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.
60 lines
1.4 KiB
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);
|
|
}
|
|
}
|