@vuu-ui/vuu-data-local 0.13.40 → 0.13.42

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.
@@ -17,18 +17,20 @@ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot
17
17
  var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
18
18
  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);
19
19
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
20
- var _columnMap, _data, _freezeTimestamp, _keys, _links, _range, _selectedRowsCount, _status, _title;
20
+ var _columnMap, _data, _freezeTimestamp, _keys, _links, _range, _status, _title;
21
21
  const { debug, info } = vuuUtils.logger("ArrayDataSource");
22
22
  const { KEY } = vuuUtils.metadataKeys;
23
- const toDataSourceRow = (key) => (data, index) => {
23
+ const toDataSourceRow = (indexOfKeyColumn, index) => (data, idx) => {
24
+ const key = `${data[indexOfKeyColumn]}`;
25
+ index?.set(key, idx);
24
26
  return [
25
- index,
26
- index,
27
+ idx,
28
+ idx,
27
29
  true,
28
30
  false,
29
31
  1,
30
32
  0,
31
- String(data[key]),
33
+ key,
32
34
  0,
33
35
  0,
34
36
  // ts
@@ -91,11 +93,11 @@ class ArrayDataSource extends vuuUtils.EventEmitter {
91
93
  __privateAdd(this, _keys, new vuuUtils.KeySet(vuuUtils.NULL_RANGE));
92
94
  __privateAdd(this, _links);
93
95
  __privateAdd(this, _range, vuuUtils.Range(0, 0));
94
- __privateAdd(this, _selectedRowsCount, 0);
95
96
  __privateAdd(this, _status, "initialising");
96
97
  __privateAdd(this, _title);
97
98
  __publicField(this, "_menu");
98
- __publicField(this, "selectedRows", []);
99
+ __publicField(this, "selectedRows", /* @__PURE__ */ new Set());
100
+ __publicField(this, "index", /* @__PURE__ */ new Map());
99
101
  __publicField(this, "tableSchema");
100
102
  __publicField(this, "viewport");
101
103
  __publicField(this, "processedData");
@@ -212,7 +214,7 @@ class ArrayDataSource extends vuuUtils.EventEmitter {
212
214
  const columns = columnDescriptors.map((col) => col.name);
213
215
  __privateSet(this, _columnMap, vuuUtils.buildColumnMap(columns));
214
216
  this.dataIndices = arrayDataUtils.buildDataToClientMap(__privateGet(this, _columnMap), this.dataMap);
215
- __privateSet(this, _data, data.map(toDataSourceRow(this.key)));
217
+ __privateSet(this, _data, data.map(toDataSourceRow(this.key, this.index)));
216
218
  this.config = {
217
219
  ...this._config,
218
220
  aggregations: aggregations || this._config.aggregations,
@@ -230,8 +232,8 @@ class ArrayDataSource extends vuuUtils.EventEmitter {
230
232
  aggregations,
231
233
  baseFilterSpec,
232
234
  range,
233
- selectedIndexValues,
234
- selectedKeyValues,
235
+ // selectedIndexValues,
236
+ // selectedKeyValues,
235
237
  sort,
236
238
  groupBy,
237
239
  filterSpec
@@ -239,8 +241,6 @@ class ArrayDataSource extends vuuUtils.EventEmitter {
239
241
  this.clientCallback = callback;
240
242
  this.viewport = viewport;
241
243
  __privateSet(this, _status, "subscribed");
242
- this.selectedRows = selectedIndexValues ?? this.convertKeysToIndexValues(selectedKeyValues) ?? [];
243
- __privateSet(this, _selectedRowsCount, vuuUtils.selectionCount(this.selectedRows));
244
244
  this.lastRangeServed = { from: 0, to: 0 };
245
245
  let config = this._config;
246
246
  const hasConfigProps = aggregations || columns || filterSpec || groupBy || sort;
@@ -311,12 +311,52 @@ class ArrayDataSource extends vuuUtils.EventEmitter {
311
311
  enable() {
312
312
  this.emit("enabled", this.viewport);
313
313
  }
314
- select(selected) {
315
- __privateSet(this, _selectedRowsCount, vuuUtils.selectionCount(selected));
316
- debug?.(`select ${JSON.stringify(selected)}`);
317
- this.selectedRows = selected;
314
+ select(selectRequest) {
315
+ switch (selectRequest.type) {
316
+ case "SELECT_ROW": {
317
+ const { preserveExistingSelection, rowKey } = selectRequest;
318
+ if (!preserveExistingSelection) {
319
+ this.selectedRows.clear();
320
+ }
321
+ this.selectedRows.add(rowKey);
322
+ break;
323
+ }
324
+ case "DESELECT_ROW": {
325
+ const { preserveExistingSelection, rowKey } = selectRequest;
326
+ if (!preserveExistingSelection) {
327
+ this.selectedRows.clear();
328
+ } else {
329
+ this.selectedRows.delete(rowKey);
330
+ }
331
+ break;
332
+ }
333
+ case "SELECT_ROW_RANGE": {
334
+ const { preserveExistingSelection, fromRowKey, toRowKey } = selectRequest;
335
+ if (!preserveExistingSelection) {
336
+ this.selectedRows.clear();
337
+ }
338
+ const fromIdx = this.index.get(fromRowKey);
339
+ const toIdx = this.index.get(toRowKey);
340
+ if (typeof fromIdx === "number" && typeof toIdx === "number") {
341
+ for (let i = fromIdx; i <= toIdx; i++) {
342
+ const { [KEY]: rowKey } = __privateGet(this, _data)[i];
343
+ this.selectedRows.add(rowKey);
344
+ }
345
+ }
346
+ break;
347
+ }
348
+ case "SELECT_ALL": {
349
+ this.selectedRows.clear();
350
+ this.selectedRows.add("*");
351
+ break;
352
+ }
353
+ case "DESELECT_ALL": {
354
+ this.selectedRows.clear();
355
+ break;
356
+ }
357
+ }
318
358
  this.setRange(__privateGet(this, _range), true);
319
- this.emit("row-selection", selected, __privateGet(this, _selectedRowsCount));
359
+ this.emit("row-selection", this.selectedRows.size);
320
360
  }
321
361
  getRowKey(keyOrIndex) {
322
362
  if (typeof keyOrIndex === "string") {
@@ -374,14 +414,23 @@ class ArrayDataSource extends vuuUtils.EventEmitter {
374
414
  get table() {
375
415
  return this.tableSchema.table;
376
416
  }
417
+ get columns() {
418
+ return this._config.columns;
419
+ }
420
+ set columns(columns) {
421
+ this.config = {
422
+ ...this._config,
423
+ columns
424
+ };
425
+ }
377
426
  get config() {
378
427
  return this._config;
379
428
  }
380
429
  set config(config) {
430
+ const originalConfig = this._config;
381
431
  const configChanges = this.applyConfig(config);
382
432
  if (configChanges) {
383
433
  if (config) {
384
- const originalConfig = this._config;
385
434
  const newConfig = config?.filterSpec?.filter && config?.filterSpec.filterStruct === void 0 ? {
386
435
  ...config,
387
436
  filterSpec: {
@@ -395,6 +444,9 @@ class ArrayDataSource extends vuuUtils.EventEmitter {
395
444
  const fn = this.getFilterPredicate();
396
445
  processedData = __privateGet(this, _data).filter(fn);
397
446
  }
447
+ if (configChanges.columnsChanged) {
448
+ this.processNewColumns(originalConfig.columns, config.columns);
449
+ }
398
450
  if (vuuUtils.hasSort(config)) {
399
451
  processedData = sortUtils.sortRows(
400
452
  processedData ?? __privateGet(this, _data),
@@ -446,6 +498,21 @@ class ArrayDataSource extends vuuUtils.EventEmitter {
446
498
  }
447
499
  }
448
500
  }
501
+ processNewColumns(originalColumns, columns) {
502
+ const addedColumns = vuuUtils.getAddedItems(originalColumns, columns);
503
+ if (addedColumns.length > 0) {
504
+ const columnsWithoutDescriptors = vuuUtils.getMissingItems(
505
+ this.columnDescriptors,
506
+ addedColumns,
507
+ (col) => col.name
508
+ );
509
+ console.warn(`columnsWithoutDescriptors`, {
510
+ columnsWithoutDescriptors
511
+ });
512
+ }
513
+ __privateSet(this, _columnMap, vuuUtils.buildColumnMap(columns));
514
+ this.dataIndices = arrayDataUtils.buildDataToClientMap(__privateGet(this, _columnMap), this.dataMap);
515
+ }
449
516
  indexProcessedData(data) {
450
517
  return data?.map((row, i) => {
451
518
  const dolly = row.slice();
@@ -494,7 +561,7 @@ class ArrayDataSource extends vuuUtils.EventEmitter {
494
561
  return __privateGet(this, _columnMap);
495
562
  }
496
563
  get selectedRowsCount() {
497
- return __privateGet(this, _selectedRowsCount);
564
+ return this.selectedRows.size;
498
565
  }
499
566
  get size() {
500
567
  return this.processedData?.length ?? __privateGet(this, _data).length;
@@ -625,28 +692,6 @@ class ArrayDataSource extends vuuUtils.EventEmitter {
625
692
  };
626
693
  }
627
694
  }
628
- get columns() {
629
- return this._config.columns;
630
- }
631
- set columns(columns) {
632
- const addedColumns = vuuUtils.getAddedItems(this.config.columns, columns);
633
- if (addedColumns.length > 0) {
634
- const columnsWithoutDescriptors = vuuUtils.getMissingItems(
635
- this.columnDescriptors,
636
- addedColumns,
637
- (col) => col.name
638
- );
639
- console.warn(`columnsWithoutDescriptors`, {
640
- columnsWithoutDescriptors
641
- });
642
- }
643
- __privateSet(this, _columnMap, vuuUtils.buildColumnMap(columns));
644
- this.dataIndices = arrayDataUtils.buildDataToClientMap(__privateGet(this, _columnMap), this.dataMap);
645
- this.config = {
646
- ...this._config,
647
- columns
648
- };
649
- }
650
695
  get aggregations() {
651
696
  return this._config.aggregations;
652
697
  }
@@ -822,7 +867,6 @@ _freezeTimestamp = new WeakMap();
822
867
  _keys = new WeakMap();
823
868
  _links = new WeakMap();
824
869
  _range = new WeakMap();
825
- _selectedRowsCount = new WeakMap();
826
870
  _status = new WeakMap();
827
871
  _title = new WeakMap();
828
872
 
@@ -1 +1 @@
1
- {"version":3,"file":"array-data-source.js","sources":["../../../../packages/vuu-data-local/src/array-data-source/array-data-source.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceConfig,\n DataSourceConstructorProps,\n DataSourceEvents,\n DataSourceFilter,\n DataSourceRow,\n DataSourceStatus,\n DataSourceSubscribedMessage,\n Selection,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n TableSchema,\n WithBaseFilter,\n WithFullConfig,\n DataSourceDeleteHandler,\n} from \"@vuu-ui/vuu-data-types\";\nimport { filterPredicate, parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport type {\n LinkDescriptorWithLabel,\n VuuAggregation,\n VuuGroupBy,\n VuuMenu,\n VuuRange,\n VuuRowDataItemType,\n VuuRpcEditRequest,\n VuuRpcEditResponse,\n VuuRpcRequest,\n VuuRpcResponse,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport type { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n ColumnMap,\n DataSourceConfigChanges,\n EventEmitter,\n KeySet,\n NULL_RANGE,\n Range,\n buildColumnMap,\n combineFilters,\n getAddedItems,\n getMissingItems,\n hasBaseFilter,\n hasFilter,\n hasGroupBy,\n hasSort,\n isConfigChanged,\n isEditCellRequest,\n isGroupByChanged,\n logger,\n metadataKeys,\n rangeNewItems,\n selectionCount,\n uuid,\n vanillaConfig,\n withConfigDefaults,\n} from \"@vuu-ui/vuu-utils\";\nimport { aggregateData } from \"./aggregate-utils\";\nimport { buildDataToClientMap, toClientRow } from \"./array-data-utils\";\nimport { GroupMap, collapseGroup, expandGroup, groupRows } from \"./group-utils\";\nimport {\n binarySearch,\n ColIndexSortDef,\n sortComparator,\n sortRows,\n} from \"./sort-utils\";\n\nconst { debug, info } = logger(\"ArrayDataSource\");\n\nconst { KEY } = metadataKeys;\n\nexport interface ArrayDataSourceConstructorProps\n extends Omit<DataSourceConstructorProps, \"bufferSize\" | \"table\"> {\n columnDescriptors: ColumnDescriptor[];\n data: Array<VuuRowDataItemType[]>;\n dataMap?: ColumnMap;\n keyColumn?: string;\n rangeChangeRowset?: \"delta\" | \"full\";\n}\n\nconst toDataSourceRow =\n (key: number) =>\n (data: VuuRowDataItemType[], index: number): DataSourceRow => {\n return [\n index,\n index,\n true,\n false,\n 1,\n 0,\n String(data[key]),\n 0,\n 0, // ts\n false, // isNew\n ...data,\n ];\n };\n\n// const isError = (err: unknown): err is { message: string } =>\n// typeof err === \"object\" && err !== null && err.hasOwnProperty(\"message\");\n\nconst buildTableSchema = (\n columns: ColumnDescriptor[],\n keyColumn?: string,\n): TableSchema => {\n const schema: TableSchema = {\n columns: columns.map(({ name, serverDataType = \"string\" }) => ({\n name,\n serverDataType,\n })),\n key: keyColumn ?? columns[0].name,\n table: { module: \"\", table: \"Array\" },\n };\n\n return schema;\n};\n\nexport class ArrayDataSource\n extends EventEmitter<DataSourceEvents>\n implements DataSource\n{\n private clientCallback: DataSourceSubscribeCallback | undefined;\n private columnDescriptors: ColumnDescriptor[];\n /** sorted offsets of data within raw data, reflecting sort order\n * of columns specified by client.\n */\n private dataIndices: number[] | undefined;\n /** Map reflecting positions of data items in raw data */\n private dataMap: ColumnMap | undefined;\n private groupMap: undefined | GroupMap;\n /** the index of key field within raw data row */\n private key: number;\n private lastRangeServed: VuuRange = { from: 0, to: 0 };\n private rangeChangeRowset: \"delta\" | \"full\";\n private openTreeNodes: string[] = [];\n // Experimental. There are some config changes - first concrete example is baseFilter applied to\n // 'freeze' data, that should not immediately affect the displayed data, therefore not cause\n // range reset.\n private preserveScrollPositionAcrossConfigChange = false;\n\n /** Map reflecting positions of columns in client data sent to user */\n #columnMap: ColumnMap;\n protected _config: WithBaseFilter<WithFullConfig> & {\n visualLink?: LinkDescriptorWithLabel;\n } = vanillaConfig;\n #data: DataSourceRow[];\n #freezeTimestamp: number | undefined = undefined;\n #keys = new KeySet(NULL_RANGE);\n #links: LinkDescriptorWithLabel[] | undefined;\n #range = Range(0, 0);\n #selectedRowsCount = 0;\n #status: DataSourceStatus = \"initialising\";\n #title: string | undefined;\n\n protected _menu: VuuMenu | undefined;\n protected selectedRows: Selection = [];\n\n public tableSchema: TableSchema;\n public viewport: string;\n\n protected processedData: DataSourceRow[] | undefined = undefined;\n\n constructor({\n aggregations,\n baseFilterSpec,\n // different from RemoteDataSource\n columnDescriptors,\n data,\n dataMap,\n filterSpec,\n groupBy,\n keyColumn,\n rangeChangeRowset = \"delta\",\n sort,\n title,\n viewport,\n }: ArrayDataSourceConstructorProps) {\n super();\n if (!data || !columnDescriptors) {\n throw Error(\n \"ArrayDataSource constructor called without data or without columnDescriptors\",\n );\n }\n\n this.columnDescriptors = columnDescriptors;\n this.dataMap = dataMap;\n this.key = keyColumn\n ? this.columnDescriptors.findIndex((col) => col.name === keyColumn)\n : 0;\n this.rangeChangeRowset = rangeChangeRowset;\n this.tableSchema = buildTableSchema(columnDescriptors, keyColumn);\n this.viewport = viewport || uuid();\n this.#title = title;\n\n const columns = columnDescriptors.map((col) => col.name);\n this.#columnMap = buildColumnMap(columns);\n this.dataIndices = buildDataToClientMap(this.#columnMap, this.dataMap);\n this.#data = data.map<DataSourceRow>(toDataSourceRow(this.key));\n\n this.config = {\n ...this._config,\n aggregations: aggregations || this._config.aggregations,\n baseFilterSpec,\n columns,\n filterSpec: filterSpec || this._config.filterSpec,\n groupBy: groupBy || this._config.groupBy,\n sort: sort || this._config.sort,\n };\n\n debug?.(`columnMap: ${JSON.stringify(this.#columnMap)}`);\n }\n\n async subscribe(\n {\n viewport = this.viewport ?? (this.viewport = uuid()),\n columns,\n aggregations,\n baseFilterSpec,\n range,\n selectedIndexValues,\n selectedKeyValues,\n sort,\n groupBy,\n filterSpec,\n }: DataSourceSubscribeProps,\n callback: DataSourceSubscribeCallback,\n ) {\n this.clientCallback = callback;\n this.viewport = viewport;\n this.#status = \"subscribed\";\n this.selectedRows =\n selectedIndexValues ??\n this.convertKeysToIndexValues(selectedKeyValues) ??\n [];\n this.#selectedRowsCount = selectionCount(this.selectedRows);\n this.lastRangeServed = { from: 0, to: 0 };\n\n let config = this._config;\n\n // if (range) {\n // this.setRange(range);\n // }\n const hasConfigProps =\n aggregations || columns || filterSpec || groupBy || sort;\n\n if (hasConfigProps) {\n config = {\n ...config,\n aggregations: aggregations || this._config.aggregations,\n baseFilterSpec: baseFilterSpec || this._config.baseFilterSpec,\n columns: columns || this._config.columns,\n filterSpec: filterSpec || this._config.filterSpec,\n groupBy: groupBy || this._config.groupBy,\n sort: sort || this._config.sort,\n };\n }\n\n const subscribedMessage: DataSourceSubscribedMessage = {\n ...config,\n type: \"subscribed\",\n clientViewportId: this.viewport,\n range: this.#range,\n tableSchema: this.tableSchema,\n };\n this.clientCallback?.(subscribedMessage);\n this.emit(\"subscribed\", subscribedMessage);\n\n if (hasConfigProps) {\n // invoke setter to action config\n this.config = config;\n } else {\n this.sendSizeUpdateToClient();\n if (range && !this.#range.equals(range)) {\n this.range = range;\n } else if (this.#range !== NULL_RANGE) {\n this.sendRowsToClient();\n }\n\n if (this.range.to !== 0) {\n const pageCount = Math.ceil(\n this.size / (this.range.to - this.range.from),\n );\n this.emit(\"page-count\", pageCount);\n }\n }\n }\n\n unsubscribe() {\n this.clientCallback = undefined;\n this.#status = \"unsubscribed\";\n this.emit(\"unsubscribed\", this.viewport);\n }\n\n suspend() {\n if (this.#status !== \"unsubscribed\") {\n info?.(`suspend #${this.viewport}, current status ${this.#status}`);\n this.#status = \"suspended\";\n this.emit(\"suspended\", this.viewport);\n }\n }\n\n resume(callback?: DataSourceSubscribeCallback) {\n const isSuspended = this.#status === \"suspended\";\n info?.(`resume #${this.viewport}, current status ${this.#status}`);\n if (callback) {\n this.clientCallback = callback;\n }\n\n if (isSuspended) {\n this.#status = \"subscribed\";\n }\n this.emit(\"resumed\", this.viewport);\n\n this.sendRowsToClient(true);\n }\n\n disable() {\n this.emit(\"disabled\", this.viewport);\n }\n\n enable() {\n this.emit(\"enabled\", this.viewport);\n }\n\n select(selected: Selection) {\n this.#selectedRowsCount = selectionCount(selected);\n debug?.(`select ${JSON.stringify(selected)}`);\n this.selectedRows = selected;\n this.setRange(this.#range, true);\n this.emit(\"row-selection\", selected, this.#selectedRowsCount);\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.openTreeNodes.push(key);\n this.processedData = expandGroup(\n this.openTreeNodes,\n this.#data,\n this._config.groupBy,\n this.#columnMap,\n this.groupMap as GroupMap,\n this.processedData as DataSourceRow[],\n );\n this.setRange(this.#range.reset, true);\n }\n\n closeTreeNode(keyOrIndex: string | number) {\n const key = this.getRowKey(keyOrIndex);\n this.openTreeNodes = this.openTreeNodes.filter((value) => value !== key);\n if (this.processedData) {\n this.processedData = collapseGroup(key, this.processedData);\n this.setRange(this.#range.reset, true);\n }\n }\n\n get pageSize() {\n return this.#range.to - this.#range.from;\n }\n\n get links() {\n return this.#links;\n }\n\n set links(links: LinkDescriptorWithLabel[] | undefined) {\n this.#links = links;\n }\n\n get menu() {\n return this._menu;\n }\n\n get status() {\n return this.#status;\n }\n\n get data() {\n return this.#data;\n }\n\n // Only used by the UpdateGenerator\n get currentData() {\n return this.processedData ?? this.#data;\n }\n\n get table() {\n return this.tableSchema.table;\n }\n\n get config() {\n return this._config;\n }\n\n set config(config: WithBaseFilter<WithFullConfig>) {\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n if (config) {\n const originalConfig = this._config;\n const newConfig: DataSourceConfig =\n config?.filterSpec?.filter &&\n config?.filterSpec.filterStruct === undefined\n ? {\n ...config,\n filterSpec: {\n filter: config.filterSpec.filter,\n filterStruct: parseFilter(config.filterSpec.filter),\n },\n }\n : config;\n\n this._config = withConfigDefaults(newConfig);\n\n let processedData: DataSourceRow[] | undefined;\n if (hasFilter(config) || hasBaseFilter(config)) {\n const fn = this.getFilterPredicate();\n processedData = this.#data.filter(fn);\n }\n\n if (hasSort(config)) {\n processedData = sortRows(\n processedData ?? this.#data,\n config.sort,\n this.#columnMap,\n );\n }\n\n if (\n this.openTreeNodes.length > 0 &&\n isGroupByChanged(originalConfig, config)\n ) {\n if (this._config.groupBy.length === 0) {\n this.openTreeNodes.length = 0;\n } else {\n //TODO purge any openTreeNodes for a no-longer-present groupBy col\n }\n }\n\n if (hasGroupBy(config)) {\n const [groupedData, groupMap] = groupRows(\n processedData ?? this.#data,\n config.groupBy,\n this.#columnMap,\n );\n this.groupMap = groupMap;\n processedData = groupedData;\n\n if (this.openTreeNodes.length > 0) {\n processedData = expandGroup(\n this.openTreeNodes,\n this.#data,\n this._config.groupBy,\n this.#columnMap,\n this.groupMap as GroupMap,\n processedData as DataSourceRow[],\n );\n }\n }\n if (processedData) {\n this.processedData = this.indexProcessedData(processedData);\n } else {\n this.processedData = undefined;\n }\n }\n\n if (this.#status === \"subscribed\") {\n this.sendSizeUpdateToClient();\n if (this.preserveScrollPositionAcrossConfigChange) {\n this.preserveScrollPositionAcrossConfigChange = false;\n } else {\n this.setRange(this.#range.reset, true);\n }\n if (\n configChanges.filterChanged ||\n configChanges.baseFilterChanged ||\n configChanges.groupByChanged\n ) {\n this.emit(\"resize\", this.size);\n }\n this.emit(\"config\", this._config, this.range, undefined, configChanges);\n }\n }\n }\n\n private indexProcessedData(data: DataSourceRow[]) {\n // for (let i = 0; i < data.length; i++) {\n // data[i][0] = i;\n // data[i][1] = i;\n // }\n // return data;\n return data?.map((row, i) => {\n const dolly = row.slice() as DataSourceRow;\n dolly[0] = i;\n dolly[1] = i;\n return dolly;\n });\n }\n\n private getFilterPredicate() {\n const {\n filterSpec: { filterStruct },\n } = combineFilters(this._config);\n if (filterStruct) {\n return filterPredicate(this.#columnMap, filterStruct);\n } else {\n throw Error(\"filter must include filterStruct\");\n }\n }\n\n applyConfig(\n config: WithBaseFilter<DataSourceConfig>,\n preserveExistingConfigAttributes = false,\n ): DataSourceConfigChanges | undefined {\n const { noChanges, ...otherChanges } = isConfigChanged(\n this._config,\n config,\n );\n\n if (noChanges !== true) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filterSpec?.filter &&\n config?.filterSpec.filterStruct === undefined\n ? {\n ...config,\n filterSpec: {\n filter: config.filterSpec.filter,\n filterStruct: parseFilter(config.filterSpec.filter),\n },\n }\n : config;\n if (preserveExistingConfigAttributes) {\n this._config = {\n ...this._config,\n ...config,\n };\n } else {\n this._config = withConfigDefaults(newConfig);\n }\n return otherChanges;\n }\n }\n }\n\n get columnMap() {\n return this.#columnMap;\n }\n\n get selectedRowsCount() {\n return this.#selectedRowsCount;\n }\n\n get size() {\n return this.processedData?.length ?? this.#data.length;\n }\n\n get range() {\n return this.#range;\n }\n\n set range(range: Range) {\n this.setRange(range);\n }\n\n getRowAtIndex(rowIndex: number) {\n return this.processedData?.[rowIndex];\n }\n\n protected delete(row: VuuRowDataItemType[]) {\n console.log(`delete row ${row.join(\",\")}`);\n }\n\n protected insert = (row: VuuRowDataItemType[]) => {\n // TODO take sorting, filtering. grouping into account\n const dataSourceRow = toDataSourceRow(this.key)(row, this.size);\n (this.#data as DataSourceRow[]).push(dataSourceRow);\n const { from, to } = this.#range;\n const [rowIdx] = dataSourceRow;\n const isSorted = hasSort(this.config);\n const isFiltered = hasFilter(this.config) || hasBaseFilter(this.config);\n if (isSorted && isFiltered) {\n const meetsFilterCriteria = this.getFilterPredicate();\n if (meetsFilterCriteria(dataSourceRow)) {\n this.insertIntoSortedData(dataSourceRow);\n }\n } else if (isSorted) {\n this.insertIntoSortedData(dataSourceRow);\n } else if (isFiltered) {\n const fn = this.getFilterPredicate();\n if (fn(dataSourceRow)) {\n this.processedData?.push(dataSourceRow);\n this.sendSizeUpdateToClient();\n if (rowIdx >= from && rowIdx < to) {\n this.sendRowsToClient();\n }\n this.emit(\"resize\", this.#data.length);\n }\n } else {\n this.sendSizeUpdateToClient();\n if (rowIdx >= from && rowIdx < to) {\n this.sendRowsToClient();\n }\n this.emit(\"resize\", this.size);\n }\n };\n\n private insertIntoSortedData(row: DataSourceRow) {\n const indexedSortDefs = this.config.sort.sortDefs.map<ColIndexSortDef>(\n ({ column, sortType }) => [this.columnMap[column], sortType],\n );\n\n const comparator = sortComparator(indexedSortDefs);\n const insertPos = binarySearch(\n this.processedData as DataSourceRow[],\n row,\n comparator,\n );\n\n this.sendSizeUpdateToClient();\n\n if (insertPos === -1) {\n this.processedData?.unshift(row);\n // this.#keys.reset(this.#range);\n if (this.processedData) {\n // horribly inefficient\n this.processedData = this.indexProcessedData(this.processedData);\n }\n\n if (insertPos <= this.#range.to) {\n this.sendRowsToClient(true);\n }\n if (this.processedData) {\n this.emit(\"resize\", this.processedData.length);\n }\n } else {\n if (this.processedData) {\n this.emit(\"resize\", this.processedData.length);\n }\n }\n }\n\n private validateDataValue(columnName: string, value: VuuRowDataItemType) {\n const columnDescriptor = this.columnDescriptors.find(\n (col) => col.name === columnName,\n );\n if (columnDescriptor) {\n switch (columnDescriptor.serverDataType) {\n case \"int\":\n {\n if (typeof value === \"number\") {\n if (Math.floor(value) !== value) {\n throw Error(`${columnName} is int but value = ${value}`);\n }\n } else if (typeof value === \"string\") {\n const numericValue = parseFloat(value);\n if (Math.floor(numericValue) !== numericValue) {\n throw Error(`${columnName} is ${value} is not a valid integer`);\n }\n }\n }\n break;\n default:\n }\n } else {\n throw Error(`Unknown column ${columnName}`);\n }\n }\n\n protected updateDataItem = (\n keyValue: string,\n columnName: string,\n value: VuuRowDataItemType,\n ) => {\n this.validateDataValue(columnName, value);\n // TODO take sorting, filtering. grouping into account\n const colIndex = this.#columnMap[columnName];\n const dataColIndex = this.dataMap?.[columnName];\n const dataIndex = this.indexOfRowWithKey(keyValue);\n if (dataIndex !== -1 && dataColIndex !== undefined) {\n const dataSourceRow = this.#data[dataIndex];\n dataSourceRow[colIndex] = value;\n const { from, to } = this.#range;\n const [rowIdx] = dataSourceRow;\n if (rowIdx >= from && rowIdx < to) {\n this.sendRowsToClient(false, dataSourceRow);\n }\n }\n };\n\n private indexOfRowWithKey = (key: string) =>\n this.#data.findIndex((row) => row[KEY] === key);\n\n protected update = (row: VuuRowDataItemType[], columnName: string) => {\n // TODO take sorting, filtering. grouping into account\n const keyValue = row[this.key] as string;\n const dataColIndex = this.dataMap?.[columnName] as number;\n return this.updateDataItem(keyValue, columnName, row[dataColIndex]);\n };\n\n protected updateRow = (row: VuuRowDataItemType[]) => {\n // TODO take sorting, filtering. grouping into account\n const keyValue = row[this.key];\n const dataIndex = this.#data.findIndex((row) => row[KEY] === keyValue);\n if (dataIndex !== -1) {\n const dataSourceRow = toDataSourceRow(this.key)(row, dataIndex);\n // maybe update this in place\n this.#data[dataIndex] = dataSourceRow;\n const { from, to } = this.#range;\n if (dataIndex >= from && dataIndex < to) {\n this.sendRowsToClient(false, dataSourceRow);\n }\n }\n };\n\n deleteRow: DataSourceDeleteHandler = async (key) => {\n const dataIndex = this.#data.findIndex((row) => row[KEY] === key);\n let doomedIndex: number | undefined = undefined;\n\n if (dataIndex !== -1) {\n if (this.processedData) {\n for (let i = 0; i < this.processedData.length; i++) {\n if (this.processedData[i][KEY] === key) {\n doomedIndex = i;\n } else if (doomedIndex !== undefined) {\n this.processedData[i][0] -= 1;\n }\n }\n if (doomedIndex !== undefined) {\n this.processedData.splice(doomedIndex, 1);\n }\n }\n\n this.#data.splice(dataIndex, 1);\n for (let i = dataIndex; i < this.#data.length; i++) {\n this.#data[i][0] -= 1;\n }\n\n this.sendSizeUpdateToClient();\n\n const { from, to } = this.#range;\n const deletedIndex = doomedIndex ?? dataIndex;\n if (deletedIndex >= from && deletedIndex < to) {\n this.#keys.reset(this.range);\n this.sendRowsToClient(true);\n }\n\n this.emit(\"resize\", this.size);\n\n return true;\n } else {\n return \"row not found\";\n }\n };\n\n private setRange(range: Range, forceFullRefresh = false) {\n if (range.from !== this.#range.from || range.to !== this.#range.to) {\n const currentPageCount = Math.ceil(\n this.size / (this.#range.to - this.#range.from),\n );\n const newPageCount = Math.ceil(this.size / (range.to - range.from));\n\n this.#range = range;\n const keysResequenced = this.#keys.reset(range);\n this.sendRowsToClient(forceFullRefresh || keysResequenced);\n\n requestAnimationFrame(() => {\n // executed within RAF in case this is used to setState/trigger render in listening clients\n if (newPageCount !== currentPageCount) {\n this.emit(\"page-count\", newPageCount);\n }\n this.emit(\"range\", range);\n });\n } else if (forceFullRefresh) {\n this.sendRowsToClient(forceFullRefresh);\n }\n }\n\n sendSizeUpdateToClient() {\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"size-only\",\n type: \"viewport-update\",\n size: this.processedData ? this.processedData.length : this.#data.length,\n });\n }\n\n sendRowsToClient(forceFullRefresh = false, row?: DataSourceRow) {\n if (row) {\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"update\",\n rows: [\n toClientRow(row, this.#keys, this.selectedRows, this.dataIndices),\n ],\n type: \"viewport-update\",\n });\n } else {\n const rowRange =\n this.rangeChangeRowset === \"delta\" && !forceFullRefresh\n ? rangeNewItems(this.lastRangeServed, this.#range)\n : this.#range;\n const data = this.processedData ?? this.#data;\n\n const rowsWithinViewport = data\n .slice(rowRange.from, rowRange.to)\n .map((row) =>\n toClientRow(row, this.#keys, this.selectedRows, this.dataIndices),\n );\n\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n range: this.#range,\n rows: rowsWithinViewport,\n size: data.length,\n type: \"viewport-update\",\n });\n this.lastRangeServed = {\n from: this.#range.from,\n to: this.#range.to,\n // to: Math.min(\n // this.#range.to,\n // this.#range.from + rowsWithinViewport.length,\n // ),\n };\n // console.log(\n // `%c[ArrayDataSource] lastRangeServed (${this.lastRangeServed.from}:${this.lastRangeServed.to})`,\n // \"color:green;font-weight:bold;\",\n // );\n }\n }\n\n get columns() {\n return this._config.columns;\n }\n\n set columns(columns: string[]) {\n const addedColumns = getAddedItems(this.config.columns, columns);\n if (addedColumns.length > 0) {\n const columnsWithoutDescriptors = getMissingItems(\n this.columnDescriptors,\n addedColumns,\n (col) => col.name,\n );\n console.warn(`columnsWithoutDescriptors`, {\n columnsWithoutDescriptors,\n });\n }\n this.#columnMap = buildColumnMap(columns);\n this.dataIndices = buildDataToClientMap(this.#columnMap, this.dataMap);\n\n this.config = {\n ...this._config,\n columns,\n };\n }\n\n get aggregations() {\n return this._config.aggregations;\n }\n\n set aggregations(aggregations: VuuAggregation[]) {\n this._config = {\n ...this._config,\n aggregations,\n };\n\n const targetData = this.processedData ?? this.#data;\n const leafData = this.#data;\n\n aggregateData(\n aggregations,\n targetData,\n this._config.groupBy,\n leafData,\n this.#columnMap,\n this.groupMap as GroupMap,\n );\n this.setRange(this.#range.reset, true);\n\n this.emit(\"config\", this._config, this.range);\n }\n\n get sort() {\n return this._config.sort;\n }\n\n set sort(sort: VuuSort) {\n debug?.(`sort ${JSON.stringify(sort)}`);\n this.config = {\n ...this._config,\n sort,\n };\n }\n\n get baseFilter() {\n return this._config.baseFilterSpec;\n }\n\n set baseFilter(baseFilter: DataSourceFilter | undefined) {\n debug?.(`baseFilter ${JSON.stringify(baseFilter)}`);\n // TODO check that baseFilter has changed\n this.config = {\n ...this._config,\n baseFilterSpec: baseFilter,\n };\n }\n\n get filter() {\n return this._config.filterSpec;\n }\n\n set filter(filter: DataSourceFilter) {\n debug?.(`filter ${JSON.stringify(filter)}`);\n // TODO check that filter has changed\n this.config = {\n ...this._config,\n filterSpec: filter,\n };\n }\n\n get groupBy() {\n return this._config.groupBy;\n }\n\n set groupBy(groupBy: VuuGroupBy) {\n this.config = {\n ...this._config,\n groupBy,\n };\n }\n\n get title() {\n return this.#title ?? `${this.table.module} ${this.table.table}`;\n }\n\n set title(title: string) {\n this.#title = title;\n this.emit(\"title-changed\", this.viewport, title);\n }\n\n get _clientCallback() {\n return this.clientCallback;\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 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 async remoteProcedureCall<T extends VuuRpcResponse = VuuRpcResponse>() {\n return Promise.reject<T>();\n }\n\n async editRpcCall(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n rpcRequest: Omit<VuuRpcEditRequest, \"vpId\">,\n ): Promise<VuuRpcEditResponse> {\n throw Error(\"ArrayDataSource does not implement editRpcCall\");\n }\n\n async menuRpcCall(\n rpcRequest: Omit<VuuRpcRequest, \"vpId\">,\n ): Promise<VuuRpcResponse> {\n return new Promise((resolve) => {\n if (isEditCellRequest(rpcRequest)) {\n const { rowKey, field, value } = rpcRequest;\n try {\n this.updateDataItem(rowKey, field, value);\n resolve({\n action: {\n type: \"VP_EDIT_SUCCESS\",\n },\n rpcName: \"VP_EDIT_CELL_RPC\",\n type: \"VIEW_PORT_MENU_RESP\",\n vpId: this.viewport,\n });\n } catch (error) {\n resolve({\n error: String(error),\n rpcName: \"VP_EDIT_CELL_RPC\",\n type: \"VIEW_PORT_MENU_REJ\",\n vpId: this.viewport,\n });\n }\n } else {\n throw Error(\"menuRpcCall invalid rpcRequest\");\n }\n });\n }\n\n private convertKeysToIndexValues(keys?: string[]) {\n if (Array.isArray(keys)) {\n const indexValues: number[] = [];\n keys.forEach((key) => {\n const rowIdx = this.indexOfRowWithKey(key);\n if (rowIdx !== -1) {\n indexValues.push(rowIdx);\n }\n });\n return indexValues;\n }\n }\n\n // All in BaseDataSource\n freeze() {\n if (!this.isFrozen) {\n this.#freezeTimestamp = new Date().getTime();\n this.emit(\"freeze\", true, this.#freezeTimestamp);\n this.preserveScrollPositionAcrossConfigChange = true;\n this.baseFilter = {\n filter: `created < ${this.#freezeTimestamp}`,\n };\n } else {\n throw Error(\n \"[BaseDataSource] cannot freeze, dataSource is already frozen\",\n );\n }\n }\n unfreeze() {\n if (this.isFrozen) {\n const freezeTimestamp = this.#freezeTimestamp as number;\n this.#freezeTimestamp = undefined;\n this.emit(\"freeze\", false, freezeTimestamp);\n this.preserveScrollPositionAcrossConfigChange = true;\n this.baseFilter = {\n filter: \"\",\n };\n } else {\n throw Error(\n \"[BaseDataSource] cannot freeze, dataSource is already frozen\",\n );\n }\n }\n\n get freezeTimestamp() {\n return this.#freezeTimestamp;\n }\n\n get isFrozen() {\n return typeof this.#freezeTimestamp === \"number\";\n }\n}\n"],"names":["logger","metadataKeys","EventEmitter","vanillaConfig","KeySet","NULL_RANGE","Range","hasSort","hasFilter","hasBaseFilter","row","uuid","buildColumnMap","buildDataToClientMap","selectionCount","expandGroup","collapseGroup","parseFilter","withConfigDefaults","sortRows","isGroupByChanged","hasGroupBy","groupRows","combineFilters","filterPredicate","isConfigChanged","sortComparator","binarySearch","toClientRow","rangeNewItems","getAddedItems","getMissingItems","aggregateData","isEditCellRequest"],"mappings":"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"}
1
+ {"version":3,"file":"array-data-source.js","sources":["../../../../packages/vuu-data-local/src/array-data-source/array-data-source.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceConfig,\n DataSourceConstructorProps,\n DataSourceEvents,\n DataSourceFilter,\n DataSourceRow,\n DataSourceStatus,\n DataSourceSubscribedMessage,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n TableSchema,\n WithBaseFilter,\n WithFullConfig,\n DataSourceDeleteHandler,\n} from \"@vuu-ui/vuu-data-types\";\nimport { filterPredicate, parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport type {\n LinkDescriptorWithLabel,\n SelectRequest,\n SelectRowRangeRequest,\n SelectRowRequest,\n VuuAggregation,\n VuuColumns,\n VuuGroupBy,\n VuuMenu,\n VuuRange,\n VuuRowDataItemType,\n VuuRpcEditRequest,\n VuuRpcEditResponse,\n VuuRpcRequest,\n VuuRpcResponse,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport type { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n ColumnMap,\n DataSourceConfigChanges,\n EventEmitter,\n KeySet,\n NULL_RANGE,\n Range,\n buildColumnMap,\n combineFilters,\n getAddedItems,\n getMissingItems,\n hasBaseFilter,\n hasFilter,\n hasGroupBy,\n hasSort,\n isConfigChanged,\n isEditCellRequest,\n isGroupByChanged,\n logger,\n metadataKeys,\n rangeNewItems,\n uuid,\n vanillaConfig,\n withConfigDefaults,\n} from \"@vuu-ui/vuu-utils\";\nimport { aggregateData } from \"./aggregate-utils\";\nimport { buildDataToClientMap, toClientRow } from \"./array-data-utils\";\nimport { GroupMap, collapseGroup, expandGroup, groupRows } from \"./group-utils\";\nimport {\n binarySearch,\n ColIndexSortDef,\n sortComparator,\n sortRows,\n} from \"./sort-utils\";\n\nconst { debug, info } = logger(\"ArrayDataSource\");\n\nconst { KEY } = metadataKeys;\n\nexport interface ArrayDataSourceConstructorProps\n extends Omit<DataSourceConstructorProps, \"bufferSize\" | \"table\"> {\n columnDescriptors: ColumnDescriptor[];\n data: Array<VuuRowDataItemType[]>;\n dataMap?: ColumnMap;\n keyColumn?: string;\n rangeChangeRowset?: \"delta\" | \"full\";\n}\n\nconst toDataSourceRow =\n (indexOfKeyColumn: number, index?: Map<string, number>) =>\n (data: VuuRowDataItemType[], idx: number): DataSourceRow => {\n const key = `${data[indexOfKeyColumn]}`;\n index?.set(key, idx);\n return [\n idx,\n idx,\n true,\n false,\n 1,\n 0,\n key,\n 0,\n 0, // ts\n false, // isNew\n ...data,\n ];\n };\n\n// const isError = (err: unknown): err is { message: string } =>\n// typeof err === \"object\" && err !== null && err.hasOwnProperty(\"message\");\n\nconst buildTableSchema = (\n columns: ColumnDescriptor[],\n keyColumn?: string,\n): TableSchema => {\n const schema: TableSchema = {\n columns: columns.map(({ name, serverDataType = \"string\" }) => ({\n name,\n serverDataType,\n })),\n key: keyColumn ?? columns[0].name,\n table: { module: \"\", table: \"Array\" },\n };\n\n return schema;\n};\n\nexport class ArrayDataSource\n extends EventEmitter<DataSourceEvents>\n implements DataSource\n{\n private clientCallback: DataSourceSubscribeCallback | undefined;\n private columnDescriptors: ColumnDescriptor[];\n /** sorted offsets of data within raw data, reflecting sort order\n * of columns specified by client.\n */\n private dataIndices: number[] | undefined;\n /** Map reflecting positions of data items in raw data */\n private dataMap: ColumnMap | undefined;\n private groupMap: undefined | GroupMap;\n /** the index of key field within raw data row */\n private key: number;\n private lastRangeServed: VuuRange = { from: 0, to: 0 };\n private rangeChangeRowset: \"delta\" | \"full\";\n private openTreeNodes: string[] = [];\n // Experimental. There are some config changes - first concrete example is baseFilter applied to\n // 'freeze' data, that should not immediately affect the displayed data, therefore not cause\n // range reset.\n private preserveScrollPositionAcrossConfigChange = false;\n\n /** Map reflecting positions of columns in client data sent to user */\n #columnMap: ColumnMap;\n protected _config: WithBaseFilter<WithFullConfig> & {\n visualLink?: LinkDescriptorWithLabel;\n } = vanillaConfig;\n #data: DataSourceRow[];\n #freezeTimestamp: number | undefined = undefined;\n #keys = new KeySet(NULL_RANGE);\n #links: LinkDescriptorWithLabel[] | undefined;\n #range = Range(0, 0);\n #status: DataSourceStatus = \"initialising\";\n #title: string | undefined;\n\n protected _menu: VuuMenu | undefined;\n protected selectedRows = new Set<string>();\n protected index = new Map<string, number>();\n\n public tableSchema: TableSchema;\n public viewport: string;\n\n protected processedData: DataSourceRow[] | undefined = undefined;\n\n constructor({\n aggregations,\n baseFilterSpec,\n // different from RemoteDataSource\n columnDescriptors,\n data,\n dataMap,\n filterSpec,\n groupBy,\n keyColumn,\n rangeChangeRowset = \"delta\",\n sort,\n title,\n viewport,\n }: ArrayDataSourceConstructorProps) {\n super();\n if (!data || !columnDescriptors) {\n throw Error(\n \"ArrayDataSource constructor called without data or without columnDescriptors\",\n );\n }\n\n this.columnDescriptors = columnDescriptors;\n this.dataMap = dataMap;\n this.key = keyColumn\n ? this.columnDescriptors.findIndex((col) => col.name === keyColumn)\n : 0;\n this.rangeChangeRowset = rangeChangeRowset;\n this.tableSchema = buildTableSchema(columnDescriptors, keyColumn);\n this.viewport = viewport || uuid();\n this.#title = title;\n\n const columns = columnDescriptors.map((col) => col.name);\n this.#columnMap = buildColumnMap(columns);\n this.dataIndices = buildDataToClientMap(this.#columnMap, this.dataMap);\n this.#data = data.map<DataSourceRow>(toDataSourceRow(this.key, this.index));\n\n this.config = {\n ...this._config,\n aggregations: aggregations || this._config.aggregations,\n baseFilterSpec,\n columns,\n filterSpec: filterSpec || this._config.filterSpec,\n groupBy: groupBy || this._config.groupBy,\n sort: sort || this._config.sort,\n };\n\n debug?.(`columnMap: ${JSON.stringify(this.#columnMap)}`);\n }\n\n async subscribe(\n {\n viewport = this.viewport ?? (this.viewport = uuid()),\n columns,\n aggregations,\n baseFilterSpec,\n range,\n // selectedIndexValues,\n // selectedKeyValues,\n sort,\n groupBy,\n filterSpec,\n }: DataSourceSubscribeProps,\n callback: DataSourceSubscribeCallback,\n ) {\n this.clientCallback = callback;\n this.viewport = viewport;\n this.#status = \"subscribed\";\n // this.selectedRows =\n // selectedIndexValues ??\n // this.convertKeysToIndexValues(selectedKeyValues) ??\n // [];\n // this.#selectedRowsCount = selectionCount(this.selectedRows);\n this.lastRangeServed = { from: 0, to: 0 };\n\n let config = this._config;\n\n const hasConfigProps =\n aggregations || columns || filterSpec || groupBy || sort;\n\n if (hasConfigProps) {\n config = {\n ...config,\n aggregations: aggregations || this._config.aggregations,\n baseFilterSpec: baseFilterSpec || this._config.baseFilterSpec,\n columns: columns || this._config.columns,\n filterSpec: filterSpec || this._config.filterSpec,\n groupBy: groupBy || this._config.groupBy,\n sort: sort || this._config.sort,\n };\n }\n\n const subscribedMessage: DataSourceSubscribedMessage = {\n ...config,\n type: \"subscribed\",\n clientViewportId: this.viewport,\n range: this.#range,\n tableSchema: this.tableSchema,\n };\n this.clientCallback?.(subscribedMessage);\n this.emit(\"subscribed\", subscribedMessage);\n\n if (hasConfigProps) {\n // invoke setter to action config\n this.config = config;\n } else {\n this.sendSizeUpdateToClient();\n if (range && !this.#range.equals(range)) {\n this.range = range;\n } else if (this.#range !== NULL_RANGE) {\n this.sendRowsToClient();\n }\n\n if (this.range.to !== 0) {\n const pageCount = Math.ceil(\n this.size / (this.range.to - this.range.from),\n );\n this.emit(\"page-count\", pageCount);\n }\n }\n }\n\n unsubscribe() {\n this.clientCallback = undefined;\n this.#status = \"unsubscribed\";\n this.emit(\"unsubscribed\", this.viewport);\n }\n\n suspend() {\n if (this.#status !== \"unsubscribed\") {\n info?.(`suspend #${this.viewport}, current status ${this.#status}`);\n this.#status = \"suspended\";\n this.emit(\"suspended\", this.viewport);\n }\n }\n\n resume(callback?: DataSourceSubscribeCallback) {\n const isSuspended = this.#status === \"suspended\";\n info?.(`resume #${this.viewport}, current status ${this.#status}`);\n if (callback) {\n this.clientCallback = callback;\n }\n\n if (isSuspended) {\n this.#status = \"subscribed\";\n }\n this.emit(\"resumed\", this.viewport);\n\n this.sendRowsToClient(true);\n }\n\n disable() {\n this.emit(\"disabled\", this.viewport);\n }\n\n enable() {\n this.emit(\"enabled\", this.viewport);\n }\n\n select(selectRequest: Omit<SelectRequest, \"vpId\">) {\n switch (selectRequest.type) {\n case \"SELECT_ROW\": {\n const { preserveExistingSelection, rowKey } = selectRequest as Omit<\n SelectRowRequest,\n \"vpId\"\n >;\n if (!preserveExistingSelection) {\n this.selectedRows.clear();\n }\n this.selectedRows.add(rowKey);\n break;\n }\n case \"DESELECT_ROW\": {\n const { preserveExistingSelection, rowKey } = selectRequest as Omit<\n SelectRowRequest,\n \"vpId\"\n >;\n if (!preserveExistingSelection) {\n this.selectedRows.clear();\n } else {\n this.selectedRows.delete(rowKey);\n }\n break;\n }\n case \"SELECT_ROW_RANGE\": {\n const { preserveExistingSelection, fromRowKey, toRowKey } =\n selectRequest as Omit<SelectRowRangeRequest, \"vpId\">;\n\n if (!preserveExistingSelection) {\n this.selectedRows.clear();\n }\n\n const fromIdx = this.index.get(fromRowKey);\n const toIdx = this.index.get(toRowKey);\n if (typeof fromIdx === \"number\" && typeof toIdx === \"number\") {\n for (let i = fromIdx; i <= toIdx; i++) {\n const { [KEY]: rowKey } = this.#data[i];\n this.selectedRows.add(rowKey);\n }\n }\n\n break;\n }\n case \"SELECT_ALL\": {\n this.selectedRows.clear();\n this.selectedRows.add(\"*\");\n break;\n }\n case \"DESELECT_ALL\": {\n this.selectedRows.clear();\n break;\n }\n }\n\n this.setRange(this.#range, true);\n this.emit(\"row-selection\", this.selectedRows.size);\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.openTreeNodes.push(key);\n this.processedData = expandGroup(\n this.openTreeNodes,\n this.#data,\n this._config.groupBy,\n this.#columnMap,\n this.groupMap as GroupMap,\n this.processedData as DataSourceRow[],\n );\n this.setRange(this.#range.reset, true);\n }\n\n closeTreeNode(keyOrIndex: string | number) {\n const key = this.getRowKey(keyOrIndex);\n this.openTreeNodes = this.openTreeNodes.filter((value) => value !== key);\n if (this.processedData) {\n this.processedData = collapseGroup(key, this.processedData);\n this.setRange(this.#range.reset, true);\n }\n }\n\n get pageSize() {\n return this.#range.to - this.#range.from;\n }\n\n get links() {\n return this.#links;\n }\n\n set links(links: LinkDescriptorWithLabel[] | undefined) {\n this.#links = links;\n }\n\n get menu() {\n return this._menu;\n }\n\n get status() {\n return this.#status;\n }\n\n get data() {\n return this.#data;\n }\n\n // Only used by the UpdateGenerator\n get currentData() {\n return this.processedData ?? this.#data;\n }\n\n get table() {\n return this.tableSchema.table;\n }\n\n get columns() {\n return this._config.columns;\n }\n\n set columns(columns: string[]) {\n this.config = {\n ...this._config,\n columns,\n };\n }\n\n get config() {\n return this._config;\n }\n\n set config(config: WithBaseFilter<WithFullConfig>) {\n const originalConfig = this._config;\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filterSpec?.filter &&\n config?.filterSpec.filterStruct === undefined\n ? {\n ...config,\n filterSpec: {\n filter: config.filterSpec.filter,\n filterStruct: parseFilter(config.filterSpec.filter),\n },\n }\n : config;\n\n this._config = withConfigDefaults(newConfig);\n\n let processedData: DataSourceRow[] | undefined;\n if (hasFilter(config) || hasBaseFilter(config)) {\n const fn = this.getFilterPredicate();\n processedData = this.#data.filter(fn);\n }\n\n if (configChanges.columnsChanged) {\n this.processNewColumns(originalConfig.columns, config.columns);\n }\n\n if (hasSort(config)) {\n processedData = sortRows(\n processedData ?? this.#data,\n config.sort,\n this.#columnMap,\n );\n }\n\n if (\n this.openTreeNodes.length > 0 &&\n isGroupByChanged(originalConfig, config)\n ) {\n if (this._config.groupBy.length === 0) {\n this.openTreeNodes.length = 0;\n } else {\n //TODO purge any openTreeNodes for a no-longer-present groupBy col\n }\n }\n\n if (hasGroupBy(config)) {\n const [groupedData, groupMap] = groupRows(\n processedData ?? this.#data,\n config.groupBy,\n this.#columnMap,\n );\n this.groupMap = groupMap;\n processedData = groupedData;\n\n if (this.openTreeNodes.length > 0) {\n processedData = expandGroup(\n this.openTreeNodes,\n this.#data,\n this._config.groupBy,\n this.#columnMap,\n this.groupMap as GroupMap,\n processedData as DataSourceRow[],\n );\n }\n }\n if (processedData) {\n this.processedData = this.indexProcessedData(processedData);\n } else {\n this.processedData = undefined;\n }\n }\n\n if (this.#status === \"subscribed\") {\n this.sendSizeUpdateToClient();\n if (this.preserveScrollPositionAcrossConfigChange) {\n this.preserveScrollPositionAcrossConfigChange = false;\n } else {\n this.setRange(this.#range.reset, true);\n }\n if (\n configChanges.filterChanged ||\n configChanges.baseFilterChanged ||\n configChanges.groupByChanged\n ) {\n this.emit(\"resize\", this.size);\n }\n this.emit(\"config\", this._config, this.range, undefined, configChanges);\n }\n }\n }\n\n private processNewColumns(originalColumns: VuuColumns, columns: VuuColumns) {\n const addedColumns = getAddedItems(originalColumns, columns);\n if (addedColumns.length > 0) {\n const columnsWithoutDescriptors = getMissingItems(\n this.columnDescriptors,\n addedColumns,\n (col) => col.name,\n );\n console.warn(`columnsWithoutDescriptors`, {\n columnsWithoutDescriptors,\n });\n }\n this.#columnMap = buildColumnMap(columns);\n this.dataIndices = buildDataToClientMap(this.#columnMap, this.dataMap);\n }\n\n private indexProcessedData(data: DataSourceRow[]) {\n // for (let i = 0; i < data.length; i++) {\n // data[i][0] = i;\n // data[i][1] = i;\n // }\n // return data;\n return data?.map((row, i) => {\n const dolly = row.slice() as DataSourceRow;\n dolly[0] = i;\n dolly[1] = i;\n return dolly;\n });\n }\n\n private getFilterPredicate() {\n const {\n filterSpec: { filterStruct },\n } = combineFilters(this._config);\n if (filterStruct) {\n return filterPredicate(this.#columnMap, filterStruct);\n } else {\n throw Error(\"filter must include filterStruct\");\n }\n }\n\n applyConfig(\n config: WithBaseFilter<DataSourceConfig>,\n preserveExistingConfigAttributes = false,\n ): DataSourceConfigChanges | undefined {\n const { noChanges, ...otherChanges } = isConfigChanged(\n this._config,\n config,\n );\n\n if (noChanges !== true) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filterSpec?.filter &&\n config?.filterSpec.filterStruct === undefined\n ? {\n ...config,\n filterSpec: {\n filter: config.filterSpec.filter,\n filterStruct: parseFilter(config.filterSpec.filter),\n },\n }\n : config;\n if (preserveExistingConfigAttributes) {\n this._config = {\n ...this._config,\n ...config,\n };\n } else {\n this._config = withConfigDefaults(newConfig);\n }\n return otherChanges;\n }\n }\n }\n\n get columnMap() {\n return this.#columnMap;\n }\n\n get selectedRowsCount() {\n return this.selectedRows.size;\n }\n\n get size() {\n return this.processedData?.length ?? this.#data.length;\n }\n\n get range() {\n return this.#range;\n }\n\n set range(range: Range) {\n this.setRange(range);\n }\n\n getRowAtIndex(rowIndex: number) {\n return this.processedData?.[rowIndex];\n }\n\n protected delete(row: VuuRowDataItemType[]) {\n console.log(`delete row ${row.join(\",\")}`);\n }\n\n protected insert = (row: VuuRowDataItemType[]) => {\n // TODO take sorting, filtering. grouping into account\n const dataSourceRow = toDataSourceRow(this.key)(row, this.size);\n (this.#data as DataSourceRow[]).push(dataSourceRow);\n const { from, to } = this.#range;\n const [rowIdx] = dataSourceRow;\n const isSorted = hasSort(this.config);\n const isFiltered = hasFilter(this.config) || hasBaseFilter(this.config);\n if (isSorted && isFiltered) {\n const meetsFilterCriteria = this.getFilterPredicate();\n if (meetsFilterCriteria(dataSourceRow)) {\n this.insertIntoSortedData(dataSourceRow);\n }\n } else if (isSorted) {\n this.insertIntoSortedData(dataSourceRow);\n } else if (isFiltered) {\n const fn = this.getFilterPredicate();\n if (fn(dataSourceRow)) {\n this.processedData?.push(dataSourceRow);\n this.sendSizeUpdateToClient();\n if (rowIdx >= from && rowIdx < to) {\n this.sendRowsToClient();\n }\n this.emit(\"resize\", this.#data.length);\n }\n } else {\n this.sendSizeUpdateToClient();\n if (rowIdx >= from && rowIdx < to) {\n this.sendRowsToClient();\n }\n this.emit(\"resize\", this.size);\n }\n };\n\n private insertIntoSortedData(row: DataSourceRow) {\n const indexedSortDefs = this.config.sort.sortDefs.map<ColIndexSortDef>(\n ({ column, sortType }) => [this.columnMap[column], sortType],\n );\n\n const comparator = sortComparator(indexedSortDefs);\n const insertPos = binarySearch(\n this.processedData as DataSourceRow[],\n row,\n comparator,\n );\n\n this.sendSizeUpdateToClient();\n\n if (insertPos === -1) {\n this.processedData?.unshift(row);\n // this.#keys.reset(this.#range);\n if (this.processedData) {\n // horribly inefficient\n this.processedData = this.indexProcessedData(this.processedData);\n }\n\n if (insertPos <= this.#range.to) {\n this.sendRowsToClient(true);\n }\n if (this.processedData) {\n this.emit(\"resize\", this.processedData.length);\n }\n } else {\n if (this.processedData) {\n this.emit(\"resize\", this.processedData.length);\n }\n }\n }\n\n private validateDataValue(columnName: string, value: VuuRowDataItemType) {\n const columnDescriptor = this.columnDescriptors.find(\n (col) => col.name === columnName,\n );\n if (columnDescriptor) {\n switch (columnDescriptor.serverDataType) {\n case \"int\":\n {\n if (typeof value === \"number\") {\n if (Math.floor(value) !== value) {\n throw Error(`${columnName} is int but value = ${value}`);\n }\n } else if (typeof value === \"string\") {\n const numericValue = parseFloat(value);\n if (Math.floor(numericValue) !== numericValue) {\n throw Error(`${columnName} is ${value} is not a valid integer`);\n }\n }\n }\n break;\n default:\n }\n } else {\n throw Error(`Unknown column ${columnName}`);\n }\n }\n\n protected updateDataItem = (\n keyValue: string,\n columnName: string,\n value: VuuRowDataItemType,\n ) => {\n this.validateDataValue(columnName, value);\n // TODO take sorting, filtering. grouping into account\n const colIndex = this.#columnMap[columnName];\n const dataColIndex = this.dataMap?.[columnName];\n const dataIndex = this.indexOfRowWithKey(keyValue);\n if (dataIndex !== -1 && dataColIndex !== undefined) {\n const dataSourceRow = this.#data[dataIndex];\n dataSourceRow[colIndex] = value;\n const { from, to } = this.#range;\n const [rowIdx] = dataSourceRow;\n if (rowIdx >= from && rowIdx < to) {\n this.sendRowsToClient(false, dataSourceRow);\n }\n }\n };\n\n private indexOfRowWithKey = (key: string) =>\n this.#data.findIndex((row) => row[KEY] === key);\n\n protected update = (row: VuuRowDataItemType[], columnName: string) => {\n // TODO take sorting, filtering. grouping into account\n const keyValue = row[this.key] as string;\n const dataColIndex = this.dataMap?.[columnName] as number;\n return this.updateDataItem(keyValue, columnName, row[dataColIndex]);\n };\n\n protected updateRow = (row: VuuRowDataItemType[]) => {\n // TODO take sorting, filtering. grouping into account\n const keyValue = row[this.key];\n const dataIndex = this.#data.findIndex((row) => row[KEY] === keyValue);\n if (dataIndex !== -1) {\n const dataSourceRow = toDataSourceRow(this.key)(row, dataIndex);\n // maybe update this in place\n this.#data[dataIndex] = dataSourceRow;\n const { from, to } = this.#range;\n if (dataIndex >= from && dataIndex < to) {\n this.sendRowsToClient(false, dataSourceRow);\n }\n }\n };\n\n deleteRow: DataSourceDeleteHandler = async (key) => {\n const dataIndex = this.#data.findIndex((row) => row[KEY] === key);\n let doomedIndex: number | undefined = undefined;\n\n if (dataIndex !== -1) {\n if (this.processedData) {\n for (let i = 0; i < this.processedData.length; i++) {\n if (this.processedData[i][KEY] === key) {\n doomedIndex = i;\n } else if (doomedIndex !== undefined) {\n this.processedData[i][0] -= 1;\n }\n }\n if (doomedIndex !== undefined) {\n this.processedData.splice(doomedIndex, 1);\n }\n }\n\n this.#data.splice(dataIndex, 1);\n for (let i = dataIndex; i < this.#data.length; i++) {\n this.#data[i][0] -= 1;\n }\n\n this.sendSizeUpdateToClient();\n\n const { from, to } = this.#range;\n const deletedIndex = doomedIndex ?? dataIndex;\n if (deletedIndex >= from && deletedIndex < to) {\n this.#keys.reset(this.range);\n this.sendRowsToClient(true);\n }\n\n this.emit(\"resize\", this.size);\n\n return true;\n } else {\n return \"row not found\";\n }\n };\n\n private setRange(range: Range, forceFullRefresh = false) {\n if (range.from !== this.#range.from || range.to !== this.#range.to) {\n const currentPageCount = Math.ceil(\n this.size / (this.#range.to - this.#range.from),\n );\n const newPageCount = Math.ceil(this.size / (range.to - range.from));\n\n this.#range = range;\n const keysResequenced = this.#keys.reset(range);\n this.sendRowsToClient(forceFullRefresh || keysResequenced);\n\n requestAnimationFrame(() => {\n // executed within RAF in case this is used to setState/trigger render in listening clients\n if (newPageCount !== currentPageCount) {\n this.emit(\"page-count\", newPageCount);\n }\n this.emit(\"range\", range);\n });\n } else if (forceFullRefresh) {\n this.sendRowsToClient(forceFullRefresh);\n }\n }\n\n sendSizeUpdateToClient() {\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"size-only\",\n type: \"viewport-update\",\n size: this.processedData ? this.processedData.length : this.#data.length,\n });\n }\n\n sendRowsToClient(forceFullRefresh = false, row?: DataSourceRow) {\n if (row) {\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"update\",\n rows: [\n toClientRow(row, this.#keys, this.selectedRows, this.dataIndices),\n ],\n type: \"viewport-update\",\n });\n } else {\n const rowRange =\n this.rangeChangeRowset === \"delta\" && !forceFullRefresh\n ? rangeNewItems(this.lastRangeServed, this.#range)\n : this.#range;\n const data = this.processedData ?? this.#data;\n\n const rowsWithinViewport = data\n .slice(rowRange.from, rowRange.to)\n .map((row) =>\n toClientRow(row, this.#keys, this.selectedRows, this.dataIndices),\n );\n\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n range: this.#range,\n rows: rowsWithinViewport,\n size: data.length,\n type: \"viewport-update\",\n });\n this.lastRangeServed = {\n from: this.#range.from,\n to: this.#range.to,\n // to: Math.min(\n // this.#range.to,\n // this.#range.from + rowsWithinViewport.length,\n // ),\n };\n // console.log(\n // `%c[ArrayDataSource] lastRangeServed (${this.lastRangeServed.from}:${this.lastRangeServed.to})`,\n // \"color:green;font-weight:bold;\",\n // );\n }\n }\n\n get aggregations() {\n return this._config.aggregations;\n }\n\n set aggregations(aggregations: VuuAggregation[]) {\n this._config = {\n ...this._config,\n aggregations,\n };\n\n const targetData = this.processedData ?? this.#data;\n const leafData = this.#data;\n\n aggregateData(\n aggregations,\n targetData,\n this._config.groupBy,\n leafData,\n this.#columnMap,\n this.groupMap as GroupMap,\n );\n this.setRange(this.#range.reset, true);\n\n this.emit(\"config\", this._config, this.range);\n }\n\n get sort() {\n return this._config.sort;\n }\n\n set sort(sort: VuuSort) {\n debug?.(`sort ${JSON.stringify(sort)}`);\n this.config = {\n ...this._config,\n sort,\n };\n }\n\n get baseFilter() {\n return this._config.baseFilterSpec;\n }\n\n set baseFilter(baseFilter: DataSourceFilter | undefined) {\n debug?.(`baseFilter ${JSON.stringify(baseFilter)}`);\n // TODO check that baseFilter has changed\n this.config = {\n ...this._config,\n baseFilterSpec: baseFilter,\n };\n }\n\n get filter() {\n return this._config.filterSpec;\n }\n\n set filter(filter: DataSourceFilter) {\n debug?.(`filter ${JSON.stringify(filter)}`);\n // TODO check that filter has changed\n this.config = {\n ...this._config,\n filterSpec: filter,\n };\n }\n\n get groupBy() {\n return this._config.groupBy;\n }\n\n set groupBy(groupBy: VuuGroupBy) {\n this.config = {\n ...this._config,\n groupBy,\n };\n }\n\n get title() {\n return this.#title ?? `${this.table.module} ${this.table.table}`;\n }\n\n set title(title: string) {\n this.#title = title;\n this.emit(\"title-changed\", this.viewport, title);\n }\n\n get _clientCallback() {\n return this.clientCallback;\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 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 async remoteProcedureCall<T extends VuuRpcResponse = VuuRpcResponse>() {\n return Promise.reject<T>();\n }\n\n async editRpcCall(\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n rpcRequest: Omit<VuuRpcEditRequest, \"vpId\">,\n ): Promise<VuuRpcEditResponse> {\n throw Error(\"ArrayDataSource does not implement editRpcCall\");\n }\n\n async menuRpcCall(\n rpcRequest: Omit<VuuRpcRequest, \"vpId\">,\n ): Promise<VuuRpcResponse> {\n return new Promise((resolve) => {\n if (isEditCellRequest(rpcRequest)) {\n const { rowKey, field, value } = rpcRequest;\n try {\n this.updateDataItem(rowKey, field, value);\n resolve({\n action: {\n type: \"VP_EDIT_SUCCESS\",\n },\n rpcName: \"VP_EDIT_CELL_RPC\",\n type: \"VIEW_PORT_MENU_RESP\",\n vpId: this.viewport,\n });\n } catch (error) {\n resolve({\n error: String(error),\n rpcName: \"VP_EDIT_CELL_RPC\",\n type: \"VIEW_PORT_MENU_REJ\",\n vpId: this.viewport,\n });\n }\n } else {\n throw Error(\"menuRpcCall invalid rpcRequest\");\n }\n });\n }\n\n private convertKeysToIndexValues(keys?: string[]) {\n if (Array.isArray(keys)) {\n const indexValues: number[] = [];\n keys.forEach((key) => {\n const rowIdx = this.indexOfRowWithKey(key);\n if (rowIdx !== -1) {\n indexValues.push(rowIdx);\n }\n });\n return indexValues;\n }\n }\n\n // All in BaseDataSource\n freeze() {\n if (!this.isFrozen) {\n this.#freezeTimestamp = new Date().getTime();\n this.emit(\"freeze\", true, this.#freezeTimestamp);\n this.preserveScrollPositionAcrossConfigChange = true;\n this.baseFilter = {\n filter: `created < ${this.#freezeTimestamp}`,\n };\n } else {\n throw Error(\n \"[BaseDataSource] cannot freeze, dataSource is already frozen\",\n );\n }\n }\n unfreeze() {\n if (this.isFrozen) {\n const freezeTimestamp = this.#freezeTimestamp as number;\n this.#freezeTimestamp = undefined;\n this.emit(\"freeze\", false, freezeTimestamp);\n this.preserveScrollPositionAcrossConfigChange = true;\n this.baseFilter = {\n filter: \"\",\n };\n } else {\n throw Error(\n \"[BaseDataSource] cannot freeze, dataSource is already frozen\",\n );\n }\n }\n\n get freezeTimestamp() {\n return this.#freezeTimestamp;\n }\n\n get isFrozen() {\n return typeof this.#freezeTimestamp === \"number\";\n }\n}\n"],"names":["logger","metadataKeys","EventEmitter","vanillaConfig","KeySet","NULL_RANGE","Range","hasSort","hasFilter","hasBaseFilter","row","uuid","buildColumnMap","buildDataToClientMap","expandGroup","collapseGroup","parseFilter","withConfigDefaults","sortRows","isGroupByChanged","hasGroupBy","groupRows","getAddedItems","getMissingItems","combineFilters","filterPredicate","isConfigChanged","sortComparator","binarySearch","toClientRow","rangeNewItems","aggregateData","isEditCellRequest"],"mappings":"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"}
@@ -2,9 +2,10 @@
2
2
 
3
3
  var vuuUtils = require('@vuu-ui/vuu-utils');
4
4
 
5
- const { RENDER_IDX, SELECTED } = vuuUtils.metadataKeys;
6
- const toClientRow = (row, keys, selection, dataIndices) => {
5
+ const { KEY, RENDER_IDX, SELECTED } = vuuUtils.metadataKeys;
6
+ const toClientRow = (row, keys, selectedRows, dataIndices) => {
7
7
  const [rowIndex] = row;
8
+ const selectedAll = selectedRows.has("*");
8
9
  let clientRow;
9
10
  if (dataIndices) {
10
11
  const { count } = vuuUtils.metadataKeys;
@@ -13,7 +14,7 @@ const toClientRow = (row, keys, selection, dataIndices) => {
13
14
  clientRow = row.slice();
14
15
  }
15
16
  clientRow[RENDER_IDX] = keys.keyFor(rowIndex);
16
- clientRow[SELECTED] = vuuUtils.getSelectionStatus(selection, rowIndex);
17
+ clientRow[SELECTED] = selectedAll || selectedRows.has(row[KEY]) ? 1 : 0;
17
18
  return clientRow;
18
19
  };
19
20
  const divergentMaps = (columnMap, dataMap) => {
@@ -1 +1 @@
1
- {"version":3,"file":"array-data-utils.js","sources":["../../../../packages/vuu-data-local/src/array-data-source/array-data-utils.ts"],"sourcesContent":["import type { DataSourceRow, Selection } from \"@vuu-ui/vuu-data-types\";\nimport {\n ColumnMap,\n getSelectionStatus,\n KeySet,\n metadataKeys,\n} from \"@vuu-ui/vuu-utils\";\n\nconst { RENDER_IDX, SELECTED } = metadataKeys;\n\nexport const toClientRow = (\n row: DataSourceRow,\n keys: KeySet,\n selection: Selection,\n dataIndices?: number[],\n) => {\n const [rowIndex] = row;\n let clientRow;\n if (dataIndices) {\n // If client has specified a different ordering of columns from the way they are\n // ordered inn the underlying data, this is where we effect the ordering.\n const { count } = metadataKeys;\n clientRow = row\n .slice(0, count)\n .concat(dataIndices.map((idx) => row[idx])) as DataSourceRow;\n } else {\n clientRow = row.slice() as DataSourceRow;\n }\n clientRow[RENDER_IDX] = keys.keyFor(rowIndex);\n clientRow[SELECTED] = getSelectionStatus(selection, rowIndex);\n return clientRow;\n};\n\nconst divergentMaps = (columnMap: ColumnMap, dataMap?: ColumnMap) => {\n if (dataMap) {\n const { count: mapOffset } = metadataKeys;\n for (const [columnName, index] of Object.entries(columnMap)) {\n const dataIdx = dataMap[columnName];\n if (dataIdx === undefined) {\n throw Error(\n `ArrayDataSource column ${columnName} is not in underlying data set`,\n );\n } else if (dataIdx !== index - mapOffset) {\n return true;\n }\n }\n }\n return false;\n};\n\nconst getDataIndices = (columnMap: ColumnMap, dataMap: ColumnMap) => {\n const { count: mapOffset } = metadataKeys;\n const result: number[] = [];\n Object.entries(columnMap).forEach(([columnName]) => {\n result.push(dataMap[columnName] + mapOffset);\n });\n return result;\n};\n\nexport const buildDataToClientMap = (\n columnMap: ColumnMap,\n dataMap?: ColumnMap,\n): number[] | undefined => {\n if (dataMap && divergentMaps(columnMap, dataMap)) {\n return getDataIndices(columnMap, dataMap);\n }\n return undefined;\n};\n"],"names":["metadataKeys","getSelectionStatus"],"mappings":";;;;AAQA,MAAM,EAAE,UAAY,EAAA,QAAA,EAAa,GAAAA,qBAAA;AAE1B,MAAM,WAAc,GAAA,CACzB,GACA,EAAA,IAAA,EACA,WACA,WACG,KAAA;AACH,EAAM,MAAA,CAAC,QAAQ,CAAI,GAAA,GAAA;AACnB,EAAI,IAAA,SAAA;AACJ,EAAA,IAAI,WAAa,EAAA;AAGf,IAAM,MAAA,EAAE,OAAU,GAAAA,qBAAA;AAClB,IAAA,SAAA,GAAY,GACT,CAAA,KAAA,CAAM,CAAG,EAAA,KAAK,CACd,CAAA,MAAA,CAAO,WAAY,CAAA,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAI,CAAA,GAAG,CAAC,CAAC,CAAA;AAAA,GACvC,MAAA;AACL,IAAA,SAAA,GAAY,IAAI,KAAM,EAAA;AAAA;AAExB,EAAA,SAAA,CAAU,UAAU,CAAA,GAAI,IAAK,CAAA,MAAA,CAAO,QAAQ,CAAA;AAC5C,EAAA,SAAA,CAAU,QAAQ,CAAA,GAAIC,2BAAmB,CAAA,SAAA,EAAW,QAAQ,CAAA;AAC5D,EAAO,OAAA,SAAA;AACT;AAEA,MAAM,aAAA,GAAgB,CAAC,SAAA,EAAsB,OAAwB,KAAA;AACnE,EAAA,IAAI,OAAS,EAAA;AACX,IAAM,MAAA,EAAE,KAAO,EAAA,SAAA,EAAc,GAAAD,qBAAA;AAC7B,IAAA,KAAA,MAAW,CAAC,UAAY,EAAA,KAAK,KAAK,MAAO,CAAA,OAAA,CAAQ,SAAS,CAAG,EAAA;AAC3D,MAAM,MAAA,OAAA,GAAU,QAAQ,UAAU,CAAA;AAClC,MAAA,IAAI,YAAY,KAAW,CAAA,EAAA;AACzB,QAAM,MAAA,KAAA;AAAA,UACJ,0BAA0B,UAAU,CAAA,8BAAA;AAAA,SACtC;AAAA,OACF,MAAA,IAAW,OAAY,KAAA,KAAA,GAAQ,SAAW,EAAA;AACxC,QAAO,OAAA,IAAA;AAAA;AACT;AACF;AAEF,EAAO,OAAA,KAAA;AACT,CAAA;AAEA,MAAM,cAAA,GAAiB,CAAC,SAAA,EAAsB,OAAuB,KAAA;AACnE,EAAM,MAAA,EAAE,KAAO,EAAA,SAAA,EAAc,GAAAA,qBAAA;AAC7B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAA,CAAO,QAAQ,SAAS,CAAA,CAAE,QAAQ,CAAC,CAAC,UAAU,CAAM,KAAA;AAClD,IAAA,MAAA,CAAO,IAAK,CAAA,OAAA,CAAQ,UAAU,CAAA,GAAI,SAAS,CAAA;AAAA,GAC5C,CAAA;AACD,EAAO,OAAA,MAAA;AACT,CAAA;AAEa,MAAA,oBAAA,GAAuB,CAClC,SAAA,EACA,OACyB,KAAA;AACzB,EAAA,IAAI,OAAW,IAAA,aAAA,CAAc,SAAW,EAAA,OAAO,CAAG,EAAA;AAChD,IAAO,OAAA,cAAA,CAAe,WAAW,OAAO,CAAA;AAAA;AAE1C,EAAO,OAAA,KAAA,CAAA;AACT;;;;;"}
1
+ {"version":3,"file":"array-data-utils.js","sources":["../../../../packages/vuu-data-local/src/array-data-source/array-data-utils.ts"],"sourcesContent":["import type { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport { ColumnMap, KeySet, metadataKeys } from \"@vuu-ui/vuu-utils\";\n\nconst { KEY, RENDER_IDX, SELECTED } = metadataKeys;\n\nexport const toClientRow = (\n row: DataSourceRow,\n keys: KeySet,\n selectedRows: Set<string>,\n dataIndices?: number[],\n) => {\n const [rowIndex] = row;\n const selectedAll = selectedRows.has(\"*\");\n let clientRow;\n if (dataIndices) {\n // If client has specified a different ordering of columns from the way they are\n // ordered inn the underlying data, this is where we effect the ordering.\n const { count } = metadataKeys;\n clientRow = row\n .slice(0, count)\n .concat(dataIndices.map((idx) => row[idx])) as DataSourceRow;\n } else {\n clientRow = row.slice() as DataSourceRow;\n }\n clientRow[RENDER_IDX] = keys.keyFor(rowIndex);\n clientRow[SELECTED] = selectedAll || selectedRows.has(row[KEY]) ? 1 : 0;\n return clientRow;\n};\n\nconst divergentMaps = (columnMap: ColumnMap, dataMap?: ColumnMap) => {\n if (dataMap) {\n const { count: mapOffset } = metadataKeys;\n for (const [columnName, index] of Object.entries(columnMap)) {\n const dataIdx = dataMap[columnName];\n if (dataIdx === undefined) {\n throw Error(\n `ArrayDataSource column ${columnName} is not in underlying data set`,\n );\n } else if (dataIdx !== index - mapOffset) {\n return true;\n }\n }\n }\n return false;\n};\n\nconst getDataIndices = (columnMap: ColumnMap, dataMap: ColumnMap) => {\n const { count: mapOffset } = metadataKeys;\n const result: number[] = [];\n Object.entries(columnMap).forEach(([columnName]) => {\n result.push(dataMap[columnName] + mapOffset);\n });\n return result;\n};\n\nexport const buildDataToClientMap = (\n columnMap: ColumnMap,\n dataMap?: ColumnMap,\n): number[] | undefined => {\n if (dataMap && divergentMaps(columnMap, dataMap)) {\n return getDataIndices(columnMap, dataMap);\n }\n return undefined;\n};\n"],"names":["metadataKeys"],"mappings":";;;;AAGA,MAAM,EAAE,GAAA,EAAK,UAAY,EAAA,QAAA,EAAa,GAAAA,qBAAA;AAE/B,MAAM,WAAc,GAAA,CACzB,GACA,EAAA,IAAA,EACA,cACA,WACG,KAAA;AACH,EAAM,MAAA,CAAC,QAAQ,CAAI,GAAA,GAAA;AACnB,EAAM,MAAA,WAAA,GAAc,YAAa,CAAA,GAAA,CAAI,GAAG,CAAA;AACxC,EAAI,IAAA,SAAA;AACJ,EAAA,IAAI,WAAa,EAAA;AAGf,IAAM,MAAA,EAAE,OAAU,GAAAA,qBAAA;AAClB,IAAA,SAAA,GAAY,GACT,CAAA,KAAA,CAAM,CAAG,EAAA,KAAK,CACd,CAAA,MAAA,CAAO,WAAY,CAAA,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAI,CAAA,GAAG,CAAC,CAAC,CAAA;AAAA,GACvC,MAAA;AACL,IAAA,SAAA,GAAY,IAAI,KAAM,EAAA;AAAA;AAExB,EAAA,SAAA,CAAU,UAAU,CAAA,GAAI,IAAK,CAAA,MAAA,CAAO,QAAQ,CAAA;AAC5C,EAAU,SAAA,CAAA,QAAQ,IAAI,WAAe,IAAA,YAAA,CAAa,IAAI,GAAI,CAAA,GAAG,CAAC,CAAA,GAAI,CAAI,GAAA,CAAA;AACtE,EAAO,OAAA,SAAA;AACT;AAEA,MAAM,aAAA,GAAgB,CAAC,SAAA,EAAsB,OAAwB,KAAA;AACnE,EAAA,IAAI,OAAS,EAAA;AACX,IAAM,MAAA,EAAE,KAAO,EAAA,SAAA,EAAc,GAAAA,qBAAA;AAC7B,IAAA,KAAA,MAAW,CAAC,UAAY,EAAA,KAAK,KAAK,MAAO,CAAA,OAAA,CAAQ,SAAS,CAAG,EAAA;AAC3D,MAAM,MAAA,OAAA,GAAU,QAAQ,UAAU,CAAA;AAClC,MAAA,IAAI,YAAY,KAAW,CAAA,EAAA;AACzB,QAAM,MAAA,KAAA;AAAA,UACJ,0BAA0B,UAAU,CAAA,8BAAA;AAAA,SACtC;AAAA,OACF,MAAA,IAAW,OAAY,KAAA,KAAA,GAAQ,SAAW,EAAA;AACxC,QAAO,OAAA,IAAA;AAAA;AACT;AACF;AAEF,EAAO,OAAA,KAAA;AACT,CAAA;AAEA,MAAM,cAAA,GAAiB,CAAC,SAAA,EAAsB,OAAuB,KAAA;AACnE,EAAM,MAAA,EAAE,KAAO,EAAA,SAAA,EAAc,GAAAA,qBAAA;AAC7B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAA,CAAO,QAAQ,SAAS,CAAA,CAAE,QAAQ,CAAC,CAAC,UAAU,CAAM,KAAA;AAClD,IAAA,MAAA,CAAO,IAAK,CAAA,OAAA,CAAQ,UAAU,CAAA,GAAI,SAAS,CAAA;AAAA,GAC5C,CAAA;AACD,EAAO,OAAA,MAAA;AACT,CAAA;AAEa,MAAA,oBAAA,GAAuB,CAClC,SAAA,EACA,OACyB,KAAA;AACzB,EAAA,IAAI,OAAW,IAAA,aAAA,CAAc,SAAW,EAAA,OAAO,CAAG,EAAA;AAChD,IAAO,OAAA,cAAA,CAAe,WAAW,OAAO,CAAA;AAAA;AAE1C,EAAO,OAAA,KAAA,CAAA;AACT;;;;;"}
@@ -170,17 +170,27 @@ class JsonDataSource extends vuuUtils.EventEmitter {
170
170
  this.sendRowsToClient();
171
171
  });
172
172
  }
173
- select(selected) {
173
+ // TODO - finish this implementation
174
+ select(selectRequest) {
174
175
  const updatedRows = [];
175
- for (const row of __privateGet(this, _data)) {
176
- const { [IDX]: rowIndex, [SELECTED]: sel } = row;
177
- const wasSelected = sel === 1;
178
- const nowSelected = vuuUtils.isSelected(selected, rowIndex);
179
- if (nowSelected !== wasSelected) {
180
- const selectedRow = row.slice();
181
- selectedRow[SELECTED] = nowSelected ? 1 : 0;
182
- __privateGet(this, _data)[rowIndex] = selectedRow;
183
- updatedRows.push(selectedRow);
176
+ switch (selectRequest.type) {
177
+ case "SELECT_ROW": {
178
+ const { preserveExistingSelection, rowKey } = selectRequest;
179
+ for (const row of __privateGet(this, _data)) {
180
+ const { [IDX]: rowIndex, [KEY]: key, [SELECTED]: sel } = row;
181
+ if (sel === 1 && preserveExistingSelection === false && key !== rowKey) {
182
+ const deselectedRow = row.slice();
183
+ deselectedRow[SELECTED] = 0;
184
+ __privateGet(this, _data)[rowIndex] = deselectedRow;
185
+ updatedRows.push(deselectedRow);
186
+ } else if (key === rowKey) {
187
+ const selectedRow = row.slice();
188
+ selectedRow[SELECTED] = 1;
189
+ __privateGet(this, _data)[rowIndex] = selectedRow;
190
+ updatedRows.push(selectedRow);
191
+ }
192
+ }
193
+ break;
184
194
  }
185
195
  }
186
196
  if (updatedRows.length > 0) {