@vuu-ui/vuu-data-local 2.1.19-beta.2 → 2.1.19-beta.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/array-data-source/aggregate-utils.js +237 -0
- package/cjs/array-data-source/aggregate-utils.js.map +1 -0
- package/cjs/array-data-source/array-data-source.js +914 -0
- package/cjs/array-data-source/array-data-source.js.map +1 -0
- package/cjs/array-data-source/array-data-utils.js +62 -0
- package/cjs/array-data-source/array-data-utils.js.map +1 -0
- package/cjs/array-data-source/group-utils.js +187 -0
- package/cjs/array-data-source/group-utils.js.map +1 -0
- package/cjs/array-data-source/sort-utils.js +73 -0
- package/cjs/array-data-source/sort-utils.js.map +1 -0
- package/cjs/index.js +12 -0
- package/cjs/index.js.map +1 -0
- package/cjs/json-data-source/JsonDataSource.js +404 -0
- package/cjs/json-data-source/JsonDataSource.js.map +1 -0
- package/cjs/tree-data-source/IconProvider.js +28 -0
- package/cjs/tree-data-source/IconProvider.js.map +1 -0
- package/cjs/tree-data-source/TreeDataSource.js +434 -0
- package/cjs/tree-data-source/TreeDataSource.js.map +1 -0
- package/esm/array-data-source/aggregate-utils.js +235 -0
- package/esm/array-data-source/aggregate-utils.js.map +1 -0
- package/esm/array-data-source/array-data-source.js +912 -0
- package/esm/array-data-source/array-data-source.js.map +1 -0
- package/esm/array-data-source/array-data-utils.js +59 -0
- package/esm/array-data-source/array-data-utils.js.map +1 -0
- package/esm/array-data-source/group-utils.js +183 -0
- package/esm/array-data-source/group-utils.js.map +1 -0
- package/esm/array-data-source/sort-utils.js +69 -0
- package/esm/array-data-source/sort-utils.js.map +1 -0
- package/esm/index.js +4 -0
- package/esm/index.js.map +1 -0
- package/esm/json-data-source/JsonDataSource.js +402 -0
- package/esm/json-data-source/JsonDataSource.js.map +1 -0
- package/esm/tree-data-source/IconProvider.js +26 -0
- package/esm/tree-data-source/IconProvider.js.map +1 -0
- package/esm/tree-data-source/TreeDataSource.js +432 -0
- package/esm/tree-data-source/TreeDataSource.js.map +1 -0
- package/package.json +14 -11
- package/types/array-data-source/aggregate-utils.d.ts +2 -2
- package/types/array-data-source/array-data-source.d.ts +12 -12
- package/types/array-data-source/array-data-utils.d.ts +2 -2
- package/types/array-data-source/group-utils.d.ts +4 -4
- package/types/array-data-source/sort-utils.d.ts +4 -4
- package/types/json-data-source/JsonDataSource.d.ts +2 -2
- package/types/tree-data-source/TreeDataSource.d.ts +2 -2
- package/src/array-data-source/aggregate-utils.js +0 -121
- package/src/array-data-source/array-data-source.js +0 -671
- package/src/array-data-source/array-data-utils.js +0 -41
- package/src/array-data-source/group-utils.js +0 -138
- package/src/array-data-source/sort-utils.js +0 -56
- package/src/index.js +0 -3
- package/src/json-data-source/JsonDataSource.js +0 -319
- package/src/tree-data-source/IconProvider.js +0 -11
- package/src/tree-data-source/TreeDataSource.js +0 -353
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array-data-source.js","sources":["../../../../packages/vuu-data-local/src/array-data-source/array-data-source.ts"],"sourcesContent":["import type {\n DataSourceConfig,\n DataSourceConstructorProps,\n DataSourceEvents,\n DataSourceFilter,\n DataSourceRow,\n DataSourceRowWithBigint,\n DataSourceStatus,\n DataSourceSubscribedMessage,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n TableSchema,\n WithBaseFilter,\n WithFullConfig,\n DataSourceBase,\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<Array<bigint | VuuRowDataItemType>>;\n dataMap?: ColumnMap;\n keyColumn?: string;\n rangeChangeRowset?: \"delta\" | \"full\";\n}\n\nconst toDataSourceRow =\n (indexOfKeyColumn: number, index?: Map<string, number>) =>\n (\n data: Array<bigint | VuuRowDataItemType>,\n idx: number,\n ): DataSourceRowWithBigint => {\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\nconst buildTableSchema = (\n columns: readonly ColumnDescriptor[],\n keyColumn?: string,\n): TableSchema => {\n const schema: TableSchema = {\n columns: columns.map(({ editable, name, serverDataType = \"string\" }) => ({\n editable,\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 DataSourceBase<DataSourceRowWithBigint>\n{\n protected clientCallback: DataSourceSubscribeCallback | undefined;\n protected 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<bigint | VuuRowDataItemType>[];\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 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: DataSourceRowWithBigint[] | 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<DataSourceRowWithBigint>(\n toDataSourceRow(this.key, this.index),\n );\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.#status = \"unsubscribed\";\n this.emit(\"unsubscribed\", this.viewport);\n this.removeAllListeners();\n this.clientCallback = undefined;\n }\n\n suspend() {\n console.log(`[ArrayDataSource] 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 if (links) {\n this._clientCallback?.({\n clientViewportId: this.viewport,\n type: \"vuu-links\",\n links,\n });\n }\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: Array<DataSourceRowWithBigint> | 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: Array<Array<bigint | VuuRowDataItemType>>) {\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: Array<bigint | VuuRowDataItemType>) => {\n // TODO take sorting, filtering. grouping into account\n const dataSourceRow = toDataSourceRow(this.key, this.index)(row, this.size);\n (this.#data as Array<Array<bigint | VuuRowDataItemType>>).push(\n dataSourceRow,\n );\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 meetsFilterCriteria = this.getFilterPredicate();\n if (meetsFilterCriteria(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: DataSourceRowWithBigint) {\n const indexedSortDefs = this.config.sort.sortDefs.map<ColIndexSortDef>(\n ({ column, sortType }) => [this.columnMap[column], sortType],\n );\n\n if (this.processedData) {\n const comparator = sortComparator(indexedSortDefs);\n const insertPos = binarySearch(this.processedData, row, comparator);\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\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 = (\n row: Array<bigint | VuuRowDataItemType>,\n _columnName?: string,\n ) => {\n // TODO take 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\n // maybe update this in place\n this.#data[dataIndex] = dataSourceRow;\n\n const { from, to } = this.#range;\n\n const isFiltered = hasFilter(this.config) || hasBaseFilter(this.config);\n const isSorted = hasSort(this.config);\n\n if (isFiltered) {\n // this will accomodate sorted + filtered\n const meetsFilterCriteria = this.getFilterPredicate();\n if (meetsFilterCriteria(dataSourceRow) && this.processedData) {\n const dataIndex = this.processedData.findIndex(\n (row) => row[KEY] === keyValue,\n );\n if (dataIndex !== -1) {\n const existingRow = this.processedData[dataIndex];\n // preserve the metadata, copy the domain data\n const newFilteredRow = existingRow\n .slice(0, 10)\n .concat(dataSourceRow.slice(10)) as DataSourceRow;\n this.processedData[dataIndex] = newFilteredRow;\n\n if (dataIndex >= from && dataIndex < to) {\n this.sendRowsToClient(false, newFilteredRow);\n }\n }\n } else if (this.processedData) {\n // has the update taken the row out of the filter set ?\n const dataIndex = this.processedData.findIndex(\n (row) => row[KEY] === keyValue,\n );\n if (dataIndex !== -1) {\n console.log(`LAMF dataRow no longer in filter set`);\n }\n }\n } else if (isSorted) {\n if (this.processedData) {\n const dataIndex = this.processedData.findIndex(\n (row) => row[KEY] === keyValue,\n );\n if (dataIndex !== -1) {\n const existingRow = this.processedData[dataIndex];\n // preserve the metadata, copy the domain data\n const newSortedRow = existingRow\n .slice(0, 10)\n .concat(dataSourceRow.slice(10)) as DataSourceRow;\n this.processedData[dataIndex] = newSortedRow;\n\n if (dataIndex >= from && dataIndex < to) {\n this.sendRowsToClient(false, newSortedRow);\n }\n }\n }\n } else {\n if (dataIndex >= from && dataIndex < to) {\n this.sendRowsToClient(false, dataSourceRow);\n }\n }\n }\n };\n\n protected handleDeleteFromTable = async (\n key: string,\n ): Promise<true | string> => {\n const dataIndex = this.#data.findIndex((row) => row[KEY] === key);\n if (dataIndex === -1) {\n return \"row not found\";\n }\n let doomedIndex: number | undefined = undefined;\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 return true;\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?: DataSourceRowWithBigint) {\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","dataIndex"],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { metadataKeys } from '@vuu-ui/vuu-utils';
|
|
2
|
+
|
|
3
|
+
const { KEY, RENDER_IDX, SELECTED } = metadataKeys;
|
|
4
|
+
const replaceBigInt = (value) => {
|
|
5
|
+
if (typeof value === "bigint") {
|
|
6
|
+
return value.toString();
|
|
7
|
+
} else {
|
|
8
|
+
return value;
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
const toClientRow = (row, keys, selectedRows, dataIndices) => {
|
|
12
|
+
const [rowIndex] = row;
|
|
13
|
+
const selectedAll = selectedRows.has("*");
|
|
14
|
+
let clientRow;
|
|
15
|
+
if (dataIndices) {
|
|
16
|
+
const { count } = metadataKeys;
|
|
17
|
+
clientRow = row.slice(0, count).concat(
|
|
18
|
+
dataIndices.map((idx) => replaceBigInt(row[idx]))
|
|
19
|
+
);
|
|
20
|
+
} else {
|
|
21
|
+
clientRow = row.map(replaceBigInt);
|
|
22
|
+
}
|
|
23
|
+
clientRow[RENDER_IDX] = keys.keyFor(rowIndex);
|
|
24
|
+
clientRow[SELECTED] = selectedAll || selectedRows.has(row[KEY]) ? 1 : 0;
|
|
25
|
+
return clientRow;
|
|
26
|
+
};
|
|
27
|
+
const divergentMaps = (columnMap, dataMap) => {
|
|
28
|
+
if (dataMap) {
|
|
29
|
+
const { count: mapOffset } = metadataKeys;
|
|
30
|
+
for (const [columnName, index] of Object.entries(columnMap)) {
|
|
31
|
+
const dataIdx = dataMap[columnName];
|
|
32
|
+
if (dataIdx === void 0) {
|
|
33
|
+
throw Error(
|
|
34
|
+
`ArrayDataSource column ${columnName} is not in underlying data set`
|
|
35
|
+
);
|
|
36
|
+
} else if (dataIdx !== index - mapOffset) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return false;
|
|
42
|
+
};
|
|
43
|
+
const getDataIndices = (columnMap, dataMap) => {
|
|
44
|
+
const { count: mapOffset } = metadataKeys;
|
|
45
|
+
const result = [];
|
|
46
|
+
Object.entries(columnMap).forEach(([columnName]) => {
|
|
47
|
+
result.push(dataMap[columnName] + mapOffset);
|
|
48
|
+
});
|
|
49
|
+
return result;
|
|
50
|
+
};
|
|
51
|
+
const buildDataToClientMap = (columnMap, dataMap) => {
|
|
52
|
+
if (dataMap && divergentMaps(columnMap, dataMap)) {
|
|
53
|
+
return getDataIndices(columnMap, dataMap);
|
|
54
|
+
}
|
|
55
|
+
return void 0;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
export { buildDataToClientMap, toClientRow };
|
|
59
|
+
//# sourceMappingURL=array-data-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"array-data-utils.js","sources":["../../../../packages/vuu-data-local/src/array-data-source/array-data-utils.ts"],"sourcesContent":["import type {\n DataSourceRow,\n DataSourceRowWithBigint,\n} from \"@vuu-ui/vuu-data-types\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap, KeySet, metadataKeys } from \"@vuu-ui/vuu-utils\";\n\nconst { KEY, RENDER_IDX, SELECTED } = metadataKeys;\n\nconst replaceBigInt = (\n value: VuuRowDataItemType | bigint,\n): VuuRowDataItemType => {\n if (typeof value === \"bigint\") {\n return value.toString();\n } else {\n return value;\n }\n};\n\nexport const toClientRow = (\n row: DataSourceRowWithBigint,\n keys: KeySet,\n selectedRows: Set<string>,\n dataIndices?: number[],\n) => {\n const [rowIndex] = row;\n const selectedAll = selectedRows.has(\"*\");\n let clientRow;\n if (dataIndices) {\n // If client has specified a different ordering of columns from the way they are\n // ordered inn the underlying data, this is where we effect the ordering.\n const { count } = metadataKeys;\n clientRow = row\n .slice(0, count)\n .concat(\n dataIndices.map((idx) => replaceBigInt(row[idx])),\n ) as DataSourceRow;\n } else {\n clientRow = row.map(replaceBigInt) as DataSourceRow;\n }\n clientRow[RENDER_IDX] = keys.keyFor(rowIndex);\n clientRow[SELECTED] = selectedAll || selectedRows.has(row[KEY]) ? 1 : 0;\n return clientRow;\n};\n\nconst divergentMaps = (columnMap: ColumnMap, dataMap?: ColumnMap) => {\n if (dataMap) {\n const { count: mapOffset } = metadataKeys;\n for (const [columnName, index] of Object.entries(columnMap)) {\n const dataIdx = dataMap[columnName];\n if (dataIdx === undefined) {\n throw Error(\n `ArrayDataSource column ${columnName} is not in underlying data set`,\n );\n } else if (dataIdx !== index - mapOffset) {\n return true;\n }\n }\n }\n return false;\n};\n\nconst getDataIndices = (columnMap: ColumnMap, dataMap: ColumnMap) => {\n const { count: mapOffset } = metadataKeys;\n const result: number[] = [];\n Object.entries(columnMap).forEach(([columnName]) => {\n result.push(dataMap[columnName] + mapOffset);\n });\n return result;\n};\n\nexport const buildDataToClientMap = (\n columnMap: ColumnMap,\n dataMap?: ColumnMap,\n): number[] | undefined => {\n if (dataMap && divergentMaps(columnMap, dataMap)) {\n return getDataIndices(columnMap, dataMap);\n }\n return undefined;\n};\n"],"names":[],"mappings":";;AAOA,MAAM,EAAE,GAAA,EAAK,UAAY,EAAA,QAAA,EAAa,GAAA,YAAA;AAEtC,MAAM,aAAA,GAAgB,CACpB,KACuB,KAAA;AACvB,EAAI,IAAA,OAAO,UAAU,QAAU,EAAA;AAC7B,IAAA,OAAO,MAAM,QAAS,EAAA;AAAA,GACjB,MAAA;AACL,IAAO,OAAA,KAAA;AAAA;AAEX,CAAA;AAEO,MAAM,WAAc,GAAA,CACzB,GACA,EAAA,IAAA,EACA,cACA,WACG,KAAA;AACH,EAAM,MAAA,CAAC,QAAQ,CAAI,GAAA,GAAA;AACnB,EAAM,MAAA,WAAA,GAAc,YAAa,CAAA,GAAA,CAAI,GAAG,CAAA;AACxC,EAAI,IAAA,SAAA;AACJ,EAAA,IAAI,WAAa,EAAA;AAGf,IAAM,MAAA,EAAE,OAAU,GAAA,YAAA;AAClB,IAAA,SAAA,GAAY,GACT,CAAA,KAAA,CAAM,CAAG,EAAA,KAAK,CACd,CAAA,MAAA;AAAA,MACC,WAAA,CAAY,IAAI,CAAC,GAAA,KAAQ,cAAc,GAAI,CAAA,GAAG,CAAC,CAAC;AAAA,KAClD;AAAA,GACG,MAAA;AACL,IAAY,SAAA,GAAA,GAAA,CAAI,IAAI,aAAa,CAAA;AAAA;AAEnC,EAAA,SAAA,CAAU,UAAU,CAAA,GAAI,IAAK,CAAA,MAAA,CAAO,QAAQ,CAAA;AAC5C,EAAU,SAAA,CAAA,QAAQ,IAAI,WAAe,IAAA,YAAA,CAAa,IAAI,GAAI,CAAA,GAAG,CAAC,CAAA,GAAI,CAAI,GAAA,CAAA;AACtE,EAAO,OAAA,SAAA;AACT;AAEA,MAAM,aAAA,GAAgB,CAAC,SAAA,EAAsB,OAAwB,KAAA;AACnE,EAAA,IAAI,OAAS,EAAA;AACX,IAAM,MAAA,EAAE,KAAO,EAAA,SAAA,EAAc,GAAA,YAAA;AAC7B,IAAA,KAAA,MAAW,CAAC,UAAY,EAAA,KAAK,KAAK,MAAO,CAAA,OAAA,CAAQ,SAAS,CAAG,EAAA;AAC3D,MAAM,MAAA,OAAA,GAAU,QAAQ,UAAU,CAAA;AAClC,MAAA,IAAI,YAAY,KAAW,CAAA,EAAA;AACzB,QAAM,MAAA,KAAA;AAAA,UACJ,0BAA0B,UAAU,CAAA,8BAAA;AAAA,SACtC;AAAA,OACF,MAAA,IAAW,OAAY,KAAA,KAAA,GAAQ,SAAW,EAAA;AACxC,QAAO,OAAA,IAAA;AAAA;AACT;AACF;AAEF,EAAO,OAAA,KAAA;AACT,CAAA;AAEA,MAAM,cAAA,GAAiB,CAAC,SAAA,EAAsB,OAAuB,KAAA;AACnE,EAAM,MAAA,EAAE,KAAO,EAAA,SAAA,EAAc,GAAA,YAAA;AAC7B,EAAA,MAAM,SAAmB,EAAC;AAC1B,EAAA,MAAA,CAAO,QAAQ,SAAS,CAAA,CAAE,QAAQ,CAAC,CAAC,UAAU,CAAM,KAAA;AAClD,IAAA,MAAA,CAAO,IAAK,CAAA,OAAA,CAAQ,UAAU,CAAA,GAAI,SAAS,CAAA;AAAA,GAC5C,CAAA;AACD,EAAO,OAAA,MAAA;AACT,CAAA;AAEa,MAAA,oBAAA,GAAuB,CAClC,SAAA,EACA,OACyB,KAAA;AACzB,EAAA,IAAI,OAAW,IAAA,aAAA,CAAc,SAAW,EAAA,OAAO,CAAG,EAAA;AAChD,IAAO,OAAA,cAAA,CAAe,WAAW,OAAO,CAAA;AAAA;AAE1C,EAAO,OAAA,KAAA,CAAA;AACT;;;;"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { metadataKeys } from '@vuu-ui/vuu-utils';
|
|
2
|
+
|
|
3
|
+
const { DEPTH, IS_EXPANDED, KEY } = metadataKeys;
|
|
4
|
+
const timestamp = 0;
|
|
5
|
+
const isNew = false;
|
|
6
|
+
const collapseGroup = (key, groupedRows) => {
|
|
7
|
+
const rows = [];
|
|
8
|
+
for (let i = 0, idx = 0, collapsed = false, len = groupedRows.length; i < len; i++) {
|
|
9
|
+
const row = groupedRows[i];
|
|
10
|
+
const { [DEPTH]: depth, [KEY]: rowKey } = row;
|
|
11
|
+
if (rowKey === key) {
|
|
12
|
+
const collapsedRow = row.slice();
|
|
13
|
+
collapsedRow[IS_EXPANDED] = false;
|
|
14
|
+
rows.push(collapsedRow);
|
|
15
|
+
idx += 1;
|
|
16
|
+
collapsed = true;
|
|
17
|
+
while (i < len - 1 && groupedRows[i + 1][DEPTH] > depth) {
|
|
18
|
+
i += 1;
|
|
19
|
+
}
|
|
20
|
+
} else if (collapsed) {
|
|
21
|
+
const newRow = row.slice();
|
|
22
|
+
newRow[0] = idx;
|
|
23
|
+
newRow[1] = idx;
|
|
24
|
+
rows.push(newRow);
|
|
25
|
+
idx += 1;
|
|
26
|
+
} else {
|
|
27
|
+
rows.push(row);
|
|
28
|
+
idx += 1;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return rows;
|
|
32
|
+
};
|
|
33
|
+
const expandGroup = (keys, sourceRows, groupBy, columnMap, groupMap, processedData) => {
|
|
34
|
+
const groupIndices = groupBy.map((column) => columnMap[column]);
|
|
35
|
+
return dataRowsFromGroups2(
|
|
36
|
+
groupMap,
|
|
37
|
+
groupIndices,
|
|
38
|
+
keys,
|
|
39
|
+
sourceRows,
|
|
40
|
+
void 0,
|
|
41
|
+
void 0,
|
|
42
|
+
void 0,
|
|
43
|
+
processedData
|
|
44
|
+
);
|
|
45
|
+
};
|
|
46
|
+
const dataRowsFromGroups2 = (groupMap, groupIndices, openKeys, sourceRows = [], root = "$root", depth = 1, rows = [], processedData) => {
|
|
47
|
+
const keys = Object.keys(groupMap).sort();
|
|
48
|
+
for (const key of keys) {
|
|
49
|
+
const idx = rows.length;
|
|
50
|
+
const groupKey = `${root}|${key}`;
|
|
51
|
+
const row = [
|
|
52
|
+
idx,
|
|
53
|
+
idx,
|
|
54
|
+
false,
|
|
55
|
+
false,
|
|
56
|
+
depth,
|
|
57
|
+
childCount(groupMap[key]),
|
|
58
|
+
groupKey,
|
|
59
|
+
0,
|
|
60
|
+
timestamp,
|
|
61
|
+
isNew
|
|
62
|
+
];
|
|
63
|
+
row[groupIndices[depth - 1]] = key;
|
|
64
|
+
rows.push(row);
|
|
65
|
+
if (openKeys.includes(groupKey)) {
|
|
66
|
+
row[IS_EXPANDED] = true;
|
|
67
|
+
if (Array.isArray(groupMap[key])) {
|
|
68
|
+
pushChildren(
|
|
69
|
+
rows,
|
|
70
|
+
groupMap[key],
|
|
71
|
+
sourceRows,
|
|
72
|
+
groupKey,
|
|
73
|
+
depth + 1
|
|
74
|
+
);
|
|
75
|
+
} else {
|
|
76
|
+
dataRowsFromGroups2(
|
|
77
|
+
groupMap[key],
|
|
78
|
+
groupIndices,
|
|
79
|
+
openKeys,
|
|
80
|
+
sourceRows,
|
|
81
|
+
groupKey,
|
|
82
|
+
depth + 1,
|
|
83
|
+
rows,
|
|
84
|
+
processedData
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
for (const key in rows) {
|
|
90
|
+
for (const index in rows) {
|
|
91
|
+
if (rows[key][2] === false && processedData[index] != void 0) {
|
|
92
|
+
if (rows[key][groupIndices[0]] === processedData[index][groupIndices[0]]) {
|
|
93
|
+
rows[key] = rows[key].splice(0, 8).concat(
|
|
94
|
+
processedData[index].slice(
|
|
95
|
+
8,
|
|
96
|
+
// groupIndices[0] + 1,
|
|
97
|
+
processedData[index].length
|
|
98
|
+
)
|
|
99
|
+
);
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return rows;
|
|
106
|
+
};
|
|
107
|
+
const pushChildren = (rows, tree, sourceRows, parentKey, depth) => {
|
|
108
|
+
for (const rowIdx of tree) {
|
|
109
|
+
const idx = rows.length;
|
|
110
|
+
const sourceRow = sourceRows[rowIdx].slice();
|
|
111
|
+
sourceRow[0] = idx;
|
|
112
|
+
sourceRow[1] = idx;
|
|
113
|
+
sourceRow[DEPTH] = depth;
|
|
114
|
+
sourceRow[KEY] = `${parentKey}|${sourceRow[KEY]}`;
|
|
115
|
+
rows.push(sourceRow);
|
|
116
|
+
}
|
|
117
|
+
};
|
|
118
|
+
const groupRows = (rows, groupBy, columnMap) => {
|
|
119
|
+
const groupIndices = groupBy.map((column) => columnMap[column]);
|
|
120
|
+
const groupTree = groupLeafRows(rows, groupIndices);
|
|
121
|
+
const groupedDataRows = dataRowsFromGroups(groupTree, groupIndices);
|
|
122
|
+
return [groupedDataRows, groupTree];
|
|
123
|
+
};
|
|
124
|
+
const dataRowsFromGroups = (groupTree, groupIndices) => {
|
|
125
|
+
const depth = 0;
|
|
126
|
+
const rows = [];
|
|
127
|
+
let idx = 0;
|
|
128
|
+
const keys = Object.keys(groupTree).sort();
|
|
129
|
+
for (const key of keys) {
|
|
130
|
+
const row = [
|
|
131
|
+
idx,
|
|
132
|
+
idx,
|
|
133
|
+
false,
|
|
134
|
+
false,
|
|
135
|
+
1,
|
|
136
|
+
childCount(groupTree[key]),
|
|
137
|
+
`$root|${key}`,
|
|
138
|
+
0,
|
|
139
|
+
timestamp,
|
|
140
|
+
isNew
|
|
141
|
+
];
|
|
142
|
+
row[groupIndices[depth]] = key;
|
|
143
|
+
rows.push(row);
|
|
144
|
+
idx += 1;
|
|
145
|
+
}
|
|
146
|
+
return rows;
|
|
147
|
+
};
|
|
148
|
+
function childCount(list) {
|
|
149
|
+
if (Array.isArray(list)) {
|
|
150
|
+
return list.length;
|
|
151
|
+
} else {
|
|
152
|
+
return Object.keys(list).length;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
function groupLeafRows(leafRows, groupby) {
|
|
156
|
+
const groups = {};
|
|
157
|
+
const levels = groupby.length;
|
|
158
|
+
const lastLevel = levels - 1;
|
|
159
|
+
for (let i = 0, len = leafRows.length; i < len; i++) {
|
|
160
|
+
const leafRow = leafRows[i];
|
|
161
|
+
let target = groups;
|
|
162
|
+
let targetNode;
|
|
163
|
+
let key;
|
|
164
|
+
for (let level = 0; level < levels; level++) {
|
|
165
|
+
const colIdx = groupby[level];
|
|
166
|
+
key = leafRow[colIdx].toString();
|
|
167
|
+
targetNode = target[key];
|
|
168
|
+
if (targetNode && level === lastLevel) {
|
|
169
|
+
targetNode.push(i);
|
|
170
|
+
} else if (targetNode) {
|
|
171
|
+
target = targetNode;
|
|
172
|
+
} else if (!targetNode && level < lastLevel) {
|
|
173
|
+
target = target[key] = {};
|
|
174
|
+
} else if (!targetNode) {
|
|
175
|
+
target[key] = [i];
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return groups;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
export { collapseGroup, expandGroup, groupRows };
|
|
183
|
+
//# sourceMappingURL=group-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"group-utils.js","sources":["../../../../packages/vuu-data-local/src/array-data-source/group-utils.ts"],"sourcesContent":["import type { DataSourceRow } from \"@vuu-ui/vuu-data-types\";\nimport type {\n VuuGroupBy,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap, metadataKeys } from \"@vuu-ui/vuu-utils\";\n\nexport type KeyList = number[];\nexport type GroupMap = { [key: string]: GroupMap | KeyList };\n\nconst { DEPTH, IS_EXPANDED, KEY } = metadataKeys;\n\nconst timestamp = 0;\nconst isNew = false;\n\nexport const collapseGroup = (\n key: string,\n groupedRows: readonly DataSourceRow<bigint | VuuRowDataItemType>[],\n): DataSourceRow<bigint | VuuRowDataItemType>[] => {\n const rows: DataSourceRow<bigint | VuuRowDataItemType>[] = [];\n\n for (\n let i = 0, idx = 0, collapsed = false, len = groupedRows.length;\n i < len;\n i++\n ) {\n const row = groupedRows[i];\n const { [DEPTH]: depth, [KEY]: rowKey } = row;\n if (rowKey === key) {\n const collapsedRow = row.slice() as DataSourceRow;\n collapsedRow[IS_EXPANDED] = false;\n rows.push(collapsedRow);\n idx += 1;\n collapsed = true;\n while (i < len - 1 && groupedRows[i + 1][DEPTH] > depth) {\n i += 1;\n }\n } else if (collapsed) {\n const newRow = row.slice() as DataSourceRow;\n newRow[0] = idx;\n newRow[1] = idx;\n rows.push(newRow);\n idx += 1;\n } else {\n rows.push(row);\n idx += 1;\n }\n }\n\n return rows;\n};\n\nexport const expandGroup = (\n keys: string[],\n sourceRows: readonly DataSourceRow<bigint | VuuRowDataItemType>[],\n groupBy: VuuGroupBy,\n columnMap: ColumnMap,\n groupMap: GroupMap,\n processedData: readonly DataSourceRow[],\n): DataSourceRow[] => {\n const groupIndices = groupBy.map<number>((column) => columnMap[column]);\n return dataRowsFromGroups2(\n groupMap,\n groupIndices,\n keys,\n sourceRows,\n undefined,\n undefined,\n undefined,\n processedData,\n );\n};\n\nconst dataRowsFromGroups2 = (\n groupMap: GroupMap,\n groupIndices: number[],\n openKeys: string[],\n sourceRows: readonly DataSourceRow<bigint | VuuRowDataItemType>[] = [],\n root = \"$root\",\n depth = 1,\n rows: DataSourceRow[] = [],\n processedData: readonly DataSourceRow[],\n) => {\n const keys = Object.keys(groupMap).sort();\n for (const key of keys) {\n const idx = rows.length;\n const groupKey = `${root}|${key}`;\n const row: DataSourceRow = [\n idx,\n idx,\n false,\n false,\n depth,\n childCount(groupMap[key]),\n groupKey,\n 0,\n timestamp,\n isNew,\n ];\n // TODO whats this\n row[groupIndices[depth - 1]] = key;\n rows.push(row);\n\n if (openKeys.includes(groupKey)) {\n row[IS_EXPANDED] = true;\n if (Array.isArray(groupMap[key])) {\n pushChildren(\n rows,\n groupMap[key] as KeyList,\n sourceRows,\n groupKey,\n depth + 1,\n );\n } else {\n dataRowsFromGroups2(\n groupMap[key] as GroupMap,\n groupIndices,\n openKeys,\n sourceRows,\n groupKey,\n depth + 1,\n rows,\n processedData,\n );\n }\n }\n }\n\n for (const key in rows) {\n for (const index in rows) {\n if (rows[key][2] === false && processedData[index] != undefined) {\n if (\n rows[key][groupIndices[0]] === processedData[index][groupIndices[0]]\n ) {\n rows[key] = rows[key].splice(0, 8).concat(\n processedData[index].slice(\n 8, // groupIndices[0] + 1,\n processedData[index].length,\n ),\n ) as DataSourceRow;\n break;\n }\n }\n }\n }\n\n return rows;\n};\n\nconst pushChildren = (\n rows: DataSourceRow[],\n tree: KeyList,\n sourceRows: readonly DataSourceRow<bigint | VuuRowDataItemType>[],\n parentKey: string,\n depth: number,\n) => {\n for (const rowIdx of tree) {\n const idx = rows.length;\n const sourceRow = sourceRows[rowIdx].slice() as DataSourceRow;\n sourceRow[0] = idx;\n sourceRow[1] = idx;\n sourceRow[DEPTH] = depth;\n sourceRow[KEY] = `${parentKey}|${sourceRow[KEY]}`;\n rows.push(sourceRow);\n }\n};\n\nexport const groupRows = (\n rows: ReadonlyArray<Array<bigint | VuuRowDataItemType>>,\n groupBy: VuuGroupBy,\n columnMap: ColumnMap,\n): [DataSourceRow[], GroupMap] => {\n const groupIndices = groupBy.map<number>((column) => columnMap[column]);\n const groupTree = groupLeafRows(rows, groupIndices);\n const groupedDataRows = dataRowsFromGroups(groupTree, groupIndices);\n // 2) collapse int groups\n\n return [groupedDataRows, groupTree];\n};\n\nconst dataRowsFromGroups = (groupTree: GroupMap, groupIndices: number[]) => {\n const depth = 0;\n const rows: DataSourceRow[] = [];\n let idx = 0;\n const keys = Object.keys(groupTree).sort();\n for (const key of keys) {\n const row: DataSourceRow = [\n idx,\n idx,\n false,\n false,\n 1,\n childCount(groupTree[key]),\n `$root|${key}`,\n 0,\n timestamp,\n isNew,\n ];\n row[groupIndices[depth]] = key;\n rows.push(row);\n idx += 1;\n }\n return rows;\n};\n\nfunction childCount(list: GroupMap | KeyList) {\n if (Array.isArray(list)) {\n return list.length;\n } else {\n return Object.keys(list).length;\n }\n}\n\nfunction groupLeafRows(\n leafRows: ReadonlyArray<Array<bigint | VuuRowDataItemType>>,\n groupby: number[],\n) {\n const groups: GroupMap = {};\n const levels = groupby.length;\n const lastLevel = levels - 1;\n for (let i = 0, len = leafRows.length; i < len; i++) {\n const leafRow = leafRows[i];\n let target: GroupMap | KeyList = groups;\n let targetNode;\n let key;\n for (let level = 0; level < levels; level++) {\n const colIdx = groupby[level];\n key = leafRow[colIdx].toString();\n targetNode = (target as GroupMap)[key];\n if (targetNode && level === lastLevel) {\n // we're at leaf level, targetNode can only be a KeyList\n (targetNode as KeyList).push(i);\n } else if (targetNode) {\n target = targetNode;\n } else if (!targetNode && level < lastLevel) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n target = target[key] = {};\n } else if (!targetNode) {\n (target as GroupMap)[key] = [i];\n }\n }\n }\n return groups;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
const defaultSortPredicate = (r1, r2, [i, direction]) => {
|
|
2
|
+
const val1 = direction === "D" ? r2[i] : r1[i];
|
|
3
|
+
const val2 = direction === "D" ? r1[i] : r2[i];
|
|
4
|
+
if (val1 === val2) {
|
|
5
|
+
return 0;
|
|
6
|
+
} else if (val2 === null || val1 > val2) {
|
|
7
|
+
return 1;
|
|
8
|
+
} else {
|
|
9
|
+
return -1;
|
|
10
|
+
}
|
|
11
|
+
};
|
|
12
|
+
const sortComparator = (sortDefs) => {
|
|
13
|
+
if (sortDefs.length === 1) {
|
|
14
|
+
return singleColComparator(sortDefs);
|
|
15
|
+
} else if (sortDefs.length === 2) {
|
|
16
|
+
return twoColComparator(sortDefs);
|
|
17
|
+
} else {
|
|
18
|
+
return multiColComparator(sortDefs);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
const singleColComparator = ([[i, direction]]) => (r1, r2) => {
|
|
22
|
+
const v1 = direction === "D" ? r2[i] : r1[i];
|
|
23
|
+
const v2 = direction === "D" ? r1[i] : r2[i];
|
|
24
|
+
return v1 > v2 ? 1 : v2 > v1 ? -1 : 0;
|
|
25
|
+
};
|
|
26
|
+
const twoColComparator = ([[idx1, direction1], [idx2, direction2]]) => (r1, r2) => {
|
|
27
|
+
const v1 = direction1 === "D" ? r2[idx1] : r1[idx1];
|
|
28
|
+
const v2 = direction1 === "D" ? r1[idx1] : r2[idx1];
|
|
29
|
+
const v3 = direction2 === "D" ? r2[idx2] : r1[idx2];
|
|
30
|
+
const v4 = direction2 === "D" ? r1[idx2] : r2[idx2];
|
|
31
|
+
return v1 > v2 ? 1 : v2 > v1 ? -1 : v3 > v4 ? 1 : v4 > v3 ? -1 : 0;
|
|
32
|
+
};
|
|
33
|
+
const multiColComparator = (sortDefs, test = defaultSortPredicate) => (r1, r2) => {
|
|
34
|
+
for (const sortDef of sortDefs) {
|
|
35
|
+
const result = test(r1, r2, sortDef);
|
|
36
|
+
if (result !== 0) {
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return 0;
|
|
41
|
+
};
|
|
42
|
+
const sortRows = (rows, { sortDefs }, columnMap) => {
|
|
43
|
+
const indexedSortDefs = sortDefs.map(
|
|
44
|
+
({ column, sortType }) => [columnMap[column], sortType]
|
|
45
|
+
);
|
|
46
|
+
const comparator = sortComparator(indexedSortDefs);
|
|
47
|
+
return rows.slice().sort(comparator);
|
|
48
|
+
};
|
|
49
|
+
function binarySearch(items, item, comparator) {
|
|
50
|
+
let l = 0;
|
|
51
|
+
let h = items.length - 1;
|
|
52
|
+
let m;
|
|
53
|
+
let comparison;
|
|
54
|
+
while (l <= h) {
|
|
55
|
+
m = l + h >>> 1;
|
|
56
|
+
comparison = comparator(items[m], item);
|
|
57
|
+
if (comparison < 0) {
|
|
58
|
+
l = m + 1;
|
|
59
|
+
} else if (comparison > 0) {
|
|
60
|
+
h = m - 1;
|
|
61
|
+
} else {
|
|
62
|
+
return m;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return ~l;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export { binarySearch, sortComparator, sortRows };
|
|
69
|
+
//# sourceMappingURL=sort-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sort-utils.js","sources":["../../../../packages/vuu-data-local/src/array-data-source/sort-utils.ts"],"sourcesContent":["import type { DataSourceRowWithBigint } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuSort, VuuSortType } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap } from \"@vuu-ui/vuu-utils\";\n\nexport type ColIndexSortDef = [number, VuuSortType];\ntype SortPredicate = (\n r1: DataSourceRowWithBigint,\n r2: DataSourceRowWithBigint,\n sortDefDef: ColIndexSortDef,\n) => SortCompareResult;\ntype SortCompareResult = 0 | 1 | -1;\ntype RowSortComparatorFactory = (\n sortDefs: ColIndexSortDef[],\n test?: SortPredicate,\n) => RowSortComparator;\nexport type RowSortComparator = (\n item1: DataSourceRowWithBigint,\n item2: DataSourceRowWithBigint,\n) => SortCompareResult;\n\nconst defaultSortPredicate: SortPredicate = (r1, r2, [i, direction]) => {\n const val1 = direction === \"D\" ? r2[i] : r1[i];\n const val2 = direction === \"D\" ? r1[i] : r2[i];\n if (val1 === val2) {\n return 0;\n } else if (val2 === null || val1 > val2) {\n return 1;\n } else {\n return -1;\n }\n};\n\nexport const sortComparator = (\n sortDefs: ColIndexSortDef[],\n): RowSortComparator => {\n if (sortDefs.length === 1) {\n return singleColComparator(sortDefs);\n } else if (sortDefs.length === 2) {\n return twoColComparator(sortDefs);\n } else {\n return multiColComparator(sortDefs);\n }\n};\n\nconst singleColComparator: RowSortComparatorFactory =\n ([[i, direction]]) =>\n (r1, r2) => {\n const v1 = direction === \"D\" ? r2[i] : r1[i];\n const v2 = direction === \"D\" ? r1[i] : r2[i];\n return v1 > v2 ? 1 : v2 > v1 ? -1 : 0;\n };\n\nconst twoColComparator: RowSortComparatorFactory =\n ([[idx1, direction1], [idx2, direction2]]) =>\n (r1, r2) => {\n const v1 = direction1 === \"D\" ? r2[idx1] : r1[idx1];\n const v2 = direction1 === \"D\" ? r1[idx1] : r2[idx1];\n const v3 = direction2 === \"D\" ? r2[idx2] : r1[idx2];\n const v4 = direction2 === \"D\" ? r1[idx2] : r2[idx2];\n return v1 > v2 ? 1 : v2 > v1 ? -1 : v3 > v4 ? 1 : v4 > v3 ? -1 : 0;\n };\n\nconst multiColComparator: RowSortComparatorFactory =\n (sortDefs, test = defaultSortPredicate) =>\n (r1, r2) => {\n for (const sortDef of sortDefs) {\n const result = test(r1, r2, sortDef);\n if (result !== 0) {\n return result;\n }\n }\n return 0;\n };\n\nexport const sortRows = (\n rows: readonly DataSourceRowWithBigint[],\n { sortDefs }: VuuSort,\n columnMap: ColumnMap,\n) => {\n const indexedSortDefs = sortDefs.map<ColIndexSortDef>(\n ({ column, sortType }) => [columnMap[column], sortType],\n );\n const comparator = sortComparator(indexedSortDefs);\n return rows.slice().sort(comparator);\n};\n\nexport function binarySearch(\n items: DataSourceRowWithBigint[],\n item: DataSourceRowWithBigint,\n comparator: RowSortComparator,\n) {\n let l = 0;\n let h = items.length - 1;\n let m;\n let comparison;\n\n while (l <= h) {\n m = (l + h) >>> 1; /* equivalent to Math.floor((l + h) / 2) but faster */\n comparison = comparator(items[m], item);\n if (comparison < 0) {\n l = m + 1;\n } else if (comparison > 0) {\n h = m - 1;\n } else {\n return m;\n }\n }\n return ~l;\n}\n"],"names":[],"mappings":"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"}
|
package/esm/index.js
ADDED
package/esm/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|