@vuu-ui/vuu-data-local 0.13.113 → 0.13.115-alpha.1
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/array-data-source.js +4 -0
- package/cjs/array-data-source/array-data-source.js.map +1 -1
- package/cjs/tree-data-source/IconProvider.js +2 -5
- package/cjs/tree-data-source/IconProvider.js.map +1 -1
- package/cjs/tree-data-source/TreeDataSource.js +13 -2
- package/cjs/tree-data-source/TreeDataSource.js.map +1 -1
- package/esm/array-data-source/array-data-source.js +4 -0
- package/esm/array-data-source/array-data-source.js.map +1 -1
- package/esm/tree-data-source/IconProvider.js +2 -5
- package/esm/tree-data-source/IconProvider.js.map +1 -1
- package/esm/tree-data-source/TreeDataSource.js +13 -2
- package/esm/tree-data-source/TreeDataSource.js.map +1 -1
- package/package.json +7 -7
- package/types/array-data-source/array-data-source.d.ts +1 -1
- package/types/tree-data-source/IconProvider.d.ts +2 -2
|
@@ -266,6 +266,10 @@ class ArrayDataSource extends vuuUtils.EventEmitter {
|
|
|
266
266
|
this.config = config;
|
|
267
267
|
} else {
|
|
268
268
|
this.sendSizeUpdateToClient();
|
|
269
|
+
this.emit(
|
|
270
|
+
"resize",
|
|
271
|
+
this.processedData ? this.processedData.length : __privateGet(this, _data).length
|
|
272
|
+
);
|
|
269
273
|
if (range && !__privateGet(this, _range).equals(range)) {
|
|
270
274
|
this.range = range;
|
|
271
275
|
} else if (__privateGet(this, _range) !== vuuUtils.NULL_RANGE) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-data-source.js","sources":["../../../../packages/vuu-data-local/src/array-data-source/array-data-source.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceConfig,\n DataSourceConstructorProps,\n DataSourceEvents,\n DataSourceFilter,\n DataSourceRow,\n DataSourceStatus,\n DataSourceSubscribedMessage,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n TableSchema,\n WithBaseFilter,\n WithFullConfig,\n DataSourceDeleteHandler,\n} from \"@vuu-ui/vuu-data-types\";\nimport { filterPredicate, parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport type {\n LinkDescriptorWithLabel,\n SelectRequest,\n SelectRowRangeRequest,\n SelectRowRequest,\n VuuAggregation,\n VuuColumns,\n VuuGroupBy,\n VuuMenu,\n VuuRange,\n VuuRowDataItemType,\n 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 filterAsQuery,\n getAddedItems,\n hasBaseFilter,\n hasFilter,\n hasGroupBy,\n hasSort,\n isConfigChanged,\n isGroupByChanged,\n logger,\n metadataKeys,\n rangeNewItems,\n uuid,\n vanillaConfig,\n withConfigDefaults,\n} from \"@vuu-ui/vuu-utils\";\nimport { aggregateData } from \"./aggregate-utils\";\nimport { buildDataToClientMap, toClientRow } from \"./array-data-utils\";\nimport { GroupMap, collapseGroup, expandGroup, groupRows } from \"./group-utils\";\nimport {\n binarySearch,\n ColIndexSortDef,\n sortComparator,\n sortRows,\n} from \"./sort-utils\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\n\nconst { debug, info } = logger(\"ArrayDataSource\");\n\nconst { KEY } = metadataKeys;\n\nexport interface ArrayDataSourceConstructorProps\n extends Omit<DataSourceConstructorProps, \"bufferSize\" | \"table\"> {\n columnDescriptors: ColumnDescriptor[];\n data: Array<VuuRowDataItemType[]>;\n dataMap?: ColumnMap;\n keyColumn?: string;\n rangeChangeRowset?: \"delta\" | \"full\";\n}\n\nconst toDataSourceRow =\n (indexOfKeyColumn: number, index?: Map<string, number>) =>\n (data: VuuRowDataItemType[], idx: number): DataSourceRow => {\n const key = `${data[indexOfKeyColumn]}`;\n index?.set(key, idx);\n return [\n idx,\n idx,\n true,\n false,\n 1,\n 0,\n key,\n 0,\n 0, // ts\n false, // isNew\n ...data,\n ];\n };\n\n// const isError = (err: unknown): err is { message: string } =>\n// typeof err === \"object\" && err !== null && err.hasOwnProperty(\"message\");\n\nconst buildTableSchema = (\n columns: ColumnDescriptor[],\n keyColumn?: string,\n): TableSchema => {\n const schema: TableSchema = {\n columns: columns.map(({ name, serverDataType = \"string\" }) => ({\n name,\n serverDataType,\n })),\n key: keyColumn ?? columns[0].name,\n table: { module: \"\", table: \"Array\" },\n };\n\n return schema;\n};\n\nexport class ArrayDataSource\n extends EventEmitter<DataSourceEvents>\n implements DataSource\n{\n private clientCallback: DataSourceSubscribeCallback | undefined;\n private columnDescriptors: ColumnDescriptor[];\n /** sorted offsets of data within raw data, reflecting sort order\n * of columns specified by client.\n */\n private dataIndices: number[] | undefined;\n /** Map reflecting positions of data items in raw data */\n private dataMap: ColumnMap | undefined;\n private groupMap: undefined | GroupMap;\n /** the index of key field within raw data row */\n private key: number;\n private lastRangeServed: VuuRange = { from: 0, to: 0 };\n private rangeChangeRowset: \"delta\" | \"full\";\n private openTreeNodes: string[] = [];\n // Experimental. There are some config changes - first concrete example is baseFilter applied to\n // 'freeze' data, that should not immediately affect the displayed data, therefore not cause\n // range reset.\n private preserveScrollPositionAcrossConfigChange = false;\n\n /** Map reflecting positions of columns in client data sent to user */\n #columnMap: ColumnMap;\n protected _config: WithBaseFilter<WithFullConfig> & {\n visualLink?: LinkDescriptorWithLabel;\n } = vanillaConfig;\n #data: DataSourceRow[];\n #freezeTimestamp: number | undefined = undefined;\n #keys = new KeySet(NULL_RANGE);\n #links: LinkDescriptorWithLabel[] | undefined;\n #range = Range(0, 0);\n #status: DataSourceStatus = \"initialising\";\n #title: string | undefined;\n\n protected _menu: VuuMenu | undefined;\n protected selectedRows = new Set<string>();\n protected index = new Map<string, number>();\n\n public tableSchema: TableSchema;\n public viewport: string;\n\n protected processedData: DataSourceRow[] | undefined = undefined;\n\n constructor({\n aggregations,\n baseFilterSpec,\n // different from RemoteDataSource\n columnDescriptors,\n data,\n dataMap,\n filterSpec,\n groupBy,\n keyColumn,\n rangeChangeRowset = \"delta\",\n sort,\n title,\n viewport,\n }: ArrayDataSourceConstructorProps) {\n super();\n if (!data || !columnDescriptors) {\n throw Error(\n \"ArrayDataSource constructor called without data or without columnDescriptors\",\n );\n }\n\n this.columnDescriptors = columnDescriptors;\n this.dataMap = dataMap;\n this.key = keyColumn\n ? this.columnDescriptors.findIndex((col) => col.name === keyColumn)\n : 0;\n this.rangeChangeRowset = rangeChangeRowset;\n this.tableSchema = buildTableSchema(columnDescriptors, keyColumn);\n this.viewport = viewport || uuid();\n this.#title = title;\n\n const columns = columnDescriptors.map((col) => col.name);\n this.#columnMap = buildColumnMap(columns);\n this.dataIndices = buildDataToClientMap(this.#columnMap, this.dataMap);\n this.#data = data.map<DataSourceRow>(toDataSourceRow(this.key, this.index));\n\n this.config = {\n ...this._config,\n aggregations: aggregations || this._config.aggregations,\n baseFilterSpec,\n columns,\n filterSpec: filterSpec || this._config.filterSpec,\n groupBy: groupBy || this._config.groupBy,\n sort: sort || this._config.sort,\n };\n\n debug?.(`columnMap: ${JSON.stringify(this.#columnMap)}`);\n }\n\n async subscribe(\n {\n viewport = this.viewport ?? (this.viewport = uuid()),\n columns,\n aggregations,\n baseFilterSpec,\n range,\n 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.lastRangeServed = { from: 0, to: 0 };\n\n let config = this._config;\n\n const hasConfigProps =\n aggregations || columns || filterSpec || groupBy || sort;\n\n if (hasConfigProps) {\n config = {\n ...config,\n aggregations: aggregations || this._config.aggregations,\n baseFilterSpec: baseFilterSpec || this._config.baseFilterSpec,\n columns: columns || this._config.columns,\n filterSpec: filterSpec || this._config.filterSpec,\n groupBy: groupBy || this._config.groupBy,\n sort: sort || this._config.sort,\n };\n }\n\n const subscribedMessage: DataSourceSubscribedMessage = {\n ...config,\n type: \"subscribed\",\n clientViewportId: this.viewport,\n range: this.#range,\n tableSchema: this.tableSchema,\n };\n this.clientCallback?.(subscribedMessage);\n this.emit(\"subscribed\", subscribedMessage);\n\n if (hasConfigProps) {\n // invoke setter to action config\n this.config = config;\n } else {\n this.sendSizeUpdateToClient();\n if (range && !this.#range.equals(range)) {\n this.range = range;\n } else if (this.#range !== NULL_RANGE) {\n this.sendRowsToClient();\n }\n\n if (this.range.to !== 0) {\n const pageCount = Math.ceil(\n this.size / (this.range.to - this.range.from),\n );\n this.emit(\"page-count\", pageCount);\n }\n }\n }\n\n unsubscribe() {\n this.clientCallback = undefined;\n this.#status = \"unsubscribed\";\n this.emit(\"unsubscribed\", this.viewport);\n }\n\n suspend() {\n if (this.#status !== \"unsubscribed\") {\n info?.(`suspend #${this.viewport}, current status ${this.#status}`);\n this.#status = \"suspended\";\n this.emit(\"suspended\", this.viewport);\n }\n }\n\n resume(callback?: DataSourceSubscribeCallback) {\n const isSuspended = this.#status === \"suspended\";\n info?.(`resume #${this.viewport}, current status ${this.#status}`);\n if (callback) {\n this.clientCallback = callback;\n }\n\n if (isSuspended) {\n this.#status = \"subscribed\";\n }\n this.emit(\"resumed\", this.viewport);\n if (this.selectedRows.size > 0) {\n if (this.selectedRows.has(\"*\")) {\n this.emit(\"row-selection\", this.size);\n } else {\n this.emit(\"row-selection\", this.selectedRows.size);\n }\n }\n\n this.sendRowsToClient(true);\n }\n\n disable() {\n this.emit(\"disabled\", this.viewport);\n }\n\n enable() {\n this.emit(\"enabled\", this.viewport);\n }\n\n select(selectRequest: Omit<SelectRequest, \"vpId\">) {\n switch (selectRequest.type) {\n case \"SELECT_ROW\": {\n const { preserveExistingSelection, rowKey } = selectRequest as Omit<\n SelectRowRequest,\n \"vpId\"\n >;\n if (!preserveExistingSelection) {\n this.selectedRows.clear();\n }\n this.selectedRows.add(rowKey);\n break;\n }\n case \"DESELECT_ROW\": {\n const { preserveExistingSelection, rowKey } = selectRequest as Omit<\n SelectRowRequest,\n \"vpId\"\n >;\n if (!preserveExistingSelection) {\n this.selectedRows.clear();\n } else if (this.selectedRows.has(\"*\")) {\n this.selectedRows.clear();\n for (const key of this.index.keys()) {\n if (key !== rowKey) {\n this.selectedRows.add(key);\n }\n }\n } else {\n this.selectedRows.delete(rowKey);\n }\n break;\n }\n case \"SELECT_ROW_RANGE\": {\n const { preserveExistingSelection, fromRowKey, toRowKey } =\n selectRequest as Omit<SelectRowRangeRequest, \"vpId\">;\n\n if (!preserveExistingSelection) {\n this.selectedRows.clear();\n }\n\n const fromIdx = this.index.get(fromRowKey);\n const toIdx = this.index.get(toRowKey);\n if (typeof fromIdx === \"number\" && typeof toIdx === \"number\") {\n for (let i = fromIdx; i <= toIdx; i++) {\n const { [KEY]: rowKey } = this.#data[i];\n this.selectedRows.add(rowKey);\n }\n }\n\n break;\n }\n case \"SELECT_ALL\": {\n this.selectedRows.clear();\n this.selectedRows.add(\"*\");\n break;\n }\n case \"DESELECT_ALL\": {\n this.selectedRows.clear();\n break;\n }\n }\n\n this.setRange(this.#range, true);\n this.emit(\n \"row-selection\",\n selectRequest.type === \"SELECT_ALL\" ? this.size : this.selectedRows.size,\n );\n }\n\n private getRowKey(keyOrIndex: string | number) {\n if (typeof keyOrIndex === \"string\") {\n return keyOrIndex;\n }\n const row = this.getRowAtIndex(keyOrIndex);\n if (row === undefined) {\n throw Error(`row not found at index ${keyOrIndex}`);\n }\n return row?.[KEY];\n }\n\n openTreeNode(keyOrIndex: string | number) {\n const key = this.getRowKey(keyOrIndex);\n this.openTreeNodes.push(key);\n this.processedData = expandGroup(\n this.openTreeNodes,\n this.#data,\n this._config.groupBy,\n this.#columnMap,\n this.groupMap as GroupMap,\n this.processedData as DataSourceRow[],\n );\n this.setRange(this.#range.reset, true);\n }\n\n closeTreeNode(keyOrIndex: string | number) {\n const key = this.getRowKey(keyOrIndex);\n this.openTreeNodes = this.openTreeNodes.filter((value) => value !== key);\n if (this.processedData) {\n this.processedData = collapseGroup(key, this.processedData);\n this.setRange(this.#range.reset, true);\n }\n }\n\n get pageSize() {\n return this.#range.to - this.#range.from;\n }\n\n get links() {\n return this.#links;\n }\n\n set links(links: LinkDescriptorWithLabel[] | undefined) {\n this.#links = links;\n }\n\n get menu() {\n return this._menu;\n }\n\n get status() {\n return this.#status;\n }\n\n get data() {\n return this.#data;\n }\n\n // Only used by the UpdateGenerator\n get currentData() {\n return this.processedData ?? this.#data;\n }\n\n get table() {\n return this.tableSchema.table;\n }\n\n get columns() {\n return this._config.columns;\n }\n\n set columns(columns: string[]) {\n // ignore calls to set columns, ArrayDataSource always carries all columns\n }\n\n get config() {\n return this._config;\n }\n\n set config(config: WithBaseFilter<WithFullConfig>) {\n const originalConfig = this._config;\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filterSpec?.filter &&\n config?.filterSpec.filterStruct === undefined\n ? {\n ...config,\n filterSpec: {\n filter: config.filterSpec.filter,\n filterStruct: parseFilter(config.filterSpec.filter),\n },\n }\n : config;\n\n this._config = withConfigDefaults(newConfig);\n\n let processedData: DataSourceRow[] | undefined;\n if (hasFilter(config) || hasBaseFilter(config)) {\n const fn = this.getFilterPredicate();\n processedData = this.#data.filter(fn);\n }\n\n if (configChanges.columnsChanged) {\n this.processNewColumns(originalConfig.columns, config.columns);\n }\n\n if (hasSort(config)) {\n processedData = sortRows(\n processedData ?? this.#data,\n config.sort,\n this.#columnMap,\n );\n }\n\n if (\n this.openTreeNodes.length > 0 &&\n isGroupByChanged(originalConfig, config)\n ) {\n if (this._config.groupBy.length === 0) {\n this.openTreeNodes.length = 0;\n } else {\n //TODO purge any openTreeNodes for a no-longer-present groupBy col\n }\n }\n\n if (hasGroupBy(config)) {\n const [groupedData, groupMap] = groupRows(\n processedData ?? this.#data,\n config.groupBy,\n this.#columnMap,\n );\n this.groupMap = groupMap;\n processedData = groupedData;\n\n if (this.openTreeNodes.length > 0) {\n processedData = expandGroup(\n this.openTreeNodes,\n this.#data,\n this._config.groupBy,\n this.#columnMap,\n this.groupMap as GroupMap,\n processedData as DataSourceRow[],\n );\n }\n }\n if (processedData) {\n this.processedData = this.indexProcessedData(processedData);\n } else {\n this.processedData = undefined;\n }\n }\n\n if (\n configChanges.filterChanged ||\n configChanges.baseFilterChanged ||\n configChanges.groupByChanged\n ) {\n requestAnimationFrame(() => {\n this.emit(\"resize\", this.size);\n });\n }\n\n if (this.#status === \"subscribed\") {\n requestAnimationFrame(() => {\n this.sendSizeUpdateToClient();\n if (this.preserveScrollPositionAcrossConfigChange) {\n this.preserveScrollPositionAcrossConfigChange = false;\n } else {\n this.setRange(this.#range.reset, true);\n }\n this.emit(\n \"config\",\n this._config,\n this.range,\n undefined,\n configChanges,\n );\n });\n }\n }\n }\n\n private processNewColumns(originalColumns: VuuColumns, columns: VuuColumns) {\n const addedColumns = getAddedItems(originalColumns, columns);\n if (addedColumns.length > 0) {\n // const columnsWithoutDescriptors = getMissingItems(\n // this.columnDescriptors,\n // addedColumns,\n // (col) => col.name,\n // );\n // console.warn(`columnsWithoutDescriptors`, {\n // columnsWithoutDescriptors,\n // });\n }\n this.#columnMap = buildColumnMap(columns);\n this.dataIndices = buildDataToClientMap(this.#columnMap, this.dataMap);\n }\n\n private indexProcessedData(data: DataSourceRow[]) {\n // for (let i = 0; i < data.length; i++) {\n // data[i][0] = i;\n // data[i][1] = i;\n // }\n // return data;\n return data?.map((row, i) => {\n const dolly = row.slice() as DataSourceRow;\n dolly[0] = i;\n dolly[1] = i;\n return dolly;\n });\n }\n\n private getFilterPredicate() {\n const {\n filterSpec: { filterStruct },\n } = combineFilters(this._config);\n if (filterStruct) {\n return filterPredicate(this.#columnMap, filterStruct);\n } else {\n throw Error(\"filter must include filterStruct\");\n }\n }\n\n private applyConfig(\n config: WithBaseFilter<DataSourceConfig>,\n preserveExistingConfigAttributes = false,\n ): DataSourceConfigChanges | undefined {\n const { noChanges, ...otherChanges } = isConfigChanged(\n this._config,\n config,\n );\n\n if (noChanges !== true) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filterSpec?.filter &&\n config?.filterSpec.filterStruct === undefined\n ? {\n ...config,\n filterSpec: {\n filter: config.filterSpec.filter,\n filterStruct: parseFilter(config.filterSpec.filter),\n },\n }\n : config;\n if (preserveExistingConfigAttributes) {\n this._config = {\n ...this._config,\n ...config,\n };\n } else {\n this._config = withConfigDefaults(newConfig);\n }\n return otherChanges;\n }\n }\n }\n\n get columnMap() {\n return this.#columnMap;\n }\n\n get selectedRowsCount() {\n return this.selectedRows.size;\n }\n\n get size() {\n return this.processedData?.length ?? this.#data.length;\n }\n\n get range() {\n return this.#range;\n }\n\n set range(range: Range) {\n this.setRange(range);\n }\n\n 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 getRowByKey(key: string) {\n const data = this.processedData ?? this.#data;\n return data.find((row) => row[KEY] === key);\n }\n\n getRowAtIndex(rowIndex: number) {\n return (this.processedData ?? this.#data)[rowIndex];\n }\n\n indexOfRowWithKey = (key: string) =>\n this.#data.findIndex((row) => row[KEY] === key);\n\n protected update = (row: VuuRowDataItemType[], columnName: string) => {\n // TODO take sorting, filtering. grouping into account\n const keyValue = row[this.key] as string;\n const dataColIndex = this.dataMap?.[columnName] as number;\n return this.updateDataItem(keyValue, columnName, row[dataColIndex]);\n };\n\n protected updateRow = (row: VuuRowDataItemType[]) => {\n // TODO take sorting, filtering. grouping into account\n const keyValue = row[this.key];\n const dataIndex = this.#data.findIndex((row) => row[KEY] === keyValue);\n if (dataIndex !== -1) {\n const dataSourceRow = toDataSourceRow(this.key)(row, dataIndex);\n // maybe update this in place\n this.#data[dataIndex] = dataSourceRow;\n const { from, to } = this.#range;\n if (dataIndex >= from && dataIndex < to) {\n this.sendRowsToClient(false, dataSourceRow);\n }\n }\n };\n\n deleteRow: DataSourceDeleteHandler = async (key) => {\n const dataIndex = this.#data.findIndex((row) => row[KEY] === key);\n let doomedIndex: number | undefined = undefined;\n\n if (dataIndex !== -1) {\n if (this.processedData) {\n for (let i = 0; i < this.processedData.length; i++) {\n if (this.processedData[i][KEY] === key) {\n doomedIndex = i;\n } else if (doomedIndex !== undefined) {\n this.processedData[i][0] -= 1;\n }\n }\n if (doomedIndex !== undefined) {\n this.processedData.splice(doomedIndex, 1);\n }\n }\n\n this.#data.splice(dataIndex, 1);\n for (let i = dataIndex; i < this.#data.length; i++) {\n this.#data[i][0] -= 1;\n }\n\n this.sendSizeUpdateToClient();\n\n const { from, to } = this.#range;\n const deletedIndex = doomedIndex ?? dataIndex;\n if (deletedIndex >= from && deletedIndex < to) {\n this.#keys.reset(this.range.withBuffer);\n this.sendRowsToClient(true);\n }\n\n this.emit(\"resize\", this.size);\n\n return true;\n } else {\n return \"row not found\";\n }\n };\n\n private setRange(range: Range, forceFullRefresh = false) {\n if (range.from !== this.#range.from || range.to !== this.#range.to) {\n const currentPageCount = Math.ceil(\n this.size / (this.#range.to - this.#range.from),\n );\n const newPageCount = Math.ceil(this.size / (range.to - range.from));\n\n this.#range = range;\n const keysResequenced = this.#keys.reset(range.withBuffer);\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.withBuffer)\n : this.#range.withBuffer;\n const data = this.processedData ?? this.#data;\n\n const rowsWithinViewport = data\n .slice(rowRange.from, rowRange.to)\n .map((row) =>\n toClientRow(row, this.#keys, this.selectedRows, this.dataIndices),\n );\n\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n range: this.#range,\n rows: rowsWithinViewport,\n size: data.length,\n type: \"viewport-update\",\n });\n this.lastRangeServed = {\n from: this.#range.from,\n to: this.#range.to,\n // to: Math.min(\n // this.#range.to,\n // this.#range.from + rowsWithinViewport.length,\n // ),\n };\n // console.log(\n // `%c[ArrayDataSource] lastRangeServed (${this.lastRangeServed.from}:${this.lastRangeServed.to})`,\n // \"color:green;font-weight:bold;\",\n // );\n }\n }\n\n get aggregations() {\n return this._config.aggregations;\n }\n\n set aggregations(aggregations: VuuAggregation[]) {\n this._config = {\n ...this._config,\n aggregations,\n };\n\n const targetData = this.processedData ?? this.#data;\n const leafData = this.#data;\n\n aggregateData(\n aggregations,\n targetData,\n this._config.groupBy,\n leafData,\n this.#columnMap,\n this.groupMap as GroupMap,\n );\n this.setRange(this.#range.reset, true);\n\n this.emit(\"config\", this._config, this.range);\n }\n\n get sort() {\n return this._config.sort;\n }\n\n set sort(sort: VuuSort) {\n debug?.(`sort ${JSON.stringify(sort)}`);\n this.config = {\n ...this._config,\n sort,\n };\n }\n\n get baseFilter() {\n return this._config.baseFilterSpec;\n }\n\n set baseFilter(baseFilter: DataSourceFilter | undefined) {\n debug?.(`baseFilter ${JSON.stringify(baseFilter)}`);\n // TODO check that baseFilter has changed\n this.config = {\n ...this._config,\n baseFilterSpec: baseFilter,\n };\n }\n\n get filter() {\n return this._config.filterSpec;\n }\n\n set filter(filter: DataSourceFilter) {\n debug?.(`filter ${JSON.stringify(filter)}`);\n // TODO check that filter has changed\n this.config = {\n ...this._config,\n filterSpec: filter,\n };\n }\n\n setFilter(filter: Filter) {\n const dataSourceFilter: DataSourceFilter = {\n filter: filterAsQuery(filter),\n filterStruct: filter,\n };\n this.filter = dataSourceFilter;\n }\n\n clearFilter() {\n this.filter = { filter: \"\" };\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 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 console.log({ rpcRequest });\n return new Promise(() => {\n // TODO\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: `vuuCreatedTimestamp < ${this.#freezeTimestamp}`,\n };\n } else {\n throw Error(\n \"[BaseDataSource] cannot freeze, dataSource is already frozen\",\n );\n }\n }\n unfreeze() {\n if (this.isFrozen) {\n const freezeTimestamp = this.#freezeTimestamp as number;\n this.#freezeTimestamp = undefined;\n this.emit(\"freeze\", false, freezeTimestamp);\n this.preserveScrollPositionAcrossConfigChange = true;\n this.baseFilter = {\n filter: \"\",\n };\n } else {\n throw Error(\n \"[BaseDataSource] cannot freeze, dataSource is already frozen\",\n );\n }\n }\n\n get freezeTimestamp() {\n return this.#freezeTimestamp;\n }\n\n get isFrozen() {\n return typeof this.#freezeTimestamp === \"number\";\n }\n}\n"],"names":["logger","metadataKeys","EventEmitter","vanillaConfig","KeySet","NULL_RANGE","Range","hasSort","hasFilter","hasBaseFilter","row","uuid","buildColumnMap","buildDataToClientMap","expandGroup","collapseGroup","parseFilter","withConfigDefaults","sortRows","isGroupByChanged","hasGroupBy","groupRows","getAddedItems","combineFilters","filterPredicate","isConfigChanged","sortComparator","binarySearch","toClientRow","rangeNewItems","aggregateData","filterAsQuery"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"array-data-source.js","sources":["../../../../packages/vuu-data-local/src/array-data-source/array-data-source.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceConfig,\n DataSourceConstructorProps,\n DataSourceEvents,\n DataSourceFilter,\n DataSourceRow,\n DataSourceStatus,\n DataSourceSubscribedMessage,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n TableSchema,\n WithBaseFilter,\n WithFullConfig,\n DataSourceDeleteHandler,\n} from \"@vuu-ui/vuu-data-types\";\nimport { filterPredicate, parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport type {\n LinkDescriptorWithLabel,\n SelectRequest,\n SelectRowRangeRequest,\n SelectRowRequest,\n VuuAggregation,\n VuuColumns,\n VuuGroupBy,\n VuuMenu,\n VuuRange,\n VuuRowDataItemType,\n 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 filterAsQuery,\n getAddedItems,\n hasBaseFilter,\n hasFilter,\n hasGroupBy,\n hasSort,\n isConfigChanged,\n isGroupByChanged,\n logger,\n metadataKeys,\n rangeNewItems,\n uuid,\n vanillaConfig,\n withConfigDefaults,\n} from \"@vuu-ui/vuu-utils\";\nimport { aggregateData } from \"./aggregate-utils\";\nimport { buildDataToClientMap, toClientRow } from \"./array-data-utils\";\nimport { GroupMap, collapseGroup, expandGroup, groupRows } from \"./group-utils\";\nimport {\n binarySearch,\n ColIndexSortDef,\n sortComparator,\n sortRows,\n} from \"./sort-utils\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\n\nconst { debug, info } = logger(\"ArrayDataSource\");\n\nconst { KEY } = metadataKeys;\n\nexport interface ArrayDataSourceConstructorProps\n extends Omit<DataSourceConstructorProps, \"bufferSize\" | \"table\"> {\n columnDescriptors: readonly ColumnDescriptor[];\n data: Array<VuuRowDataItemType[]>;\n dataMap?: ColumnMap;\n keyColumn?: string;\n rangeChangeRowset?: \"delta\" | \"full\";\n}\n\nconst toDataSourceRow =\n (indexOfKeyColumn: number, index?: Map<string, number>) =>\n (data: VuuRowDataItemType[], idx: number): DataSourceRow => {\n const key = `${data[indexOfKeyColumn]}`;\n index?.set(key, idx);\n return [\n idx,\n idx,\n true,\n false,\n 1,\n 0,\n key,\n 0,\n 0, // ts\n false, // isNew\n ...data,\n ];\n };\n\n// const isError = (err: unknown): err is { message: string } =>\n// typeof err === \"object\" && err !== null && err.hasOwnProperty(\"message\");\n\nconst buildTableSchema = (\n columns: readonly 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: readonly ColumnDescriptor[];\n /** sorted offsets of data within raw data, reflecting sort order\n * of columns specified by client.\n */\n private dataIndices: number[] | undefined;\n /** Map reflecting positions of data items in raw data */\n private dataMap: ColumnMap | undefined;\n private groupMap: undefined | GroupMap;\n /** the index of key field within raw data row */\n private key: number;\n private lastRangeServed: VuuRange = { from: 0, to: 0 };\n private rangeChangeRowset: \"delta\" | \"full\";\n private openTreeNodes: string[] = [];\n // Experimental. There are some config changes - first concrete example is baseFilter applied to\n // 'freeze' data, that should not immediately affect the displayed data, therefore not cause\n // range reset.\n private preserveScrollPositionAcrossConfigChange = false;\n\n /** Map reflecting positions of columns in client data sent to user */\n #columnMap: ColumnMap;\n protected _config: WithBaseFilter<WithFullConfig> & {\n visualLink?: LinkDescriptorWithLabel;\n } = vanillaConfig;\n #data: DataSourceRow[];\n #freezeTimestamp: number | undefined = undefined;\n #keys = new KeySet(NULL_RANGE);\n #links: LinkDescriptorWithLabel[] | undefined;\n #range = Range(0, 0);\n #status: DataSourceStatus = \"initialising\";\n #title: string | undefined;\n\n protected _menu: VuuMenu | undefined;\n protected selectedRows = new Set<string>();\n protected index = new Map<string, number>();\n\n public tableSchema: TableSchema;\n public viewport: string;\n\n protected processedData: DataSourceRow[] | undefined = undefined;\n\n constructor({\n aggregations,\n baseFilterSpec,\n // different from RemoteDataSource\n columnDescriptors,\n data,\n dataMap,\n filterSpec,\n groupBy,\n keyColumn,\n rangeChangeRowset = \"delta\",\n sort,\n title,\n viewport,\n }: ArrayDataSourceConstructorProps) {\n super();\n if (!data || !columnDescriptors) {\n throw Error(\n \"ArrayDataSource constructor called without data or without columnDescriptors\",\n );\n }\n\n this.columnDescriptors = columnDescriptors;\n this.dataMap = dataMap;\n this.key = keyColumn\n ? this.columnDescriptors.findIndex((col) => col.name === keyColumn)\n : 0;\n this.rangeChangeRowset = rangeChangeRowset;\n this.tableSchema = buildTableSchema(columnDescriptors, keyColumn);\n this.viewport = viewport || uuid();\n this.#title = title;\n\n const columns = columnDescriptors.map((col) => col.name);\n this.#columnMap = buildColumnMap(columns);\n this.dataIndices = buildDataToClientMap(this.#columnMap, this.dataMap);\n this.#data = data.map<DataSourceRow>(toDataSourceRow(this.key, this.index));\n\n this.config = {\n ...this._config,\n aggregations: aggregations || this._config.aggregations,\n baseFilterSpec,\n columns,\n filterSpec: filterSpec || this._config.filterSpec,\n groupBy: groupBy || this._config.groupBy,\n sort: sort || this._config.sort,\n };\n\n debug?.(`columnMap: ${JSON.stringify(this.#columnMap)}`);\n }\n\n async subscribe(\n {\n viewport = this.viewport ?? (this.viewport = uuid()),\n columns,\n aggregations,\n baseFilterSpec,\n range,\n 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.lastRangeServed = { from: 0, to: 0 };\n\n let config = this._config;\n\n const hasConfigProps =\n aggregations || columns || filterSpec || groupBy || sort;\n\n if (hasConfigProps) {\n config = {\n ...config,\n aggregations: aggregations || this._config.aggregations,\n baseFilterSpec: baseFilterSpec || this._config.baseFilterSpec,\n columns: columns || this._config.columns,\n filterSpec: filterSpec || this._config.filterSpec,\n groupBy: groupBy || this._config.groupBy,\n sort: sort || this._config.sort,\n };\n }\n\n const subscribedMessage: DataSourceSubscribedMessage = {\n ...config,\n type: \"subscribed\",\n clientViewportId: this.viewport,\n range: this.#range,\n tableSchema: this.tableSchema,\n };\n this.clientCallback?.(subscribedMessage);\n this.emit(\"subscribed\", subscribedMessage);\n\n if (hasConfigProps) {\n // invoke setter to action config\n this.config = config;\n } else {\n this.sendSizeUpdateToClient();\n this.emit(\n \"resize\",\n this.processedData ? this.processedData.length : this.#data.length,\n );\n\n if (range && !this.#range.equals(range)) {\n this.range = range;\n } else if (this.#range !== NULL_RANGE) {\n this.sendRowsToClient();\n }\n\n 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 if (this.selectedRows.size > 0) {\n if (this.selectedRows.has(\"*\")) {\n this.emit(\"row-selection\", this.size);\n } else {\n this.emit(\"row-selection\", this.selectedRows.size);\n }\n }\n\n this.sendRowsToClient(true);\n }\n\n disable() {\n this.emit(\"disabled\", this.viewport);\n }\n\n enable() {\n this.emit(\"enabled\", this.viewport);\n }\n\n select(selectRequest: Omit<SelectRequest, \"vpId\">) {\n switch (selectRequest.type) {\n case \"SELECT_ROW\": {\n const { preserveExistingSelection, rowKey } = selectRequest as Omit<\n SelectRowRequest,\n \"vpId\"\n >;\n if (!preserveExistingSelection) {\n this.selectedRows.clear();\n }\n this.selectedRows.add(rowKey);\n break;\n }\n case \"DESELECT_ROW\": {\n const { preserveExistingSelection, rowKey } = selectRequest as Omit<\n SelectRowRequest,\n \"vpId\"\n >;\n if (!preserveExistingSelection) {\n this.selectedRows.clear();\n } else if (this.selectedRows.has(\"*\")) {\n this.selectedRows.clear();\n for (const key of this.index.keys()) {\n if (key !== rowKey) {\n this.selectedRows.add(key);\n }\n }\n } else {\n this.selectedRows.delete(rowKey);\n }\n break;\n }\n case \"SELECT_ROW_RANGE\": {\n const { preserveExistingSelection, fromRowKey, toRowKey } =\n selectRequest as Omit<SelectRowRangeRequest, \"vpId\">;\n\n if (!preserveExistingSelection) {\n this.selectedRows.clear();\n }\n\n const fromIdx = this.index.get(fromRowKey);\n const toIdx = this.index.get(toRowKey);\n if (typeof fromIdx === \"number\" && typeof toIdx === \"number\") {\n for (let i = fromIdx; i <= toIdx; i++) {\n const { [KEY]: rowKey } = this.#data[i];\n this.selectedRows.add(rowKey);\n }\n }\n\n break;\n }\n case \"SELECT_ALL\": {\n this.selectedRows.clear();\n this.selectedRows.add(\"*\");\n break;\n }\n case \"DESELECT_ALL\": {\n this.selectedRows.clear();\n break;\n }\n }\n\n this.setRange(this.#range, true);\n this.emit(\n \"row-selection\",\n selectRequest.type === \"SELECT_ALL\" ? this.size : this.selectedRows.size,\n );\n }\n\n private getRowKey(keyOrIndex: string | number) {\n if (typeof keyOrIndex === \"string\") {\n return keyOrIndex;\n }\n const row = this.getRowAtIndex(keyOrIndex);\n if (row === undefined) {\n throw Error(`row not found at index ${keyOrIndex}`);\n }\n return row?.[KEY];\n }\n\n openTreeNode(keyOrIndex: string | number) {\n const key = this.getRowKey(keyOrIndex);\n this.openTreeNodes.push(key);\n this.processedData = expandGroup(\n this.openTreeNodes,\n this.#data,\n this._config.groupBy,\n this.#columnMap,\n this.groupMap as GroupMap,\n this.processedData as DataSourceRow[],\n );\n this.setRange(this.#range.reset, true);\n }\n\n closeTreeNode(keyOrIndex: string | number) {\n const key = this.getRowKey(keyOrIndex);\n this.openTreeNodes = this.openTreeNodes.filter((value) => value !== key);\n if (this.processedData) {\n this.processedData = collapseGroup(key, this.processedData);\n this.setRange(this.#range.reset, true);\n }\n }\n\n get pageSize() {\n return this.#range.to - this.#range.from;\n }\n\n get links() {\n return this.#links;\n }\n\n set links(links: LinkDescriptorWithLabel[] | undefined) {\n this.#links = links;\n }\n\n get menu() {\n return this._menu;\n }\n\n get status() {\n return this.#status;\n }\n\n get data() {\n return this.#data;\n }\n\n // Only used by the UpdateGenerator\n get currentData() {\n return this.processedData ?? this.#data;\n }\n\n get table() {\n return this.tableSchema.table;\n }\n\n get columns() {\n return this._config.columns;\n }\n\n set columns(columns: string[]) {\n // ignore calls to set columns, ArrayDataSource always carries all columns\n }\n\n get config() {\n return this._config;\n }\n\n set config(config: WithBaseFilter<WithFullConfig>) {\n const originalConfig = this._config;\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filterSpec?.filter &&\n config?.filterSpec.filterStruct === undefined\n ? {\n ...config,\n filterSpec: {\n filter: config.filterSpec.filter,\n filterStruct: parseFilter(config.filterSpec.filter),\n },\n }\n : config;\n\n this._config = withConfigDefaults(newConfig);\n\n let processedData: DataSourceRow[] | undefined;\n if (hasFilter(config) || hasBaseFilter(config)) {\n const fn = this.getFilterPredicate();\n processedData = this.#data.filter(fn);\n }\n\n if (configChanges.columnsChanged) {\n this.processNewColumns(originalConfig.columns, config.columns);\n }\n\n if (hasSort(config)) {\n processedData = sortRows(\n processedData ?? this.#data,\n config.sort,\n this.#columnMap,\n );\n }\n\n if (\n this.openTreeNodes.length > 0 &&\n isGroupByChanged(originalConfig, config)\n ) {\n if (this._config.groupBy.length === 0) {\n this.openTreeNodes.length = 0;\n } else {\n //TODO purge any openTreeNodes for a no-longer-present groupBy col\n }\n }\n\n if (hasGroupBy(config)) {\n const [groupedData, groupMap] = groupRows(\n processedData ?? this.#data,\n config.groupBy,\n this.#columnMap,\n );\n this.groupMap = groupMap;\n processedData = groupedData;\n\n if (this.openTreeNodes.length > 0) {\n processedData = expandGroup(\n this.openTreeNodes,\n this.#data,\n this._config.groupBy,\n this.#columnMap,\n this.groupMap as GroupMap,\n processedData as DataSourceRow[],\n );\n }\n }\n if (processedData) {\n this.processedData = this.indexProcessedData(processedData);\n } else {\n this.processedData = undefined;\n }\n }\n\n if (\n configChanges.filterChanged ||\n configChanges.baseFilterChanged ||\n configChanges.groupByChanged\n ) {\n requestAnimationFrame(() => {\n this.emit(\"resize\", this.size);\n });\n }\n\n if (this.#status === \"subscribed\") {\n requestAnimationFrame(() => {\n this.sendSizeUpdateToClient();\n if (this.preserveScrollPositionAcrossConfigChange) {\n this.preserveScrollPositionAcrossConfigChange = false;\n } else {\n this.setRange(this.#range.reset, true);\n }\n this.emit(\n \"config\",\n this._config,\n this.range,\n undefined,\n configChanges,\n );\n });\n }\n }\n }\n\n private processNewColumns(originalColumns: VuuColumns, columns: VuuColumns) {\n const addedColumns = getAddedItems(originalColumns, columns);\n if (addedColumns.length > 0) {\n // const columnsWithoutDescriptors = getMissingItems(\n // this.columnDescriptors,\n // addedColumns,\n // (col) => col.name,\n // );\n // console.warn(`columnsWithoutDescriptors`, {\n // columnsWithoutDescriptors,\n // });\n }\n this.#columnMap = buildColumnMap(columns);\n this.dataIndices = buildDataToClientMap(this.#columnMap, this.dataMap);\n }\n\n private indexProcessedData(data: DataSourceRow[]) {\n // for (let i = 0; i < data.length; i++) {\n // data[i][0] = i;\n // data[i][1] = i;\n // }\n // return data;\n return data?.map((row, i) => {\n const dolly = row.slice() as DataSourceRow;\n dolly[0] = i;\n dolly[1] = i;\n return dolly;\n });\n }\n\n private getFilterPredicate() {\n const {\n filterSpec: { filterStruct },\n } = combineFilters(this._config);\n if (filterStruct) {\n return filterPredicate(this.#columnMap, filterStruct);\n } else {\n throw Error(\"filter must include filterStruct\");\n }\n }\n\n private applyConfig(\n config: WithBaseFilter<DataSourceConfig>,\n preserveExistingConfigAttributes = false,\n ): DataSourceConfigChanges | undefined {\n const { noChanges, ...otherChanges } = isConfigChanged(\n this._config,\n config,\n );\n\n if (noChanges !== true) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filterSpec?.filter &&\n config?.filterSpec.filterStruct === undefined\n ? {\n ...config,\n filterSpec: {\n filter: config.filterSpec.filter,\n filterStruct: parseFilter(config.filterSpec.filter),\n },\n }\n : config;\n if (preserveExistingConfigAttributes) {\n this._config = {\n ...this._config,\n ...config,\n };\n } else {\n this._config = withConfigDefaults(newConfig);\n }\n return otherChanges;\n }\n }\n }\n\n get columnMap() {\n return this.#columnMap;\n }\n\n get selectedRowsCount() {\n return this.selectedRows.size;\n }\n\n get size() {\n return this.processedData?.length ?? this.#data.length;\n }\n\n get range() {\n return this.#range;\n }\n\n set range(range: Range) {\n this.setRange(range);\n }\n\n 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 getRowByKey(key: string) {\n const data = this.processedData ?? this.#data;\n return data.find((row) => row[KEY] === key);\n }\n\n getRowAtIndex(rowIndex: number) {\n return (this.processedData ?? this.#data)[rowIndex];\n }\n\n indexOfRowWithKey = (key: string) =>\n this.#data.findIndex((row) => row[KEY] === key);\n\n protected update = (row: VuuRowDataItemType[], columnName: string) => {\n // TODO take sorting, filtering. grouping into account\n const keyValue = row[this.key] as string;\n const dataColIndex = this.dataMap?.[columnName] as number;\n return this.updateDataItem(keyValue, columnName, row[dataColIndex]);\n };\n\n protected updateRow = (row: VuuRowDataItemType[]) => {\n // TODO take sorting, filtering. grouping into account\n const keyValue = row[this.key];\n const dataIndex = this.#data.findIndex((row) => row[KEY] === keyValue);\n if (dataIndex !== -1) {\n const dataSourceRow = toDataSourceRow(this.key)(row, dataIndex);\n // maybe update this in place\n this.#data[dataIndex] = dataSourceRow;\n const { from, to } = this.#range;\n if (dataIndex >= from && dataIndex < to) {\n this.sendRowsToClient(false, dataSourceRow);\n }\n }\n };\n\n deleteRow: DataSourceDeleteHandler = async (key) => {\n const dataIndex = this.#data.findIndex((row) => row[KEY] === key);\n let doomedIndex: number | undefined = undefined;\n\n if (dataIndex !== -1) {\n if (this.processedData) {\n for (let i = 0; i < this.processedData.length; i++) {\n if (this.processedData[i][KEY] === key) {\n doomedIndex = i;\n } else if (doomedIndex !== undefined) {\n this.processedData[i][0] -= 1;\n }\n }\n if (doomedIndex !== undefined) {\n this.processedData.splice(doomedIndex, 1);\n }\n }\n\n this.#data.splice(dataIndex, 1);\n for (let i = dataIndex; i < this.#data.length; i++) {\n this.#data[i][0] -= 1;\n }\n\n this.sendSizeUpdateToClient();\n\n const { from, to } = this.#range;\n const deletedIndex = doomedIndex ?? dataIndex;\n if (deletedIndex >= from && deletedIndex < to) {\n this.#keys.reset(this.range.withBuffer);\n this.sendRowsToClient(true);\n }\n\n this.emit(\"resize\", this.size);\n\n return true;\n } else {\n return \"row not found\";\n }\n };\n\n private setRange(range: Range, forceFullRefresh = false) {\n if (range.from !== this.#range.from || range.to !== this.#range.to) {\n const currentPageCount = Math.ceil(\n this.size / (this.#range.to - this.#range.from),\n );\n const newPageCount = Math.ceil(this.size / (range.to - range.from));\n\n this.#range = range;\n const keysResequenced = this.#keys.reset(range.withBuffer);\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.withBuffer)\n : this.#range.withBuffer;\n const data = this.processedData ?? this.#data;\n\n const rowsWithinViewport = data\n .slice(rowRange.from, rowRange.to)\n .map((row) =>\n toClientRow(row, this.#keys, this.selectedRows, this.dataIndices),\n );\n\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n range: this.#range,\n rows: rowsWithinViewport,\n size: data.length,\n type: \"viewport-update\",\n });\n this.lastRangeServed = {\n from: this.#range.from,\n to: this.#range.to,\n // to: Math.min(\n // this.#range.to,\n // this.#range.from + rowsWithinViewport.length,\n // ),\n };\n // console.log(\n // `%c[ArrayDataSource] lastRangeServed (${this.lastRangeServed.from}:${this.lastRangeServed.to})`,\n // \"color:green;font-weight:bold;\",\n // );\n }\n }\n\n get aggregations() {\n return this._config.aggregations;\n }\n\n set aggregations(aggregations: VuuAggregation[]) {\n this._config = {\n ...this._config,\n aggregations,\n };\n\n const targetData = this.processedData ?? this.#data;\n const leafData = this.#data;\n\n aggregateData(\n aggregations,\n targetData,\n this._config.groupBy,\n leafData,\n this.#columnMap,\n this.groupMap as GroupMap,\n );\n this.setRange(this.#range.reset, true);\n\n this.emit(\"config\", this._config, this.range);\n }\n\n get sort() {\n return this._config.sort;\n }\n\n set sort(sort: VuuSort) {\n debug?.(`sort ${JSON.stringify(sort)}`);\n this.config = {\n ...this._config,\n sort,\n };\n }\n\n get baseFilter() {\n return this._config.baseFilterSpec;\n }\n\n set baseFilter(baseFilter: DataSourceFilter | undefined) {\n debug?.(`baseFilter ${JSON.stringify(baseFilter)}`);\n // TODO check that baseFilter has changed\n this.config = {\n ...this._config,\n baseFilterSpec: baseFilter,\n };\n }\n\n get filter() {\n return this._config.filterSpec;\n }\n\n set filter(filter: DataSourceFilter) {\n debug?.(`filter ${JSON.stringify(filter)}`);\n // TODO check that filter has changed\n this.config = {\n ...this._config,\n filterSpec: filter,\n };\n }\n\n setFilter(filter: Filter) {\n const dataSourceFilter: DataSourceFilter = {\n filter: filterAsQuery(filter),\n filterStruct: filter,\n };\n this.filter = dataSourceFilter;\n }\n\n clearFilter() {\n this.filter = { filter: \"\" };\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 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 console.log({ rpcRequest });\n return new Promise(() => {\n // TODO\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: `vuuCreatedTimestamp < ${this.#freezeTimestamp}`,\n };\n } else {\n throw Error(\n \"[BaseDataSource] cannot freeze, dataSource is already frozen\",\n );\n }\n }\n unfreeze() {\n if (this.isFrozen) {\n const freezeTimestamp = this.#freezeTimestamp as number;\n this.#freezeTimestamp = undefined;\n this.emit(\"freeze\", false, freezeTimestamp);\n this.preserveScrollPositionAcrossConfigChange = true;\n this.baseFilter = {\n filter: \"\",\n };\n } else {\n throw Error(\n \"[BaseDataSource] cannot freeze, dataSource is already frozen\",\n );\n }\n }\n\n get freezeTimestamp() {\n return this.#freezeTimestamp;\n }\n\n get isFrozen() {\n return typeof this.#freezeTimestamp === \"number\";\n }\n}\n"],"names":["logger","metadataKeys","EventEmitter","vanillaConfig","KeySet","NULL_RANGE","Range","hasSort","hasFilter","hasBaseFilter","row","uuid","buildColumnMap","buildDataToClientMap","expandGroup","collapseGroup","parseFilter","withConfigDefaults","sortRows","isGroupByChanged","hasGroupBy","groupRows","getAddedItems","combineFilters","filterPredicate","isConfigChanged","sortComparator","binarySearch","toClientRow","rangeNewItems","aggregateData","filterAsQuery"],"mappings":"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"}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
4
|
-
|
|
5
3
|
var __defProp = Object.defineProperty;
|
|
6
4
|
var __typeError = (msg) => {
|
|
7
5
|
throw TypeError(msg);
|
|
@@ -12,12 +10,11 @@ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot
|
|
|
12
10
|
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
13
11
|
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
14
12
|
var _iconMap;
|
|
15
|
-
const { KEY } = vuuUtils.metadataKeys;
|
|
16
13
|
class IconProvider {
|
|
17
14
|
constructor() {
|
|
18
15
|
__privateAdd(this, _iconMap, {});
|
|
19
|
-
__publicField(this, "getIcon", (
|
|
20
|
-
const key =
|
|
16
|
+
__publicField(this, "getIcon", (dataRow) => {
|
|
17
|
+
const key = dataRow.key;
|
|
21
18
|
return __privateGet(this, _iconMap)[key];
|
|
22
19
|
});
|
|
23
20
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IconProvider.js","sources":["../../../../packages/vuu-data-local/src/tree-data-source/IconProvider.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"IconProvider.js","sources":["../../../../packages/vuu-data-local/src/tree-data-source/IconProvider.ts"],"sourcesContent":["import { DataRow } from \"@vuu-ui/vuu-table-types\";\n\nexport class IconProvider {\n #iconMap: Record<string, string> = {};\n getIcon = (dataRow: DataRow) => {\n const key = dataRow.key;\n return this.#iconMap[key];\n };\n setIcon(key: string, icon: string) {\n this.#iconMap[key] = icon;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAAA,IAAA,QAAA;AAEO,MAAM,YAAa,CAAA;AAAA,EAAnB,WAAA,GAAA;AACL,IAAA,YAAA,CAAA,IAAA,EAAA,QAAA,EAAmC,EAAC,CAAA;AACpC,IAAA,aAAA,CAAA,IAAA,EAAA,SAAA,EAAU,CAAC,OAAqB,KAAA;AAC9B,MAAA,MAAM,MAAM,OAAQ,CAAA,GAAA;AACpB,MAAO,OAAA,YAAA,CAAA,IAAA,EAAK,UAAS,GAAG,CAAA;AAAA,KAC1B,CAAA;AAAA;AAAA,EACA,OAAA,CAAQ,KAAa,IAAc,EAAA;AACjC,IAAK,YAAA,CAAA,IAAA,EAAA,QAAA,CAAA,CAAS,GAAG,CAAI,GAAA,IAAA;AAAA;AAEzB;AARE,QAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
|
|
@@ -23,7 +23,18 @@ var __privateWrapper = (obj, member, setter, getter) => ({
|
|
|
23
23
|
}
|
|
24
24
|
});
|
|
25
25
|
var _aggregations, _data, _iconProvider, _selectedRowsCount, _size, _status, _filterSet;
|
|
26
|
-
const
|
|
26
|
+
const TREE_SCHEMA = {
|
|
27
|
+
columns: [
|
|
28
|
+
{ name: "nodeData", serverDataType: "string" },
|
|
29
|
+
{ name: "Level 1", serverDataType: "string" },
|
|
30
|
+
{ name: "Level 2", serverDataType: "string" },
|
|
31
|
+
{ name: "Level 3", serverDataType: "string" },
|
|
32
|
+
{ name: "Level 4", serverDataType: "string" },
|
|
33
|
+
{ name: "Level 5", serverDataType: "string" }
|
|
34
|
+
],
|
|
35
|
+
key: "",
|
|
36
|
+
table: { module: "", table: "" }
|
|
37
|
+
};
|
|
27
38
|
const { COUNT, DEPTH, IDX, IS_EXPANDED, IS_LEAF, KEY, SELECTED } = vuuUtils.metadataKeys;
|
|
28
39
|
const toClientRow = (row, keys) => {
|
|
29
40
|
const [rowIndex] = row;
|
|
@@ -106,7 +117,7 @@ class TreeDataSource extends vuuUtils.BaseDataSource {
|
|
|
106
117
|
groupBy: this._configWithVisualLink.groupBy,
|
|
107
118
|
range: this.range,
|
|
108
119
|
sort: this.sort,
|
|
109
|
-
tableSchema:
|
|
120
|
+
tableSchema: TREE_SCHEMA
|
|
110
121
|
});
|
|
111
122
|
this.clientCallback({
|
|
112
123
|
clientViewportId: this.viewport,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeDataSource.js","sources":["../../../../packages/vuu-data-local/src/tree-data-source/TreeDataSource.ts"],"sourcesContent":["import type { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport type {\n LinkDescriptorWithLabel,\n VuuAggregation,\n VuuRange,\n VuuRpcResponse,\n VuuRpcRequest,\n SelectRequest,\n SelectRowRequest,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport type {\n DataSourceRow,\n DataSourceConstructorProps,\n DataSourceStatus,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n MenuRpcResponse,\n DataSourceFilter,\n DataSource,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n BaseDataSource,\n getParentRow,\n isSingleValueFilter,\n KeySet,\n lastPathSegment,\n metadataKeys,\n missingAncestor,\n NULL_RANGE,\n TreeSourceNode,\n treeToDataSourceRows,\n uuid,\n} from \"@vuu-ui/vuu-utils\";\nimport { IconProvider } from \"./IconProvider\";\nimport { parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport { FilterClause } from \"@vuu-ui/vuu-filter-types\";\n\nconst NULL_SCHEMA = { columns: [], key: \"\", table: { module: \"\", table: \"\" } };\n\ntype VisibleRowIndex = Record<number, number>;\n\nexport interface TreeDataSourceConstructorProps\n extends Omit<DataSourceConstructorProps, \"bufferSize\" | \"table\"> {\n data: TreeSourceNode[];\n}\n\nconst { COUNT, DEPTH, IDX, IS_EXPANDED, IS_LEAF, KEY, SELECTED } = metadataKeys;\n\nconst toClientRow = (row: DataSourceRow, keys: KeySet) => {\n const [rowIndex] = row;\n const clientRow = row.slice() as DataSourceRow;\n clientRow[1] = keys.keyFor(rowIndex);\n return clientRow;\n};\n\nexport class TreeDataSource extends BaseDataSource implements DataSource {\n public columnDescriptors: ColumnDescriptor[];\n private clientCallback: DataSourceSubscribeCallback | undefined;\n private expandedRows = new Set<string>();\n private visibleRows: DataSourceRow[] = [];\n private visibleRowIndex: VisibleRowIndex = {};\n\n #aggregations: VuuAggregation[] = [];\n #data: DataSourceRow[];\n #iconProvider: IconProvider;\n #selectedRowsCount = 0;\n #size = 0;\n #status: DataSourceStatus = \"initialising\";\n #filterSet: number[] | undefined;\n\n public rowCount: number | undefined;\n\n private keys = new KeySet(this._range);\n\n constructor({ data, ...props }: TreeDataSourceConstructorProps) {\n super(props);\n\n if (!data) {\n throw Error(\"TreeDataSource constructor called without data\");\n }\n this.#iconProvider = new IconProvider();\n\n [this.columnDescriptors, this.#data] = treeToDataSourceRows(\n data,\n this.#iconProvider,\n );\n\n if (this.columnDescriptors) {\n const columns = this.columnDescriptors.map((c) => c.name);\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n columns,\n groupBy: columns.slice(1),\n };\n }\n }\n\n async subscribe(\n {\n aggregations,\n columns,\n range,\n revealSelected,\n selectedKeyValues,\n viewport = this.viewport ?? uuid(),\n }: DataSourceSubscribeProps,\n callback: DataSourceSubscribeCallback,\n ) {\n this.clientCallback = callback;\n\n if (aggregations) {\n this.#aggregations = aggregations;\n }\n if (columns) {\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n columns,\n };\n }\n\n if (this.#status !== \"initialising\") {\n //TODO check if subscription details are still the same\n return;\n }\n\n this.viewport = viewport;\n\n this.#status = \"subscribed\";\n this.#selectedRowsCount = selectedKeyValues?.length ?? 0;\n\n if (selectedKeyValues) {\n this.applySelectedKeyValues(selectedKeyValues, revealSelected);\n }\n\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n );\n\n this.clientCallback?.({\n aggregations: this.#aggregations,\n type: \"subscribed\",\n clientViewportId: this.viewport,\n columns: this.columns,\n filterSpec: this.filter,\n groupBy: this._configWithVisualLink.groupBy,\n range: this.range,\n sort: this.sort,\n tableSchema: NULL_SCHEMA,\n });\n\n this.clientCallback({\n clientViewportId: this.viewport,\n mode: \"size-only\",\n type: \"viewport-update\",\n size: this.visibleRows.length,\n });\n\n if (range && !this._range.equals(range)) {\n this.range = range;\n } else if (this._range !== NULL_RANGE) {\n this.sendRowsToClient();\n }\n }\n\n unsubscribe() {\n console.log(\"noop\");\n }\n\n suspend() {\n console.log(\"noop\");\n return this;\n }\n\n resume() {\n console.log(\"noop\");\n return this;\n }\n\n disable() {\n console.log(\"noop\");\n return this;\n }\n\n enable() {\n console.log(\"noop\");\n return this;\n }\n set data(data: TreeSourceNode[]) {\n [this.columnDescriptors, this.#data] = treeToDataSourceRows(data);\n\n requestAnimationFrame(() => {\n this.sendRowsToClient();\n });\n }\n\n get filter() {\n return this._configWithVisualLink.filterSpec;\n }\n\n set filter(filter: DataSourceFilter) {\n // Note not using the setter\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n filterSpec: filter,\n };\n\n if (filter.filter) {\n this.applyFilter(filter);\n } else {\n this.#filterSet = undefined;\n }\n\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n this.#filterSet,\n );\n\n const { from, to } = this.range;\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n rows: this.visibleRows\n .slice(from, to)\n .map((row) => toClientRow(row, this.keys)),\n size: this.visibleRows.length,\n type: \"viewport-update\",\n });\n }\n\n private applyFilter({ filter: filterQuery, filterStruct }: DataSourceFilter) {\n const filter = filterStruct ?? (parseFilter(filterQuery) as FilterClause);\n if (isSingleValueFilter(filter)) {\n const filterSet = [];\n const regex = new RegExp(`${filter.value}`, \"i\");\n for (const row of this.#data) {\n const { [KEY]: key, [IDX]: idx } = row;\n if (regex.test(lastPathSegment(key, \"|\"))) {\n filterSet.push(idx);\n }\n }\n this.#filterSet = filterSet;\n }\n }\n\n /**\n * used to apply an initial selection. These may not necessarily be\n * visible. If revealOnSelect is in force, expand nodes as necessary\n * to ensure selected nodes are visible\n */\n private applySelectedKeyValues(keys: string[], revealSelected = false) {\n keys.forEach((key) => {\n const rowIdx = this.indexOfRowWithKey(key);\n const row = this.#data[rowIdx];\n row[SELECTED] = 1;\n\n if (revealSelected && row[DEPTH] !== 1) {\n const keys = key.slice(6).split(\"|\").slice(0, -1);\n\n let path = \"$root\";\n do {\n path = `${path}|${keys.shift()}`;\n this.expandedRows.add(path);\n } while (keys.length);\n }\n });\n }\n\n private indexOfRowWithKey = (key: string) =>\n this.#data.findIndex((row) => row[KEY] === key);\n\n select(selectRequest: Omit<SelectRequest, \"vpId\">) {\n // todo get a diff\n const updatedRows: DataSourceRow[] = [];\n\n switch (selectRequest.type) {\n case \"SELECT_ROW\": {\n const { preserveExistingSelection, rowKey } = selectRequest as Omit<\n SelectRowRequest,\n \"vpId\"\n >;\n for (const row of this.visibleRows) {\n const { [IDX]: rowIndex, [KEY]: key, [SELECTED]: sel } = row;\n if (\n sel === 1 &&\n preserveExistingSelection === false &&\n key !== rowKey\n ) {\n const deselectedRow = row.slice() as DataSourceRow;\n deselectedRow[SELECTED] = 0;\n this.visibleRows[rowIndex] = deselectedRow;\n updatedRows.push(deselectedRow);\n } else if (key === rowKey) {\n const selectedRow = row.slice() as DataSourceRow;\n selectedRow[SELECTED] = 1;\n this.visibleRows[rowIndex] = selectedRow;\n updatedRows.push(selectedRow);\n }\n }\n\n break;\n }\n case \"DESELECT_ROW\": {\n break;\n }\n\n default:\n // ignore\n }\n\n if (updatedRows.length > 0) {\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"update\",\n type: \"viewport-update\",\n rows: updatedRows,\n });\n }\n }\n\n private getRowKey(keyOrIndex: string | number) {\n if (typeof keyOrIndex === \"string\") {\n return keyOrIndex;\n }\n const row = this.getRowAtIndex(keyOrIndex);\n if (row === undefined) {\n throw Error(`row not found at index ${keyOrIndex}`);\n }\n return row[KEY];\n }\n\n openTreeNode(keyOrIndex: string | number) {\n const key = this.getRowKey(keyOrIndex);\n this.expandedRows.add(key);\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n );\n\n const { from, to } = this._range;\n this.clientCallback?.({\n clientViewportId: this.viewport,\n\n mode: \"batch\",\n rows: this.visibleRows\n .slice(from, to)\n .map((row) => toClientRow(row, this.keys)),\n size: this.visibleRows.length,\n type: \"viewport-update\",\n });\n }\n\n closeTreeNode(keyOrIndex: string | number, cascade = false) {\n const key = this.getRowKey(keyOrIndex);\n this.expandedRows.delete(key);\n if (cascade) {\n for (const rowKey of this.expandedRows.keys()) {\n if (rowKey.startsWith(key)) {\n this.expandedRows.delete(rowKey);\n }\n }\n }\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n );\n this.sendRowsToClient();\n }\n\n get status() {\n return this.#status;\n }\n\n get selectedRowsCount() {\n return this.#selectedRowsCount;\n }\n\n get size() {\n return this.#size;\n }\n\n rangeRequest(range: VuuRange) {\n this.keys.reset(range);\n requestAnimationFrame(() => {\n this.sendRowsToClient();\n });\n }\n\n private sendRowsToClient() {\n const { from, to } = this._range;\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n rows: this.visibleRows\n .slice(from, to)\n .map((row) => toClientRow(row, this.keys)),\n size: this.visibleRows.length,\n type: \"viewport-update\",\n });\n }\n\n createLink({\n parentVpId,\n link: { fromColumn, toColumn },\n }: LinkDescriptorWithLabel) {\n console.log(\"create link\", {\n parentVpId,\n fromColumn,\n toColumn,\n });\n }\n\n removeLink() {\n console.log(\"remove link\");\n }\n\n async remoteProcedureCall<T extends VuuRpcResponse = VuuRpcResponse>() {\n return Promise.reject<T>();\n }\n\n async menuRpcCall(\n rpcRequest: Omit<VuuRpcRequest, \"vpId\">,\n ): Promise<MenuRpcResponse | undefined> {\n console.log(\"rmenuRpcCall\", {\n rpcRequest,\n });\n return undefined;\n }\n\n getChildRows(rowKey: string) {\n const parentRow = this.#data.find((row) => row[KEY] === rowKey);\n if (parentRow) {\n const { [IDX]: parentIdx, [DEPTH]: parentDepth } = parentRow;\n let rowIdx = parentIdx + 1;\n const childRows = [];\n do {\n const { [DEPTH]: depth } = this.#data[rowIdx];\n if (depth === parentDepth + 1) {\n childRows.push(this.#data[rowIdx]);\n } else if (depth <= parentDepth) {\n break;\n }\n rowIdx += 1;\n } while (rowIdx < this.#data.length);\n return childRows;\n } else {\n console.warn(\n `JsonDataSource getChildRows row not found for key ${rowKey}`,\n );\n }\n\n return [];\n }\n\n getRowsAtDepth(depth: number, visibleOnly = true) {\n const rows = visibleOnly ? this.visibleRows : this.#data;\n return rows.filter((row) => row[DEPTH] === depth);\n }\n\n getRowAtIndex(rowIdx: number) {\n return this.visibleRows[rowIdx];\n }\n}\n\nfunction getVisibleRows(\n rows: DataSourceRow[],\n expandedKeys: Set<string>,\n filterset?: number[],\n): [visibleRows: DataSourceRow[], index: VisibleRowIndex] {\n const visibleRows: DataSourceRow[] = [];\n const visibleRowIndex: VisibleRowIndex = {};\n\n const data = filterset ?? rows;\n\n for (let i = 0, index = 0; i < data.length; i++) {\n const idx = filterset ? filterset[i] : i;\n const row = rows[idx];\n const {\n [COUNT]: count,\n [DEPTH]: depth,\n [KEY]: key,\n [IS_LEAF]: isLeaf,\n } = row;\n if (filterset) {\n // assume expanded for now\n\n // if we have skipped a higher level group (that didn't directly match\n // our filter criteria, add it.\n const previousRow = visibleRows.at(-1);\n if (missingAncestor(row, previousRow)) {\n let currentRow: DataSourceRow | undefined = row;\n const missingRows = [];\n while (currentRow) {\n currentRow = getParentRow(rows, currentRow);\n if (currentRow) {\n // we will get the missing rows in reverse order\n missingRows.unshift(currentRow);\n }\n }\n missingRows.forEach((row) => {\n visibleRows.push(cloneRow(row, index++, true));\n });\n }\n\n visibleRows.push(cloneRow(row, index++, true));\n visibleRowIndex[index] = i;\n } else {\n const isExpanded = expandedKeys.has(key);\n visibleRows.push(cloneRow(row, index, isExpanded));\n visibleRowIndex[index++] = i;\n const skipNonVisibleRows = !isLeaf && !isExpanded && count > 0;\n if (skipNonVisibleRows) {\n do {\n i += 1;\n } while (i < rows.length - 1 && rows[i + 1][DEPTH] > depth);\n }\n }\n }\n return [visibleRows, visibleRowIndex];\n}\n\nconst cloneRow = (\n row: DataSourceRow,\n index: number,\n isExpanded: boolean,\n): DataSourceRow => {\n const dolly = row.slice() as DataSourceRow;\n dolly[0] = index;\n dolly[1] = index;\n if (isExpanded) {\n dolly[IS_EXPANDED] = true;\n }\n return dolly;\n};\n"],"names":["metadataKeys","BaseDataSource","KeySet","IconProvider","treeToDataSourceRows","uuid","NULL_RANGE","parseFilter","isSingleValueFilter","lastPathSegment","keys","missingAncestor","getParentRow","row"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TreeDataSource.js","sources":["../../../../packages/vuu-data-local/src/tree-data-source/TreeDataSource.ts"],"sourcesContent":["import type { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport type {\n LinkDescriptorWithLabel,\n VuuAggregation,\n VuuRange,\n VuuRpcResponse,\n VuuRpcRequest,\n SelectRequest,\n SelectRowRequest,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport type {\n DataSourceRow,\n DataSourceConstructorProps,\n DataSourceStatus,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n MenuRpcResponse,\n DataSourceFilter,\n DataSource,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n BaseDataSource,\n getParentRow,\n isSingleValueFilter,\n KeySet,\n lastPathSegment,\n metadataKeys,\n missingAncestor,\n NULL_RANGE,\n TreeSourceNode,\n treeToDataSourceRows,\n uuid,\n} from \"@vuu-ui/vuu-utils\";\nimport { IconProvider } from \"./IconProvider\";\nimport { parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport { FilterClause } from \"@vuu-ui/vuu-filter-types\";\n\nconst TREE_SCHEMA: TableSchema = {\n columns: [\n { name: \"nodeData\", serverDataType: \"string\" },\n { name: \"Level 1\", serverDataType: \"string\" },\n { name: \"Level 2\", serverDataType: \"string\" },\n { name: \"Level 3\", serverDataType: \"string\" },\n { name: \"Level 4\", serverDataType: \"string\" },\n { name: \"Level 5\", serverDataType: \"string\" },\n ],\n key: \"\",\n table: { module: \"\", table: \"\" },\n};\n\ntype VisibleRowIndex = Record<number, number>;\n\nexport interface TreeDataSourceConstructorProps\n extends Omit<DataSourceConstructorProps, \"bufferSize\" | \"table\"> {\n data: TreeSourceNode[];\n}\n\nconst { COUNT, DEPTH, IDX, IS_EXPANDED, IS_LEAF, KEY, SELECTED } = metadataKeys;\n\nconst toClientRow = (row: DataSourceRow, keys: KeySet) => {\n const [rowIndex] = row;\n const clientRow = row.slice() as DataSourceRow;\n clientRow[1] = keys.keyFor(rowIndex);\n return clientRow;\n};\n\nexport class TreeDataSource extends BaseDataSource implements DataSource {\n public columnDescriptors: ColumnDescriptor[];\n private clientCallback: DataSourceSubscribeCallback | undefined;\n private expandedRows = new Set<string>();\n private visibleRows: DataSourceRow[] = [];\n private visibleRowIndex: VisibleRowIndex = {};\n\n #aggregations: VuuAggregation[] = [];\n #data: DataSourceRow[];\n #iconProvider: IconProvider;\n #selectedRowsCount = 0;\n #size = 0;\n #status: DataSourceStatus = \"initialising\";\n #filterSet: number[] | undefined;\n\n public rowCount: number | undefined;\n\n private keys = new KeySet(this._range);\n\n constructor({ data, ...props }: TreeDataSourceConstructorProps) {\n super(props);\n\n if (!data) {\n throw Error(\"TreeDataSource constructor called without data\");\n }\n this.#iconProvider = new IconProvider();\n\n [this.columnDescriptors, this.#data] = treeToDataSourceRows(\n data,\n this.#iconProvider,\n );\n\n if (this.columnDescriptors) {\n const columns = this.columnDescriptors.map((c) => c.name);\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n columns,\n groupBy: columns.slice(1),\n };\n }\n }\n\n async subscribe(\n {\n aggregations,\n columns,\n range,\n revealSelected,\n selectedKeyValues,\n viewport = this.viewport ?? uuid(),\n }: DataSourceSubscribeProps,\n callback: DataSourceSubscribeCallback,\n ) {\n this.clientCallback = callback;\n\n if (aggregations) {\n this.#aggregations = aggregations;\n }\n if (columns) {\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n columns,\n };\n }\n\n if (this.#status !== \"initialising\") {\n //TODO check if subscription details are still the same\n return;\n }\n\n this.viewport = viewport;\n\n this.#status = \"subscribed\";\n this.#selectedRowsCount = selectedKeyValues?.length ?? 0;\n\n if (selectedKeyValues) {\n this.applySelectedKeyValues(selectedKeyValues, revealSelected);\n }\n\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n );\n\n this.clientCallback?.({\n aggregations: this.#aggregations,\n type: \"subscribed\",\n clientViewportId: this.viewport,\n columns: this.columns,\n filterSpec: this.filter,\n groupBy: this._configWithVisualLink.groupBy,\n range: this.range,\n sort: this.sort,\n tableSchema: TREE_SCHEMA,\n });\n\n this.clientCallback({\n clientViewportId: this.viewport,\n mode: \"size-only\",\n type: \"viewport-update\",\n size: this.visibleRows.length,\n });\n\n if (range && !this._range.equals(range)) {\n this.range = range;\n } else if (this._range !== NULL_RANGE) {\n this.sendRowsToClient();\n }\n }\n\n unsubscribe() {\n console.log(\"noop\");\n }\n\n suspend() {\n console.log(\"noop\");\n return this;\n }\n\n resume() {\n console.log(\"noop\");\n return this;\n }\n\n disable() {\n console.log(\"noop\");\n return this;\n }\n\n enable() {\n console.log(\"noop\");\n return this;\n }\n set data(data: TreeSourceNode[]) {\n [this.columnDescriptors, this.#data] = treeToDataSourceRows(data);\n\n requestAnimationFrame(() => {\n this.sendRowsToClient();\n });\n }\n\n get filter() {\n return this._configWithVisualLink.filterSpec;\n }\n\n set filter(filter: DataSourceFilter) {\n // Note not using the setter\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n filterSpec: filter,\n };\n\n if (filter.filter) {\n this.applyFilter(filter);\n } else {\n this.#filterSet = undefined;\n }\n\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n this.#filterSet,\n );\n\n const { from, to } = this.range;\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n rows: this.visibleRows\n .slice(from, to)\n .map((row) => toClientRow(row, this.keys)),\n size: this.visibleRows.length,\n type: \"viewport-update\",\n });\n }\n\n private applyFilter({ filter: filterQuery, filterStruct }: DataSourceFilter) {\n const filter = filterStruct ?? (parseFilter(filterQuery) as FilterClause);\n if (isSingleValueFilter(filter)) {\n const filterSet = [];\n const regex = new RegExp(`${filter.value}`, \"i\");\n for (const row of this.#data) {\n const { [KEY]: key, [IDX]: idx } = row;\n if (regex.test(lastPathSegment(key, \"|\"))) {\n filterSet.push(idx);\n }\n }\n this.#filterSet = filterSet;\n }\n }\n\n /**\n * used to apply an initial selection. These may not necessarily be\n * visible. If revealOnSelect is in force, expand nodes as necessary\n * to ensure selected nodes are visible\n */\n private applySelectedKeyValues(keys: string[], revealSelected = false) {\n keys.forEach((key) => {\n const rowIdx = this.indexOfRowWithKey(key);\n const row = this.#data[rowIdx];\n row[SELECTED] = 1;\n\n if (revealSelected && row[DEPTH] !== 1) {\n const keys = key.slice(6).split(\"|\").slice(0, -1);\n\n let path = \"$root\";\n do {\n path = `${path}|${keys.shift()}`;\n this.expandedRows.add(path);\n } while (keys.length);\n }\n });\n }\n\n private indexOfRowWithKey = (key: string) =>\n this.#data.findIndex((row) => row[KEY] === key);\n\n select(selectRequest: Omit<SelectRequest, \"vpId\">) {\n // todo get a diff\n const updatedRows: DataSourceRow[] = [];\n\n switch (selectRequest.type) {\n case \"SELECT_ROW\": {\n const { preserveExistingSelection, rowKey } = selectRequest as Omit<\n SelectRowRequest,\n \"vpId\"\n >;\n for (const row of this.visibleRows) {\n const { [IDX]: rowIndex, [KEY]: key, [SELECTED]: sel } = row;\n if (\n sel === 1 &&\n preserveExistingSelection === false &&\n key !== rowKey\n ) {\n const deselectedRow = row.slice() as DataSourceRow;\n deselectedRow[SELECTED] = 0;\n this.visibleRows[rowIndex] = deselectedRow;\n updatedRows.push(deselectedRow);\n } else if (key === rowKey) {\n const selectedRow = row.slice() as DataSourceRow;\n selectedRow[SELECTED] = 1;\n this.visibleRows[rowIndex] = selectedRow;\n updatedRows.push(selectedRow);\n }\n }\n\n break;\n }\n case \"DESELECT_ROW\": {\n break;\n }\n\n default:\n // ignore\n }\n\n if (updatedRows.length > 0) {\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"update\",\n type: \"viewport-update\",\n rows: updatedRows,\n });\n }\n }\n\n private getRowKey(keyOrIndex: string | number) {\n if (typeof keyOrIndex === \"string\") {\n return keyOrIndex;\n }\n const row = this.getRowAtIndex(keyOrIndex);\n if (row === undefined) {\n throw Error(`row not found at index ${keyOrIndex}`);\n }\n return row[KEY];\n }\n\n openTreeNode(keyOrIndex: string | number) {\n const key = this.getRowKey(keyOrIndex);\n this.expandedRows.add(key);\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n );\n\n const { from, to } = this._range;\n this.clientCallback?.({\n clientViewportId: this.viewport,\n\n mode: \"batch\",\n rows: this.visibleRows\n .slice(from, to)\n .map((row) => toClientRow(row, this.keys)),\n size: this.visibleRows.length,\n type: \"viewport-update\",\n });\n }\n\n closeTreeNode(keyOrIndex: string | number, cascade = false) {\n const key = this.getRowKey(keyOrIndex);\n this.expandedRows.delete(key);\n if (cascade) {\n for (const rowKey of this.expandedRows.keys()) {\n if (rowKey.startsWith(key)) {\n this.expandedRows.delete(rowKey);\n }\n }\n }\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n );\n this.sendRowsToClient();\n }\n\n get status() {\n return this.#status;\n }\n\n get selectedRowsCount() {\n return this.#selectedRowsCount;\n }\n\n get size() {\n return this.#size;\n }\n\n rangeRequest(range: VuuRange) {\n this.keys.reset(range);\n requestAnimationFrame(() => {\n this.sendRowsToClient();\n });\n }\n\n private sendRowsToClient() {\n const { from, to } = this._range;\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n rows: this.visibleRows\n .slice(from, to)\n .map((row) => toClientRow(row, this.keys)),\n size: this.visibleRows.length,\n type: \"viewport-update\",\n });\n }\n\n createLink({\n parentVpId,\n link: { fromColumn, toColumn },\n }: LinkDescriptorWithLabel) {\n console.log(\"create link\", {\n parentVpId,\n fromColumn,\n toColumn,\n });\n }\n\n removeLink() {\n console.log(\"remove link\");\n }\n\n async remoteProcedureCall<T extends VuuRpcResponse = VuuRpcResponse>() {\n return Promise.reject<T>();\n }\n\n async menuRpcCall(\n rpcRequest: Omit<VuuRpcRequest, \"vpId\">,\n ): Promise<MenuRpcResponse | undefined> {\n console.log(\"rmenuRpcCall\", {\n rpcRequest,\n });\n return undefined;\n }\n\n getChildRows(rowKey: string) {\n const parentRow = this.#data.find((row) => row[KEY] === rowKey);\n if (parentRow) {\n const { [IDX]: parentIdx, [DEPTH]: parentDepth } = parentRow;\n let rowIdx = parentIdx + 1;\n const childRows = [];\n do {\n const { [DEPTH]: depth } = this.#data[rowIdx];\n if (depth === parentDepth + 1) {\n childRows.push(this.#data[rowIdx]);\n } else if (depth <= parentDepth) {\n break;\n }\n rowIdx += 1;\n } while (rowIdx < this.#data.length);\n return childRows;\n } else {\n console.warn(\n `JsonDataSource getChildRows row not found for key ${rowKey}`,\n );\n }\n\n return [];\n }\n\n getRowsAtDepth(depth: number, visibleOnly = true) {\n const rows = visibleOnly ? this.visibleRows : this.#data;\n return rows.filter((row) => row[DEPTH] === depth);\n }\n\n getRowAtIndex(rowIdx: number) {\n return this.visibleRows[rowIdx];\n }\n}\n\nfunction getVisibleRows(\n rows: DataSourceRow[],\n expandedKeys: Set<string>,\n filterset?: number[],\n): [visibleRows: DataSourceRow[], index: VisibleRowIndex] {\n const visibleRows: DataSourceRow[] = [];\n const visibleRowIndex: VisibleRowIndex = {};\n\n const data = filterset ?? rows;\n\n for (let i = 0, index = 0; i < data.length; i++) {\n const idx = filterset ? filterset[i] : i;\n const row = rows[idx];\n const {\n [COUNT]: count,\n [DEPTH]: depth,\n [KEY]: key,\n [IS_LEAF]: isLeaf,\n } = row;\n if (filterset) {\n // assume expanded for now\n\n // if we have skipped a higher level group (that didn't directly match\n // our filter criteria, add it.\n const previousRow = visibleRows.at(-1);\n if (missingAncestor(row, previousRow)) {\n let currentRow: DataSourceRow | undefined = row;\n const missingRows = [];\n while (currentRow) {\n currentRow = getParentRow(rows, currentRow);\n if (currentRow) {\n // we will get the missing rows in reverse order\n missingRows.unshift(currentRow);\n }\n }\n missingRows.forEach((row) => {\n visibleRows.push(cloneRow(row, index++, true));\n });\n }\n\n visibleRows.push(cloneRow(row, index++, true));\n visibleRowIndex[index] = i;\n } else {\n const isExpanded = expandedKeys.has(key);\n visibleRows.push(cloneRow(row, index, isExpanded));\n visibleRowIndex[index++] = i;\n const skipNonVisibleRows = !isLeaf && !isExpanded && count > 0;\n if (skipNonVisibleRows) {\n do {\n i += 1;\n } while (i < rows.length - 1 && rows[i + 1][DEPTH] > depth);\n }\n }\n }\n return [visibleRows, visibleRowIndex];\n}\n\nconst cloneRow = (\n row: DataSourceRow,\n index: number,\n isExpanded: boolean,\n): DataSourceRow => {\n const dolly = row.slice() as DataSourceRow;\n dolly[0] = index;\n dolly[1] = index;\n if (isExpanded) {\n dolly[IS_EXPANDED] = true;\n }\n return dolly;\n};\n"],"names":["metadataKeys","BaseDataSource","KeySet","IconProvider","treeToDataSourceRows","uuid","NULL_RANGE","parseFilter","isSingleValueFilter","lastPathSegment","keys","missingAncestor","getParentRow","row"],"mappings":"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"}
|
|
@@ -264,6 +264,10 @@ class ArrayDataSource extends EventEmitter {
|
|
|
264
264
|
this.config = config;
|
|
265
265
|
} else {
|
|
266
266
|
this.sendSizeUpdateToClient();
|
|
267
|
+
this.emit(
|
|
268
|
+
"resize",
|
|
269
|
+
this.processedData ? this.processedData.length : __privateGet(this, _data).length
|
|
270
|
+
);
|
|
267
271
|
if (range && !__privateGet(this, _range).equals(range)) {
|
|
268
272
|
this.range = range;
|
|
269
273
|
} else if (__privateGet(this, _range) !== NULL_RANGE) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"array-data-source.js","sources":["../../../../packages/vuu-data-local/src/array-data-source/array-data-source.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceConfig,\n DataSourceConstructorProps,\n DataSourceEvents,\n DataSourceFilter,\n DataSourceRow,\n DataSourceStatus,\n DataSourceSubscribedMessage,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n TableSchema,\n WithBaseFilter,\n WithFullConfig,\n DataSourceDeleteHandler,\n} from \"@vuu-ui/vuu-data-types\";\nimport { filterPredicate, parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport type {\n LinkDescriptorWithLabel,\n SelectRequest,\n SelectRowRangeRequest,\n SelectRowRequest,\n VuuAggregation,\n VuuColumns,\n VuuGroupBy,\n VuuMenu,\n VuuRange,\n VuuRowDataItemType,\n 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 filterAsQuery,\n getAddedItems,\n hasBaseFilter,\n hasFilter,\n hasGroupBy,\n hasSort,\n isConfigChanged,\n isGroupByChanged,\n logger,\n metadataKeys,\n rangeNewItems,\n uuid,\n vanillaConfig,\n withConfigDefaults,\n} from \"@vuu-ui/vuu-utils\";\nimport { aggregateData } from \"./aggregate-utils\";\nimport { buildDataToClientMap, toClientRow } from \"./array-data-utils\";\nimport { GroupMap, collapseGroup, expandGroup, groupRows } from \"./group-utils\";\nimport {\n binarySearch,\n ColIndexSortDef,\n sortComparator,\n sortRows,\n} from \"./sort-utils\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\n\nconst { debug, info } = logger(\"ArrayDataSource\");\n\nconst { KEY } = metadataKeys;\n\nexport interface ArrayDataSourceConstructorProps\n extends Omit<DataSourceConstructorProps, \"bufferSize\" | \"table\"> {\n columnDescriptors: ColumnDescriptor[];\n data: Array<VuuRowDataItemType[]>;\n dataMap?: ColumnMap;\n keyColumn?: string;\n rangeChangeRowset?: \"delta\" | \"full\";\n}\n\nconst toDataSourceRow =\n (indexOfKeyColumn: number, index?: Map<string, number>) =>\n (data: VuuRowDataItemType[], idx: number): DataSourceRow => {\n const key = `${data[indexOfKeyColumn]}`;\n index?.set(key, idx);\n return [\n idx,\n idx,\n true,\n false,\n 1,\n 0,\n key,\n 0,\n 0, // ts\n false, // isNew\n ...data,\n ];\n };\n\n// const isError = (err: unknown): err is { message: string } =>\n// typeof err === \"object\" && err !== null && err.hasOwnProperty(\"message\");\n\nconst buildTableSchema = (\n columns: ColumnDescriptor[],\n keyColumn?: string,\n): TableSchema => {\n const schema: TableSchema = {\n columns: columns.map(({ name, serverDataType = \"string\" }) => ({\n name,\n serverDataType,\n })),\n key: keyColumn ?? columns[0].name,\n table: { module: \"\", table: \"Array\" },\n };\n\n return schema;\n};\n\nexport class ArrayDataSource\n extends EventEmitter<DataSourceEvents>\n implements DataSource\n{\n private clientCallback: DataSourceSubscribeCallback | undefined;\n private columnDescriptors: ColumnDescriptor[];\n /** sorted offsets of data within raw data, reflecting sort order\n * of columns specified by client.\n */\n private dataIndices: number[] | undefined;\n /** Map reflecting positions of data items in raw data */\n private dataMap: ColumnMap | undefined;\n private groupMap: undefined | GroupMap;\n /** the index of key field within raw data row */\n private key: number;\n private lastRangeServed: VuuRange = { from: 0, to: 0 };\n private rangeChangeRowset: \"delta\" | \"full\";\n private openTreeNodes: string[] = [];\n // Experimental. There are some config changes - first concrete example is baseFilter applied to\n // 'freeze' data, that should not immediately affect the displayed data, therefore not cause\n // range reset.\n private preserveScrollPositionAcrossConfigChange = false;\n\n /** Map reflecting positions of columns in client data sent to user */\n #columnMap: ColumnMap;\n protected _config: WithBaseFilter<WithFullConfig> & {\n visualLink?: LinkDescriptorWithLabel;\n } = vanillaConfig;\n #data: DataSourceRow[];\n #freezeTimestamp: number | undefined = undefined;\n #keys = new KeySet(NULL_RANGE);\n #links: LinkDescriptorWithLabel[] | undefined;\n #range = Range(0, 0);\n #status: DataSourceStatus = \"initialising\";\n #title: string | undefined;\n\n protected _menu: VuuMenu | undefined;\n protected selectedRows = new Set<string>();\n protected index = new Map<string, number>();\n\n public tableSchema: TableSchema;\n public viewport: string;\n\n protected processedData: DataSourceRow[] | undefined = undefined;\n\n constructor({\n aggregations,\n baseFilterSpec,\n // different from RemoteDataSource\n columnDescriptors,\n data,\n dataMap,\n filterSpec,\n groupBy,\n keyColumn,\n rangeChangeRowset = \"delta\",\n sort,\n title,\n viewport,\n }: ArrayDataSourceConstructorProps) {\n super();\n if (!data || !columnDescriptors) {\n throw Error(\n \"ArrayDataSource constructor called without data or without columnDescriptors\",\n );\n }\n\n this.columnDescriptors = columnDescriptors;\n this.dataMap = dataMap;\n this.key = keyColumn\n ? this.columnDescriptors.findIndex((col) => col.name === keyColumn)\n : 0;\n this.rangeChangeRowset = rangeChangeRowset;\n this.tableSchema = buildTableSchema(columnDescriptors, keyColumn);\n this.viewport = viewport || uuid();\n this.#title = title;\n\n const columns = columnDescriptors.map((col) => col.name);\n this.#columnMap = buildColumnMap(columns);\n this.dataIndices = buildDataToClientMap(this.#columnMap, this.dataMap);\n this.#data = data.map<DataSourceRow>(toDataSourceRow(this.key, this.index));\n\n this.config = {\n ...this._config,\n aggregations: aggregations || this._config.aggregations,\n baseFilterSpec,\n columns,\n filterSpec: filterSpec || this._config.filterSpec,\n groupBy: groupBy || this._config.groupBy,\n sort: sort || this._config.sort,\n };\n\n debug?.(`columnMap: ${JSON.stringify(this.#columnMap)}`);\n }\n\n async subscribe(\n {\n viewport = this.viewport ?? (this.viewport = uuid()),\n columns,\n aggregations,\n baseFilterSpec,\n range,\n 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.lastRangeServed = { from: 0, to: 0 };\n\n let config = this._config;\n\n const hasConfigProps =\n aggregations || columns || filterSpec || groupBy || sort;\n\n if (hasConfigProps) {\n config = {\n ...config,\n aggregations: aggregations || this._config.aggregations,\n baseFilterSpec: baseFilterSpec || this._config.baseFilterSpec,\n columns: columns || this._config.columns,\n filterSpec: filterSpec || this._config.filterSpec,\n groupBy: groupBy || this._config.groupBy,\n sort: sort || this._config.sort,\n };\n }\n\n const subscribedMessage: DataSourceSubscribedMessage = {\n ...config,\n type: \"subscribed\",\n clientViewportId: this.viewport,\n range: this.#range,\n tableSchema: this.tableSchema,\n };\n this.clientCallback?.(subscribedMessage);\n this.emit(\"subscribed\", subscribedMessage);\n\n if (hasConfigProps) {\n // invoke setter to action config\n this.config = config;\n } else {\n this.sendSizeUpdateToClient();\n if (range && !this.#range.equals(range)) {\n this.range = range;\n } else if (this.#range !== NULL_RANGE) {\n this.sendRowsToClient();\n }\n\n if (this.range.to !== 0) {\n const pageCount = Math.ceil(\n this.size / (this.range.to - this.range.from),\n );\n this.emit(\"page-count\", pageCount);\n }\n }\n }\n\n unsubscribe() {\n this.clientCallback = undefined;\n this.#status = \"unsubscribed\";\n this.emit(\"unsubscribed\", this.viewport);\n }\n\n suspend() {\n if (this.#status !== \"unsubscribed\") {\n info?.(`suspend #${this.viewport}, current status ${this.#status}`);\n this.#status = \"suspended\";\n this.emit(\"suspended\", this.viewport);\n }\n }\n\n resume(callback?: DataSourceSubscribeCallback) {\n const isSuspended = this.#status === \"suspended\";\n info?.(`resume #${this.viewport}, current status ${this.#status}`);\n if (callback) {\n this.clientCallback = callback;\n }\n\n if (isSuspended) {\n this.#status = \"subscribed\";\n }\n this.emit(\"resumed\", this.viewport);\n if (this.selectedRows.size > 0) {\n if (this.selectedRows.has(\"*\")) {\n this.emit(\"row-selection\", this.size);\n } else {\n this.emit(\"row-selection\", this.selectedRows.size);\n }\n }\n\n this.sendRowsToClient(true);\n }\n\n disable() {\n this.emit(\"disabled\", this.viewport);\n }\n\n enable() {\n this.emit(\"enabled\", this.viewport);\n }\n\n select(selectRequest: Omit<SelectRequest, \"vpId\">) {\n switch (selectRequest.type) {\n case \"SELECT_ROW\": {\n const { preserveExistingSelection, rowKey } = selectRequest as Omit<\n SelectRowRequest,\n \"vpId\"\n >;\n if (!preserveExistingSelection) {\n this.selectedRows.clear();\n }\n this.selectedRows.add(rowKey);\n break;\n }\n case \"DESELECT_ROW\": {\n const { preserveExistingSelection, rowKey } = selectRequest as Omit<\n SelectRowRequest,\n \"vpId\"\n >;\n if (!preserveExistingSelection) {\n this.selectedRows.clear();\n } else if (this.selectedRows.has(\"*\")) {\n this.selectedRows.clear();\n for (const key of this.index.keys()) {\n if (key !== rowKey) {\n this.selectedRows.add(key);\n }\n }\n } else {\n this.selectedRows.delete(rowKey);\n }\n break;\n }\n case \"SELECT_ROW_RANGE\": {\n const { preserveExistingSelection, fromRowKey, toRowKey } =\n selectRequest as Omit<SelectRowRangeRequest, \"vpId\">;\n\n if (!preserveExistingSelection) {\n this.selectedRows.clear();\n }\n\n const fromIdx = this.index.get(fromRowKey);\n const toIdx = this.index.get(toRowKey);\n if (typeof fromIdx === \"number\" && typeof toIdx === \"number\") {\n for (let i = fromIdx; i <= toIdx; i++) {\n const { [KEY]: rowKey } = this.#data[i];\n this.selectedRows.add(rowKey);\n }\n }\n\n break;\n }\n case \"SELECT_ALL\": {\n this.selectedRows.clear();\n this.selectedRows.add(\"*\");\n break;\n }\n case \"DESELECT_ALL\": {\n this.selectedRows.clear();\n break;\n }\n }\n\n this.setRange(this.#range, true);\n this.emit(\n \"row-selection\",\n selectRequest.type === \"SELECT_ALL\" ? this.size : this.selectedRows.size,\n );\n }\n\n private getRowKey(keyOrIndex: string | number) {\n if (typeof keyOrIndex === \"string\") {\n return keyOrIndex;\n }\n const row = this.getRowAtIndex(keyOrIndex);\n if (row === undefined) {\n throw Error(`row not found at index ${keyOrIndex}`);\n }\n return row?.[KEY];\n }\n\n openTreeNode(keyOrIndex: string | number) {\n const key = this.getRowKey(keyOrIndex);\n this.openTreeNodes.push(key);\n this.processedData = expandGroup(\n this.openTreeNodes,\n this.#data,\n this._config.groupBy,\n this.#columnMap,\n this.groupMap as GroupMap,\n this.processedData as DataSourceRow[],\n );\n this.setRange(this.#range.reset, true);\n }\n\n closeTreeNode(keyOrIndex: string | number) {\n const key = this.getRowKey(keyOrIndex);\n this.openTreeNodes = this.openTreeNodes.filter((value) => value !== key);\n if (this.processedData) {\n this.processedData = collapseGroup(key, this.processedData);\n this.setRange(this.#range.reset, true);\n }\n }\n\n get pageSize() {\n return this.#range.to - this.#range.from;\n }\n\n get links() {\n return this.#links;\n }\n\n set links(links: LinkDescriptorWithLabel[] | undefined) {\n this.#links = links;\n }\n\n get menu() {\n return this._menu;\n }\n\n get status() {\n return this.#status;\n }\n\n get data() {\n return this.#data;\n }\n\n // Only used by the UpdateGenerator\n get currentData() {\n return this.processedData ?? this.#data;\n }\n\n get table() {\n return this.tableSchema.table;\n }\n\n get columns() {\n return this._config.columns;\n }\n\n set columns(columns: string[]) {\n // ignore calls to set columns, ArrayDataSource always carries all columns\n }\n\n get config() {\n return this._config;\n }\n\n set config(config: WithBaseFilter<WithFullConfig>) {\n const originalConfig = this._config;\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filterSpec?.filter &&\n config?.filterSpec.filterStruct === undefined\n ? {\n ...config,\n filterSpec: {\n filter: config.filterSpec.filter,\n filterStruct: parseFilter(config.filterSpec.filter),\n },\n }\n : config;\n\n this._config = withConfigDefaults(newConfig);\n\n let processedData: DataSourceRow[] | undefined;\n if (hasFilter(config) || hasBaseFilter(config)) {\n const fn = this.getFilterPredicate();\n processedData = this.#data.filter(fn);\n }\n\n if (configChanges.columnsChanged) {\n this.processNewColumns(originalConfig.columns, config.columns);\n }\n\n if (hasSort(config)) {\n processedData = sortRows(\n processedData ?? this.#data,\n config.sort,\n this.#columnMap,\n );\n }\n\n if (\n this.openTreeNodes.length > 0 &&\n isGroupByChanged(originalConfig, config)\n ) {\n if (this._config.groupBy.length === 0) {\n this.openTreeNodes.length = 0;\n } else {\n //TODO purge any openTreeNodes for a no-longer-present groupBy col\n }\n }\n\n if (hasGroupBy(config)) {\n const [groupedData, groupMap] = groupRows(\n processedData ?? this.#data,\n config.groupBy,\n this.#columnMap,\n );\n this.groupMap = groupMap;\n processedData = groupedData;\n\n if (this.openTreeNodes.length > 0) {\n processedData = expandGroup(\n this.openTreeNodes,\n this.#data,\n this._config.groupBy,\n this.#columnMap,\n this.groupMap as GroupMap,\n processedData as DataSourceRow[],\n );\n }\n }\n if (processedData) {\n this.processedData = this.indexProcessedData(processedData);\n } else {\n this.processedData = undefined;\n }\n }\n\n if (\n configChanges.filterChanged ||\n configChanges.baseFilterChanged ||\n configChanges.groupByChanged\n ) {\n requestAnimationFrame(() => {\n this.emit(\"resize\", this.size);\n });\n }\n\n if (this.#status === \"subscribed\") {\n requestAnimationFrame(() => {\n this.sendSizeUpdateToClient();\n if (this.preserveScrollPositionAcrossConfigChange) {\n this.preserveScrollPositionAcrossConfigChange = false;\n } else {\n this.setRange(this.#range.reset, true);\n }\n this.emit(\n \"config\",\n this._config,\n this.range,\n undefined,\n configChanges,\n );\n });\n }\n }\n }\n\n private processNewColumns(originalColumns: VuuColumns, columns: VuuColumns) {\n const addedColumns = getAddedItems(originalColumns, columns);\n if (addedColumns.length > 0) {\n // const columnsWithoutDescriptors = getMissingItems(\n // this.columnDescriptors,\n // addedColumns,\n // (col) => col.name,\n // );\n // console.warn(`columnsWithoutDescriptors`, {\n // columnsWithoutDescriptors,\n // });\n }\n this.#columnMap = buildColumnMap(columns);\n this.dataIndices = buildDataToClientMap(this.#columnMap, this.dataMap);\n }\n\n private indexProcessedData(data: DataSourceRow[]) {\n // for (let i = 0; i < data.length; i++) {\n // data[i][0] = i;\n // data[i][1] = i;\n // }\n // return data;\n return data?.map((row, i) => {\n const dolly = row.slice() as DataSourceRow;\n dolly[0] = i;\n dolly[1] = i;\n return dolly;\n });\n }\n\n private getFilterPredicate() {\n const {\n filterSpec: { filterStruct },\n } = combineFilters(this._config);\n if (filterStruct) {\n return filterPredicate(this.#columnMap, filterStruct);\n } else {\n throw Error(\"filter must include filterStruct\");\n }\n }\n\n private applyConfig(\n config: WithBaseFilter<DataSourceConfig>,\n preserveExistingConfigAttributes = false,\n ): DataSourceConfigChanges | undefined {\n const { noChanges, ...otherChanges } = isConfigChanged(\n this._config,\n config,\n );\n\n if (noChanges !== true) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filterSpec?.filter &&\n config?.filterSpec.filterStruct === undefined\n ? {\n ...config,\n filterSpec: {\n filter: config.filterSpec.filter,\n filterStruct: parseFilter(config.filterSpec.filter),\n },\n }\n : config;\n if (preserveExistingConfigAttributes) {\n this._config = {\n ...this._config,\n ...config,\n };\n } else {\n this._config = withConfigDefaults(newConfig);\n }\n return otherChanges;\n }\n }\n }\n\n get columnMap() {\n return this.#columnMap;\n }\n\n get selectedRowsCount() {\n return this.selectedRows.size;\n }\n\n get size() {\n return this.processedData?.length ?? this.#data.length;\n }\n\n get range() {\n return this.#range;\n }\n\n set range(range: Range) {\n this.setRange(range);\n }\n\n 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 getRowByKey(key: string) {\n const data = this.processedData ?? this.#data;\n return data.find((row) => row[KEY] === key);\n }\n\n getRowAtIndex(rowIndex: number) {\n return (this.processedData ?? this.#data)[rowIndex];\n }\n\n indexOfRowWithKey = (key: string) =>\n this.#data.findIndex((row) => row[KEY] === key);\n\n protected update = (row: VuuRowDataItemType[], columnName: string) => {\n // TODO take sorting, filtering. grouping into account\n const keyValue = row[this.key] as string;\n const dataColIndex = this.dataMap?.[columnName] as number;\n return this.updateDataItem(keyValue, columnName, row[dataColIndex]);\n };\n\n protected updateRow = (row: VuuRowDataItemType[]) => {\n // TODO take sorting, filtering. grouping into account\n const keyValue = row[this.key];\n const dataIndex = this.#data.findIndex((row) => row[KEY] === keyValue);\n if (dataIndex !== -1) {\n const dataSourceRow = toDataSourceRow(this.key)(row, dataIndex);\n // maybe update this in place\n this.#data[dataIndex] = dataSourceRow;\n const { from, to } = this.#range;\n if (dataIndex >= from && dataIndex < to) {\n this.sendRowsToClient(false, dataSourceRow);\n }\n }\n };\n\n deleteRow: DataSourceDeleteHandler = async (key) => {\n const dataIndex = this.#data.findIndex((row) => row[KEY] === key);\n let doomedIndex: number | undefined = undefined;\n\n if (dataIndex !== -1) {\n if (this.processedData) {\n for (let i = 0; i < this.processedData.length; i++) {\n if (this.processedData[i][KEY] === key) {\n doomedIndex = i;\n } else if (doomedIndex !== undefined) {\n this.processedData[i][0] -= 1;\n }\n }\n if (doomedIndex !== undefined) {\n this.processedData.splice(doomedIndex, 1);\n }\n }\n\n this.#data.splice(dataIndex, 1);\n for (let i = dataIndex; i < this.#data.length; i++) {\n this.#data[i][0] -= 1;\n }\n\n this.sendSizeUpdateToClient();\n\n const { from, to } = this.#range;\n const deletedIndex = doomedIndex ?? dataIndex;\n if (deletedIndex >= from && deletedIndex < to) {\n this.#keys.reset(this.range.withBuffer);\n this.sendRowsToClient(true);\n }\n\n this.emit(\"resize\", this.size);\n\n return true;\n } else {\n return \"row not found\";\n }\n };\n\n private setRange(range: Range, forceFullRefresh = false) {\n if (range.from !== this.#range.from || range.to !== this.#range.to) {\n const currentPageCount = Math.ceil(\n this.size / (this.#range.to - this.#range.from),\n );\n const newPageCount = Math.ceil(this.size / (range.to - range.from));\n\n this.#range = range;\n const keysResequenced = this.#keys.reset(range.withBuffer);\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.withBuffer)\n : this.#range.withBuffer;\n const data = this.processedData ?? this.#data;\n\n const rowsWithinViewport = data\n .slice(rowRange.from, rowRange.to)\n .map((row) =>\n toClientRow(row, this.#keys, this.selectedRows, this.dataIndices),\n );\n\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n range: this.#range,\n rows: rowsWithinViewport,\n size: data.length,\n type: \"viewport-update\",\n });\n this.lastRangeServed = {\n from: this.#range.from,\n to: this.#range.to,\n // to: Math.min(\n // this.#range.to,\n // this.#range.from + rowsWithinViewport.length,\n // ),\n };\n // console.log(\n // `%c[ArrayDataSource] lastRangeServed (${this.lastRangeServed.from}:${this.lastRangeServed.to})`,\n // \"color:green;font-weight:bold;\",\n // );\n }\n }\n\n get aggregations() {\n return this._config.aggregations;\n }\n\n set aggregations(aggregations: VuuAggregation[]) {\n this._config = {\n ...this._config,\n aggregations,\n };\n\n const targetData = this.processedData ?? this.#data;\n const leafData = this.#data;\n\n aggregateData(\n aggregations,\n targetData,\n this._config.groupBy,\n leafData,\n this.#columnMap,\n this.groupMap as GroupMap,\n );\n this.setRange(this.#range.reset, true);\n\n this.emit(\"config\", this._config, this.range);\n }\n\n get sort() {\n return this._config.sort;\n }\n\n set sort(sort: VuuSort) {\n debug?.(`sort ${JSON.stringify(sort)}`);\n this.config = {\n ...this._config,\n sort,\n };\n }\n\n get baseFilter() {\n return this._config.baseFilterSpec;\n }\n\n set baseFilter(baseFilter: DataSourceFilter | undefined) {\n debug?.(`baseFilter ${JSON.stringify(baseFilter)}`);\n // TODO check that baseFilter has changed\n this.config = {\n ...this._config,\n baseFilterSpec: baseFilter,\n };\n }\n\n get filter() {\n return this._config.filterSpec;\n }\n\n set filter(filter: DataSourceFilter) {\n debug?.(`filter ${JSON.stringify(filter)}`);\n // TODO check that filter has changed\n this.config = {\n ...this._config,\n filterSpec: filter,\n };\n }\n\n setFilter(filter: Filter) {\n const dataSourceFilter: DataSourceFilter = {\n filter: filterAsQuery(filter),\n filterStruct: filter,\n };\n this.filter = dataSourceFilter;\n }\n\n clearFilter() {\n this.filter = { filter: \"\" };\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 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 console.log({ rpcRequest });\n return new Promise(() => {\n // TODO\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: `vuuCreatedTimestamp < ${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":["row"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"array-data-source.js","sources":["../../../../packages/vuu-data-local/src/array-data-source/array-data-source.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceConfig,\n DataSourceConstructorProps,\n DataSourceEvents,\n DataSourceFilter,\n DataSourceRow,\n DataSourceStatus,\n DataSourceSubscribedMessage,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n TableSchema,\n WithBaseFilter,\n WithFullConfig,\n DataSourceDeleteHandler,\n} from \"@vuu-ui/vuu-data-types\";\nimport { filterPredicate, parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport type {\n LinkDescriptorWithLabel,\n SelectRequest,\n SelectRowRangeRequest,\n SelectRowRequest,\n VuuAggregation,\n VuuColumns,\n VuuGroupBy,\n VuuMenu,\n VuuRange,\n VuuRowDataItemType,\n 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 filterAsQuery,\n getAddedItems,\n hasBaseFilter,\n hasFilter,\n hasGroupBy,\n hasSort,\n isConfigChanged,\n isGroupByChanged,\n logger,\n metadataKeys,\n rangeNewItems,\n uuid,\n vanillaConfig,\n withConfigDefaults,\n} from \"@vuu-ui/vuu-utils\";\nimport { aggregateData } from \"./aggregate-utils\";\nimport { buildDataToClientMap, toClientRow } from \"./array-data-utils\";\nimport { GroupMap, collapseGroup, expandGroup, groupRows } from \"./group-utils\";\nimport {\n binarySearch,\n ColIndexSortDef,\n sortComparator,\n sortRows,\n} from \"./sort-utils\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\n\nconst { debug, info } = logger(\"ArrayDataSource\");\n\nconst { KEY } = metadataKeys;\n\nexport interface ArrayDataSourceConstructorProps\n extends Omit<DataSourceConstructorProps, \"bufferSize\" | \"table\"> {\n columnDescriptors: readonly ColumnDescriptor[];\n data: Array<VuuRowDataItemType[]>;\n dataMap?: ColumnMap;\n keyColumn?: string;\n rangeChangeRowset?: \"delta\" | \"full\";\n}\n\nconst toDataSourceRow =\n (indexOfKeyColumn: number, index?: Map<string, number>) =>\n (data: VuuRowDataItemType[], idx: number): DataSourceRow => {\n const key = `${data[indexOfKeyColumn]}`;\n index?.set(key, idx);\n return [\n idx,\n idx,\n true,\n false,\n 1,\n 0,\n key,\n 0,\n 0, // ts\n false, // isNew\n ...data,\n ];\n };\n\n// const isError = (err: unknown): err is { message: string } =>\n// typeof err === \"object\" && err !== null && err.hasOwnProperty(\"message\");\n\nconst buildTableSchema = (\n columns: readonly 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: readonly ColumnDescriptor[];\n /** sorted offsets of data within raw data, reflecting sort order\n * of columns specified by client.\n */\n private dataIndices: number[] | undefined;\n /** Map reflecting positions of data items in raw data */\n private dataMap: ColumnMap | undefined;\n private groupMap: undefined | GroupMap;\n /** the index of key field within raw data row */\n private key: number;\n private lastRangeServed: VuuRange = { from: 0, to: 0 };\n private rangeChangeRowset: \"delta\" | \"full\";\n private openTreeNodes: string[] = [];\n // Experimental. There are some config changes - first concrete example is baseFilter applied to\n // 'freeze' data, that should not immediately affect the displayed data, therefore not cause\n // range reset.\n private preserveScrollPositionAcrossConfigChange = false;\n\n /** Map reflecting positions of columns in client data sent to user */\n #columnMap: ColumnMap;\n protected _config: WithBaseFilter<WithFullConfig> & {\n visualLink?: LinkDescriptorWithLabel;\n } = vanillaConfig;\n #data: DataSourceRow[];\n #freezeTimestamp: number | undefined = undefined;\n #keys = new KeySet(NULL_RANGE);\n #links: LinkDescriptorWithLabel[] | undefined;\n #range = Range(0, 0);\n #status: DataSourceStatus = \"initialising\";\n #title: string | undefined;\n\n protected _menu: VuuMenu | undefined;\n protected selectedRows = new Set<string>();\n protected index = new Map<string, number>();\n\n public tableSchema: TableSchema;\n public viewport: string;\n\n protected processedData: DataSourceRow[] | undefined = undefined;\n\n constructor({\n aggregations,\n baseFilterSpec,\n // different from RemoteDataSource\n columnDescriptors,\n data,\n dataMap,\n filterSpec,\n groupBy,\n keyColumn,\n rangeChangeRowset = \"delta\",\n sort,\n title,\n viewport,\n }: ArrayDataSourceConstructorProps) {\n super();\n if (!data || !columnDescriptors) {\n throw Error(\n \"ArrayDataSource constructor called without data or without columnDescriptors\",\n );\n }\n\n this.columnDescriptors = columnDescriptors;\n this.dataMap = dataMap;\n this.key = keyColumn\n ? this.columnDescriptors.findIndex((col) => col.name === keyColumn)\n : 0;\n this.rangeChangeRowset = rangeChangeRowset;\n this.tableSchema = buildTableSchema(columnDescriptors, keyColumn);\n this.viewport = viewport || uuid();\n this.#title = title;\n\n const columns = columnDescriptors.map((col) => col.name);\n this.#columnMap = buildColumnMap(columns);\n this.dataIndices = buildDataToClientMap(this.#columnMap, this.dataMap);\n this.#data = data.map<DataSourceRow>(toDataSourceRow(this.key, this.index));\n\n this.config = {\n ...this._config,\n aggregations: aggregations || this._config.aggregations,\n baseFilterSpec,\n columns,\n filterSpec: filterSpec || this._config.filterSpec,\n groupBy: groupBy || this._config.groupBy,\n sort: sort || this._config.sort,\n };\n\n debug?.(`columnMap: ${JSON.stringify(this.#columnMap)}`);\n }\n\n async subscribe(\n {\n viewport = this.viewport ?? (this.viewport = uuid()),\n columns,\n aggregations,\n baseFilterSpec,\n range,\n 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.lastRangeServed = { from: 0, to: 0 };\n\n let config = this._config;\n\n const hasConfigProps =\n aggregations || columns || filterSpec || groupBy || sort;\n\n if (hasConfigProps) {\n config = {\n ...config,\n aggregations: aggregations || this._config.aggregations,\n baseFilterSpec: baseFilterSpec || this._config.baseFilterSpec,\n columns: columns || this._config.columns,\n filterSpec: filterSpec || this._config.filterSpec,\n groupBy: groupBy || this._config.groupBy,\n sort: sort || this._config.sort,\n };\n }\n\n const subscribedMessage: DataSourceSubscribedMessage = {\n ...config,\n type: \"subscribed\",\n clientViewportId: this.viewport,\n range: this.#range,\n tableSchema: this.tableSchema,\n };\n this.clientCallback?.(subscribedMessage);\n this.emit(\"subscribed\", subscribedMessage);\n\n if (hasConfigProps) {\n // invoke setter to action config\n this.config = config;\n } else {\n this.sendSizeUpdateToClient();\n this.emit(\n \"resize\",\n this.processedData ? this.processedData.length : this.#data.length,\n );\n\n if (range && !this.#range.equals(range)) {\n this.range = range;\n } else if (this.#range !== NULL_RANGE) {\n this.sendRowsToClient();\n }\n\n 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 if (this.selectedRows.size > 0) {\n if (this.selectedRows.has(\"*\")) {\n this.emit(\"row-selection\", this.size);\n } else {\n this.emit(\"row-selection\", this.selectedRows.size);\n }\n }\n\n this.sendRowsToClient(true);\n }\n\n disable() {\n this.emit(\"disabled\", this.viewport);\n }\n\n enable() {\n this.emit(\"enabled\", this.viewport);\n }\n\n select(selectRequest: Omit<SelectRequest, \"vpId\">) {\n switch (selectRequest.type) {\n case \"SELECT_ROW\": {\n const { preserveExistingSelection, rowKey } = selectRequest as Omit<\n SelectRowRequest,\n \"vpId\"\n >;\n if (!preserveExistingSelection) {\n this.selectedRows.clear();\n }\n this.selectedRows.add(rowKey);\n break;\n }\n case \"DESELECT_ROW\": {\n const { preserveExistingSelection, rowKey } = selectRequest as Omit<\n SelectRowRequest,\n \"vpId\"\n >;\n if (!preserveExistingSelection) {\n this.selectedRows.clear();\n } else if (this.selectedRows.has(\"*\")) {\n this.selectedRows.clear();\n for (const key of this.index.keys()) {\n if (key !== rowKey) {\n this.selectedRows.add(key);\n }\n }\n } else {\n this.selectedRows.delete(rowKey);\n }\n break;\n }\n case \"SELECT_ROW_RANGE\": {\n const { preserveExistingSelection, fromRowKey, toRowKey } =\n selectRequest as Omit<SelectRowRangeRequest, \"vpId\">;\n\n if (!preserveExistingSelection) {\n this.selectedRows.clear();\n }\n\n const fromIdx = this.index.get(fromRowKey);\n const toIdx = this.index.get(toRowKey);\n if (typeof fromIdx === \"number\" && typeof toIdx === \"number\") {\n for (let i = fromIdx; i <= toIdx; i++) {\n const { [KEY]: rowKey } = this.#data[i];\n this.selectedRows.add(rowKey);\n }\n }\n\n break;\n }\n case \"SELECT_ALL\": {\n this.selectedRows.clear();\n this.selectedRows.add(\"*\");\n break;\n }\n case \"DESELECT_ALL\": {\n this.selectedRows.clear();\n break;\n }\n }\n\n this.setRange(this.#range, true);\n this.emit(\n \"row-selection\",\n selectRequest.type === \"SELECT_ALL\" ? this.size : this.selectedRows.size,\n );\n }\n\n private getRowKey(keyOrIndex: string | number) {\n if (typeof keyOrIndex === \"string\") {\n return keyOrIndex;\n }\n const row = this.getRowAtIndex(keyOrIndex);\n if (row === undefined) {\n throw Error(`row not found at index ${keyOrIndex}`);\n }\n return row?.[KEY];\n }\n\n openTreeNode(keyOrIndex: string | number) {\n const key = this.getRowKey(keyOrIndex);\n this.openTreeNodes.push(key);\n this.processedData = expandGroup(\n this.openTreeNodes,\n this.#data,\n this._config.groupBy,\n this.#columnMap,\n this.groupMap as GroupMap,\n this.processedData as DataSourceRow[],\n );\n this.setRange(this.#range.reset, true);\n }\n\n closeTreeNode(keyOrIndex: string | number) {\n const key = this.getRowKey(keyOrIndex);\n this.openTreeNodes = this.openTreeNodes.filter((value) => value !== key);\n if (this.processedData) {\n this.processedData = collapseGroup(key, this.processedData);\n this.setRange(this.#range.reset, true);\n }\n }\n\n get pageSize() {\n return this.#range.to - this.#range.from;\n }\n\n get links() {\n return this.#links;\n }\n\n set links(links: LinkDescriptorWithLabel[] | undefined) {\n this.#links = links;\n }\n\n get menu() {\n return this._menu;\n }\n\n get status() {\n return this.#status;\n }\n\n get data() {\n return this.#data;\n }\n\n // Only used by the UpdateGenerator\n get currentData() {\n return this.processedData ?? this.#data;\n }\n\n get table() {\n return this.tableSchema.table;\n }\n\n get columns() {\n return this._config.columns;\n }\n\n set columns(columns: string[]) {\n // ignore calls to set columns, ArrayDataSource always carries all columns\n }\n\n get config() {\n return this._config;\n }\n\n set config(config: WithBaseFilter<WithFullConfig>) {\n const originalConfig = this._config;\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filterSpec?.filter &&\n config?.filterSpec.filterStruct === undefined\n ? {\n ...config,\n filterSpec: {\n filter: config.filterSpec.filter,\n filterStruct: parseFilter(config.filterSpec.filter),\n },\n }\n : config;\n\n this._config = withConfigDefaults(newConfig);\n\n let processedData: DataSourceRow[] | undefined;\n if (hasFilter(config) || hasBaseFilter(config)) {\n const fn = this.getFilterPredicate();\n processedData = this.#data.filter(fn);\n }\n\n if (configChanges.columnsChanged) {\n this.processNewColumns(originalConfig.columns, config.columns);\n }\n\n if (hasSort(config)) {\n processedData = sortRows(\n processedData ?? this.#data,\n config.sort,\n this.#columnMap,\n );\n }\n\n if (\n this.openTreeNodes.length > 0 &&\n isGroupByChanged(originalConfig, config)\n ) {\n if (this._config.groupBy.length === 0) {\n this.openTreeNodes.length = 0;\n } else {\n //TODO purge any openTreeNodes for a no-longer-present groupBy col\n }\n }\n\n if (hasGroupBy(config)) {\n const [groupedData, groupMap] = groupRows(\n processedData ?? this.#data,\n config.groupBy,\n this.#columnMap,\n );\n this.groupMap = groupMap;\n processedData = groupedData;\n\n if (this.openTreeNodes.length > 0) {\n processedData = expandGroup(\n this.openTreeNodes,\n this.#data,\n this._config.groupBy,\n this.#columnMap,\n this.groupMap as GroupMap,\n processedData as DataSourceRow[],\n );\n }\n }\n if (processedData) {\n this.processedData = this.indexProcessedData(processedData);\n } else {\n this.processedData = undefined;\n }\n }\n\n if (\n configChanges.filterChanged ||\n configChanges.baseFilterChanged ||\n configChanges.groupByChanged\n ) {\n requestAnimationFrame(() => {\n this.emit(\"resize\", this.size);\n });\n }\n\n if (this.#status === \"subscribed\") {\n requestAnimationFrame(() => {\n this.sendSizeUpdateToClient();\n if (this.preserveScrollPositionAcrossConfigChange) {\n this.preserveScrollPositionAcrossConfigChange = false;\n } else {\n this.setRange(this.#range.reset, true);\n }\n this.emit(\n \"config\",\n this._config,\n this.range,\n undefined,\n configChanges,\n );\n });\n }\n }\n }\n\n private processNewColumns(originalColumns: VuuColumns, columns: VuuColumns) {\n const addedColumns = getAddedItems(originalColumns, columns);\n if (addedColumns.length > 0) {\n // const columnsWithoutDescriptors = getMissingItems(\n // this.columnDescriptors,\n // addedColumns,\n // (col) => col.name,\n // );\n // console.warn(`columnsWithoutDescriptors`, {\n // columnsWithoutDescriptors,\n // });\n }\n this.#columnMap = buildColumnMap(columns);\n this.dataIndices = buildDataToClientMap(this.#columnMap, this.dataMap);\n }\n\n private indexProcessedData(data: DataSourceRow[]) {\n // for (let i = 0; i < data.length; i++) {\n // data[i][0] = i;\n // data[i][1] = i;\n // }\n // return data;\n return data?.map((row, i) => {\n const dolly = row.slice() as DataSourceRow;\n dolly[0] = i;\n dolly[1] = i;\n return dolly;\n });\n }\n\n private getFilterPredicate() {\n const {\n filterSpec: { filterStruct },\n } = combineFilters(this._config);\n if (filterStruct) {\n return filterPredicate(this.#columnMap, filterStruct);\n } else {\n throw Error(\"filter must include filterStruct\");\n }\n }\n\n private applyConfig(\n config: WithBaseFilter<DataSourceConfig>,\n preserveExistingConfigAttributes = false,\n ): DataSourceConfigChanges | undefined {\n const { noChanges, ...otherChanges } = isConfigChanged(\n this._config,\n config,\n );\n\n if (noChanges !== true) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filterSpec?.filter &&\n config?.filterSpec.filterStruct === undefined\n ? {\n ...config,\n filterSpec: {\n filter: config.filterSpec.filter,\n filterStruct: parseFilter(config.filterSpec.filter),\n },\n }\n : config;\n if (preserveExistingConfigAttributes) {\n this._config = {\n ...this._config,\n ...config,\n };\n } else {\n this._config = withConfigDefaults(newConfig);\n }\n return otherChanges;\n }\n }\n }\n\n get columnMap() {\n return this.#columnMap;\n }\n\n get selectedRowsCount() {\n return this.selectedRows.size;\n }\n\n get size() {\n return this.processedData?.length ?? this.#data.length;\n }\n\n get range() {\n return this.#range;\n }\n\n set range(range: Range) {\n this.setRange(range);\n }\n\n 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 getRowByKey(key: string) {\n const data = this.processedData ?? this.#data;\n return data.find((row) => row[KEY] === key);\n }\n\n getRowAtIndex(rowIndex: number) {\n return (this.processedData ?? this.#data)[rowIndex];\n }\n\n indexOfRowWithKey = (key: string) =>\n this.#data.findIndex((row) => row[KEY] === key);\n\n protected update = (row: VuuRowDataItemType[], columnName: string) => {\n // TODO take sorting, filtering. grouping into account\n const keyValue = row[this.key] as string;\n const dataColIndex = this.dataMap?.[columnName] as number;\n return this.updateDataItem(keyValue, columnName, row[dataColIndex]);\n };\n\n protected updateRow = (row: VuuRowDataItemType[]) => {\n // TODO take sorting, filtering. grouping into account\n const keyValue = row[this.key];\n const dataIndex = this.#data.findIndex((row) => row[KEY] === keyValue);\n if (dataIndex !== -1) {\n const dataSourceRow = toDataSourceRow(this.key)(row, dataIndex);\n // maybe update this in place\n this.#data[dataIndex] = dataSourceRow;\n const { from, to } = this.#range;\n if (dataIndex >= from && dataIndex < to) {\n this.sendRowsToClient(false, dataSourceRow);\n }\n }\n };\n\n deleteRow: DataSourceDeleteHandler = async (key) => {\n const dataIndex = this.#data.findIndex((row) => row[KEY] === key);\n let doomedIndex: number | undefined = undefined;\n\n if (dataIndex !== -1) {\n if (this.processedData) {\n for (let i = 0; i < this.processedData.length; i++) {\n if (this.processedData[i][KEY] === key) {\n doomedIndex = i;\n } else if (doomedIndex !== undefined) {\n this.processedData[i][0] -= 1;\n }\n }\n if (doomedIndex !== undefined) {\n this.processedData.splice(doomedIndex, 1);\n }\n }\n\n this.#data.splice(dataIndex, 1);\n for (let i = dataIndex; i < this.#data.length; i++) {\n this.#data[i][0] -= 1;\n }\n\n this.sendSizeUpdateToClient();\n\n const { from, to } = this.#range;\n const deletedIndex = doomedIndex ?? dataIndex;\n if (deletedIndex >= from && deletedIndex < to) {\n this.#keys.reset(this.range.withBuffer);\n this.sendRowsToClient(true);\n }\n\n this.emit(\"resize\", this.size);\n\n return true;\n } else {\n return \"row not found\";\n }\n };\n\n private setRange(range: Range, forceFullRefresh = false) {\n if (range.from !== this.#range.from || range.to !== this.#range.to) {\n const currentPageCount = Math.ceil(\n this.size / (this.#range.to - this.#range.from),\n );\n const newPageCount = Math.ceil(this.size / (range.to - range.from));\n\n this.#range = range;\n const keysResequenced = this.#keys.reset(range.withBuffer);\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.withBuffer)\n : this.#range.withBuffer;\n const data = this.processedData ?? this.#data;\n\n const rowsWithinViewport = data\n .slice(rowRange.from, rowRange.to)\n .map((row) =>\n toClientRow(row, this.#keys, this.selectedRows, this.dataIndices),\n );\n\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n range: this.#range,\n rows: rowsWithinViewport,\n size: data.length,\n type: \"viewport-update\",\n });\n this.lastRangeServed = {\n from: this.#range.from,\n to: this.#range.to,\n // to: Math.min(\n // this.#range.to,\n // this.#range.from + rowsWithinViewport.length,\n // ),\n };\n // console.log(\n // `%c[ArrayDataSource] lastRangeServed (${this.lastRangeServed.from}:${this.lastRangeServed.to})`,\n // \"color:green;font-weight:bold;\",\n // );\n }\n }\n\n get aggregations() {\n return this._config.aggregations;\n }\n\n set aggregations(aggregations: VuuAggregation[]) {\n this._config = {\n ...this._config,\n aggregations,\n };\n\n const targetData = this.processedData ?? this.#data;\n const leafData = this.#data;\n\n aggregateData(\n aggregations,\n targetData,\n this._config.groupBy,\n leafData,\n this.#columnMap,\n this.groupMap as GroupMap,\n );\n this.setRange(this.#range.reset, true);\n\n this.emit(\"config\", this._config, this.range);\n }\n\n get sort() {\n return this._config.sort;\n }\n\n set sort(sort: VuuSort) {\n debug?.(`sort ${JSON.stringify(sort)}`);\n this.config = {\n ...this._config,\n sort,\n };\n }\n\n get baseFilter() {\n return this._config.baseFilterSpec;\n }\n\n set baseFilter(baseFilter: DataSourceFilter | undefined) {\n debug?.(`baseFilter ${JSON.stringify(baseFilter)}`);\n // TODO check that baseFilter has changed\n this.config = {\n ...this._config,\n baseFilterSpec: baseFilter,\n };\n }\n\n get filter() {\n return this._config.filterSpec;\n }\n\n set filter(filter: DataSourceFilter) {\n debug?.(`filter ${JSON.stringify(filter)}`);\n // TODO check that filter has changed\n this.config = {\n ...this._config,\n filterSpec: filter,\n };\n }\n\n setFilter(filter: Filter) {\n const dataSourceFilter: DataSourceFilter = {\n filter: filterAsQuery(filter),\n filterStruct: filter,\n };\n this.filter = dataSourceFilter;\n }\n\n clearFilter() {\n this.filter = { filter: \"\" };\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 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 console.log({ rpcRequest });\n return new Promise(() => {\n // TODO\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: `vuuCreatedTimestamp < ${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":["row"],"mappings":"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"}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { metadataKeys } from '@vuu-ui/vuu-utils';
|
|
2
|
-
|
|
3
1
|
var __defProp = Object.defineProperty;
|
|
4
2
|
var __typeError = (msg) => {
|
|
5
3
|
throw TypeError(msg);
|
|
@@ -10,12 +8,11 @@ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot
|
|
|
10
8
|
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
11
9
|
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
12
10
|
var _iconMap;
|
|
13
|
-
const { KEY } = metadataKeys;
|
|
14
11
|
class IconProvider {
|
|
15
12
|
constructor() {
|
|
16
13
|
__privateAdd(this, _iconMap, {});
|
|
17
|
-
__publicField(this, "getIcon", (
|
|
18
|
-
const key =
|
|
14
|
+
__publicField(this, "getIcon", (dataRow) => {
|
|
15
|
+
const key = dataRow.key;
|
|
19
16
|
return __privateGet(this, _iconMap)[key];
|
|
20
17
|
});
|
|
21
18
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IconProvider.js","sources":["../../../../packages/vuu-data-local/src/tree-data-source/IconProvider.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"IconProvider.js","sources":["../../../../packages/vuu-data-local/src/tree-data-source/IconProvider.ts"],"sourcesContent":["import { DataRow } from \"@vuu-ui/vuu-table-types\";\n\nexport class IconProvider {\n #iconMap: Record<string, string> = {};\n getIcon = (dataRow: DataRow) => {\n const key = dataRow.key;\n return this.#iconMap[key];\n };\n setIcon(key: string, icon: string) {\n this.#iconMap[key] = icon;\n }\n}\n"],"names":[],"mappings":";;;;;;;;;AAAA,IAAA,QAAA;AAEO,MAAM,YAAa,CAAA;AAAA,EAAnB,WAAA,GAAA;AACL,IAAA,YAAA,CAAA,IAAA,EAAA,QAAA,EAAmC,EAAC,CAAA;AACpC,IAAA,aAAA,CAAA,IAAA,EAAA,SAAA,EAAU,CAAC,OAAqB,KAAA;AAC9B,MAAA,MAAM,MAAM,OAAQ,CAAA,GAAA;AACpB,MAAO,OAAA,YAAA,CAAA,IAAA,EAAK,UAAS,GAAG,CAAA;AAAA,KAC1B,CAAA;AAAA;AAAA,EACA,OAAA,CAAQ,KAAa,IAAc,EAAA;AACjC,IAAK,YAAA,CAAA,IAAA,EAAA,QAAA,CAAA,CAAS,GAAG,CAAI,GAAA,IAAA;AAAA;AAEzB;AARE,QAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
|
|
@@ -21,7 +21,18 @@ var __privateWrapper = (obj, member, setter, getter) => ({
|
|
|
21
21
|
}
|
|
22
22
|
});
|
|
23
23
|
var _aggregations, _data, _iconProvider, _selectedRowsCount, _size, _status, _filterSet;
|
|
24
|
-
const
|
|
24
|
+
const TREE_SCHEMA = {
|
|
25
|
+
columns: [
|
|
26
|
+
{ name: "nodeData", serverDataType: "string" },
|
|
27
|
+
{ name: "Level 1", serverDataType: "string" },
|
|
28
|
+
{ name: "Level 2", serverDataType: "string" },
|
|
29
|
+
{ name: "Level 3", serverDataType: "string" },
|
|
30
|
+
{ name: "Level 4", serverDataType: "string" },
|
|
31
|
+
{ name: "Level 5", serverDataType: "string" }
|
|
32
|
+
],
|
|
33
|
+
key: "",
|
|
34
|
+
table: { module: "", table: "" }
|
|
35
|
+
};
|
|
25
36
|
const { COUNT, DEPTH, IDX, IS_EXPANDED, IS_LEAF, KEY, SELECTED } = metadataKeys;
|
|
26
37
|
const toClientRow = (row, keys) => {
|
|
27
38
|
const [rowIndex] = row;
|
|
@@ -104,7 +115,7 @@ class TreeDataSource extends BaseDataSource {
|
|
|
104
115
|
groupBy: this._configWithVisualLink.groupBy,
|
|
105
116
|
range: this.range,
|
|
106
117
|
sort: this.sort,
|
|
107
|
-
tableSchema:
|
|
118
|
+
tableSchema: TREE_SCHEMA
|
|
108
119
|
});
|
|
109
120
|
this.clientCallback({
|
|
110
121
|
clientViewportId: this.viewport,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TreeDataSource.js","sources":["../../../../packages/vuu-data-local/src/tree-data-source/TreeDataSource.ts"],"sourcesContent":["import type { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport type {\n LinkDescriptorWithLabel,\n VuuAggregation,\n VuuRange,\n VuuRpcResponse,\n VuuRpcRequest,\n SelectRequest,\n SelectRowRequest,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport type {\n DataSourceRow,\n DataSourceConstructorProps,\n DataSourceStatus,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n MenuRpcResponse,\n DataSourceFilter,\n DataSource,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n BaseDataSource,\n getParentRow,\n isSingleValueFilter,\n KeySet,\n lastPathSegment,\n metadataKeys,\n missingAncestor,\n NULL_RANGE,\n TreeSourceNode,\n treeToDataSourceRows,\n uuid,\n} from \"@vuu-ui/vuu-utils\";\nimport { IconProvider } from \"./IconProvider\";\nimport { parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport { FilterClause } from \"@vuu-ui/vuu-filter-types\";\n\nconst NULL_SCHEMA = { columns: [], key: \"\", table: { module: \"\", table: \"\" } };\n\ntype VisibleRowIndex = Record<number, number>;\n\nexport interface TreeDataSourceConstructorProps\n extends Omit<DataSourceConstructorProps, \"bufferSize\" | \"table\"> {\n data: TreeSourceNode[];\n}\n\nconst { COUNT, DEPTH, IDX, IS_EXPANDED, IS_LEAF, KEY, SELECTED } = metadataKeys;\n\nconst toClientRow = (row: DataSourceRow, keys: KeySet) => {\n const [rowIndex] = row;\n const clientRow = row.slice() as DataSourceRow;\n clientRow[1] = keys.keyFor(rowIndex);\n return clientRow;\n};\n\nexport class TreeDataSource extends BaseDataSource implements DataSource {\n public columnDescriptors: ColumnDescriptor[];\n private clientCallback: DataSourceSubscribeCallback | undefined;\n private expandedRows = new Set<string>();\n private visibleRows: DataSourceRow[] = [];\n private visibleRowIndex: VisibleRowIndex = {};\n\n #aggregations: VuuAggregation[] = [];\n #data: DataSourceRow[];\n #iconProvider: IconProvider;\n #selectedRowsCount = 0;\n #size = 0;\n #status: DataSourceStatus = \"initialising\";\n #filterSet: number[] | undefined;\n\n public rowCount: number | undefined;\n\n private keys = new KeySet(this._range);\n\n constructor({ data, ...props }: TreeDataSourceConstructorProps) {\n super(props);\n\n if (!data) {\n throw Error(\"TreeDataSource constructor called without data\");\n }\n this.#iconProvider = new IconProvider();\n\n [this.columnDescriptors, this.#data] = treeToDataSourceRows(\n data,\n this.#iconProvider,\n );\n\n if (this.columnDescriptors) {\n const columns = this.columnDescriptors.map((c) => c.name);\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n columns,\n groupBy: columns.slice(1),\n };\n }\n }\n\n async subscribe(\n {\n aggregations,\n columns,\n range,\n revealSelected,\n selectedKeyValues,\n viewport = this.viewport ?? uuid(),\n }: DataSourceSubscribeProps,\n callback: DataSourceSubscribeCallback,\n ) {\n this.clientCallback = callback;\n\n if (aggregations) {\n this.#aggregations = aggregations;\n }\n if (columns) {\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n columns,\n };\n }\n\n if (this.#status !== \"initialising\") {\n //TODO check if subscription details are still the same\n return;\n }\n\n this.viewport = viewport;\n\n this.#status = \"subscribed\";\n this.#selectedRowsCount = selectedKeyValues?.length ?? 0;\n\n if (selectedKeyValues) {\n this.applySelectedKeyValues(selectedKeyValues, revealSelected);\n }\n\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n );\n\n this.clientCallback?.({\n aggregations: this.#aggregations,\n type: \"subscribed\",\n clientViewportId: this.viewport,\n columns: this.columns,\n filterSpec: this.filter,\n groupBy: this._configWithVisualLink.groupBy,\n range: this.range,\n sort: this.sort,\n tableSchema: NULL_SCHEMA,\n });\n\n this.clientCallback({\n clientViewportId: this.viewport,\n mode: \"size-only\",\n type: \"viewport-update\",\n size: this.visibleRows.length,\n });\n\n if (range && !this._range.equals(range)) {\n this.range = range;\n } else if (this._range !== NULL_RANGE) {\n this.sendRowsToClient();\n }\n }\n\n unsubscribe() {\n console.log(\"noop\");\n }\n\n suspend() {\n console.log(\"noop\");\n return this;\n }\n\n resume() {\n console.log(\"noop\");\n return this;\n }\n\n disable() {\n console.log(\"noop\");\n return this;\n }\n\n enable() {\n console.log(\"noop\");\n return this;\n }\n set data(data: TreeSourceNode[]) {\n [this.columnDescriptors, this.#data] = treeToDataSourceRows(data);\n\n requestAnimationFrame(() => {\n this.sendRowsToClient();\n });\n }\n\n get filter() {\n return this._configWithVisualLink.filterSpec;\n }\n\n set filter(filter: DataSourceFilter) {\n // Note not using the setter\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n filterSpec: filter,\n };\n\n if (filter.filter) {\n this.applyFilter(filter);\n } else {\n this.#filterSet = undefined;\n }\n\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n this.#filterSet,\n );\n\n const { from, to } = this.range;\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n rows: this.visibleRows\n .slice(from, to)\n .map((row) => toClientRow(row, this.keys)),\n size: this.visibleRows.length,\n type: \"viewport-update\",\n });\n }\n\n private applyFilter({ filter: filterQuery, filterStruct }: DataSourceFilter) {\n const filter = filterStruct ?? (parseFilter(filterQuery) as FilterClause);\n if (isSingleValueFilter(filter)) {\n const filterSet = [];\n const regex = new RegExp(`${filter.value}`, \"i\");\n for (const row of this.#data) {\n const { [KEY]: key, [IDX]: idx } = row;\n if (regex.test(lastPathSegment(key, \"|\"))) {\n filterSet.push(idx);\n }\n }\n this.#filterSet = filterSet;\n }\n }\n\n /**\n * used to apply an initial selection. These may not necessarily be\n * visible. If revealOnSelect is in force, expand nodes as necessary\n * to ensure selected nodes are visible\n */\n private applySelectedKeyValues(keys: string[], revealSelected = false) {\n keys.forEach((key) => {\n const rowIdx = this.indexOfRowWithKey(key);\n const row = this.#data[rowIdx];\n row[SELECTED] = 1;\n\n if (revealSelected && row[DEPTH] !== 1) {\n const keys = key.slice(6).split(\"|\").slice(0, -1);\n\n let path = \"$root\";\n do {\n path = `${path}|${keys.shift()}`;\n this.expandedRows.add(path);\n } while (keys.length);\n }\n });\n }\n\n private indexOfRowWithKey = (key: string) =>\n this.#data.findIndex((row) => row[KEY] === key);\n\n select(selectRequest: Omit<SelectRequest, \"vpId\">) {\n // todo get a diff\n const updatedRows: DataSourceRow[] = [];\n\n switch (selectRequest.type) {\n case \"SELECT_ROW\": {\n const { preserveExistingSelection, rowKey } = selectRequest as Omit<\n SelectRowRequest,\n \"vpId\"\n >;\n for (const row of this.visibleRows) {\n const { [IDX]: rowIndex, [KEY]: key, [SELECTED]: sel } = row;\n if (\n sel === 1 &&\n preserveExistingSelection === false &&\n key !== rowKey\n ) {\n const deselectedRow = row.slice() as DataSourceRow;\n deselectedRow[SELECTED] = 0;\n this.visibleRows[rowIndex] = deselectedRow;\n updatedRows.push(deselectedRow);\n } else if (key === rowKey) {\n const selectedRow = row.slice() as DataSourceRow;\n selectedRow[SELECTED] = 1;\n this.visibleRows[rowIndex] = selectedRow;\n updatedRows.push(selectedRow);\n }\n }\n\n break;\n }\n case \"DESELECT_ROW\": {\n break;\n }\n\n default:\n // ignore\n }\n\n if (updatedRows.length > 0) {\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"update\",\n type: \"viewport-update\",\n rows: updatedRows,\n });\n }\n }\n\n private getRowKey(keyOrIndex: string | number) {\n if (typeof keyOrIndex === \"string\") {\n return keyOrIndex;\n }\n const row = this.getRowAtIndex(keyOrIndex);\n if (row === undefined) {\n throw Error(`row not found at index ${keyOrIndex}`);\n }\n return row[KEY];\n }\n\n openTreeNode(keyOrIndex: string | number) {\n const key = this.getRowKey(keyOrIndex);\n this.expandedRows.add(key);\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n );\n\n const { from, to } = this._range;\n this.clientCallback?.({\n clientViewportId: this.viewport,\n\n mode: \"batch\",\n rows: this.visibleRows\n .slice(from, to)\n .map((row) => toClientRow(row, this.keys)),\n size: this.visibleRows.length,\n type: \"viewport-update\",\n });\n }\n\n closeTreeNode(keyOrIndex: string | number, cascade = false) {\n const key = this.getRowKey(keyOrIndex);\n this.expandedRows.delete(key);\n if (cascade) {\n for (const rowKey of this.expandedRows.keys()) {\n if (rowKey.startsWith(key)) {\n this.expandedRows.delete(rowKey);\n }\n }\n }\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n );\n this.sendRowsToClient();\n }\n\n get status() {\n return this.#status;\n }\n\n get selectedRowsCount() {\n return this.#selectedRowsCount;\n }\n\n get size() {\n return this.#size;\n }\n\n rangeRequest(range: VuuRange) {\n this.keys.reset(range);\n requestAnimationFrame(() => {\n this.sendRowsToClient();\n });\n }\n\n private sendRowsToClient() {\n const { from, to } = this._range;\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n rows: this.visibleRows\n .slice(from, to)\n .map((row) => toClientRow(row, this.keys)),\n size: this.visibleRows.length,\n type: \"viewport-update\",\n });\n }\n\n createLink({\n parentVpId,\n link: { fromColumn, toColumn },\n }: LinkDescriptorWithLabel) {\n console.log(\"create link\", {\n parentVpId,\n fromColumn,\n toColumn,\n });\n }\n\n removeLink() {\n console.log(\"remove link\");\n }\n\n async remoteProcedureCall<T extends VuuRpcResponse = VuuRpcResponse>() {\n return Promise.reject<T>();\n }\n\n async menuRpcCall(\n rpcRequest: Omit<VuuRpcRequest, \"vpId\">,\n ): Promise<MenuRpcResponse | undefined> {\n console.log(\"rmenuRpcCall\", {\n rpcRequest,\n });\n return undefined;\n }\n\n getChildRows(rowKey: string) {\n const parentRow = this.#data.find((row) => row[KEY] === rowKey);\n if (parentRow) {\n const { [IDX]: parentIdx, [DEPTH]: parentDepth } = parentRow;\n let rowIdx = parentIdx + 1;\n const childRows = [];\n do {\n const { [DEPTH]: depth } = this.#data[rowIdx];\n if (depth === parentDepth + 1) {\n childRows.push(this.#data[rowIdx]);\n } else if (depth <= parentDepth) {\n break;\n }\n rowIdx += 1;\n } while (rowIdx < this.#data.length);\n return childRows;\n } else {\n console.warn(\n `JsonDataSource getChildRows row not found for key ${rowKey}`,\n );\n }\n\n return [];\n }\n\n getRowsAtDepth(depth: number, visibleOnly = true) {\n const rows = visibleOnly ? this.visibleRows : this.#data;\n return rows.filter((row) => row[DEPTH] === depth);\n }\n\n getRowAtIndex(rowIdx: number) {\n return this.visibleRows[rowIdx];\n }\n}\n\nfunction getVisibleRows(\n rows: DataSourceRow[],\n expandedKeys: Set<string>,\n filterset?: number[],\n): [visibleRows: DataSourceRow[], index: VisibleRowIndex] {\n const visibleRows: DataSourceRow[] = [];\n const visibleRowIndex: VisibleRowIndex = {};\n\n const data = filterset ?? rows;\n\n for (let i = 0, index = 0; i < data.length; i++) {\n const idx = filterset ? filterset[i] : i;\n const row = rows[idx];\n const {\n [COUNT]: count,\n [DEPTH]: depth,\n [KEY]: key,\n [IS_LEAF]: isLeaf,\n } = row;\n if (filterset) {\n // assume expanded for now\n\n // if we have skipped a higher level group (that didn't directly match\n // our filter criteria, add it.\n const previousRow = visibleRows.at(-1);\n if (missingAncestor(row, previousRow)) {\n let currentRow: DataSourceRow | undefined = row;\n const missingRows = [];\n while (currentRow) {\n currentRow = getParentRow(rows, currentRow);\n if (currentRow) {\n // we will get the missing rows in reverse order\n missingRows.unshift(currentRow);\n }\n }\n missingRows.forEach((row) => {\n visibleRows.push(cloneRow(row, index++, true));\n });\n }\n\n visibleRows.push(cloneRow(row, index++, true));\n visibleRowIndex[index] = i;\n } else {\n const isExpanded = expandedKeys.has(key);\n visibleRows.push(cloneRow(row, index, isExpanded));\n visibleRowIndex[index++] = i;\n const skipNonVisibleRows = !isLeaf && !isExpanded && count > 0;\n if (skipNonVisibleRows) {\n do {\n i += 1;\n } while (i < rows.length - 1 && rows[i + 1][DEPTH] > depth);\n }\n }\n }\n return [visibleRows, visibleRowIndex];\n}\n\nconst cloneRow = (\n row: DataSourceRow,\n index: number,\n isExpanded: boolean,\n): DataSourceRow => {\n const dolly = row.slice() as DataSourceRow;\n dolly[0] = index;\n dolly[1] = index;\n if (isExpanded) {\n dolly[IS_EXPANDED] = true;\n }\n return dolly;\n};\n"],"names":["keys","row"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TreeDataSource.js","sources":["../../../../packages/vuu-data-local/src/tree-data-source/TreeDataSource.ts"],"sourcesContent":["import type { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport type {\n LinkDescriptorWithLabel,\n VuuAggregation,\n VuuRange,\n VuuRpcResponse,\n VuuRpcRequest,\n SelectRequest,\n SelectRowRequest,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport type {\n DataSourceRow,\n DataSourceConstructorProps,\n DataSourceStatus,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n MenuRpcResponse,\n DataSourceFilter,\n DataSource,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n BaseDataSource,\n getParentRow,\n isSingleValueFilter,\n KeySet,\n lastPathSegment,\n metadataKeys,\n missingAncestor,\n NULL_RANGE,\n TreeSourceNode,\n treeToDataSourceRows,\n uuid,\n} from \"@vuu-ui/vuu-utils\";\nimport { IconProvider } from \"./IconProvider\";\nimport { parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport { FilterClause } from \"@vuu-ui/vuu-filter-types\";\n\nconst TREE_SCHEMA: TableSchema = {\n columns: [\n { name: \"nodeData\", serverDataType: \"string\" },\n { name: \"Level 1\", serverDataType: \"string\" },\n { name: \"Level 2\", serverDataType: \"string\" },\n { name: \"Level 3\", serverDataType: \"string\" },\n { name: \"Level 4\", serverDataType: \"string\" },\n { name: \"Level 5\", serverDataType: \"string\" },\n ],\n key: \"\",\n table: { module: \"\", table: \"\" },\n};\n\ntype VisibleRowIndex = Record<number, number>;\n\nexport interface TreeDataSourceConstructorProps\n extends Omit<DataSourceConstructorProps, \"bufferSize\" | \"table\"> {\n data: TreeSourceNode[];\n}\n\nconst { COUNT, DEPTH, IDX, IS_EXPANDED, IS_LEAF, KEY, SELECTED } = metadataKeys;\n\nconst toClientRow = (row: DataSourceRow, keys: KeySet) => {\n const [rowIndex] = row;\n const clientRow = row.slice() as DataSourceRow;\n clientRow[1] = keys.keyFor(rowIndex);\n return clientRow;\n};\n\nexport class TreeDataSource extends BaseDataSource implements DataSource {\n public columnDescriptors: ColumnDescriptor[];\n private clientCallback: DataSourceSubscribeCallback | undefined;\n private expandedRows = new Set<string>();\n private visibleRows: DataSourceRow[] = [];\n private visibleRowIndex: VisibleRowIndex = {};\n\n #aggregations: VuuAggregation[] = [];\n #data: DataSourceRow[];\n #iconProvider: IconProvider;\n #selectedRowsCount = 0;\n #size = 0;\n #status: DataSourceStatus = \"initialising\";\n #filterSet: number[] | undefined;\n\n public rowCount: number | undefined;\n\n private keys = new KeySet(this._range);\n\n constructor({ data, ...props }: TreeDataSourceConstructorProps) {\n super(props);\n\n if (!data) {\n throw Error(\"TreeDataSource constructor called without data\");\n }\n this.#iconProvider = new IconProvider();\n\n [this.columnDescriptors, this.#data] = treeToDataSourceRows(\n data,\n this.#iconProvider,\n );\n\n if (this.columnDescriptors) {\n const columns = this.columnDescriptors.map((c) => c.name);\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n columns,\n groupBy: columns.slice(1),\n };\n }\n }\n\n async subscribe(\n {\n aggregations,\n columns,\n range,\n revealSelected,\n selectedKeyValues,\n viewport = this.viewport ?? uuid(),\n }: DataSourceSubscribeProps,\n callback: DataSourceSubscribeCallback,\n ) {\n this.clientCallback = callback;\n\n if (aggregations) {\n this.#aggregations = aggregations;\n }\n if (columns) {\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n columns,\n };\n }\n\n if (this.#status !== \"initialising\") {\n //TODO check if subscription details are still the same\n return;\n }\n\n this.viewport = viewport;\n\n this.#status = \"subscribed\";\n this.#selectedRowsCount = selectedKeyValues?.length ?? 0;\n\n if (selectedKeyValues) {\n this.applySelectedKeyValues(selectedKeyValues, revealSelected);\n }\n\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n );\n\n this.clientCallback?.({\n aggregations: this.#aggregations,\n type: \"subscribed\",\n clientViewportId: this.viewport,\n columns: this.columns,\n filterSpec: this.filter,\n groupBy: this._configWithVisualLink.groupBy,\n range: this.range,\n sort: this.sort,\n tableSchema: TREE_SCHEMA,\n });\n\n this.clientCallback({\n clientViewportId: this.viewport,\n mode: \"size-only\",\n type: \"viewport-update\",\n size: this.visibleRows.length,\n });\n\n if (range && !this._range.equals(range)) {\n this.range = range;\n } else if (this._range !== NULL_RANGE) {\n this.sendRowsToClient();\n }\n }\n\n unsubscribe() {\n console.log(\"noop\");\n }\n\n suspend() {\n console.log(\"noop\");\n return this;\n }\n\n resume() {\n console.log(\"noop\");\n return this;\n }\n\n disable() {\n console.log(\"noop\");\n return this;\n }\n\n enable() {\n console.log(\"noop\");\n return this;\n }\n set data(data: TreeSourceNode[]) {\n [this.columnDescriptors, this.#data] = treeToDataSourceRows(data);\n\n requestAnimationFrame(() => {\n this.sendRowsToClient();\n });\n }\n\n get filter() {\n return this._configWithVisualLink.filterSpec;\n }\n\n set filter(filter: DataSourceFilter) {\n // Note not using the setter\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n filterSpec: filter,\n };\n\n if (filter.filter) {\n this.applyFilter(filter);\n } else {\n this.#filterSet = undefined;\n }\n\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n this.#filterSet,\n );\n\n const { from, to } = this.range;\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n rows: this.visibleRows\n .slice(from, to)\n .map((row) => toClientRow(row, this.keys)),\n size: this.visibleRows.length,\n type: \"viewport-update\",\n });\n }\n\n private applyFilter({ filter: filterQuery, filterStruct }: DataSourceFilter) {\n const filter = filterStruct ?? (parseFilter(filterQuery) as FilterClause);\n if (isSingleValueFilter(filter)) {\n const filterSet = [];\n const regex = new RegExp(`${filter.value}`, \"i\");\n for (const row of this.#data) {\n const { [KEY]: key, [IDX]: idx } = row;\n if (regex.test(lastPathSegment(key, \"|\"))) {\n filterSet.push(idx);\n }\n }\n this.#filterSet = filterSet;\n }\n }\n\n /**\n * used to apply an initial selection. These may not necessarily be\n * visible. If revealOnSelect is in force, expand nodes as necessary\n * to ensure selected nodes are visible\n */\n private applySelectedKeyValues(keys: string[], revealSelected = false) {\n keys.forEach((key) => {\n const rowIdx = this.indexOfRowWithKey(key);\n const row = this.#data[rowIdx];\n row[SELECTED] = 1;\n\n if (revealSelected && row[DEPTH] !== 1) {\n const keys = key.slice(6).split(\"|\").slice(0, -1);\n\n let path = \"$root\";\n do {\n path = `${path}|${keys.shift()}`;\n this.expandedRows.add(path);\n } while (keys.length);\n }\n });\n }\n\n private indexOfRowWithKey = (key: string) =>\n this.#data.findIndex((row) => row[KEY] === key);\n\n select(selectRequest: Omit<SelectRequest, \"vpId\">) {\n // todo get a diff\n const updatedRows: DataSourceRow[] = [];\n\n switch (selectRequest.type) {\n case \"SELECT_ROW\": {\n const { preserveExistingSelection, rowKey } = selectRequest as Omit<\n SelectRowRequest,\n \"vpId\"\n >;\n for (const row of this.visibleRows) {\n const { [IDX]: rowIndex, [KEY]: key, [SELECTED]: sel } = row;\n if (\n sel === 1 &&\n preserveExistingSelection === false &&\n key !== rowKey\n ) {\n const deselectedRow = row.slice() as DataSourceRow;\n deselectedRow[SELECTED] = 0;\n this.visibleRows[rowIndex] = deselectedRow;\n updatedRows.push(deselectedRow);\n } else if (key === rowKey) {\n const selectedRow = row.slice() as DataSourceRow;\n selectedRow[SELECTED] = 1;\n this.visibleRows[rowIndex] = selectedRow;\n updatedRows.push(selectedRow);\n }\n }\n\n break;\n }\n case \"DESELECT_ROW\": {\n break;\n }\n\n default:\n // ignore\n }\n\n if (updatedRows.length > 0) {\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"update\",\n type: \"viewport-update\",\n rows: updatedRows,\n });\n }\n }\n\n private getRowKey(keyOrIndex: string | number) {\n if (typeof keyOrIndex === \"string\") {\n return keyOrIndex;\n }\n const row = this.getRowAtIndex(keyOrIndex);\n if (row === undefined) {\n throw Error(`row not found at index ${keyOrIndex}`);\n }\n return row[KEY];\n }\n\n openTreeNode(keyOrIndex: string | number) {\n const key = this.getRowKey(keyOrIndex);\n this.expandedRows.add(key);\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n );\n\n const { from, to } = this._range;\n this.clientCallback?.({\n clientViewportId: this.viewport,\n\n mode: \"batch\",\n rows: this.visibleRows\n .slice(from, to)\n .map((row) => toClientRow(row, this.keys)),\n size: this.visibleRows.length,\n type: \"viewport-update\",\n });\n }\n\n closeTreeNode(keyOrIndex: string | number, cascade = false) {\n const key = this.getRowKey(keyOrIndex);\n this.expandedRows.delete(key);\n if (cascade) {\n for (const rowKey of this.expandedRows.keys()) {\n if (rowKey.startsWith(key)) {\n this.expandedRows.delete(rowKey);\n }\n }\n }\n [this.visibleRows, this.visibleRowIndex] = getVisibleRows(\n this.#data,\n this.expandedRows,\n );\n this.sendRowsToClient();\n }\n\n get status() {\n return this.#status;\n }\n\n get selectedRowsCount() {\n return this.#selectedRowsCount;\n }\n\n get size() {\n return this.#size;\n }\n\n rangeRequest(range: VuuRange) {\n this.keys.reset(range);\n requestAnimationFrame(() => {\n this.sendRowsToClient();\n });\n }\n\n private sendRowsToClient() {\n const { from, to } = this._range;\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n rows: this.visibleRows\n .slice(from, to)\n .map((row) => toClientRow(row, this.keys)),\n size: this.visibleRows.length,\n type: \"viewport-update\",\n });\n }\n\n createLink({\n parentVpId,\n link: { fromColumn, toColumn },\n }: LinkDescriptorWithLabel) {\n console.log(\"create link\", {\n parentVpId,\n fromColumn,\n toColumn,\n });\n }\n\n removeLink() {\n console.log(\"remove link\");\n }\n\n async remoteProcedureCall<T extends VuuRpcResponse = VuuRpcResponse>() {\n return Promise.reject<T>();\n }\n\n async menuRpcCall(\n rpcRequest: Omit<VuuRpcRequest, \"vpId\">,\n ): Promise<MenuRpcResponse | undefined> {\n console.log(\"rmenuRpcCall\", {\n rpcRequest,\n });\n return undefined;\n }\n\n getChildRows(rowKey: string) {\n const parentRow = this.#data.find((row) => row[KEY] === rowKey);\n if (parentRow) {\n const { [IDX]: parentIdx, [DEPTH]: parentDepth } = parentRow;\n let rowIdx = parentIdx + 1;\n const childRows = [];\n do {\n const { [DEPTH]: depth } = this.#data[rowIdx];\n if (depth === parentDepth + 1) {\n childRows.push(this.#data[rowIdx]);\n } else if (depth <= parentDepth) {\n break;\n }\n rowIdx += 1;\n } while (rowIdx < this.#data.length);\n return childRows;\n } else {\n console.warn(\n `JsonDataSource getChildRows row not found for key ${rowKey}`,\n );\n }\n\n return [];\n }\n\n getRowsAtDepth(depth: number, visibleOnly = true) {\n const rows = visibleOnly ? this.visibleRows : this.#data;\n return rows.filter((row) => row[DEPTH] === depth);\n }\n\n getRowAtIndex(rowIdx: number) {\n return this.visibleRows[rowIdx];\n }\n}\n\nfunction getVisibleRows(\n rows: DataSourceRow[],\n expandedKeys: Set<string>,\n filterset?: number[],\n): [visibleRows: DataSourceRow[], index: VisibleRowIndex] {\n const visibleRows: DataSourceRow[] = [];\n const visibleRowIndex: VisibleRowIndex = {};\n\n const data = filterset ?? rows;\n\n for (let i = 0, index = 0; i < data.length; i++) {\n const idx = filterset ? filterset[i] : i;\n const row = rows[idx];\n const {\n [COUNT]: count,\n [DEPTH]: depth,\n [KEY]: key,\n [IS_LEAF]: isLeaf,\n } = row;\n if (filterset) {\n // assume expanded for now\n\n // if we have skipped a higher level group (that didn't directly match\n // our filter criteria, add it.\n const previousRow = visibleRows.at(-1);\n if (missingAncestor(row, previousRow)) {\n let currentRow: DataSourceRow | undefined = row;\n const missingRows = [];\n while (currentRow) {\n currentRow = getParentRow(rows, currentRow);\n if (currentRow) {\n // we will get the missing rows in reverse order\n missingRows.unshift(currentRow);\n }\n }\n missingRows.forEach((row) => {\n visibleRows.push(cloneRow(row, index++, true));\n });\n }\n\n visibleRows.push(cloneRow(row, index++, true));\n visibleRowIndex[index] = i;\n } else {\n const isExpanded = expandedKeys.has(key);\n visibleRows.push(cloneRow(row, index, isExpanded));\n visibleRowIndex[index++] = i;\n const skipNonVisibleRows = !isLeaf && !isExpanded && count > 0;\n if (skipNonVisibleRows) {\n do {\n i += 1;\n } while (i < rows.length - 1 && rows[i + 1][DEPTH] > depth);\n }\n }\n }\n return [visibleRows, visibleRowIndex];\n}\n\nconst cloneRow = (\n row: DataSourceRow,\n index: number,\n isExpanded: boolean,\n): DataSourceRow => {\n const dolly = row.slice() as DataSourceRow;\n dolly[0] = index;\n dolly[1] = index;\n if (isExpanded) {\n dolly[IS_EXPANDED] = true;\n }\n return dolly;\n};\n"],"names":["keys","row"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.13.
|
|
2
|
+
"version": "0.13.115-alpha.1",
|
|
3
3
|
"author": "heswell",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"devDependencies": {
|
|
6
|
-
"@vuu-ui/vuu-data-types": "0.13.
|
|
7
|
-
"@vuu-ui/vuu-table-types": "0.13.
|
|
8
|
-
"@vuu-ui/vuu-filter-types": "0.13.
|
|
9
|
-
"@vuu-ui/vuu-protocol-types": "0.13.
|
|
6
|
+
"@vuu-ui/vuu-data-types": "0.13.115-alpha.1",
|
|
7
|
+
"@vuu-ui/vuu-table-types": "0.13.115-alpha.1",
|
|
8
|
+
"@vuu-ui/vuu-filter-types": "0.13.115-alpha.1",
|
|
9
|
+
"@vuu-ui/vuu-protocol-types": "0.13.115-alpha.1"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@vuu-ui/vuu-filter-parser": "0.13.
|
|
13
|
-
"@vuu-ui/vuu-utils": "0.13.
|
|
12
|
+
"@vuu-ui/vuu-filter-parser": "0.13.115-alpha.1",
|
|
13
|
+
"@vuu-ui/vuu-utils": "0.13.115-alpha.1"
|
|
14
14
|
},
|
|
15
15
|
"sideEffects": false,
|
|
16
16
|
"files": [
|
|
@@ -4,7 +4,7 @@ import type { ColumnDescriptor } from "@vuu-ui/vuu-table-types";
|
|
|
4
4
|
import { ColumnMap, EventEmitter, Range } from "@vuu-ui/vuu-utils";
|
|
5
5
|
import { Filter } from "@vuu-ui/vuu-filter-types";
|
|
6
6
|
export interface ArrayDataSourceConstructorProps extends Omit<DataSourceConstructorProps, "bufferSize" | "table"> {
|
|
7
|
-
columnDescriptors: ColumnDescriptor[];
|
|
7
|
+
columnDescriptors: readonly ColumnDescriptor[];
|
|
8
8
|
data: Array<VuuRowDataItemType[]>;
|
|
9
9
|
dataMap?: ColumnMap;
|
|
10
10
|
keyColumn?: string;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DataRow } from "@vuu-ui/vuu-table-types";
|
|
2
2
|
export declare class IconProvider {
|
|
3
3
|
#private;
|
|
4
|
-
getIcon: (
|
|
4
|
+
getIcon: (dataRow: DataRow) => string;
|
|
5
5
|
setIcon(key: string, icon: string): void;
|
|
6
6
|
}
|