@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.
Files changed (37) hide show
  1. package/cjs/index.js +1992 -6
  2. package/cjs/index.js.map +1 -1
  3. package/esm/index.js +1993 -3
  4. package/esm/index.js.map +1 -1
  5. package/package.json +7 -7
  6. package/cjs/array-data-source/aggregate-utils.js +0 -237
  7. package/cjs/array-data-source/aggregate-utils.js.map +0 -1
  8. package/cjs/array-data-source/array-data-source.js +0 -669
  9. package/cjs/array-data-source/array-data-source.js.map +0 -1
  10. package/cjs/array-data-source/array-data-utils.js +0 -52
  11. package/cjs/array-data-source/array-data-utils.js.map +0 -1
  12. package/cjs/array-data-source/group-utils.js +0 -181
  13. package/cjs/array-data-source/group-utils.js.map +0 -1
  14. package/cjs/array-data-source/sort-utils.js +0 -54
  15. package/cjs/array-data-source/sort-utils.js.map +0 -1
  16. package/cjs/json-data-source/JsonDataSource.js +0 -398
  17. package/cjs/json-data-source/JsonDataSource.js.map +0 -1
  18. package/cjs/tree-data-source/IconProvider.js +0 -31
  19. package/cjs/tree-data-source/IconProvider.js.map +0 -1
  20. package/cjs/tree-data-source/TreeDataSource.js +0 -421
  21. package/cjs/tree-data-source/TreeDataSource.js.map +0 -1
  22. package/esm/array-data-source/aggregate-utils.js +0 -235
  23. package/esm/array-data-source/aggregate-utils.js.map +0 -1
  24. package/esm/array-data-source/array-data-source.js +0 -667
  25. package/esm/array-data-source/array-data-source.js.map +0 -1
  26. package/esm/array-data-source/array-data-utils.js +0 -49
  27. package/esm/array-data-source/array-data-utils.js.map +0 -1
  28. package/esm/array-data-source/group-utils.js +0 -177
  29. package/esm/array-data-source/group-utils.js.map +0 -1
  30. package/esm/array-data-source/sort-utils.js +0 -52
  31. package/esm/array-data-source/sort-utils.js.map +0 -1
  32. package/esm/json-data-source/JsonDataSource.js +0 -396
  33. package/esm/json-data-source/JsonDataSource.js.map +0 -1
  34. package/esm/tree-data-source/IconProvider.js +0 -29
  35. package/esm/tree-data-source/IconProvider.js.map +0 -1
  36. package/esm/tree-data-source/TreeDataSource.js +0 -419
  37. 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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"}