@vuu-ui/vuu-data-local 4.0.0-alpha.3 → 4.0.0-alpha.30
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/package.json
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "4.0.0-alpha.
|
|
2
|
+
"version": "4.0.0-alpha.30",
|
|
3
3
|
"main": "./src/index.js",
|
|
4
4
|
"author": "heswell",
|
|
5
5
|
"type": "module",
|
|
@@ -11,14 +11,14 @@
|
|
|
11
11
|
"type-defs": "node ../../scripts/build-type-defs.mjs"
|
|
12
12
|
},
|
|
13
13
|
"devDependencies": {
|
|
14
|
-
"@vuu-ui/vuu-data-types": "4.0.0-alpha.
|
|
15
|
-
"@vuu-ui/vuu-table-types": "4.0.0-alpha.
|
|
16
|
-
"@vuu-ui/vuu-filter-types": "4.0.0-alpha.
|
|
17
|
-
"@vuu-ui/vuu-protocol-types": "4.0.0-alpha.
|
|
14
|
+
"@vuu-ui/vuu-data-types": "4.0.0-alpha.30",
|
|
15
|
+
"@vuu-ui/vuu-table-types": "4.0.0-alpha.30",
|
|
16
|
+
"@vuu-ui/vuu-filter-types": "4.0.0-alpha.30",
|
|
17
|
+
"@vuu-ui/vuu-protocol-types": "4.0.0-alpha.30"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@vuu-ui/vuu-filter-parser": "4.0.0-alpha.
|
|
21
|
-
"@vuu-ui/vuu-utils": "4.0.0-alpha.
|
|
20
|
+
"@vuu-ui/vuu-filter-parser": "4.0.0-alpha.30",
|
|
21
|
+
"@vuu-ui/vuu-utils": "4.0.0-alpha.30"
|
|
22
22
|
},
|
|
23
23
|
"sideEffects": false,
|
|
24
24
|
"files": [
|
|
@@ -28,8 +28,9 @@
|
|
|
28
28
|
],
|
|
29
29
|
"exports": {
|
|
30
30
|
".": {
|
|
31
|
+
"types": "./types/index.d.ts",
|
|
31
32
|
"import": "./src/index.js",
|
|
32
|
-
"
|
|
33
|
+
"default": "./src/index.js"
|
|
33
34
|
}
|
|
34
35
|
},
|
|
35
36
|
"module": "./src/index.js",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { filterPredicate, parseFilter } from "@vuu-ui/vuu-filter-parser";
|
|
2
|
-
import { EventEmitter, KeySet, NULL_RANGE, Range, buildColumnMap, combineFilters, filterAsQuery, getAddedItems, hasBaseFilter, hasFilter, hasGroupBy, hasSort, isConfigChanged, isGroupByChanged, logger, metadataKeys, rangeNewItems, toSchemaColumn, uuid, vanillaConfig, withConfigDefaults } from "@vuu-ui/vuu-utils";
|
|
2
|
+
import { EventEmitter, KeySet, NULL_RANGE, Range, buildColumnMap, combineFilters, filterAsQuery, filterRequiresResolution, getAddedItems, getColumnsByName, getColumnsByNameForFilter, hasBaseFilter, hasFilter, hasGroupBy, hasSort, isConfigChanged, isGroupByChanged, logger, metadataKeys, rangeNewItems, toSchemaColumn, uuid, vanillaConfig, withConfigDefaults } from "@vuu-ui/vuu-utils";
|
|
3
3
|
import { aggregateData } from "./aggregate-utils.js";
|
|
4
4
|
import { buildDataToClientMap, toClientRow } from "./array-data-utils.js";
|
|
5
5
|
import { collapseGroup, expandGroup, groupRows } from "./group-utils.js";
|
|
@@ -49,6 +49,7 @@ class ArrayDataSource extends EventEmitter {
|
|
|
49
49
|
openTreeNodes = [];
|
|
50
50
|
preserveScrollPositionAcrossConfigChange = false;
|
|
51
51
|
#columnMap;
|
|
52
|
+
#filterColumnsByName;
|
|
52
53
|
_config = vanillaConfig;
|
|
53
54
|
#data;
|
|
54
55
|
#freezeTimestamp = void 0;
|
|
@@ -68,8 +69,9 @@ class ArrayDataSource extends EventEmitter {
|
|
|
68
69
|
super();
|
|
69
70
|
if (!data || !columnDescriptors) throw Error("ArrayDataSource constructor called without data or without columnDescriptors");
|
|
70
71
|
this.columnDescriptors = columnDescriptors;
|
|
72
|
+
this.#filterColumnsByName = getColumnsByName(columnDescriptors);
|
|
71
73
|
this.dataMap = dataMap;
|
|
72
|
-
this.key = keyColumn ? this.columnDescriptors.findIndex((col)=>col.name === keyColumn) : 0;
|
|
74
|
+
this.key = keyColumn ? dataMap?.[keyColumn] ?? this.columnDescriptors.findIndex((col)=>col.name === keyColumn) : 0;
|
|
73
75
|
this.rangeChangeRowset = rangeChangeRowset;
|
|
74
76
|
this.tableSchema = buildTableSchema(columnDescriptors, keyColumn);
|
|
75
77
|
this.viewport = viewport || uuid();
|
|
@@ -118,8 +120,15 @@ class ArrayDataSource extends EventEmitter {
|
|
|
118
120
|
};
|
|
119
121
|
this.clientCallback?.(subscribedMessage);
|
|
120
122
|
this.emit("subscribed", subscribedMessage);
|
|
121
|
-
if (hasConfigProps)
|
|
122
|
-
|
|
123
|
+
if (hasConfigProps) {
|
|
124
|
+
if (range) {
|
|
125
|
+
this.constrainRangeToMaxRangeEnd(range);
|
|
126
|
+
this.#range = range;
|
|
127
|
+
this.#keys.reset(this.rangeWithBufferWithinMaxRangeEnd);
|
|
128
|
+
}
|
|
129
|
+
this.config = config;
|
|
130
|
+
this.sendRowsToClient(true);
|
|
131
|
+
} else {
|
|
123
132
|
this.sendSizeUpdateToClient();
|
|
124
133
|
this.emit("resize", this.processedData ? this.processedData.length : this.#data.length, this.#maxRangeEnd);
|
|
125
134
|
if (range && !this.#range.equals(range)) this.range = range;
|
|
@@ -316,7 +325,8 @@ class ArrayDataSource extends EventEmitter {
|
|
|
316
325
|
});
|
|
317
326
|
}
|
|
318
327
|
getFilterPredicate() {
|
|
319
|
-
const { filterSpec: { filterStruct } } = combineFilters(this._config);
|
|
328
|
+
const { filterSpec: { filter, filterStruct: rawFilterStruct } } = combineFilters(this._config);
|
|
329
|
+
const filterStruct = rawFilterStruct && filter && filterRequiresResolution(rawFilterStruct, getColumnsByNameForFilter(this.tableSchema, this.#filterColumnsByName)) ? parseFilter(filter) : rawFilterStruct;
|
|
320
330
|
if (filterStruct) {
|
|
321
331
|
if (this.dataMap) {
|
|
322
332
|
const { count: offset } = metadataKeys;
|
|
@@ -458,7 +468,7 @@ class ArrayDataSource extends EventEmitter {
|
|
|
458
468
|
if (-1 !== dataIndex) {
|
|
459
469
|
const dataSourceRow = toDataSourceRow(this.key)(row, dataIndex);
|
|
460
470
|
this.#data[dataIndex] = dataSourceRow;
|
|
461
|
-
const { from, to } = this
|
|
471
|
+
const { from, to } = this.rangeWithBufferWithinMaxRangeEnd;
|
|
462
472
|
const isFiltered = hasFilter(this.config) || hasBaseFilter(this.config);
|
|
463
473
|
const isSorted = hasSort(this.config);
|
|
464
474
|
if (isFiltered) {
|
|
@@ -617,9 +627,15 @@ class ArrayDataSource extends EventEmitter {
|
|
|
617
627
|
filterSpec: filter
|
|
618
628
|
};
|
|
619
629
|
}
|
|
620
|
-
setFilter(filter) {
|
|
630
|
+
setFilter(filter, options) {
|
|
631
|
+
this.#filterColumnsByName = {
|
|
632
|
+
...getColumnsByName(this.columnDescriptors),
|
|
633
|
+
...options?.columnsByName
|
|
634
|
+
};
|
|
621
635
|
const dataSourceFilter = {
|
|
622
|
-
filter: filterAsQuery(filter
|
|
636
|
+
filter: filterAsQuery(filter, {
|
|
637
|
+
columnsByName: getColumnsByNameForFilter(this.tableSchema, this.#filterColumnsByName)
|
|
638
|
+
}),
|
|
623
639
|
filterStruct: filter
|
|
624
640
|
};
|
|
625
641
|
this.filter = dataSourceFilter;
|
|
@@ -1,39 +1,17 @@
|
|
|
1
1
|
import { BaseDataSource, KeySet, NULL_RANGE, getParentRow, isSingleValueFilter, lastPathSegment, metadataKeys, missingAncestor, treeToDataSourceRows, uuid } from "@vuu-ui/vuu-utils";
|
|
2
2
|
import { IconProvider } from "./IconProvider.js";
|
|
3
3
|
import { parseFilter } from "@vuu-ui/vuu-filter-parser";
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
{
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
},
|
|
14
|
-
{
|
|
15
|
-
name: "Level 2",
|
|
16
|
-
serverDataType: "string"
|
|
17
|
-
},
|
|
18
|
-
{
|
|
19
|
-
name: "Level 3",
|
|
20
|
-
serverDataType: "string"
|
|
21
|
-
},
|
|
22
|
-
{
|
|
23
|
-
name: "Level 4",
|
|
24
|
-
serverDataType: "string"
|
|
25
|
-
},
|
|
26
|
-
{
|
|
27
|
-
name: "Level 5",
|
|
28
|
-
serverDataType: "string"
|
|
4
|
+
const treeSchema = (columns)=>({
|
|
5
|
+
columns: columns.map(({ name })=>({
|
|
6
|
+
name,
|
|
7
|
+
serverDataType: "string"
|
|
8
|
+
})),
|
|
9
|
+
key: "",
|
|
10
|
+
table: {
|
|
11
|
+
module: "",
|
|
12
|
+
table: ""
|
|
29
13
|
}
|
|
30
|
-
|
|
31
|
-
key: "",
|
|
32
|
-
table: {
|
|
33
|
-
module: "",
|
|
34
|
-
table: ""
|
|
35
|
-
}
|
|
36
|
-
};
|
|
14
|
+
});
|
|
37
15
|
const { COUNT: COUNT, DEPTH: DEPTH, IDX: IDX, IS_EXPANDED: IS_EXPANDED, IS_LEAF: IS_LEAF, KEY: KEY, SELECTED: SELECTED } = metadataKeys;
|
|
38
16
|
const toClientRow = (row, keys)=>{
|
|
39
17
|
const [rowIndex] = row;
|
|
@@ -61,6 +39,8 @@ class TreeDataSource extends BaseDataSource {
|
|
|
61
39
|
if (!data) throw Error("TreeDataSource constructor called without data");
|
|
62
40
|
this.#iconProvider = new IconProvider();
|
|
63
41
|
[this.columnDescriptors, this.#data] = treeToDataSourceRows(data, this.#iconProvider);
|
|
42
|
+
this.expandedRows = getInitiallyExpandedKeys(data);
|
|
43
|
+
console.table(this.#data);
|
|
64
44
|
if (this.columnDescriptors) {
|
|
65
45
|
const columns = this.columnDescriptors.map((c)=>c.name);
|
|
66
46
|
this._configWithVisualLink = {
|
|
@@ -92,7 +72,7 @@ class TreeDataSource extends BaseDataSource {
|
|
|
92
72
|
groupBy: this._configWithVisualLink.groupBy,
|
|
93
73
|
range: this.range,
|
|
94
74
|
sort: this.sort,
|
|
95
|
-
tableSchema:
|
|
75
|
+
tableSchema: treeSchema(this.columnDescriptors)
|
|
96
76
|
});
|
|
97
77
|
this.clientCallback({
|
|
98
78
|
clientViewportId: this.viewport,
|
|
@@ -163,6 +143,7 @@ class TreeDataSource extends BaseDataSource {
|
|
|
163
143
|
applySelectedKeyValues(keys, revealSelected = false) {
|
|
164
144
|
keys.forEach((key)=>{
|
|
165
145
|
const rowIdx = this.indexOfRowWithKey(key);
|
|
146
|
+
if (-1 === rowIdx) return;
|
|
166
147
|
const row = this.#data[rowIdx];
|
|
167
148
|
row[SELECTED] = 1;
|
|
168
149
|
if (revealSelected && 1 !== row[DEPTH]) {
|
|
@@ -305,6 +286,14 @@ class TreeDataSource extends BaseDataSource {
|
|
|
305
286
|
return this.visibleRows[rowIdx];
|
|
306
287
|
}
|
|
307
288
|
}
|
|
289
|
+
const getInitiallyExpandedKeys = (treeSourceNodes, keyBase = "$root", expandedKeys = new Set())=>{
|
|
290
|
+
for (const { childNodes, expanded, label } of treeSourceNodes){
|
|
291
|
+
const key = `${keyBase}|${label}`;
|
|
292
|
+
if (expanded) expandedKeys.add(key);
|
|
293
|
+
if (childNodes) getInitiallyExpandedKeys(childNodes, key, expandedKeys);
|
|
294
|
+
}
|
|
295
|
+
return expandedKeys;
|
|
296
|
+
};
|
|
308
297
|
function getVisibleRows(rows, expandedKeys, filterset) {
|
|
309
298
|
const visibleRows = [];
|
|
310
299
|
const visibleRowIndex = {};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { DataSourceBase, DataSourceConstructorProps, DataSourceEvents, DataSourceFilter, DataSourceRow, DataSourceRowWithBigint, DataSourceStatus, DataSourceSubscribeCallback, DataSourceSubscribeProps, TableSchema, WithBaseFilter, WithFullConfig } from "@vuu-ui/vuu-data-types";
|
|
1
|
+
import type { DataSourceBase, DataSourceConstructorProps, DataSourceEvents, DataSourceFilter, DataSourceRow, DataSourceRowWithBigint, DataSourceStatus, DataSourceSubscribeCallback, DataSourceSubscribeProps, SetFilterOptions, TableSchema, WithBaseFilter, WithFullConfig } from "@vuu-ui/vuu-data-types";
|
|
2
2
|
import type { Filter } from "@vuu-ui/vuu-filter-types";
|
|
3
3
|
import type { LinkDescriptorWithLabel, SelectRequest, VuuAggregation, VuuGroupBy, VuuMenu, VuuRowDataItemType, VuuRpcRequest, VuuRpcResponse, VuuSort } from "@vuu-ui/vuu-protocol-types";
|
|
4
4
|
import type { ColumnDescriptor } from "@vuu-ui/vuu-table-types";
|
|
@@ -93,7 +93,7 @@ export declare class ArrayDataSource extends EventEmitter<DataSourceEvents> impl
|
|
|
93
93
|
set baseFilter(baseFilter: DataSourceFilter | undefined);
|
|
94
94
|
get filter(): DataSourceFilter;
|
|
95
95
|
set filter(filter: DataSourceFilter);
|
|
96
|
-
setFilter(filter: Filter): void;
|
|
96
|
+
setFilter(filter: Filter, options?: SetFilterOptions): void;
|
|
97
97
|
clearFilter(): void;
|
|
98
98
|
get groupBy(): VuuGroupBy;
|
|
99
99
|
set groupBy(groupBy: VuuGroupBy);
|