You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gristlabs_grist-core/app/client/models/UnionRowSource.ts

60 lines
1.4 KiB

import {RowList, RowListener, RowSource} from 'app/client/models/rowset';
import {UIRowId} from "app/plugin/GristAPI";
export class UnionRowSource extends RowListener implements RowSource {
protected _allRows = new Map<UIRowId, Set<RowSource>>();
constructor(parentRowSources: RowSource[]) {
super();
for (const p of parentRowSources) {
this.subscribeTo(p);
}
}
public getAllRows(): RowList {
return this._allRows.keys();
}
public getNumRows(): number {
return this._allRows.size;
}
public onAddRows(rows: RowList, rowSource: RowSource) {
const outputRows = [];
for (const r of rows) {
let sources = this._allRows.get(r);
if (!sources) {
sources = new Set();
this._allRows.set(r, sources);
outputRows.push(r);
}
sources.add(rowSource);
}
if (outputRows.length > 0) {
this.trigger('rowChange', 'add', outputRows);
}
}
public onRemoveRows(rows: RowList, rowSource: RowSource) {
const outputRows = [];
for (const r of rows) {
const sources = this._allRows.get(r);
if (!sources) {
continue;
}
sources.delete(rowSource);
if (sources.size === 0) {
outputRows.push(r);
this._allRows.delete(r);
}
}
if (outputRows.length > 0) {
this.trigger('rowChange', 'remove', outputRows);
}
}
public onUpdateRows(rows: RowList) {
this.trigger('rowChange', 'update', rows);
}
}