@vuu-ui/vuu-data-local 0.13.7 → 0.13.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/index.js +1992 -6
- package/cjs/index.js.map +1 -1
- package/esm/index.js +1993 -3
- package/esm/index.js.map +1 -1
- package/package.json +7 -7
- package/cjs/array-data-source/aggregate-utils.js +0 -237
- package/cjs/array-data-source/aggregate-utils.js.map +0 -1
- package/cjs/array-data-source/array-data-source.js +0 -669
- package/cjs/array-data-source/array-data-source.js.map +0 -1
- package/cjs/array-data-source/array-data-utils.js +0 -52
- package/cjs/array-data-source/array-data-utils.js.map +0 -1
- package/cjs/array-data-source/group-utils.js +0 -181
- package/cjs/array-data-source/group-utils.js.map +0 -1
- package/cjs/array-data-source/sort-utils.js +0 -54
- package/cjs/array-data-source/sort-utils.js.map +0 -1
- package/cjs/json-data-source/JsonDataSource.js +0 -398
- package/cjs/json-data-source/JsonDataSource.js.map +0 -1
- package/cjs/tree-data-source/IconProvider.js +0 -31
- package/cjs/tree-data-source/IconProvider.js.map +0 -1
- package/cjs/tree-data-source/TreeDataSource.js +0 -421
- package/cjs/tree-data-source/TreeDataSource.js.map +0 -1
- package/esm/array-data-source/aggregate-utils.js +0 -235
- package/esm/array-data-source/aggregate-utils.js.map +0 -1
- package/esm/array-data-source/array-data-source.js +0 -667
- package/esm/array-data-source/array-data-source.js.map +0 -1
- package/esm/array-data-source/array-data-utils.js +0 -49
- package/esm/array-data-source/array-data-utils.js.map +0 -1
- package/esm/array-data-source/group-utils.js +0 -177
- package/esm/array-data-source/group-utils.js.map +0 -1
- package/esm/array-data-source/sort-utils.js +0 -52
- package/esm/array-data-source/sort-utils.js.map +0 -1
- package/esm/json-data-source/JsonDataSource.js +0 -396
- package/esm/json-data-source/JsonDataSource.js.map +0 -1
- package/esm/tree-data-source/IconProvider.js +0 -29
- package/esm/tree-data-source/IconProvider.js.map +0 -1
- package/esm/tree-data-source/TreeDataSource.js +0 -419
- package/esm/tree-data-source/TreeDataSource.js.map +0 -1
|
@@ -1,421 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
4
|
-
var IconProvider = require('./IconProvider.js');
|
|
5
|
-
var vuuFilterParser = require('@vuu-ui/vuu-filter-parser');
|
|
6
|
-
|
|
7
|
-
var __defProp = Object.defineProperty;
|
|
8
|
-
var __typeError = (msg) => {
|
|
9
|
-
throw TypeError(msg);
|
|
10
|
-
};
|
|
11
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
12
|
-
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
13
|
-
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
14
|
-
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
15
|
-
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
16
|
-
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
|
|
17
|
-
var __privateWrapper = (obj, member, setter, getter) => ({
|
|
18
|
-
set _(value) {
|
|
19
|
-
__privateSet(obj, member, value);
|
|
20
|
-
},
|
|
21
|
-
get _() {
|
|
22
|
-
return __privateGet(obj, member, getter);
|
|
23
|
-
}
|
|
24
|
-
});
|
|
25
|
-
var _aggregations, _data, _iconProvider, _selectedRowsCount, _size, _status, _filterSet;
|
|
26
|
-
const NULL_SCHEMA = { columns: [], key: "", table: { module: "", table: "" } };
|
|
27
|
-
const { COUNT, DEPTH, IDX, IS_EXPANDED, IS_LEAF, KEY, SELECTED } = vuuUtils.metadataKeys;
|
|
28
|
-
const toClientRow = (row, keys) => {
|
|
29
|
-
const [rowIndex] = row;
|
|
30
|
-
const clientRow = row.slice();
|
|
31
|
-
clientRow[1] = keys.keyFor(rowIndex);
|
|
32
|
-
return clientRow;
|
|
33
|
-
};
|
|
34
|
-
class TreeDataSource extends vuuUtils.BaseDataSource {
|
|
35
|
-
constructor({ data, ...props }) {
|
|
36
|
-
super(props);
|
|
37
|
-
__publicField(this, "columnDescriptors");
|
|
38
|
-
__publicField(this, "clientCallback");
|
|
39
|
-
__publicField(this, "expandedRows", /* @__PURE__ */ new Set());
|
|
40
|
-
__publicField(this, "visibleRows", []);
|
|
41
|
-
__publicField(this, "visibleRowIndex", {});
|
|
42
|
-
__privateAdd(this, _aggregations, []);
|
|
43
|
-
__privateAdd(this, _data);
|
|
44
|
-
__privateAdd(this, _iconProvider);
|
|
45
|
-
__privateAdd(this, _selectedRowsCount, 0);
|
|
46
|
-
__privateAdd(this, _size, 0);
|
|
47
|
-
__privateAdd(this, _status, "initialising");
|
|
48
|
-
__privateAdd(this, _filterSet);
|
|
49
|
-
__publicField(this, "rowCount");
|
|
50
|
-
__publicField(this, "keys", new vuuUtils.KeySet(this._range));
|
|
51
|
-
__publicField(this, "indexOfRowWithKey", (key) => __privateGet(this, _data).findIndex((row) => row[KEY] === key));
|
|
52
|
-
if (!data) {
|
|
53
|
-
throw Error("TreeDataSource constructor called without data");
|
|
54
|
-
}
|
|
55
|
-
__privateSet(this, _iconProvider, new IconProvider.IconProvider());
|
|
56
|
-
[this.columnDescriptors, __privateWrapper(this, _data)._] = vuuUtils.treeToDataSourceRows(
|
|
57
|
-
data,
|
|
58
|
-
__privateGet(this, _iconProvider)
|
|
59
|
-
);
|
|
60
|
-
if (this.columnDescriptors) {
|
|
61
|
-
const columns = this.columnDescriptors.map((c) => c.name);
|
|
62
|
-
this._config = {
|
|
63
|
-
...this._config,
|
|
64
|
-
columns,
|
|
65
|
-
groupBy: columns.slice(1)
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
async subscribe({
|
|
70
|
-
aggregations,
|
|
71
|
-
columns,
|
|
72
|
-
range,
|
|
73
|
-
revealSelected,
|
|
74
|
-
selectedKeyValues,
|
|
75
|
-
viewport = this.viewport ?? vuuUtils.uuid()
|
|
76
|
-
}, callback) {
|
|
77
|
-
this.clientCallback = callback;
|
|
78
|
-
if (aggregations) {
|
|
79
|
-
__privateSet(this, _aggregations, aggregations);
|
|
80
|
-
}
|
|
81
|
-
if (columns) {
|
|
82
|
-
this._config = {
|
|
83
|
-
...this._config,
|
|
84
|
-
columns
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
if (__privateGet(this, _status) !== "initialising") {
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
this.viewport = viewport;
|
|
91
|
-
__privateSet(this, _status, "subscribed");
|
|
92
|
-
__privateSet(this, _selectedRowsCount, selectedKeyValues?.length ?? 0);
|
|
93
|
-
if (selectedKeyValues) {
|
|
94
|
-
this.applySelectedKeyValues(selectedKeyValues, revealSelected);
|
|
95
|
-
}
|
|
96
|
-
[this.visibleRows, this.visibleRowIndex] = getVisibleRows(
|
|
97
|
-
__privateGet(this, _data),
|
|
98
|
-
this.expandedRows
|
|
99
|
-
);
|
|
100
|
-
this.clientCallback?.({
|
|
101
|
-
aggregations: __privateGet(this, _aggregations),
|
|
102
|
-
type: "subscribed",
|
|
103
|
-
clientViewportId: this.viewport,
|
|
104
|
-
columns: this.columns,
|
|
105
|
-
filterSpec: this.filter,
|
|
106
|
-
groupBy: this._config.groupBy,
|
|
107
|
-
range: this.range,
|
|
108
|
-
sort: this.sort,
|
|
109
|
-
tableSchema: NULL_SCHEMA
|
|
110
|
-
});
|
|
111
|
-
this.clientCallback({
|
|
112
|
-
clientViewportId: this.viewport,
|
|
113
|
-
mode: "size-only",
|
|
114
|
-
type: "viewport-update",
|
|
115
|
-
size: this.visibleRows.length
|
|
116
|
-
});
|
|
117
|
-
if (range && !this._range.equals(range)) {
|
|
118
|
-
this.range = range;
|
|
119
|
-
} else if (this._range !== vuuUtils.NULL_RANGE) {
|
|
120
|
-
this.sendRowsToClient();
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
unsubscribe() {
|
|
124
|
-
console.log("noop");
|
|
125
|
-
}
|
|
126
|
-
suspend() {
|
|
127
|
-
console.log("noop");
|
|
128
|
-
return this;
|
|
129
|
-
}
|
|
130
|
-
resume() {
|
|
131
|
-
console.log("noop");
|
|
132
|
-
return this;
|
|
133
|
-
}
|
|
134
|
-
disable() {
|
|
135
|
-
console.log("noop");
|
|
136
|
-
return this;
|
|
137
|
-
}
|
|
138
|
-
enable() {
|
|
139
|
-
console.log("noop");
|
|
140
|
-
return this;
|
|
141
|
-
}
|
|
142
|
-
set data(data) {
|
|
143
|
-
[this.columnDescriptors, __privateWrapper(this, _data)._] = vuuUtils.treeToDataSourceRows(data);
|
|
144
|
-
requestAnimationFrame(() => {
|
|
145
|
-
this.sendRowsToClient();
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
get filter() {
|
|
149
|
-
return this._config.filterSpec;
|
|
150
|
-
}
|
|
151
|
-
set filter(filter) {
|
|
152
|
-
this._config = {
|
|
153
|
-
...this._config,
|
|
154
|
-
filterSpec: filter
|
|
155
|
-
};
|
|
156
|
-
if (filter.filter) {
|
|
157
|
-
this.applyFilter(filter);
|
|
158
|
-
} else {
|
|
159
|
-
__privateSet(this, _filterSet, void 0);
|
|
160
|
-
}
|
|
161
|
-
[this.visibleRows, this.visibleRowIndex] = getVisibleRows(
|
|
162
|
-
__privateGet(this, _data),
|
|
163
|
-
this.expandedRows,
|
|
164
|
-
__privateGet(this, _filterSet)
|
|
165
|
-
);
|
|
166
|
-
const { from, to } = this.range;
|
|
167
|
-
this.clientCallback?.({
|
|
168
|
-
clientViewportId: this.viewport,
|
|
169
|
-
mode: "batch",
|
|
170
|
-
rows: this.visibleRows.slice(from, to).map((row) => toClientRow(row, this.keys)),
|
|
171
|
-
size: this.visibleRows.length,
|
|
172
|
-
type: "viewport-update"
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
applyFilter({ filter: filterQuery, filterStruct }) {
|
|
176
|
-
const filter = filterStruct ?? vuuFilterParser.parseFilter(filterQuery);
|
|
177
|
-
if (vuuUtils.isSingleValueFilter(filter)) {
|
|
178
|
-
const filterSet = [];
|
|
179
|
-
const regex = new RegExp(`${filter.value}`, "i");
|
|
180
|
-
for (const row of __privateGet(this, _data)) {
|
|
181
|
-
const { [KEY]: key, [IDX]: idx } = row;
|
|
182
|
-
if (regex.test(vuuUtils.lastPathSegment(key, "|"))) {
|
|
183
|
-
filterSet.push(idx);
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
__privateSet(this, _filterSet, filterSet);
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
/**
|
|
190
|
-
* used to apply an initial selection. These may not necessarily be
|
|
191
|
-
* visible. If revealOnSelect is in force, expand nodes as necessary
|
|
192
|
-
* to ensure selected nodes are visible
|
|
193
|
-
*/
|
|
194
|
-
applySelectedKeyValues(keys, revealSelected = false) {
|
|
195
|
-
keys.forEach((key) => {
|
|
196
|
-
const rowIdx = this.indexOfRowWithKey(key);
|
|
197
|
-
const row = __privateGet(this, _data)[rowIdx];
|
|
198
|
-
row[SELECTED] = 1;
|
|
199
|
-
if (revealSelected && row[DEPTH] !== 1) {
|
|
200
|
-
const keys2 = key.slice(6).split("|").slice(0, -1);
|
|
201
|
-
let path = "$root";
|
|
202
|
-
do {
|
|
203
|
-
path = `${path}|${keys2.shift()}`;
|
|
204
|
-
this.expandedRows.add(path);
|
|
205
|
-
} while (keys2.length);
|
|
206
|
-
}
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
// Incoming Selection references visibleRow indices
|
|
210
|
-
select(selected) {
|
|
211
|
-
const updatedRows = [];
|
|
212
|
-
for (const row of this.visibleRows) {
|
|
213
|
-
const { [IDX]: rowIndex, [SELECTED]: sel } = row;
|
|
214
|
-
const wasSelected = sel === 1;
|
|
215
|
-
const nowSelected = vuuUtils.isSelected(selected, rowIndex);
|
|
216
|
-
if (nowSelected !== wasSelected) {
|
|
217
|
-
const selectedRow = row.slice();
|
|
218
|
-
const selectedValue = nowSelected ? 1 : 0;
|
|
219
|
-
selectedRow[SELECTED] = selectedValue;
|
|
220
|
-
const dataRowIdx = this.visibleRowIndex[rowIndex];
|
|
221
|
-
this.visibleRows[rowIndex] = selectedRow;
|
|
222
|
-
__privateGet(this, _data)[dataRowIdx][SELECTED] = selectedValue;
|
|
223
|
-
updatedRows.push(selectedRow);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
if (updatedRows.length > 0) {
|
|
227
|
-
this.clientCallback?.({
|
|
228
|
-
clientViewportId: this.viewport,
|
|
229
|
-
mode: "update",
|
|
230
|
-
type: "viewport-update",
|
|
231
|
-
rows: updatedRows
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
getRowKey(keyOrIndex) {
|
|
236
|
-
if (typeof keyOrIndex === "string") {
|
|
237
|
-
return keyOrIndex;
|
|
238
|
-
}
|
|
239
|
-
const row = this.getRowAtIndex(keyOrIndex);
|
|
240
|
-
if (row === void 0) {
|
|
241
|
-
throw Error(`row not found at index ${keyOrIndex}`);
|
|
242
|
-
}
|
|
243
|
-
return row[KEY];
|
|
244
|
-
}
|
|
245
|
-
openTreeNode(keyOrIndex) {
|
|
246
|
-
const key = this.getRowKey(keyOrIndex);
|
|
247
|
-
this.expandedRows.add(key);
|
|
248
|
-
[this.visibleRows, this.visibleRowIndex] = getVisibleRows(
|
|
249
|
-
__privateGet(this, _data),
|
|
250
|
-
this.expandedRows
|
|
251
|
-
);
|
|
252
|
-
const { from, to } = this._range;
|
|
253
|
-
this.clientCallback?.({
|
|
254
|
-
clientViewportId: this.viewport,
|
|
255
|
-
mode: "batch",
|
|
256
|
-
rows: this.visibleRows.slice(from, to).map((row) => toClientRow(row, this.keys)),
|
|
257
|
-
size: this.visibleRows.length,
|
|
258
|
-
type: "viewport-update"
|
|
259
|
-
});
|
|
260
|
-
}
|
|
261
|
-
closeTreeNode(keyOrIndex, cascade = false) {
|
|
262
|
-
const key = this.getRowKey(keyOrIndex);
|
|
263
|
-
this.expandedRows.delete(key);
|
|
264
|
-
if (cascade) {
|
|
265
|
-
for (const rowKey of this.expandedRows.keys()) {
|
|
266
|
-
if (rowKey.startsWith(key)) {
|
|
267
|
-
this.expandedRows.delete(rowKey);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
[this.visibleRows, this.visibleRowIndex] = getVisibleRows(
|
|
272
|
-
__privateGet(this, _data),
|
|
273
|
-
this.expandedRows
|
|
274
|
-
);
|
|
275
|
-
this.sendRowsToClient();
|
|
276
|
-
}
|
|
277
|
-
get status() {
|
|
278
|
-
return __privateGet(this, _status);
|
|
279
|
-
}
|
|
280
|
-
get selectedRowsCount() {
|
|
281
|
-
return __privateGet(this, _selectedRowsCount);
|
|
282
|
-
}
|
|
283
|
-
get size() {
|
|
284
|
-
return __privateGet(this, _size);
|
|
285
|
-
}
|
|
286
|
-
rangeRequest(range) {
|
|
287
|
-
this.keys.reset(range);
|
|
288
|
-
requestAnimationFrame(() => {
|
|
289
|
-
this.sendRowsToClient();
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
sendRowsToClient() {
|
|
293
|
-
const { from, to } = this._range;
|
|
294
|
-
this.clientCallback?.({
|
|
295
|
-
clientViewportId: this.viewport,
|
|
296
|
-
mode: "batch",
|
|
297
|
-
rows: this.visibleRows.slice(from, to).map((row) => toClientRow(row, this.keys)),
|
|
298
|
-
size: this.visibleRows.length,
|
|
299
|
-
type: "viewport-update"
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
createLink({
|
|
303
|
-
parentVpId,
|
|
304
|
-
link: { fromColumn, toColumn }
|
|
305
|
-
}) {
|
|
306
|
-
console.log("create link", {
|
|
307
|
-
parentVpId,
|
|
308
|
-
fromColumn,
|
|
309
|
-
toColumn
|
|
310
|
-
});
|
|
311
|
-
}
|
|
312
|
-
removeLink() {
|
|
313
|
-
console.log("remove link");
|
|
314
|
-
}
|
|
315
|
-
async remoteProcedureCall() {
|
|
316
|
-
return Promise.reject();
|
|
317
|
-
}
|
|
318
|
-
async menuRpcCall(rpcRequest) {
|
|
319
|
-
console.log("rmenuRpcCall", {
|
|
320
|
-
rpcRequest
|
|
321
|
-
});
|
|
322
|
-
return void 0;
|
|
323
|
-
}
|
|
324
|
-
applyEdit(rowKey, columnName, value) {
|
|
325
|
-
console.log(`ArrayDataSource applyEdit ${rowKey} ${columnName} ${value}`);
|
|
326
|
-
return Promise.resolve(true);
|
|
327
|
-
}
|
|
328
|
-
getChildRows(rowKey) {
|
|
329
|
-
const parentRow = __privateGet(this, _data).find((row) => row[KEY] === rowKey);
|
|
330
|
-
if (parentRow) {
|
|
331
|
-
const { [IDX]: parentIdx, [DEPTH]: parentDepth } = parentRow;
|
|
332
|
-
let rowIdx = parentIdx + 1;
|
|
333
|
-
const childRows = [];
|
|
334
|
-
do {
|
|
335
|
-
const { [DEPTH]: depth } = __privateGet(this, _data)[rowIdx];
|
|
336
|
-
if (depth === parentDepth + 1) {
|
|
337
|
-
childRows.push(__privateGet(this, _data)[rowIdx]);
|
|
338
|
-
} else if (depth <= parentDepth) {
|
|
339
|
-
break;
|
|
340
|
-
}
|
|
341
|
-
rowIdx += 1;
|
|
342
|
-
} while (rowIdx < __privateGet(this, _data).length);
|
|
343
|
-
return childRows;
|
|
344
|
-
} else {
|
|
345
|
-
console.warn(
|
|
346
|
-
`JsonDataSource getChildRows row not found for key ${rowKey}`
|
|
347
|
-
);
|
|
348
|
-
}
|
|
349
|
-
return [];
|
|
350
|
-
}
|
|
351
|
-
getRowsAtDepth(depth, visibleOnly = true) {
|
|
352
|
-
const rows = visibleOnly ? this.visibleRows : __privateGet(this, _data);
|
|
353
|
-
return rows.filter((row) => row[DEPTH] === depth);
|
|
354
|
-
}
|
|
355
|
-
getRowAtIndex(rowIdx) {
|
|
356
|
-
return this.visibleRows[rowIdx];
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
_aggregations = new WeakMap();
|
|
360
|
-
_data = new WeakMap();
|
|
361
|
-
_iconProvider = new WeakMap();
|
|
362
|
-
_selectedRowsCount = new WeakMap();
|
|
363
|
-
_size = new WeakMap();
|
|
364
|
-
_status = new WeakMap();
|
|
365
|
-
_filterSet = new WeakMap();
|
|
366
|
-
function getVisibleRows(rows, expandedKeys, filterset) {
|
|
367
|
-
const visibleRows = [];
|
|
368
|
-
const visibleRowIndex = {};
|
|
369
|
-
const data = filterset ?? rows;
|
|
370
|
-
for (let i = 0, index = 0; i < data.length; i++) {
|
|
371
|
-
const idx = filterset ? filterset[i] : i;
|
|
372
|
-
const row = rows[idx];
|
|
373
|
-
const {
|
|
374
|
-
[COUNT]: count,
|
|
375
|
-
[DEPTH]: depth,
|
|
376
|
-
[KEY]: key,
|
|
377
|
-
[IS_LEAF]: isLeaf
|
|
378
|
-
} = row;
|
|
379
|
-
if (filterset) {
|
|
380
|
-
const previousRow = visibleRows.at(-1);
|
|
381
|
-
if (vuuUtils.missingAncestor(row, previousRow)) {
|
|
382
|
-
let currentRow = row;
|
|
383
|
-
const missingRows = [];
|
|
384
|
-
while (currentRow) {
|
|
385
|
-
currentRow = vuuUtils.getParentRow(rows, currentRow);
|
|
386
|
-
if (currentRow) {
|
|
387
|
-
missingRows.unshift(currentRow);
|
|
388
|
-
}
|
|
389
|
-
}
|
|
390
|
-
missingRows.forEach((row2) => {
|
|
391
|
-
visibleRows.push(cloneRow(row2, index++, true));
|
|
392
|
-
});
|
|
393
|
-
}
|
|
394
|
-
visibleRows.push(cloneRow(row, index++, true));
|
|
395
|
-
visibleRowIndex[index] = i;
|
|
396
|
-
} else {
|
|
397
|
-
const isExpanded = expandedKeys.has(key);
|
|
398
|
-
visibleRows.push(cloneRow(row, index, isExpanded));
|
|
399
|
-
visibleRowIndex[index++] = i;
|
|
400
|
-
const skipNonVisibleRows = !isLeaf && !isExpanded && count > 0;
|
|
401
|
-
if (skipNonVisibleRows) {
|
|
402
|
-
do {
|
|
403
|
-
i += 1;
|
|
404
|
-
} while (i < rows.length - 1 && rows[i + 1][DEPTH] > depth);
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
}
|
|
408
|
-
return [visibleRows, visibleRowIndex];
|
|
409
|
-
}
|
|
410
|
-
const cloneRow = (row, index, isExpanded) => {
|
|
411
|
-
const dolly = row.slice();
|
|
412
|
-
dolly[0] = index;
|
|
413
|
-
dolly[1] = index;
|
|
414
|
-
if (isExpanded) {
|
|
415
|
-
dolly[IS_EXPANDED] = true;
|
|
416
|
-
}
|
|
417
|
-
return dolly;
|
|
418
|
-
};
|
|
419
|
-
|
|
420
|
-
exports.TreeDataSource = TreeDataSource;
|
|
421
|
-
//# sourceMappingURL=TreeDataSource.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TreeDataSource.js","sources":["../../src/tree-data-source/TreeDataSource.ts"],"sourcesContent":["import type { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport type {\n LinkDescriptorWithLabel,\n VuuAggregation,\n VuuRange,\n VuuRowDataItemType,\n VuuRpcResponse,\n VuuRpcRequest,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport type {\n DataSourceRow,\n DataSourceConstructorProps,\n DataSourceStatus,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n Selection,\n MenuRpcResponse,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n DataSourceFilter,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n BaseDataSource,\n getParentRow,\n isSelected,\n isSingleValueFilter,\n KeySet,\n lastPathSegment,\n metadataKeys,\n missingAncestor,\n NULL_RANGE,\n TreeSourceNode,\n treeToDataSourceRows,\n uuid,\n} from \"@vuu-ui/vuu-utils\";\nimport { IconProvider } from \"./IconProvider\";\nimport { parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport { FilterClause } from \"@vuu-ui/vuu-filter-types\";\n\nconst NULL_SCHEMA = { columns: [], key: \"\", table: { module: \"\", table: \"\" } };\n\ntype VisibleRowIndex = Record<number, number>;\n\nexport interface TreeDataSourceConstructorProps\n extends Omit<DataSourceConstructorProps, \"bufferSize\" | \"table\"> {\n data: TreeSourceNode[];\n}\n\nconst { COUNT, DEPTH, IDX, IS_EXPANDED, IS_LEAF, KEY, SELECTED } = metadataKeys;\n\nconst toClientRow = (row: DataSourceRow, keys: KeySet) => {\n const [rowIndex] = row;\n const clientRow = row.slice() as DataSourceRow;\n clientRow[1] = keys.keyFor(rowIndex);\n return clientRow;\n};\n\nexport class TreeDataSource extends BaseDataSource {\n public columnDescriptors: ColumnDescriptor[];\n private clientCallback: DataSourceSubscribeCallback | undefined;\n private expandedRows = new Set<string>();\n private visibleRows: DataSourceRow[] = [];\n private visibleRowIndex: VisibleRowIndex = {};\n\n #aggregations: VuuAggregation[] = [];\n #data: DataSourceRow[];\n #iconProvider: IconProvider;\n #selectedRowsCount = 0;\n #size = 0;\n #status: DataSourceStatus = \"initialising\";\n #filterSet: number[] | undefined;\n\n public rowCount: number | undefined;\n\n private keys = new KeySet(this._range);\n\n constructor({ data, ...props }: TreeDataSourceConstructorProps) {\n super(props);\n\n if (!data) {\n throw Error(\"TreeDataSource constructor called without data\");\n }\n this.#iconProvider = new IconProvider();\n\n [this.columnDescriptors, this.#data] = treeToDataSourceRows(\n data,\n this.#iconProvider,\n );\n\n if (this.columnDescriptors) {\n const columns = this.columnDescriptors.map((c) => c.name);\n this._config = {\n ...this._config,\n columns,\n groupBy: columns.slice(1),\n };\n }\n }\n\n async subscribe(\n {\n aggregations,\n columns,\n range,\n revealSelected,\n selectedKeyValues,\n viewport = this.viewport ?? uuid(),\n }: DataSourceSubscribeProps,\n callback: DataSourceSubscribeCallback,\n ) {\n this.clientCallback = callback;\n\n if (aggregations) {\n this.#aggregations = aggregations;\n }\n if (columns) {\n this._config = {\n ...this._config,\n columns,\n };\n }\n\n if (this.#status !== \"initialising\") {\n //TODO check if subscription details are still the same\n return;\n }\n\n this.viewport = viewport;\n\n this.#status = \"subscribed\";\n this.#selectedRowsCount = selectedKeyValues?.length ?? 0;\n\n if (selectedKeyValues) {\n this.applySelectedKeyValues(selectedKeyValues, revealSelected);\n }\n\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n );\n\n this.clientCallback?.({\n aggregations: this.#aggregations,\n type: \"subscribed\",\n clientViewportId: this.viewport,\n columns: this.columns,\n filterSpec: this.filter,\n groupBy: this._config.groupBy,\n range: this.range,\n sort: this.sort,\n tableSchema: NULL_SCHEMA,\n });\n\n this.clientCallback({\n clientViewportId: this.viewport,\n mode: \"size-only\",\n type: \"viewport-update\",\n size: this.visibleRows.length,\n });\n\n if (range && !this._range.equals(range)) {\n this.range = range;\n } else if (this._range !== NULL_RANGE) {\n this.sendRowsToClient();\n }\n }\n\n unsubscribe() {\n console.log(\"noop\");\n }\n\n suspend() {\n console.log(\"noop\");\n return this;\n }\n\n resume() {\n console.log(\"noop\");\n return this;\n }\n\n disable() {\n console.log(\"noop\");\n return this;\n }\n\n enable() {\n console.log(\"noop\");\n return this;\n }\n set data(data: TreeSourceNode[]) {\n [this.columnDescriptors, this.#data] = treeToDataSourceRows(data);\n\n requestAnimationFrame(() => {\n this.sendRowsToClient();\n });\n }\n\n get filter() {\n return this._config.filterSpec;\n }\n\n set filter(filter: DataSourceFilter) {\n // Note not using the setter\n this._config = {\n ...this._config,\n filterSpec: filter,\n };\n\n if (filter.filter) {\n this.applyFilter(filter);\n } else {\n this.#filterSet = undefined;\n }\n\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n this.#filterSet,\n );\n\n const { from, to } = this.range;\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n rows: this.visibleRows\n .slice(from, to)\n .map((row) => toClientRow(row, this.keys)),\n size: this.visibleRows.length,\n type: \"viewport-update\",\n });\n }\n\n private applyFilter({ filter: filterQuery, filterStruct }: DataSourceFilter) {\n const filter = filterStruct ?? (parseFilter(filterQuery) as FilterClause);\n if (isSingleValueFilter(filter)) {\n const filterSet = [];\n const regex = new RegExp(`${filter.value}`, \"i\");\n for (const row of this.#data) {\n const { [KEY]: key, [IDX]: idx } = row;\n if (regex.test(lastPathSegment(key, \"|\"))) {\n filterSet.push(idx);\n }\n }\n this.#filterSet = filterSet;\n }\n }\n\n /**\n * used to apply an initial selection. These may not necessarily be\n * visible. If revealOnSelect is in force, expand nodes as necessary\n * to ensure selected nodes are visible\n */\n private applySelectedKeyValues(keys: string[], revealSelected = false) {\n keys.forEach((key) => {\n const rowIdx = this.indexOfRowWithKey(key);\n const row = this.#data[rowIdx];\n row[SELECTED] = 1;\n\n if (revealSelected && row[DEPTH] !== 1) {\n const keys = key.slice(6).split(\"|\").slice(0, -1);\n\n let path = \"$root\";\n do {\n path = `${path}|${keys.shift()}`;\n this.expandedRows.add(path);\n } while (keys.length);\n }\n });\n }\n\n private indexOfRowWithKey = (key: string) =>\n this.#data.findIndex((row) => row[KEY] === key);\n\n // Incoming Selection references visibleRow indices\n select(selected: Selection) {\n // todo get a diff\n const updatedRows: DataSourceRow[] = [];\n for (const row of this.visibleRows) {\n const { [IDX]: rowIndex, [SELECTED]: sel } = row;\n const wasSelected = sel === 1;\n const nowSelected = isSelected(selected, rowIndex);\n if (nowSelected !== wasSelected) {\n const selectedRow = row.slice() as DataSourceRow;\n const selectedValue = nowSelected ? 1 : 0;\n selectedRow[SELECTED] = selectedValue;\n const dataRowIdx = this.visibleRowIndex[rowIndex];\n this.visibleRows[rowIndex] = selectedRow;\n this.#data[dataRowIdx][SELECTED] = selectedValue;\n updatedRows.push(selectedRow);\n }\n }\n\n if (updatedRows.length > 0) {\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"update\",\n type: \"viewport-update\",\n rows: updatedRows,\n });\n }\n }\n\n private getRowKey(keyOrIndex: string | number) {\n if (typeof keyOrIndex === \"string\") {\n return keyOrIndex;\n }\n const row = this.getRowAtIndex(keyOrIndex);\n if (row === undefined) {\n throw Error(`row not found at index ${keyOrIndex}`);\n }\n return row[KEY];\n }\n\n openTreeNode(keyOrIndex: string | number) {\n const key = this.getRowKey(keyOrIndex);\n this.expandedRows.add(key);\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n );\n\n const { from, to } = this._range;\n this.clientCallback?.({\n clientViewportId: this.viewport,\n\n mode: \"batch\",\n rows: this.visibleRows\n .slice(from, to)\n .map((row) => toClientRow(row, this.keys)),\n size: this.visibleRows.length,\n type: \"viewport-update\",\n });\n }\n\n closeTreeNode(keyOrIndex: string | number, cascade = false) {\n const key = this.getRowKey(keyOrIndex);\n this.expandedRows.delete(key);\n if (cascade) {\n for (const rowKey of this.expandedRows.keys()) {\n if (rowKey.startsWith(key)) {\n this.expandedRows.delete(rowKey);\n }\n }\n }\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n );\n this.sendRowsToClient();\n }\n\n get status() {\n return this.#status;\n }\n\n get selectedRowsCount() {\n return this.#selectedRowsCount;\n }\n\n get size() {\n return this.#size;\n }\n\n rangeRequest(range: VuuRange) {\n this.keys.reset(range);\n requestAnimationFrame(() => {\n this.sendRowsToClient();\n });\n }\n\n private sendRowsToClient() {\n const { from, to } = this._range;\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n rows: this.visibleRows\n .slice(from, to)\n .map((row) => toClientRow(row, this.keys)),\n size: this.visibleRows.length,\n type: \"viewport-update\",\n });\n }\n\n createLink({\n parentVpId,\n link: { fromColumn, toColumn },\n }: LinkDescriptorWithLabel) {\n console.log(\"create link\", {\n parentVpId,\n fromColumn,\n toColumn,\n });\n }\n\n removeLink() {\n console.log(\"remove link\");\n }\n\n async remoteProcedureCall<T extends VuuRpcResponse = VuuRpcResponse>() {\n return Promise.reject<T>();\n }\n\n async menuRpcCall(\n rpcRequest: Omit<VuuRpcRequest, \"vpId\">,\n ): Promise<\n | MenuRpcResponse\n | VuuUIMessageInRPCEditReject\n | VuuUIMessageInRPCEditResponse\n | undefined\n > {\n console.log(\"rmenuRpcCall\", {\n rpcRequest,\n });\n return undefined;\n }\n\n applyEdit(\n rowKey: string,\n columnName: string,\n value: VuuRowDataItemType,\n ): Promise<true> {\n console.log(`ArrayDataSource applyEdit ${rowKey} ${columnName} ${value}`);\n return Promise.resolve(true);\n }\n\n getChildRows(rowKey: string) {\n const parentRow = this.#data.find((row) => row[KEY] === rowKey);\n if (parentRow) {\n const { [IDX]: parentIdx, [DEPTH]: parentDepth } = parentRow;\n let rowIdx = parentIdx + 1;\n const childRows = [];\n do {\n const { [DEPTH]: depth } = this.#data[rowIdx];\n if (depth === parentDepth + 1) {\n childRows.push(this.#data[rowIdx]);\n } else if (depth <= parentDepth) {\n break;\n }\n rowIdx += 1;\n } while (rowIdx < this.#data.length);\n return childRows;\n } else {\n console.warn(\n `JsonDataSource getChildRows row not found for key ${rowKey}`,\n );\n }\n\n return [];\n }\n\n getRowsAtDepth(depth: number, visibleOnly = true) {\n const rows = visibleOnly ? this.visibleRows : this.#data;\n return rows.filter((row) => row[DEPTH] === depth);\n }\n\n getRowAtIndex(rowIdx: number) {\n return this.visibleRows[rowIdx];\n }\n}\n\nfunction getVisibleRows(\n rows: DataSourceRow[],\n expandedKeys: Set<string>,\n filterset?: number[],\n): [visibleRows: DataSourceRow[], index: VisibleRowIndex] {\n const visibleRows: DataSourceRow[] = [];\n const visibleRowIndex: VisibleRowIndex = {};\n\n const data = filterset ?? rows;\n\n for (let i = 0, index = 0; i < data.length; i++) {\n const idx = filterset ? filterset[i] : i;\n const row = rows[idx];\n const {\n [COUNT]: count,\n [DEPTH]: depth,\n [KEY]: key,\n [IS_LEAF]: isLeaf,\n } = row;\n if (filterset) {\n // assume expanded for now\n\n // if we have skipped a higher level group (that didn't directly match\n // our filter criteria, add it.\n const previousRow = visibleRows.at(-1);\n if (missingAncestor(row, previousRow)) {\n let currentRow: DataSourceRow | undefined = row;\n const missingRows = [];\n while (currentRow) {\n currentRow = getParentRow(rows, currentRow);\n if (currentRow) {\n // we will get the missing rows in reverse order\n missingRows.unshift(currentRow);\n }\n }\n missingRows.forEach((row) => {\n visibleRows.push(cloneRow(row, index++, true));\n });\n }\n\n visibleRows.push(cloneRow(row, index++, true));\n visibleRowIndex[index] = i;\n } else {\n const isExpanded = expandedKeys.has(key);\n visibleRows.push(cloneRow(row, index, isExpanded));\n visibleRowIndex[index++] = i;\n const skipNonVisibleRows = !isLeaf && !isExpanded && count > 0;\n if (skipNonVisibleRows) {\n do {\n i += 1;\n } while (i < rows.length - 1 && rows[i + 1][DEPTH] > depth);\n }\n }\n }\n return [visibleRows, visibleRowIndex];\n}\n\nconst cloneRow = (\n row: DataSourceRow,\n index: number,\n isExpanded: boolean,\n): DataSourceRow => {\n const dolly = row.slice() as DataSourceRow;\n dolly[0] = index;\n dolly[1] = index;\n if (isExpanded) {\n dolly[IS_EXPANDED] = true;\n }\n return dolly;\n};\n"],"names":["metadataKeys","BaseDataSource","KeySet","IconProvider","treeToDataSourceRows","uuid","NULL_RANGE","parseFilter","isSingleValueFilter","lastPathSegment","keys","isSelected","missingAncestor","getParentRow","row"],"mappings":"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"}
|