@vuu-ui/vuu-data-local 0.13.14 → 0.13.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/array-data-source/aggregate-utils.js.map +1 -1
- package/cjs/array-data-source/array-data-source.js +6 -1
- package/cjs/array-data-source/array-data-source.js.map +1 -1
- package/cjs/array-data-source/array-data-utils.js.map +1 -1
- package/cjs/array-data-source/group-utils.js.map +1 -1
- package/cjs/array-data-source/sort-utils.js.map +1 -1
- package/cjs/json-data-source/JsonDataSource.js.map +1 -1
- package/cjs/tree-data-source/IconProvider.js.map +1 -1
- package/cjs/tree-data-source/TreeDataSource.js.map +1 -1
- package/esm/array-data-source/aggregate-utils.js.map +1 -1
- package/esm/array-data-source/array-data-source.js +6 -1
- package/esm/array-data-source/array-data-source.js.map +1 -1
- package/esm/array-data-source/array-data-utils.js.map +1 -1
- package/esm/array-data-source/group-utils.js.map +1 -1
- package/esm/array-data-source/sort-utils.js.map +1 -1
- package/esm/json-data-source/JsonDataSource.js.map +1 -1
- package/esm/tree-data-source/IconProvider.js.map +1 -1
- package/esm/tree-data-source/TreeDataSource.js.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aggregate-utils.js","sources":["../../src/array-data-source/aggregate-utils.ts"],"sourcesContent":["import type { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuAggregation, VuuGroupBy } from \"@vuu-ui/vuu-protocol-types\";\nimport type { ColumnMap } from \"@vuu-ui/vuu-utils\";\nimport type { GroupMap, KeyList } from \"./group-utils\";\n\nexport const count = (arr: unknown[]) => arr.length;\n\nexport const aggregateData = (\n aggregations: VuuAggregation[],\n targetData: readonly DataSourceRow[],\n groupBy: VuuGroupBy,\n leafData: readonly DataSourceRow[],\n columnMap: ColumnMap,\n groupMap: GroupMap,\n) => {\n const aggType = aggregations[aggregations.length - 1].aggType;\n const groupIndices = groupBy.map<number>((column) => columnMap[column]);\n\n switch (aggType) {\n case 1:\n return aggregateSum(\n groupMap,\n leafData,\n columnMap,\n aggregations,\n targetData,\n groupIndices,\n );\n case 2:\n return aggregateAverage(\n groupMap,\n leafData,\n columnMap,\n aggregations,\n targetData,\n groupIndices,\n );\n case 3:\n return aggregateCount(\n groupMap,\n columnMap,\n aggregations,\n targetData,\n groupIndices,\n );\n case 4:\n return aggregateHigh(\n groupMap,\n leafData,\n columnMap,\n aggregations,\n targetData,\n groupIndices,\n );\n case 5:\n return aggregateLow(\n groupMap,\n leafData,\n columnMap,\n aggregations,\n targetData,\n groupIndices,\n );\n case 6:\n return aggregateDistinct(\n groupMap,\n leafData,\n columnMap,\n aggregations,\n targetData,\n groupIndices,\n );\n }\n};\n\nfunction aggregateCount(\n groupMap: GroupMap,\n columnMap: ColumnMap,\n aggregations: VuuAggregation[],\n targetData: readonly DataSourceRow[],\n groupIndices: number[],\n): { [key: string]: number } {\n const counts: { [key: string]: number } = {};\n const aggColumn = getAggColumn(columnMap, aggregations);\n\n function countRecursive(map: GroupMap | KeyList) {\n if (Array.isArray(map)) {\n return map.length;\n } else {\n let count = 0;\n for (const key in map) {\n count += 1 + countRecursive(map[key]);\n }\n return count;\n }\n }\n\n for (const key in groupMap) {\n const count = countRecursive(groupMap[key]);\n counts[key] = count;\n }\n\n for (let index = 0; index < targetData.length; index++) {\n for (const key in counts) {\n if (targetData[index][groupIndices[0]] === key) {\n targetData[index][aggColumn] = counts[key];\n }\n }\n }\n\n return counts;\n}\n\nfunction getAggColumn(columnMap: ColumnMap, aggregations: VuuAggregation[]) {\n const columnName = aggregations[aggregations.length - 1].column;\n const columnNumber = columnMap[columnName];\n return columnNumber;\n}\n\nfunction aggregateSum(\n groupMap: GroupMap,\n leafData: readonly DataSourceRow[],\n columnMap: ColumnMap,\n aggregations: VuuAggregation[],\n targetData: readonly DataSourceRow[],\n groupIndices: number[],\n): { [key: string]: number } {\n const sums: { [key: string]: number } = {};\n const aggColumn = getAggColumn(columnMap, aggregations);\n\n function sumRecursive(\n map: GroupMap | KeyList,\n leafData: readonly DataSourceRow[],\n aggColumn: number,\n ) {\n if (Array.isArray(map)) {\n let sum = 0;\n for (const key of map) {\n sum += Number(leafData[key][aggColumn]);\n }\n return sum;\n } else {\n let sum = 0;\n for (const key in map) {\n sum += sumRecursive(map[key], leafData, aggColumn);\n }\n return sum;\n }\n }\n\n for (const key in groupMap) {\n const sum = Number(sumRecursive(groupMap[key], leafData, aggColumn));\n sums[key] = sum;\n }\n\n for (let index = 0; index < targetData.length; index++) {\n for (const key in sums) {\n if (targetData[index][groupIndices[0]] === key) {\n targetData[index][aggColumn] = sums[key];\n }\n }\n }\n\n return sums;\n}\n\nfunction aggregateAverage(\n groupMap: GroupMap,\n leafData: readonly DataSourceRow[],\n columnMap: ColumnMap,\n aggregations: VuuAggregation[],\n targetData: readonly DataSourceRow[],\n groupIndices: number[],\n): { [key: string]: number } {\n const averages: { [key: string]: number } = {};\n const aggColumn = getAggColumn(columnMap, aggregations);\n\n const count = aggregateCount(\n groupMap,\n columnMap,\n aggregations,\n targetData,\n groupIndices,\n );\n const sum = aggregateSum(\n groupMap,\n leafData,\n columnMap,\n aggregations,\n targetData,\n groupIndices,\n );\n\n for (const key in count) {\n let average = 0;\n average = sum[key] / count[key];\n averages[key] = average;\n }\n\n for (let index = 0; index < targetData.length; index++) {\n for (const key in averages) {\n if (targetData[index][groupIndices[0]] === key) {\n targetData[index][aggColumn] = averages[key];\n }\n }\n }\n\n console.log(\"!!!! targetData\", targetData);\n console.log(\"!!!! averages\", averages);\n return averages;\n}\n\nfunction getLeafColumnData(\n map: GroupMap | KeyList,\n leafData: readonly DataSourceRow[],\n aggColumn: number,\n): number[] {\n const data: number[] = [];\n\n if (Array.isArray(map)) {\n for (const key of map) {\n data.push(leafData[key][aggColumn] as number);\n }\n } else {\n for (const key in map) {\n data.push(...getLeafColumnData(map[key], leafData, aggColumn));\n }\n }\n\n return data;\n}\n\nfunction aggregateDistinct(\n groupMap: GroupMap,\n leafData: readonly DataSourceRow[],\n columnMap: ColumnMap,\n aggregations: VuuAggregation[],\n targetData: readonly DataSourceRow[],\n groupIndices: number[],\n): { [key: string]: number } {\n const distincts: { [key: string]: number } = {};\n const aggColumn = getAggColumn(columnMap, aggregations);\n\n for (const key in groupMap) {\n const leafColumnData = getLeafColumnData(\n groupMap[key],\n leafData,\n aggColumn,\n );\n const distinct = [...new Set(leafColumnData)];\n\n distincts[key] = distinct.length;\n }\n\n for (let index = 0; index < targetData.length; index++) {\n for (const key in distincts) {\n if (targetData[index][groupIndices[0]] === key) {\n targetData[index][aggColumn] = distincts[key];\n }\n }\n }\n\n return distincts;\n}\n\nfunction aggregateHigh(\n groupMap: GroupMap,\n leafData: readonly DataSourceRow[],\n columnMap: ColumnMap,\n aggregations: VuuAggregation[],\n targetData: readonly DataSourceRow[],\n groupIndices: number[],\n): { [key: string]: number } {\n const highs: { [key: string]: number } = {};\n const aggColumn = getAggColumn(columnMap, aggregations);\n\n for (const key in groupMap) {\n const leafColumnData = getLeafColumnData(\n groupMap[key],\n leafData,\n aggColumn,\n );\n const maxNumber = Math.max(...leafColumnData);\n\n highs[key] = maxNumber;\n }\n for (let index = 0; index < targetData.length; index++) {\n for (const key in highs) {\n if (targetData[index][groupIndices[0]] === key) {\n targetData[index][aggColumn] = highs[key];\n }\n }\n }\n\n return highs;\n}\n\nfunction aggregateLow(\n groupMap: GroupMap,\n leafData: readonly DataSourceRow[],\n columnMap: ColumnMap,\n aggregations: VuuAggregation[],\n targetData: readonly DataSourceRow[],\n groupIndices: number[],\n): { [key: string]: number } {\n const mins: { [key: string]: number } = {};\n const aggColumn = getAggColumn(columnMap, aggregations);\n\n for (const key in groupMap) {\n const leafColumnData = getLeafColumnData(\n groupMap[key],\n leafData,\n aggColumn,\n );\n const minNumber = Math.min(...leafColumnData);\n mins[key] = minNumber;\n }\n\n for (let index = 0; index < targetData.length; index++) {\n for (const key in mins) {\n if (targetData[index][groupIndices[0]] === key) {\n targetData[index][aggColumn] = mins[key];\n }\n }\n }\n\n return mins;\n}\n"],"names":["count","leafData","aggColumn"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"aggregate-utils.js","sources":["../../../../packages/vuu-data-local/src/array-data-source/aggregate-utils.ts"],"sourcesContent":["import type { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuAggregation, VuuGroupBy } from \"@vuu-ui/vuu-protocol-types\";\nimport type { ColumnMap } from \"@vuu-ui/vuu-utils\";\nimport type { GroupMap, KeyList } from \"./group-utils\";\n\nexport const count = (arr: unknown[]) => arr.length;\n\nexport const aggregateData = (\n aggregations: VuuAggregation[],\n targetData: readonly DataSourceRow[],\n groupBy: VuuGroupBy,\n leafData: readonly DataSourceRow[],\n columnMap: ColumnMap,\n groupMap: GroupMap,\n) => {\n const aggType = aggregations[aggregations.length - 1].aggType;\n const groupIndices = groupBy.map<number>((column) => columnMap[column]);\n\n switch (aggType) {\n case 1:\n return aggregateSum(\n groupMap,\n leafData,\n columnMap,\n aggregations,\n targetData,\n groupIndices,\n );\n case 2:\n return aggregateAverage(\n groupMap,\n leafData,\n columnMap,\n aggregations,\n targetData,\n groupIndices,\n );\n case 3:\n return aggregateCount(\n groupMap,\n columnMap,\n aggregations,\n targetData,\n groupIndices,\n );\n case 4:\n return aggregateHigh(\n groupMap,\n leafData,\n columnMap,\n aggregations,\n targetData,\n groupIndices,\n );\n case 5:\n return aggregateLow(\n groupMap,\n leafData,\n columnMap,\n aggregations,\n targetData,\n groupIndices,\n );\n case 6:\n return aggregateDistinct(\n groupMap,\n leafData,\n columnMap,\n aggregations,\n targetData,\n groupIndices,\n );\n }\n};\n\nfunction aggregateCount(\n groupMap: GroupMap,\n columnMap: ColumnMap,\n aggregations: VuuAggregation[],\n targetData: readonly DataSourceRow[],\n groupIndices: number[],\n): { [key: string]: number } {\n const counts: { [key: string]: number } = {};\n const aggColumn = getAggColumn(columnMap, aggregations);\n\n function countRecursive(map: GroupMap | KeyList) {\n if (Array.isArray(map)) {\n return map.length;\n } else {\n let count = 0;\n for (const key in map) {\n count += 1 + countRecursive(map[key]);\n }\n return count;\n }\n }\n\n for (const key in groupMap) {\n const count = countRecursive(groupMap[key]);\n counts[key] = count;\n }\n\n for (let index = 0; index < targetData.length; index++) {\n for (const key in counts) {\n if (targetData[index][groupIndices[0]] === key) {\n targetData[index][aggColumn] = counts[key];\n }\n }\n }\n\n return counts;\n}\n\nfunction getAggColumn(columnMap: ColumnMap, aggregations: VuuAggregation[]) {\n const columnName = aggregations[aggregations.length - 1].column;\n const columnNumber = columnMap[columnName];\n return columnNumber;\n}\n\nfunction aggregateSum(\n groupMap: GroupMap,\n leafData: readonly DataSourceRow[],\n columnMap: ColumnMap,\n aggregations: VuuAggregation[],\n targetData: readonly DataSourceRow[],\n groupIndices: number[],\n): { [key: string]: number } {\n const sums: { [key: string]: number } = {};\n const aggColumn = getAggColumn(columnMap, aggregations);\n\n function sumRecursive(\n map: GroupMap | KeyList,\n leafData: readonly DataSourceRow[],\n aggColumn: number,\n ) {\n if (Array.isArray(map)) {\n let sum = 0;\n for (const key of map) {\n sum += Number(leafData[key][aggColumn]);\n }\n return sum;\n } else {\n let sum = 0;\n for (const key in map) {\n sum += sumRecursive(map[key], leafData, aggColumn);\n }\n return sum;\n }\n }\n\n for (const key in groupMap) {\n const sum = Number(sumRecursive(groupMap[key], leafData, aggColumn));\n sums[key] = sum;\n }\n\n for (let index = 0; index < targetData.length; index++) {\n for (const key in sums) {\n if (targetData[index][groupIndices[0]] === key) {\n targetData[index][aggColumn] = sums[key];\n }\n }\n }\n\n return sums;\n}\n\nfunction aggregateAverage(\n groupMap: GroupMap,\n leafData: readonly DataSourceRow[],\n columnMap: ColumnMap,\n aggregations: VuuAggregation[],\n targetData: readonly DataSourceRow[],\n groupIndices: number[],\n): { [key: string]: number } {\n const averages: { [key: string]: number } = {};\n const aggColumn = getAggColumn(columnMap, aggregations);\n\n const count = aggregateCount(\n groupMap,\n columnMap,\n aggregations,\n targetData,\n groupIndices,\n );\n const sum = aggregateSum(\n groupMap,\n leafData,\n columnMap,\n aggregations,\n targetData,\n groupIndices,\n );\n\n for (const key in count) {\n let average = 0;\n average = sum[key] / count[key];\n averages[key] = average;\n }\n\n for (let index = 0; index < targetData.length; index++) {\n for (const key in averages) {\n if (targetData[index][groupIndices[0]] === key) {\n targetData[index][aggColumn] = averages[key];\n }\n }\n }\n\n console.log(\"!!!! targetData\", targetData);\n console.log(\"!!!! averages\", averages);\n return averages;\n}\n\nfunction getLeafColumnData(\n map: GroupMap | KeyList,\n leafData: readonly DataSourceRow[],\n aggColumn: number,\n): number[] {\n const data: number[] = [];\n\n if (Array.isArray(map)) {\n for (const key of map) {\n data.push(leafData[key][aggColumn] as number);\n }\n } else {\n for (const key in map) {\n data.push(...getLeafColumnData(map[key], leafData, aggColumn));\n }\n }\n\n return data;\n}\n\nfunction aggregateDistinct(\n groupMap: GroupMap,\n leafData: readonly DataSourceRow[],\n columnMap: ColumnMap,\n aggregations: VuuAggregation[],\n targetData: readonly DataSourceRow[],\n groupIndices: number[],\n): { [key: string]: number } {\n const distincts: { [key: string]: number } = {};\n const aggColumn = getAggColumn(columnMap, aggregations);\n\n for (const key in groupMap) {\n const leafColumnData = getLeafColumnData(\n groupMap[key],\n leafData,\n aggColumn,\n );\n const distinct = [...new Set(leafColumnData)];\n\n distincts[key] = distinct.length;\n }\n\n for (let index = 0; index < targetData.length; index++) {\n for (const key in distincts) {\n if (targetData[index][groupIndices[0]] === key) {\n targetData[index][aggColumn] = distincts[key];\n }\n }\n }\n\n return distincts;\n}\n\nfunction aggregateHigh(\n groupMap: GroupMap,\n leafData: readonly DataSourceRow[],\n columnMap: ColumnMap,\n aggregations: VuuAggregation[],\n targetData: readonly DataSourceRow[],\n groupIndices: number[],\n): { [key: string]: number } {\n const highs: { [key: string]: number } = {};\n const aggColumn = getAggColumn(columnMap, aggregations);\n\n for (const key in groupMap) {\n const leafColumnData = getLeafColumnData(\n groupMap[key],\n leafData,\n aggColumn,\n );\n const maxNumber = Math.max(...leafColumnData);\n\n highs[key] = maxNumber;\n }\n for (let index = 0; index < targetData.length; index++) {\n for (const key in highs) {\n if (targetData[index][groupIndices[0]] === key) {\n targetData[index][aggColumn] = highs[key];\n }\n }\n }\n\n return highs;\n}\n\nfunction aggregateLow(\n groupMap: GroupMap,\n leafData: readonly DataSourceRow[],\n columnMap: ColumnMap,\n aggregations: VuuAggregation[],\n targetData: readonly DataSourceRow[],\n groupIndices: number[],\n): { [key: string]: number } {\n const mins: { [key: string]: number } = {};\n const aggColumn = getAggColumn(columnMap, aggregations);\n\n for (const key in groupMap) {\n const leafColumnData = getLeafColumnData(\n groupMap[key],\n leafData,\n aggColumn,\n );\n const minNumber = Math.min(...leafColumnData);\n mins[key] = minNumber;\n }\n\n for (let index = 0; index < targetData.length; index++) {\n for (const key in mins) {\n if (targetData[index][groupIndices[0]] === key) {\n targetData[index][aggColumn] = mins[key];\n }\n }\n }\n\n return mins;\n}\n"],"names":["count","leafData","aggColumn"],"mappings":"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"}
|
|
@@ -128,7 +128,7 @@ class ArrayDataSource extends vuuUtils.EventEmitter {
|
|
|
128
128
|
if (rowIdx >= from && rowIdx < to) {
|
|
129
129
|
this.sendRowsToClient();
|
|
130
130
|
}
|
|
131
|
-
this.emit("resize",
|
|
131
|
+
this.emit("resize", this.size);
|
|
132
132
|
}
|
|
133
133
|
});
|
|
134
134
|
__publicField(this, "updateDataItem", (keyValue, columnName, value) => {
|
|
@@ -398,6 +398,8 @@ class ArrayDataSource extends vuuUtils.EventEmitter {
|
|
|
398
398
|
}
|
|
399
399
|
if (processedData) {
|
|
400
400
|
this.processedData = this.indexProcessedData(processedData);
|
|
401
|
+
} else {
|
|
402
|
+
this.processedData = void 0;
|
|
401
403
|
}
|
|
402
404
|
}
|
|
403
405
|
if (__privateGet(this, _status) === "subscribed") {
|
|
@@ -407,6 +409,9 @@ class ArrayDataSource extends vuuUtils.EventEmitter {
|
|
|
407
409
|
} else {
|
|
408
410
|
this.setRange(__privateGet(this, _range).reset, true);
|
|
409
411
|
}
|
|
412
|
+
if (configChanges.filterChanged || configChanges.baseFilterChanged || configChanges.groupByChanged) {
|
|
413
|
+
this.emit("resize", this.size);
|
|
414
|
+
}
|
|
410
415
|
this.emit("config", this._config, this.range, void 0, configChanges);
|
|
411
416
|
}
|
|
412
417
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-data-source.js","sources":["../../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} 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 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 const hasConfigProps =\n aggregations || columns || filterSpec || groupBy || sort;\n if (hasConfigProps) {\n if (range) {\n this.setRange(range);\n }\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 }\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 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.#data.length);\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 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 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 Selection,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n TableSchema,\n WithBaseFilter,\n WithFullConfig,\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 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 const hasConfigProps =\n aggregations || columns || filterSpec || groupBy || sort;\n if (hasConfigProps) {\n if (range) {\n this.setRange(range);\n }\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 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 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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-data-utils.js","sources":["
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group-utils.js","sources":["../../src/array-data-source/group-utils.ts"],"sourcesContent":["import type { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuGroupBy } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap, metadataKeys } from \"@vuu-ui/vuu-utils\";\n\nexport type KeyList = number[];\nexport type GroupMap = { [key: string]: GroupMap | KeyList };\n\nconst { DEPTH, IS_EXPANDED, KEY } = metadataKeys;\n\nconst timestamp = 0;\nconst isNew = false;\n\nexport const collapseGroup = (\n key: string,\n groupedRows: readonly DataSourceRow[],\n): DataSourceRow[] => {\n const rows: DataSourceRow[] = [];\n\n for (\n let i = 0, idx = 0, collapsed = false, len = groupedRows.length;\n i < len;\n i++\n ) {\n const row = groupedRows[i];\n const { [DEPTH]: depth, [KEY]: rowKey } = row;\n if (rowKey === key) {\n const collapsedRow = row.slice() as DataSourceRow;\n collapsedRow[IS_EXPANDED] = false;\n rows.push(collapsedRow);\n idx += 1;\n collapsed = true;\n while (i < len - 1 && groupedRows[i + 1][DEPTH] > depth) {\n i += 1;\n }\n } else if (collapsed) {\n const newRow = row.slice() as DataSourceRow;\n newRow[0] = idx;\n newRow[1] = idx;\n rows.push(newRow);\n idx += 1;\n } else {\n rows.push(row);\n idx += 1;\n }\n }\n\n return rows;\n};\n\nexport const expandGroup = (\n keys: string[],\n sourceRows: readonly DataSourceRow[],\n groupBy: VuuGroupBy,\n columnMap: ColumnMap,\n groupMap: GroupMap,\n processedData: readonly DataSourceRow[],\n): DataSourceRow[] => {\n const groupIndices = groupBy.map<number>((column) => columnMap[column]);\n return dataRowsFromGroups2(\n groupMap,\n groupIndices,\n keys,\n sourceRows,\n undefined,\n undefined,\n undefined,\n processedData,\n );\n};\n\nconst dataRowsFromGroups2 = (\n groupMap: GroupMap,\n groupIndices: number[],\n openKeys: string[],\n sourceRows: readonly DataSourceRow[] = [],\n root = \"$root\",\n depth = 1,\n rows: DataSourceRow[] = [],\n processedData: readonly DataSourceRow[],\n) => {\n const keys = Object.keys(groupMap).sort();\n for (const key of keys) {\n const idx = rows.length;\n const groupKey = `${root}|${key}`;\n const row: DataSourceRow = [\n idx,\n idx,\n false,\n false,\n depth,\n childCount(groupMap[key]),\n groupKey,\n 0,\n timestamp,\n isNew,\n ];\n // TODO whats this\n row[groupIndices[depth - 1]] = key;\n rows.push(row);\n\n if (openKeys.includes(groupKey)) {\n row[IS_EXPANDED] = true;\n if (Array.isArray(groupMap[key])) {\n pushChildren(\n rows,\n groupMap[key] as KeyList,\n sourceRows,\n groupKey,\n depth + 1,\n );\n } else {\n dataRowsFromGroups2(\n groupMap[key] as GroupMap,\n groupIndices,\n openKeys,\n sourceRows,\n groupKey,\n depth + 1,\n rows,\n processedData,\n );\n }\n }\n }\n\n for (const key in rows) {\n for (const index in rows) {\n if (rows[key][2] === false && processedData[index] != undefined) {\n if (\n rows[key][groupIndices[0]] === processedData[index][groupIndices[0]]\n ) {\n rows[key] = rows[key].splice(0, 8).concat(\n processedData[index].slice(\n 8, // groupIndices[0] + 1,\n processedData[index].length,\n ),\n ) as DataSourceRow;\n break;\n }\n }\n }\n }\n\n return rows;\n};\n\nconst pushChildren = (\n rows: DataSourceRow[],\n tree: KeyList,\n sourceRows: readonly DataSourceRow[],\n parentKey: string,\n depth: number,\n) => {\n for (const rowIdx of tree) {\n const idx = rows.length;\n const sourceRow = sourceRows[rowIdx].slice() as DataSourceRow;\n sourceRow[0] = idx;\n sourceRow[1] = idx;\n sourceRow[DEPTH] = depth;\n sourceRow[KEY] = `${parentKey}|${sourceRow[KEY]}`;\n rows.push(sourceRow);\n }\n};\n\nexport const groupRows = (\n rows: readonly DataSourceRow[],\n groupBy: VuuGroupBy,\n columnMap: ColumnMap,\n): [DataSourceRow[], GroupMap] => {\n const groupIndices = groupBy.map<number>((column) => columnMap[column]);\n const groupTree = groupLeafRows(rows, groupIndices);\n const groupedDataRows = dataRowsFromGroups(groupTree, groupIndices);\n // 2) collapse int groups\n\n return [groupedDataRows, groupTree];\n};\n\nconst dataRowsFromGroups = (groupTree: GroupMap, groupIndices: number[]) => {\n const depth = 0;\n const rows: DataSourceRow[] = [];\n let idx = 0;\n const keys = Object.keys(groupTree).sort();\n for (const key of keys) {\n const row: DataSourceRow = [\n idx,\n idx,\n false,\n false,\n 1,\n childCount(groupTree[key]),\n `$root|${key}`,\n 0,\n timestamp,\n isNew,\n ];\n row[groupIndices[depth]] = key;\n rows.push(row);\n idx += 1;\n }\n return rows;\n};\n\nfunction childCount(list: GroupMap | KeyList) {\n if (Array.isArray(list)) {\n return list.length;\n } else {\n return Object.keys(list).length;\n }\n}\n\nfunction groupLeafRows(leafRows: readonly DataSourceRow[], groupby: number[]) {\n const groups: GroupMap = {};\n const levels = groupby.length;\n const lastLevel = levels - 1;\n for (let i = 0, len = leafRows.length; i < len; i++) {\n const leafRow = leafRows[i];\n let target: GroupMap | KeyList = groups;\n let targetNode;\n let key;\n for (let level = 0; level < levels; level++) {\n const colIdx = groupby[level];\n key = leafRow[colIdx].toString();\n targetNode = (target as GroupMap)[key];\n if (targetNode && level === lastLevel) {\n // we're at leaf level, targetNode can only be a KeyList\n (targetNode as KeyList).push(i);\n } else if (targetNode) {\n target = targetNode;\n } else if (!targetNode && level < lastLevel) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n target = target[key] = {};\n } else if (!targetNode) {\n (target as GroupMap)[key] = [i];\n }\n }\n }\n return groups;\n}\n"],"names":["metadataKeys"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"group-utils.js","sources":["../../../../packages/vuu-data-local/src/array-data-source/group-utils.ts"],"sourcesContent":["import type { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuGroupBy } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap, metadataKeys } from \"@vuu-ui/vuu-utils\";\n\nexport type KeyList = number[];\nexport type GroupMap = { [key: string]: GroupMap | KeyList };\n\nconst { DEPTH, IS_EXPANDED, KEY } = metadataKeys;\n\nconst timestamp = 0;\nconst isNew = false;\n\nexport const collapseGroup = (\n key: string,\n groupedRows: readonly DataSourceRow[],\n): DataSourceRow[] => {\n const rows: DataSourceRow[] = [];\n\n for (\n let i = 0, idx = 0, collapsed = false, len = groupedRows.length;\n i < len;\n i++\n ) {\n const row = groupedRows[i];\n const { [DEPTH]: depth, [KEY]: rowKey } = row;\n if (rowKey === key) {\n const collapsedRow = row.slice() as DataSourceRow;\n collapsedRow[IS_EXPANDED] = false;\n rows.push(collapsedRow);\n idx += 1;\n collapsed = true;\n while (i < len - 1 && groupedRows[i + 1][DEPTH] > depth) {\n i += 1;\n }\n } else if (collapsed) {\n const newRow = row.slice() as DataSourceRow;\n newRow[0] = idx;\n newRow[1] = idx;\n rows.push(newRow);\n idx += 1;\n } else {\n rows.push(row);\n idx += 1;\n }\n }\n\n return rows;\n};\n\nexport const expandGroup = (\n keys: string[],\n sourceRows: readonly DataSourceRow[],\n groupBy: VuuGroupBy,\n columnMap: ColumnMap,\n groupMap: GroupMap,\n processedData: readonly DataSourceRow[],\n): DataSourceRow[] => {\n const groupIndices = groupBy.map<number>((column) => columnMap[column]);\n return dataRowsFromGroups2(\n groupMap,\n groupIndices,\n keys,\n sourceRows,\n undefined,\n undefined,\n undefined,\n processedData,\n );\n};\n\nconst dataRowsFromGroups2 = (\n groupMap: GroupMap,\n groupIndices: number[],\n openKeys: string[],\n sourceRows: readonly DataSourceRow[] = [],\n root = \"$root\",\n depth = 1,\n rows: DataSourceRow[] = [],\n processedData: readonly DataSourceRow[],\n) => {\n const keys = Object.keys(groupMap).sort();\n for (const key of keys) {\n const idx = rows.length;\n const groupKey = `${root}|${key}`;\n const row: DataSourceRow = [\n idx,\n idx,\n false,\n false,\n depth,\n childCount(groupMap[key]),\n groupKey,\n 0,\n timestamp,\n isNew,\n ];\n // TODO whats this\n row[groupIndices[depth - 1]] = key;\n rows.push(row);\n\n if (openKeys.includes(groupKey)) {\n row[IS_EXPANDED] = true;\n if (Array.isArray(groupMap[key])) {\n pushChildren(\n rows,\n groupMap[key] as KeyList,\n sourceRows,\n groupKey,\n depth + 1,\n );\n } else {\n dataRowsFromGroups2(\n groupMap[key] as GroupMap,\n groupIndices,\n openKeys,\n sourceRows,\n groupKey,\n depth + 1,\n rows,\n processedData,\n );\n }\n }\n }\n\n for (const key in rows) {\n for (const index in rows) {\n if (rows[key][2] === false && processedData[index] != undefined) {\n if (\n rows[key][groupIndices[0]] === processedData[index][groupIndices[0]]\n ) {\n rows[key] = rows[key].splice(0, 8).concat(\n processedData[index].slice(\n 8, // groupIndices[0] + 1,\n processedData[index].length,\n ),\n ) as DataSourceRow;\n break;\n }\n }\n }\n }\n\n return rows;\n};\n\nconst pushChildren = (\n rows: DataSourceRow[],\n tree: KeyList,\n sourceRows: readonly DataSourceRow[],\n parentKey: string,\n depth: number,\n) => {\n for (const rowIdx of tree) {\n const idx = rows.length;\n const sourceRow = sourceRows[rowIdx].slice() as DataSourceRow;\n sourceRow[0] = idx;\n sourceRow[1] = idx;\n sourceRow[DEPTH] = depth;\n sourceRow[KEY] = `${parentKey}|${sourceRow[KEY]}`;\n rows.push(sourceRow);\n }\n};\n\nexport const groupRows = (\n rows: readonly DataSourceRow[],\n groupBy: VuuGroupBy,\n columnMap: ColumnMap,\n): [DataSourceRow[], GroupMap] => {\n const groupIndices = groupBy.map<number>((column) => columnMap[column]);\n const groupTree = groupLeafRows(rows, groupIndices);\n const groupedDataRows = dataRowsFromGroups(groupTree, groupIndices);\n // 2) collapse int groups\n\n return [groupedDataRows, groupTree];\n};\n\nconst dataRowsFromGroups = (groupTree: GroupMap, groupIndices: number[]) => {\n const depth = 0;\n const rows: DataSourceRow[] = [];\n let idx = 0;\n const keys = Object.keys(groupTree).sort();\n for (const key of keys) {\n const row: DataSourceRow = [\n idx,\n idx,\n false,\n false,\n 1,\n childCount(groupTree[key]),\n `$root|${key}`,\n 0,\n timestamp,\n isNew,\n ];\n row[groupIndices[depth]] = key;\n rows.push(row);\n idx += 1;\n }\n return rows;\n};\n\nfunction childCount(list: GroupMap | KeyList) {\n if (Array.isArray(list)) {\n return list.length;\n } else {\n return Object.keys(list).length;\n }\n}\n\nfunction groupLeafRows(leafRows: readonly DataSourceRow[], groupby: number[]) {\n const groups: GroupMap = {};\n const levels = groupby.length;\n const lastLevel = levels - 1;\n for (let i = 0, len = leafRows.length; i < len; i++) {\n const leafRow = leafRows[i];\n let target: GroupMap | KeyList = groups;\n let targetNode;\n let key;\n for (let level = 0; level < levels; level++) {\n const colIdx = groupby[level];\n key = leafRow[colIdx].toString();\n targetNode = (target as GroupMap)[key];\n if (targetNode && level === lastLevel) {\n // we're at leaf level, targetNode can only be a KeyList\n (targetNode as KeyList).push(i);\n } else if (targetNode) {\n target = targetNode;\n } else if (!targetNode && level < lastLevel) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n target = target[key] = {};\n } else if (!targetNode) {\n (target as GroupMap)[key] = [i];\n }\n }\n }\n return groups;\n}\n"],"names":["metadataKeys"],"mappings":";;;;AAOA,MAAM,EAAE,KAAA,EAAO,WAAa,EAAA,GAAA,EAAQ,GAAAA,qBAAA;AAEpC,MAAM,SAAY,GAAA,CAAA;AAClB,MAAM,KAAQ,GAAA,KAAA;AAED,MAAA,aAAA,GAAgB,CAC3B,GAAA,EACA,WACoB,KAAA;AACpB,EAAA,MAAM,OAAwB,EAAC;AAE/B,EACM,KAAA,IAAA,CAAA,GAAI,CAAG,EAAA,GAAA,GAAM,CAAG,EAAA,SAAA,GAAY,KAAO,EAAA,GAAA,GAAM,WAAY,CAAA,MAAA,EACzD,CAAI,GAAA,GAAA,EACJ,CACA,EAAA,EAAA;AACA,IAAM,MAAA,GAAA,GAAM,YAAY,CAAC,CAAA;AACzB,IAAM,MAAA,EAAE,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,GAAG,MAAA,EAAW,GAAA,GAAA;AAC1C,IAAA,IAAI,WAAW,GAAK,EAAA;AAClB,MAAM,MAAA,YAAA,GAAe,IAAI,KAAM,EAAA;AAC/B,MAAA,YAAA,CAAa,WAAW,CAAI,GAAA,KAAA;AAC5B,MAAA,IAAA,CAAK,KAAK,YAAY,CAAA;AACtB,MAAO,GAAA,IAAA,CAAA;AACP,MAAY,SAAA,GAAA,IAAA;AACZ,MAAO,OAAA,CAAA,GAAI,MAAM,CAAK,IAAA,WAAA,CAAY,IAAI,CAAC,CAAA,CAAE,KAAK,CAAA,GAAI,KAAO,EAAA;AACvD,QAAK,CAAA,IAAA,CAAA;AAAA;AACP,eACS,SAAW,EAAA;AACpB,MAAM,MAAA,MAAA,GAAS,IAAI,KAAM,EAAA;AACzB,MAAA,MAAA,CAAO,CAAC,CAAI,GAAA,GAAA;AACZ,MAAA,MAAA,CAAO,CAAC,CAAI,GAAA,GAAA;AACZ,MAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAChB,MAAO,GAAA,IAAA,CAAA;AAAA,KACF,MAAA;AACL,MAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AACb,MAAO,GAAA,IAAA,CAAA;AAAA;AACT;AAGF,EAAO,OAAA,IAAA;AACT;AAEO,MAAM,cAAc,CACzB,IAAA,EACA,YACA,OACA,EAAA,SAAA,EACA,UACA,aACoB,KAAA;AACpB,EAAA,MAAM,eAAe,OAAQ,CAAA,GAAA,CAAY,CAAC,MAAW,KAAA,SAAA,CAAU,MAAM,CAAC,CAAA;AACtE,EAAO,OAAA,mBAAA;AAAA,IACL,QAAA;AAAA,IACA,YAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA,KAAA,CAAA;AAAA,IACA;AAAA,GACF;AACF;AAEA,MAAM,mBAAsB,GAAA,CAC1B,QACA,EAAA,YAAA,EACA,UACA,UAAuC,GAAA,EACvC,EAAA,IAAA,GAAO,SACP,KAAQ,GAAA,CAAA,EACR,IAAwB,GAAA,IACxB,aACG,KAAA;AACH,EAAA,MAAM,IAAO,GAAA,MAAA,CAAO,IAAK,CAAA,QAAQ,EAAE,IAAK,EAAA;AACxC,EAAA,KAAA,MAAW,OAAO,IAAM,EAAA;AACtB,IAAA,MAAM,MAAM,IAAK,CAAA,MAAA;AACjB,IAAA,MAAM,QAAW,GAAA,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAC/B,IAAA,MAAM,GAAqB,GAAA;AAAA,MACzB,GAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,UAAA,CAAW,QAAS,CAAA,GAAG,CAAC,CAAA;AAAA,MACxB,QAAA;AAAA,MACA,CAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,GAAA,CAAI,YAAa,CAAA,KAAA,GAAQ,CAAC,CAAC,CAAI,GAAA,GAAA;AAC/B,IAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAEb,IAAI,IAAA,QAAA,CAAS,QAAS,CAAA,QAAQ,CAAG,EAAA;AAC/B,MAAA,GAAA,CAAI,WAAW,CAAI,GAAA,IAAA;AACnB,MAAA,IAAI,KAAM,CAAA,OAAA,CAAQ,QAAS,CAAA,GAAG,CAAC,CAAG,EAAA;AAChC,QAAA,YAAA;AAAA,UACE,IAAA;AAAA,UACA,SAAS,GAAG,CAAA;AAAA,UACZ,UAAA;AAAA,UACA,QAAA;AAAA,UACA,KAAQ,GAAA;AAAA,SACV;AAAA,OACK,MAAA;AACL,QAAA,mBAAA;AAAA,UACE,SAAS,GAAG,CAAA;AAAA,UACZ,YAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UACA,KAAQ,GAAA,CAAA;AAAA,UACR,IAAA;AAAA,UACA;AAAA,SACF;AAAA;AACF;AACF;AAGF,EAAA,KAAA,MAAW,OAAO,IAAM,EAAA;AACtB,IAAA,KAAA,MAAW,SAAS,IAAM,EAAA;AACxB,MAAI,IAAA,IAAA,CAAK,GAAG,CAAE,CAAA,CAAC,MAAM,KAAS,IAAA,aAAA,CAAc,KAAK,CAAA,IAAK,KAAW,CAAA,EAAA;AAC/D,QAAA,IACE,IAAK,CAAA,GAAG,CAAE,CAAA,YAAA,CAAa,CAAC,CAAC,CAAM,KAAA,aAAA,CAAc,KAAK,CAAA,CAAE,YAAa,CAAA,CAAC,CAAC,CACnE,EAAA;AACA,UAAK,IAAA,CAAA,GAAG,IAAI,IAAK,CAAA,GAAG,EAAE,MAAO,CAAA,CAAA,EAAG,CAAC,CAAE,CAAA,MAAA;AAAA,YACjC,aAAA,CAAc,KAAK,CAAE,CAAA,KAAA;AAAA,cACnB,CAAA;AAAA;AAAA,cACA,aAAA,CAAc,KAAK,CAAE,CAAA;AAAA;AACvB,WACF;AACA,UAAA;AAAA;AACF;AACF;AACF;AAGF,EAAO,OAAA,IAAA;AACT,CAAA;AAEA,MAAM,eAAe,CACnB,IAAA,EACA,IACA,EAAA,UAAA,EACA,WACA,KACG,KAAA;AACH,EAAA,KAAA,MAAW,UAAU,IAAM,EAAA;AACzB,IAAA,MAAM,MAAM,IAAK,CAAA,MAAA;AACjB,IAAA,MAAM,SAAY,GAAA,UAAA,CAAW,MAAM,CAAA,CAAE,KAAM,EAAA;AAC3C,IAAA,SAAA,CAAU,CAAC,CAAI,GAAA,GAAA;AACf,IAAA,SAAA,CAAU,CAAC,CAAI,GAAA,GAAA;AACf,IAAA,SAAA,CAAU,KAAK,CAAI,GAAA,KAAA;AACnB,IAAA,SAAA,CAAU,GAAG,CAAI,GAAA,CAAA,EAAG,SAAS,CAAI,CAAA,EAAA,SAAA,CAAU,GAAG,CAAC,CAAA,CAAA;AAC/C,IAAA,IAAA,CAAK,KAAK,SAAS,CAAA;AAAA;AAEvB,CAAA;AAEO,MAAM,SAAY,GAAA,CACvB,IACA,EAAA,OAAA,EACA,SACgC,KAAA;AAChC,EAAA,MAAM,eAAe,OAAQ,CAAA,GAAA,CAAY,CAAC,MAAW,KAAA,SAAA,CAAU,MAAM,CAAC,CAAA;AACtE,EAAM,MAAA,SAAA,GAAY,aAAc,CAAA,IAAA,EAAM,YAAY,CAAA;AAClD,EAAM,MAAA,eAAA,GAAkB,kBAAmB,CAAA,SAAA,EAAW,YAAY,CAAA;AAGlE,EAAO,OAAA,CAAC,iBAAiB,SAAS,CAAA;AACpC;AAEA,MAAM,kBAAA,GAAqB,CAAC,SAAA,EAAqB,YAA2B,KAAA;AAC1E,EAAA,MAAM,KAAQ,GAAA,CAAA;AACd,EAAA,MAAM,OAAwB,EAAC;AAC/B,EAAA,IAAI,GAAM,GAAA,CAAA;AACV,EAAA,MAAM,IAAO,GAAA,MAAA,CAAO,IAAK,CAAA,SAAS,EAAE,IAAK,EAAA;AACzC,EAAA,KAAA,MAAW,OAAO,IAAM,EAAA;AACtB,IAAA,MAAM,GAAqB,GAAA;AAAA,MACzB,GAAA;AAAA,MACA,GAAA;AAAA,MACA,KAAA;AAAA,MACA,KAAA;AAAA,MACA,CAAA;AAAA,MACA,UAAA,CAAW,SAAU,CAAA,GAAG,CAAC,CAAA;AAAA,MACzB,SAAS,GAAG,CAAA,CAAA;AAAA,MACZ,CAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AACA,IAAI,GAAA,CAAA,YAAA,CAAa,KAAK,CAAC,CAAI,GAAA,GAAA;AAC3B,IAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AACb,IAAO,GAAA,IAAA,CAAA;AAAA;AAET,EAAO,OAAA,IAAA;AACT,CAAA;AAEA,SAAS,WAAW,IAA0B,EAAA;AAC5C,EAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,IAAI,CAAG,EAAA;AACvB,IAAA,OAAO,IAAK,CAAA,MAAA;AAAA,GACP,MAAA;AACL,IAAO,OAAA,MAAA,CAAO,IAAK,CAAA,IAAI,CAAE,CAAA,MAAA;AAAA;AAE7B;AAEA,SAAS,aAAA,CAAc,UAAoC,OAAmB,EAAA;AAC5E,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAM,SAAS,OAAQ,CAAA,MAAA;AACvB,EAAA,MAAM,YAAY,MAAS,GAAA,CAAA;AAC3B,EAAA,KAAA,IAAS,IAAI,CAAG,EAAA,GAAA,GAAM,SAAS,MAAQ,EAAA,CAAA,GAAI,KAAK,CAAK,EAAA,EAAA;AACnD,IAAM,MAAA,OAAA,GAAU,SAAS,CAAC,CAAA;AAC1B,IAAA,IAAI,MAA6B,GAAA,MAAA;AACjC,IAAI,IAAA,UAAA;AACJ,IAAI,IAAA,GAAA;AACJ,IAAA,KAAA,IAAS,KAAQ,GAAA,CAAA,EAAG,KAAQ,GAAA,MAAA,EAAQ,KAAS,EAAA,EAAA;AAC3C,MAAM,MAAA,MAAA,GAAS,QAAQ,KAAK,CAAA;AAC5B,MAAM,GAAA,GAAA,OAAA,CAAQ,MAAM,CAAA,CAAE,QAAS,EAAA;AAC/B,MAAA,UAAA,GAAc,OAAoB,GAAG,CAAA;AACrC,MAAI,IAAA,UAAA,IAAc,UAAU,SAAW,EAAA;AAErC,QAAC,UAAA,CAAuB,KAAK,CAAC,CAAA;AAAA,iBACrB,UAAY,EAAA;AACrB,QAAS,MAAA,GAAA,UAAA;AAAA,OACA,MAAA,IAAA,CAAC,UAAc,IAAA,KAAA,GAAQ,SAAW,EAAA;AAG3C,QAAS,MAAA,GAAA,MAAA,CAAO,GAAG,CAAA,GAAI,EAAC;AAAA,OAC1B,MAAA,IAAW,CAAC,UAAY,EAAA;AACtB,QAAC,MAAoB,CAAA,GAAG,CAAI,GAAA,CAAC,CAAC,CAAA;AAAA;AAChC;AACF;AAEF,EAAO,OAAA,MAAA;AACT;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sort-utils.js","sources":["
|
|
1
|
+
{"version":3,"file":"sort-utils.js","sources":["../../../../packages/vuu-data-local/src/array-data-source/sort-utils.ts"],"sourcesContent":["import type { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuSort, VuuSortType } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap } from \"@vuu-ui/vuu-utils\";\n\nexport type ColIndexSortDef = [number, VuuSortType];\ntype SortPredicate = (\n r1: DataSourceRow,\n r2: DataSourceRow,\n sortDefDef: ColIndexSortDef,\n) => SortCompareResult;\ntype SortCompareResult = 0 | 1 | -1;\ntype RowSortComparatorFactory = (\n sortDefs: ColIndexSortDef[],\n test?: SortPredicate,\n) => RowSortComparator;\nexport type RowSortComparator = (\n item1: DataSourceRow,\n item2: DataSourceRow,\n) => SortCompareResult;\n\nconst defaultSortPredicate: SortPredicate = (r1, r2, [i, direction]) => {\n const val1 = direction === \"D\" ? r2[i] : r1[i];\n const val2 = direction === \"D\" ? r1[i] : r2[i];\n if (val1 === val2) {\n return 0;\n } else if (val2 === null || val1 > val2) {\n return 1;\n } else {\n return -1;\n }\n};\n\nexport const sortComparator = (\n sortDefs: ColIndexSortDef[],\n): RowSortComparator => {\n if (sortDefs.length === 1) {\n return singleColComparator(sortDefs);\n } else if (sortDefs.length === 2) {\n return twoColComparator(sortDefs);\n } else {\n return multiColComparator(sortDefs);\n }\n};\n\nconst singleColComparator: RowSortComparatorFactory =\n ([[i, direction]]) =>\n (r1, r2) => {\n const v1 = direction === \"D\" ? r2[i] : r1[i];\n const v2 = direction === \"D\" ? r1[i] : r2[i];\n return v1 > v2 ? 1 : v2 > v1 ? -1 : 0;\n };\n\nconst twoColComparator: RowSortComparatorFactory =\n ([[idx1, direction1], [idx2, direction2]]) =>\n (r1, r2) => {\n const v1 = direction1 === \"D\" ? r2[idx1] : r1[idx1];\n const v2 = direction1 === \"D\" ? r1[idx1] : r2[idx1];\n const v3 = direction2 === \"D\" ? r2[idx2] : r1[idx2];\n const v4 = direction2 === \"D\" ? r1[idx2] : r2[idx2];\n return v1 > v2 ? 1 : v2 > v1 ? -1 : v3 > v4 ? 1 : v4 > v3 ? -1 : 0;\n };\n\nconst multiColComparator: RowSortComparatorFactory =\n (sortDefs, test = defaultSortPredicate) =>\n (r1, r2) => {\n for (const sortDef of sortDefs) {\n const result = test(r1, r2, sortDef);\n if (result !== 0) {\n return result;\n }\n }\n return 0;\n };\n\nexport const sortRows = (\n rows: readonly DataSourceRow[],\n { sortDefs }: VuuSort,\n columnMap: ColumnMap,\n) => {\n const indexedSortDefs = sortDefs.map<ColIndexSortDef>(\n ({ column, sortType }) => [columnMap[column], sortType],\n );\n const comparator = sortComparator(indexedSortDefs);\n return rows.slice().sort(comparator);\n};\n\nexport function binarySearch(\n items: DataSourceRow[],\n item: DataSourceRow,\n comparator: RowSortComparator,\n) {\n let l = 0;\n let h = items.length - 1;\n let m;\n let comparison;\n\n while (l <= h) {\n m = (l + h) >>> 1; /* equivalent to Math.floor((l + h) / 2) but faster */\n comparison = comparator(items[m], item);\n if (comparison < 0) {\n l = m + 1;\n } else if (comparison > 0) {\n h = m - 1;\n } else {\n return m;\n }\n }\n return ~l;\n}\n"],"names":[],"mappings":"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"}
|