@vuu-ui/vuu-data-local 0.0.26

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.
Files changed (38) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +0 -0
  3. package/cjs/array-data-source/aggregate-utils.js +243 -0
  4. package/cjs/array-data-source/aggregate-utils.js.map +1 -0
  5. package/cjs/array-data-source/array-data-source.js +539 -0
  6. package/cjs/array-data-source/array-data-source.js.map +1 -0
  7. package/cjs/array-data-source/array-data-utils.js +52 -0
  8. package/cjs/array-data-source/array-data-utils.js.map +1 -0
  9. package/cjs/array-data-source/group-utils.js +169 -0
  10. package/cjs/array-data-source/group-utils.js.map +1 -0
  11. package/cjs/array-data-source/sort-utils.js +54 -0
  12. package/cjs/array-data-source/sort-utils.js.map +1 -0
  13. package/cjs/index.js +10 -0
  14. package/cjs/index.js.map +1 -0
  15. package/cjs/json-data-source/json-data-source.js +388 -0
  16. package/cjs/json-data-source/json-data-source.js.map +1 -0
  17. package/esm/array-data-source/aggregate-utils.js +241 -0
  18. package/esm/array-data-source/aggregate-utils.js.map +1 -0
  19. package/esm/array-data-source/array-data-source.js +537 -0
  20. package/esm/array-data-source/array-data-source.js.map +1 -0
  21. package/esm/array-data-source/array-data-utils.js +49 -0
  22. package/esm/array-data-source/array-data-utils.js.map +1 -0
  23. package/esm/array-data-source/group-utils.js +165 -0
  24. package/esm/array-data-source/group-utils.js.map +1 -0
  25. package/esm/array-data-source/sort-utils.js +52 -0
  26. package/esm/array-data-source/sort-utils.js.map +1 -0
  27. package/esm/index.js +3 -0
  28. package/esm/index.js.map +1 -0
  29. package/esm/json-data-source/json-data-source.js +386 -0
  30. package/esm/json-data-source/json-data-source.js.map +1 -0
  31. package/package.json +34 -0
  32. package/types/array-data-source/aggregate-utils.d.ts +8 -0
  33. package/types/array-data-source/array-data-source.d.ts +81 -0
  34. package/types/array-data-source/array-data-utils.d.ts +4 -0
  35. package/types/array-data-source/group-utils.d.ts +10 -0
  36. package/types/array-data-source/sort-utils.d.ts +4 -0
  37. package/types/index.d.ts +2 -0
  38. package/types/json-data-source/json-data-source.d.ts +54 -0
@@ -0,0 +1,537 @@
1
+ import { parseFilter, filterPredicate } from '@vuu-ui/vuu-filter-parser';
2
+ import { logger, EventEmitter, KeySet, uuid, buildColumnMap, NULL_RANGE, resetRange, withConfigDefaults, hasFilter, hasSort, isGroupByChanged, hasGroupBy, isConfigChanged, rangeNewItems, getAddedItems, getMissingItems, metadataKeys, vanillaConfig } from '@vuu-ui/vuu-utils';
3
+ import { aggregateData } from './aggregate-utils.js';
4
+ import { buildDataToClientMap, toClientRow } from './array-data-utils.js';
5
+ import { expandGroup, collapseGroup, groupRows } from './group-utils.js';
6
+ import { sortRows } from './sort-utils.js';
7
+
8
+ var __accessCheck = (obj, member, msg) => {
9
+ if (!member.has(obj))
10
+ throw TypeError("Cannot " + msg);
11
+ };
12
+ var __privateGet = (obj, member, getter) => {
13
+ __accessCheck(obj, member, "read from private field");
14
+ return getter ? getter.call(obj) : member.get(obj);
15
+ };
16
+ var __privateAdd = (obj, member, value) => {
17
+ if (member.has(obj))
18
+ throw TypeError("Cannot add the same private member more than once");
19
+ member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
20
+ };
21
+ var __privateSet = (obj, member, value, setter) => {
22
+ __accessCheck(obj, member, "write to private field");
23
+ setter ? setter.call(obj, value) : member.set(obj, value);
24
+ return value;
25
+ };
26
+ var _columnMap, _config, _data, _links, _range, _selectedRowsCount, _size, _status, _title;
27
+ const { debug, info } = logger("ArrayDataSource");
28
+ const { KEY } = metadataKeys;
29
+ const toDataSourceRow = (key) => (data, index) => {
30
+ return [index, index, true, false, 1, 0, String(data[key]), 0, ...data];
31
+ };
32
+ const buildTableSchema = (columns, keyColumn) => {
33
+ const schema = {
34
+ columns: columns.map(({ name, serverDataType = "string" }) => ({
35
+ name,
36
+ serverDataType
37
+ })),
38
+ key: keyColumn ?? columns[0].name,
39
+ table: { module: "", table: "Array" }
40
+ };
41
+ return schema;
42
+ };
43
+ class ArrayDataSource extends EventEmitter {
44
+ constructor({
45
+ aggregations,
46
+ // different from RemoteDataSource
47
+ columnDescriptors,
48
+ data,
49
+ dataMap,
50
+ filter,
51
+ groupBy,
52
+ keyColumn,
53
+ rangeChangeRowset = "delta",
54
+ sort,
55
+ title,
56
+ viewport
57
+ }) {
58
+ super();
59
+ this.lastRangeServed = { from: 0, to: 0 };
60
+ this.openTreeNodes = [];
61
+ /** Map reflecting positions of columns in client data sent to user */
62
+ __privateAdd(this, _columnMap, void 0);
63
+ __privateAdd(this, _config, vanillaConfig);
64
+ __privateAdd(this, _data, void 0);
65
+ __privateAdd(this, _links, void 0);
66
+ __privateAdd(this, _range, NULL_RANGE);
67
+ __privateAdd(this, _selectedRowsCount, 0);
68
+ __privateAdd(this, _size, 0);
69
+ __privateAdd(this, _status, "initialising");
70
+ __privateAdd(this, _title, void 0);
71
+ this.selectedRows = [];
72
+ this.keys = new KeySet(__privateGet(this, _range));
73
+ this.processedData = void 0;
74
+ this.insert = (row) => {
75
+ const dataSourceRow = toDataSourceRow(this.key)(row, this.size);
76
+ __privateGet(this, _data).push(dataSourceRow);
77
+ const { from, to } = __privateGet(this, _range);
78
+ const [rowIdx] = dataSourceRow;
79
+ if (rowIdx >= from && rowIdx < to) {
80
+ this.sendRowsToClient();
81
+ }
82
+ };
83
+ this.update = (row, columnName) => {
84
+ const keyValue = row[this.key];
85
+ const colIndex = __privateGet(this, _columnMap)[columnName];
86
+ const dataColIndex = this.dataMap?.[columnName];
87
+ const dataIndex = __privateGet(this, _data).findIndex((row2) => row2[KEY] === keyValue);
88
+ if (dataIndex !== -1 && dataColIndex !== void 0) {
89
+ const dataSourceRow = __privateGet(this, _data)[dataIndex];
90
+ dataSourceRow[colIndex] = row[dataColIndex];
91
+ const { from, to } = __privateGet(this, _range);
92
+ const [rowIdx] = dataSourceRow;
93
+ if (rowIdx >= from && rowIdx < to) {
94
+ this.sendRowsToClient(false, dataSourceRow);
95
+ }
96
+ }
97
+ };
98
+ this.updateRow = (row) => {
99
+ const keyValue = row[this.key];
100
+ const dataIndex = __privateGet(this, _data).findIndex((row2) => row2[KEY] === keyValue);
101
+ if (dataIndex !== -1) {
102
+ const dataSourceRow = toDataSourceRow(this.key)(row, dataIndex);
103
+ __privateGet(this, _data)[dataIndex] = dataSourceRow;
104
+ const { from, to } = __privateGet(this, _range);
105
+ if (dataIndex >= from && dataIndex < to) {
106
+ this.sendRowsToClient(false, dataSourceRow);
107
+ }
108
+ }
109
+ };
110
+ if (!data || !columnDescriptors) {
111
+ throw Error(
112
+ "ArrayDataSource constructor called without data or without columnDescriptors"
113
+ );
114
+ }
115
+ this.columnDescriptors = columnDescriptors;
116
+ this.dataMap = dataMap;
117
+ this.key = keyColumn ? this.columnDescriptors.findIndex((col) => col.name === keyColumn) : 0;
118
+ this.rangeChangeRowset = rangeChangeRowset;
119
+ this.tableSchema = buildTableSchema(columnDescriptors, keyColumn);
120
+ this.viewport = viewport || uuid();
121
+ __privateSet(this, _size, data.length);
122
+ __privateSet(this, _title, title);
123
+ const columns = columnDescriptors.map((col) => col.name);
124
+ __privateSet(this, _columnMap, buildColumnMap(columns));
125
+ this.dataIndices = buildDataToClientMap(__privateGet(this, _columnMap), this.dataMap);
126
+ __privateSet(this, _data, data.map(toDataSourceRow(this.key)));
127
+ this.config = {
128
+ ...__privateGet(this, _config),
129
+ aggregations: aggregations || __privateGet(this, _config).aggregations,
130
+ columns,
131
+ filter: filter || __privateGet(this, _config).filter,
132
+ groupBy: groupBy || __privateGet(this, _config).groupBy,
133
+ sort: sort || __privateGet(this, _config).sort
134
+ };
135
+ debug?.(`columnMap: ${JSON.stringify(__privateGet(this, _columnMap))}`);
136
+ }
137
+ async subscribe({
138
+ viewport = this.viewport ?? uuid(),
139
+ columns,
140
+ aggregations,
141
+ range,
142
+ sort,
143
+ groupBy,
144
+ filter
145
+ }, callback) {
146
+ this.clientCallback = callback;
147
+ this.viewport = viewport;
148
+ __privateSet(this, _status, "subscribed");
149
+ this.lastRangeServed = { from: 0, to: 0 };
150
+ let config = __privateGet(this, _config);
151
+ const hasConfigProps = aggregations || columns || filter || groupBy || sort;
152
+ if (hasConfigProps) {
153
+ if (range) {
154
+ __privateSet(this, _range, range);
155
+ }
156
+ config = {
157
+ ...config,
158
+ aggregations: aggregations || __privateGet(this, _config).aggregations,
159
+ columns: columns || __privateGet(this, _config).columns,
160
+ filter: filter || __privateGet(this, _config).filter,
161
+ groupBy: groupBy || __privateGet(this, _config).groupBy,
162
+ sort: sort || __privateGet(this, _config).sort
163
+ };
164
+ }
165
+ this.clientCallback?.({
166
+ ...config,
167
+ type: "subscribed",
168
+ clientViewportId: this.viewport,
169
+ range: __privateGet(this, _range),
170
+ tableSchema: this.tableSchema
171
+ });
172
+ if (hasConfigProps) {
173
+ this.config = config;
174
+ } else {
175
+ this.clientCallback({
176
+ clientViewportId: this.viewport,
177
+ mode: "size-only",
178
+ type: "viewport-update",
179
+ size: __privateGet(this, _data).length
180
+ });
181
+ if (range) {
182
+ this.range = range;
183
+ this.sendRowsToClient();
184
+ } else if (__privateGet(this, _range) !== NULL_RANGE) {
185
+ this.sendRowsToClient();
186
+ }
187
+ }
188
+ }
189
+ unsubscribe() {
190
+ console.log(`unsubscribe noop`);
191
+ }
192
+ suspend() {
193
+ console.log(`suspend #${this.viewport}, current status ${__privateGet(this, _status)}`);
194
+ info?.(`suspend #${this.viewport}, current status ${__privateGet(this, _status)}`);
195
+ __privateSet(this, _status, "suspended");
196
+ return this;
197
+ }
198
+ resume() {
199
+ console.log(`resume #${this.viewport}, current status ${__privateGet(this, _status)}`);
200
+ const isSuspended = __privateGet(this, _status) === "suspended";
201
+ info?.(`resume #${this.viewport}, current status ${__privateGet(this, _status)}`);
202
+ console.log(`resume noop`);
203
+ if (isSuspended) {
204
+ __privateSet(this, _status, "subscribed");
205
+ }
206
+ return this;
207
+ }
208
+ disable() {
209
+ console.log(`disable noop`);
210
+ return this;
211
+ }
212
+ enable() {
213
+ console.log(`enable noop`);
214
+ return this;
215
+ }
216
+ select(selected) {
217
+ __privateSet(this, _selectedRowsCount, selected.length);
218
+ debug?.(`select ${JSON.stringify(selected)}`);
219
+ this.selectedRows = selected;
220
+ this.setRange(resetRange(__privateGet(this, _range)), true);
221
+ }
222
+ openTreeNode(key) {
223
+ this.openTreeNodes.push(key);
224
+ this.processedData = expandGroup(
225
+ this.openTreeNodes,
226
+ __privateGet(this, _data),
227
+ __privateGet(this, _config).groupBy,
228
+ __privateGet(this, _columnMap),
229
+ this.groupMap,
230
+ this.processedData
231
+ );
232
+ this.setRange(resetRange(__privateGet(this, _range)), true);
233
+ }
234
+ closeTreeNode(key) {
235
+ this.openTreeNodes = this.openTreeNodes.filter((value) => value !== key);
236
+ if (this.processedData) {
237
+ this.processedData = collapseGroup(key, this.processedData);
238
+ this.setRange(resetRange(__privateGet(this, _range)), true);
239
+ }
240
+ }
241
+ get links() {
242
+ return __privateGet(this, _links);
243
+ }
244
+ get menu() {
245
+ return this._menu;
246
+ }
247
+ get status() {
248
+ return __privateGet(this, _status);
249
+ }
250
+ get data() {
251
+ return __privateGet(this, _data);
252
+ }
253
+ // Only used by the UpdateGenerator
254
+ get currentData() {
255
+ return this.processedData ?? __privateGet(this, _data);
256
+ }
257
+ get table() {
258
+ return this.tableSchema.table;
259
+ }
260
+ get config() {
261
+ return __privateGet(this, _config);
262
+ }
263
+ set config(config) {
264
+ const configChanges = this.applyConfig(config);
265
+ if (configChanges) {
266
+ if (config) {
267
+ const originalConfig = __privateGet(this, _config);
268
+ const newConfig = config?.filter?.filter && config?.filter.filterStruct === void 0 ? {
269
+ ...config,
270
+ filter: {
271
+ filter: config.filter.filter,
272
+ filterStruct: parseFilter(config.filter.filter)
273
+ }
274
+ } : config;
275
+ __privateSet(this, _config, withConfigDefaults(newConfig));
276
+ let processedData;
277
+ if (hasFilter(config)) {
278
+ const { filter, filterStruct = parseFilter(filter) } = config.filter;
279
+ if (filterStruct) {
280
+ const fn = filterPredicate(__privateGet(this, _columnMap), filterStruct);
281
+ processedData = __privateGet(this, _data).filter(fn);
282
+ } else {
283
+ throw Error("filter must include filterStruct");
284
+ }
285
+ }
286
+ if (hasSort(config)) {
287
+ processedData = sortRows(
288
+ processedData ?? __privateGet(this, _data),
289
+ config.sort,
290
+ __privateGet(this, _columnMap)
291
+ );
292
+ }
293
+ if (this.openTreeNodes.length > 0 && isGroupByChanged(originalConfig, config)) {
294
+ if (__privateGet(this, _config).groupBy.length === 0) {
295
+ this.openTreeNodes.length = 0;
296
+ } else {
297
+ console.log("adjust the openTReeNodes groupBy changed ", {
298
+ originalGroupBy: originalConfig.groupBy,
299
+ newGroupBy: newConfig.groupBy
300
+ });
301
+ }
302
+ }
303
+ if (hasGroupBy(config)) {
304
+ const [groupedData, groupMap] = groupRows(
305
+ processedData ?? __privateGet(this, _data),
306
+ config.groupBy,
307
+ __privateGet(this, _columnMap)
308
+ );
309
+ this.groupMap = groupMap;
310
+ processedData = groupedData;
311
+ if (this.openTreeNodes.length > 0) {
312
+ processedData = expandGroup(
313
+ this.openTreeNodes,
314
+ __privateGet(this, _data),
315
+ __privateGet(this, _config).groupBy,
316
+ __privateGet(this, _columnMap),
317
+ this.groupMap,
318
+ processedData
319
+ );
320
+ }
321
+ }
322
+ this.processedData = processedData?.map((row, i) => {
323
+ const dolly = row.slice();
324
+ dolly[0] = i;
325
+ dolly[1] = i;
326
+ return dolly;
327
+ });
328
+ }
329
+ this.setRange(resetRange(__privateGet(this, _range)), true);
330
+ this.emit("config", __privateGet(this, _config), void 0, configChanges);
331
+ }
332
+ }
333
+ applyConfig(config) {
334
+ const { noChanges, ...otherChanges } = isConfigChanged(
335
+ __privateGet(this, _config),
336
+ config
337
+ );
338
+ if (noChanges !== true) {
339
+ if (config) {
340
+ const newConfig = config?.filter?.filter && config?.filter.filterStruct === void 0 ? {
341
+ ...config,
342
+ filter: {
343
+ filter: config.filter.filter,
344
+ filterStruct: parseFilter(config.filter.filter)
345
+ }
346
+ } : config;
347
+ __privateSet(this, _config, withConfigDefaults(newConfig));
348
+ return otherChanges;
349
+ }
350
+ }
351
+ }
352
+ get selectedRowsCount() {
353
+ return __privateGet(this, _selectedRowsCount);
354
+ }
355
+ get size() {
356
+ return this.processedData?.length ?? __privateGet(this, _data).length;
357
+ }
358
+ get range() {
359
+ return __privateGet(this, _range);
360
+ }
361
+ set range(range) {
362
+ this.setRange(range);
363
+ }
364
+ delete(row) {
365
+ console.log(`delete row ${row.join(",")}`);
366
+ }
367
+ setRange(range, forceFullRefresh = false) {
368
+ if (range.from !== __privateGet(this, _range).from || range.to !== __privateGet(this, _range).to) {
369
+ __privateSet(this, _range, range);
370
+ const keysResequenced = this.keys.reset(range);
371
+ this.sendRowsToClient(forceFullRefresh || keysResequenced);
372
+ } else if (forceFullRefresh) {
373
+ this.sendRowsToClient(forceFullRefresh);
374
+ }
375
+ }
376
+ sendRowsToClient(forceFullRefresh = false, row) {
377
+ if (row) {
378
+ this.clientCallback?.({
379
+ clientViewportId: this.viewport,
380
+ mode: "update",
381
+ rows: [
382
+ toClientRow(row, this.keys, this.selectedRows, this.dataIndices)
383
+ ],
384
+ type: "viewport-update"
385
+ });
386
+ } else {
387
+ const rowRange = this.rangeChangeRowset === "delta" && !forceFullRefresh ? rangeNewItems(this.lastRangeServed, __privateGet(this, _range)) : __privateGet(this, _range);
388
+ const data = this.processedData ?? __privateGet(this, _data);
389
+ const rowsWithinViewport = data.slice(rowRange.from, rowRange.to).map(
390
+ (row2) => toClientRow(row2, this.keys, this.selectedRows, this.dataIndices)
391
+ );
392
+ this.clientCallback?.({
393
+ clientViewportId: this.viewport,
394
+ mode: "batch",
395
+ rows: rowsWithinViewport,
396
+ size: data.length,
397
+ type: "viewport-update"
398
+ });
399
+ this.lastRangeServed = {
400
+ from: __privateGet(this, _range).from,
401
+ to: Math.min(
402
+ __privateGet(this, _range).to,
403
+ __privateGet(this, _range).from + rowsWithinViewport.length
404
+ )
405
+ };
406
+ }
407
+ }
408
+ get columns() {
409
+ return __privateGet(this, _config).columns;
410
+ }
411
+ set columns(columns) {
412
+ const addedColumns = getAddedItems(this.config.columns, columns);
413
+ if (addedColumns.length > 0) {
414
+ const columnsWithoutDescriptors = getMissingItems(
415
+ this.columnDescriptors,
416
+ addedColumns,
417
+ (col) => col.name
418
+ );
419
+ console.log(`columnsWithoutDescriptors`, {
420
+ columnsWithoutDescriptors
421
+ });
422
+ }
423
+ __privateSet(this, _columnMap, buildColumnMap(columns));
424
+ this.dataIndices = buildDataToClientMap(__privateGet(this, _columnMap), this.dataMap);
425
+ this.config = {
426
+ ...__privateGet(this, _config),
427
+ columns
428
+ };
429
+ }
430
+ get aggregations() {
431
+ return __privateGet(this, _config).aggregations;
432
+ }
433
+ set aggregations(aggregations) {
434
+ __privateSet(this, _config, {
435
+ ...__privateGet(this, _config),
436
+ aggregations
437
+ });
438
+ const targetData = this.processedData ?? __privateGet(this, _data);
439
+ const leafData = __privateGet(this, _data);
440
+ aggregateData(
441
+ aggregations,
442
+ targetData,
443
+ __privateGet(this, _config).groupBy,
444
+ leafData,
445
+ __privateGet(this, _columnMap),
446
+ this.groupMap
447
+ );
448
+ this.setRange(resetRange(__privateGet(this, _range)), true);
449
+ this.emit("config", __privateGet(this, _config));
450
+ }
451
+ get sort() {
452
+ return __privateGet(this, _config).sort;
453
+ }
454
+ set sort(sort) {
455
+ debug?.(`sort ${JSON.stringify(sort)}`);
456
+ this.config = {
457
+ ...__privateGet(this, _config),
458
+ sort
459
+ };
460
+ }
461
+ get filter() {
462
+ return __privateGet(this, _config).filter;
463
+ }
464
+ set filter(filter) {
465
+ debug?.(`filter ${JSON.stringify(filter)}`);
466
+ this.config = {
467
+ ...__privateGet(this, _config),
468
+ filter
469
+ };
470
+ }
471
+ get groupBy() {
472
+ return __privateGet(this, _config).groupBy;
473
+ }
474
+ set groupBy(groupBy) {
475
+ this.config = {
476
+ ...__privateGet(this, _config),
477
+ groupBy
478
+ };
479
+ }
480
+ get title() {
481
+ return __privateGet(this, _title);
482
+ }
483
+ set title(title) {
484
+ __privateSet(this, _title, title);
485
+ }
486
+ get _clientCallback() {
487
+ return this.clientCallback;
488
+ }
489
+ createLink({
490
+ parentVpId,
491
+ link: { fromColumn, toColumn }
492
+ }) {
493
+ console.log("create link", {
494
+ parentVpId,
495
+ fromColumn,
496
+ toColumn
497
+ });
498
+ }
499
+ removeLink() {
500
+ console.log("remove link");
501
+ }
502
+ findRow(rowKey) {
503
+ const row = __privateGet(this, _data)[rowKey];
504
+ if (row) {
505
+ return row;
506
+ } else {
507
+ throw `no row found for key ${rowKey}`;
508
+ }
509
+ }
510
+ applyEdit(row, columnName, value) {
511
+ console.log(`ArrayDataSource applyEdit ${row[0]} ${columnName} ${value}`);
512
+ return Promise.resolve(true);
513
+ }
514
+ async menuRpcCall(rpcRequest) {
515
+ return new Promise((resolve) => {
516
+ const { type } = rpcRequest;
517
+ switch (type) {
518
+ case "VP_EDIT_CELL_RPC":
519
+ break;
520
+ default:
521
+ resolve(void 0);
522
+ }
523
+ });
524
+ }
525
+ }
526
+ _columnMap = new WeakMap();
527
+ _config = new WeakMap();
528
+ _data = new WeakMap();
529
+ _links = new WeakMap();
530
+ _range = new WeakMap();
531
+ _selectedRowsCount = new WeakMap();
532
+ _size = new WeakMap();
533
+ _status = new WeakMap();
534
+ _title = new WeakMap();
535
+
536
+ export { ArrayDataSource };
537
+ //# sourceMappingURL=array-data-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array-data-source.js","sources":["../../src/array-data-source/array-data-source.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceConfig,\n DataSourceConstructorProps,\n DataSourceEvents,\n DataSourceFilter,\n DataSourceRow,\n DataSourceStatus,\n MenuRpcResponse,\n Selection,\n SubscribeCallback,\n SubscribeProps,\n TableSchema,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n WithFullConfig,\n} from \"@vuu-ui/vuu-data-types\";\nimport { filterPredicate, parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport type {\n ClientToServerEditRpc,\n ClientToServerMenuRPC,\n LinkDescriptorWithLabel,\n VuuAggregation,\n VuuGroupBy,\n VuuMenu,\n VuuRange,\n VuuRowDataItemType,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport type { ColumnDescriptor } from \"@vuu-ui/vuu-table-types\";\nimport {\n buildColumnMap,\n ColumnMap,\n isConfigChanged,\n EventEmitter,\n getAddedItems,\n getMissingItems,\n isGroupByChanged,\n hasFilter,\n hasGroupBy,\n hasSort,\n KeySet,\n logger,\n metadataKeys,\n NULL_RANGE,\n rangeNewItems,\n resetRange,\n uuid,\n vanillaConfig,\n withConfigDefaults,\n DataSourceConfigChanges,\n} from \"@vuu-ui/vuu-utils\";\nimport { aggregateData } from \"./aggregate-utils\";\nimport { buildDataToClientMap, toClientRow } from \"./array-data-utils\";\nimport { collapseGroup, expandGroup, GroupMap, groupRows } from \"./group-utils\";\nimport { sortRows } from \"./sort-utils\";\n\nconst { debug, info } = logger(\"ArrayDataSource\");\n\nconst { KEY } = metadataKeys;\n\nexport interface ArrayDataSourceConstructorProps\n extends Omit<DataSourceConstructorProps, \"bufferSize\" | \"table\"> {\n columnDescriptors: ColumnDescriptor[];\n data: Array<VuuRowDataItemType[]>;\n dataMap?: ColumnMap;\n keyColumn?: string;\n rangeChangeRowset?: \"delta\" | \"full\";\n}\n\nconst toDataSourceRow =\n (key: number) =>\n (data: VuuRowDataItemType[], index: number): DataSourceRow => {\n return [index, index, true, false, 1, 0, String(data[key]), 0, ...data];\n };\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: SubscribeCallback | 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\n /** Map reflecting positions of columns in client data sent to user */\n #columnMap: ColumnMap;\n #config: WithFullConfig = vanillaConfig;\n #data: DataSourceRow[];\n #links: LinkDescriptorWithLabel[] | undefined;\n #range: VuuRange = NULL_RANGE;\n #selectedRowsCount = 0;\n #size = 0;\n #status: DataSourceStatus = \"initialising\";\n #title: string | undefined;\n\n protected _menu: VuuMenu | undefined;\n protected selectedRows: Selection = [];\n\n public tableSchema: TableSchema;\n public viewport: string;\n\n private keys = new KeySet(this.#range);\n protected processedData: DataSourceRow[] | undefined = undefined;\n\n constructor({\n aggregations,\n // different from RemoteDataSource\n columnDescriptors,\n data,\n dataMap,\n filter,\n groupBy,\n keyColumn,\n rangeChangeRowset = \"delta\",\n sort,\n title,\n viewport,\n }: ArrayDataSourceConstructorProps) {\n super();\n\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.#size = data.length;\n this.#title = title;\n\n const columns = columnDescriptors.map((col) => col.name);\n this.#columnMap = buildColumnMap(columns);\n this.dataIndices = buildDataToClientMap(this.#columnMap, this.dataMap);\n this.#data = data.map<DataSourceRow>(toDataSourceRow(this.key));\n\n this.config = {\n ...this.#config,\n aggregations: aggregations || this.#config.aggregations,\n columns,\n filter: filter || this.#config.filter,\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 ?? uuid(),\n columns,\n aggregations,\n range,\n sort,\n groupBy,\n filter,\n }: SubscribeProps,\n callback: SubscribeCallback\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 = aggregations || columns || filter || groupBy || sort;\n if (hasConfigProps) {\n if (range) {\n this.#range = range;\n }\n config = {\n ...config,\n aggregations: aggregations || this.#config.aggregations,\n columns: columns || this.#config.columns,\n filter: filter || this.#config.filter,\n groupBy: groupBy || this.#config.groupBy,\n sort: sort || this.#config.sort,\n };\n }\n\n this.clientCallback?.({\n ...config,\n type: \"subscribed\",\n clientViewportId: this.viewport,\n range: this.#range,\n tableSchema: this.tableSchema,\n });\n\n if (hasConfigProps) {\n // invoke setter to action config\n this.config = config;\n } else {\n this.clientCallback({\n clientViewportId: this.viewport,\n mode: \"size-only\",\n type: \"viewport-update\",\n size: this.#data.length,\n });\n if (range) {\n // set range and trigger dispatch of initial rows\n this.range = range;\n this.sendRowsToClient();\n } else if (this.#range !== NULL_RANGE) {\n this.sendRowsToClient();\n }\n }\n }\n\n unsubscribe() {\n console.log(`unsubscribe noop`);\n }\n\n suspend() {\n console.log(`suspend #${this.viewport}, current status ${this.#status}`);\n info?.(`suspend #${this.viewport}, current status ${this.#status}`);\n this.#status = \"suspended\";\n\n return this;\n }\n\n resume() {\n console.log(`resume #${this.viewport}, current status ${this.#status}`);\n // const isDisabled = this.#status.startsWith(\"disabl\");\n const isSuspended = this.#status === \"suspended\";\n info?.(`resume #${this.viewport}, current status ${this.#status}`);\n console.log(`resume noop`);\n if (isSuspended) {\n this.#status = \"subscribed\";\n }\n return this;\n }\n\n disable() {\n console.log(`disable noop`);\n return this;\n }\n\n enable() {\n console.log(`enable noop`);\n return this;\n }\n\n select(selected: Selection) {\n this.#selectedRowsCount = selected.length;\n debug?.(`select ${JSON.stringify(selected)}`);\n this.selectedRows = selected;\n this.setRange(resetRange(this.#range), true);\n }\n\n openTreeNode(key: string) {\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(resetRange(this.#range), true);\n }\n\n closeTreeNode(key: string) {\n this.openTreeNodes = this.openTreeNodes.filter((value) => value !== key);\n if (this.processedData) {\n this.processedData = collapseGroup(key, this.processedData);\n this.setRange(resetRange(this.#range), true);\n }\n }\n\n get links() {\n return this.#links;\n }\n\n get menu() {\n return this._menu;\n }\n\n get status() {\n return this.#status;\n }\n\n get data() {\n return this.#data;\n }\n\n // Only used by the UpdateGenerator\n get currentData() {\n return this.processedData ?? this.#data;\n }\n\n get table() {\n return this.tableSchema.table;\n }\n\n get config() {\n return this.#config;\n }\n\n set config(config: DataSourceConfig) {\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n if (config) {\n const originalConfig = this.#config;\n const newConfig: DataSourceConfig =\n config?.filter?.filter && config?.filter.filterStruct === undefined\n ? {\n ...config,\n filter: {\n filter: config.filter.filter,\n filterStruct: parseFilter(config.filter.filter),\n },\n }\n : config;\n\n this.#config = withConfigDefaults(newConfig);\n\n let processedData: DataSourceRow[] | undefined;\n\n if (hasFilter(config)) {\n const { filter, filterStruct = parseFilter(filter) } = config.filter;\n if (filterStruct) {\n const fn = filterPredicate(this.#columnMap, filterStruct);\n processedData = this.#data.filter(fn);\n } else {\n throw Error(\"filter must include filterStruct\");\n }\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 console.log(\"adjust the openTReeNodes groupBy changed \", {\n originalGroupBy: originalConfig.groupBy,\n newGroupBy: newConfig.groupBy,\n });\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\n this.processedData = processedData?.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 this.setRange(resetRange(this.#range), true);\n\n this.emit(\"config\", this.#config, undefined, configChanges);\n }\n }\n\n applyConfig(config: DataSourceConfig): 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?.filter?.filter && config?.filter.filterStruct === undefined\n ? {\n ...config,\n filter: {\n filter: config.filter.filter,\n filterStruct: parseFilter(config.filter.filter),\n },\n }\n : config;\n this.#config = withConfigDefaults(newConfig);\n return otherChanges;\n }\n }\n }\n\n get selectedRowsCount() {\n return this.#selectedRowsCount;\n }\n\n get size() {\n // return this.#size;\n return this.processedData?.length ?? this.#data.length;\n }\n\n get range() {\n return this.#range;\n }\n\n set range(range: VuuRange) {\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 if (rowIdx >= from && rowIdx < to) {\n this.sendRowsToClient();\n }\n };\n\n protected update = (row: VuuRowDataItemType[], columnName: string) => {\n // TODO take sorting, filtering. grouping into account\n const keyValue = row[this.key];\n const colIndex = this.#columnMap[columnName];\n const dataColIndex = this.dataMap?.[columnName];\n const dataIndex = this.#data.findIndex((row) => row[KEY] === keyValue);\n if (dataIndex !== -1 && dataColIndex !== undefined) {\n const dataSourceRow = this.#data[dataIndex];\n dataSourceRow[colIndex] = row[dataColIndex];\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 protected updateRow = (row: VuuRowDataItemType[]) => {\n // TODO take sorting, filtering. grouping into account\n const keyValue = row[this.key];\n const dataIndex = this.#data.findIndex((row) => row[KEY] === keyValue);\n if (dataIndex !== -1) {\n const dataSourceRow = toDataSourceRow(this.key)(row, dataIndex);\n // maybe update this in place\n this.#data[dataIndex] = dataSourceRow;\n const { from, to } = this.#range;\n if (dataIndex >= from && dataIndex < to) {\n this.sendRowsToClient(false, dataSourceRow);\n }\n }\n };\n\n private setRange(range: VuuRange, forceFullRefresh = false) {\n if (range.from !== this.#range.from || range.to !== this.#range.to) {\n this.#range = range;\n const keysResequenced = this.keys.reset(range);\n this.sendRowsToClient(forceFullRefresh || keysResequenced);\n } else if (forceFullRefresh) {\n this.sendRowsToClient(forceFullRefresh);\n }\n }\n\n sendRowsToClient(forceFullRefresh = false, row?: DataSourceRow) {\n if (row) {\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"update\",\n rows: [\n toClientRow(row, this.keys, this.selectedRows, this.dataIndices),\n ],\n type: \"viewport-update\",\n });\n } else {\n const rowRange =\n this.rangeChangeRowset === \"delta\" && !forceFullRefresh\n ? rangeNewItems(this.lastRangeServed, this.#range)\n : this.#range;\n const data = this.processedData ?? this.#data;\n\n const rowsWithinViewport = data\n .slice(rowRange.from, rowRange.to)\n .map((row) =>\n toClientRow(row, this.keys, this.selectedRows, this.dataIndices)\n );\n\n this.clientCallback?.({\n clientViewportId: this.viewport,\n mode: \"batch\",\n rows: rowsWithinViewport,\n size: data.length,\n type: \"viewport-update\",\n });\n this.lastRangeServed = {\n from: this.#range.from,\n to: Math.min(\n this.#range.to,\n this.#range.from + rowsWithinViewport.length\n ),\n };\n }\n }\n\n get columns() {\n return this.#config.columns;\n }\n\n set columns(columns: string[]) {\n const addedColumns = getAddedItems(this.config.columns, columns);\n if (addedColumns.length > 0) {\n const columnsWithoutDescriptors = getMissingItems(\n this.columnDescriptors,\n addedColumns,\n (col) => col.name\n );\n console.log(`columnsWithoutDescriptors`, {\n columnsWithoutDescriptors,\n });\n }\n this.#columnMap = buildColumnMap(columns);\n this.dataIndices = buildDataToClientMap(this.#columnMap, this.dataMap);\n\n this.config = {\n ...this.#config,\n columns,\n };\n }\n\n get aggregations() {\n return this.#config.aggregations;\n }\n\n set aggregations(aggregations: VuuAggregation[]) {\n this.#config = {\n ...this.#config,\n aggregations,\n };\n\n const targetData = this.processedData ?? this.#data;\n const leafData = this.#data;\n\n aggregateData(\n aggregations,\n targetData,\n this.#config.groupBy,\n leafData,\n this.#columnMap,\n this.groupMap as GroupMap\n );\n this.setRange(resetRange(this.#range), true);\n\n this.emit(\"config\", this.#config);\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 filter() {\n return this.#config.filter;\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 filter,\n };\n }\n\n get groupBy() {\n return this.#config.groupBy;\n }\n\n set groupBy(groupBy: VuuGroupBy) {\n this.config = {\n ...this.#config,\n groupBy,\n };\n }\n\n get title() {\n return this.#title;\n }\n\n set title(title: string | undefined) {\n this.#title = 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 private findRow(rowKey: number) {\n const row = this.#data[rowKey];\n if (row) {\n return row;\n } else {\n throw `no row found for key ${rowKey}`;\n }\n }\n\n applyEdit(\n row: DataSourceRow,\n columnName: string,\n value: VuuRowDataItemType\n ): Promise<true> {\n console.log(`ArrayDataSource applyEdit ${row[0]} ${columnName} ${value}`);\n return Promise.resolve(true);\n }\n\n async menuRpcCall(\n rpcRequest: Omit<ClientToServerMenuRPC, \"vpId\"> | ClientToServerEditRpc\n ): Promise<\n | MenuRpcResponse\n | VuuUIMessageInRPCEditReject\n | VuuUIMessageInRPCEditResponse\n | undefined\n > {\n return new Promise((resolve) => {\n const { type } = rpcRequest;\n switch (type) {\n case \"VP_EDIT_CELL_RPC\":\n {\n // TODO\n // const { rowKey, field, value } = rpcRequest;\n // try {\n // this.update(rowKey, field, value);\n // resolve(undefined);\n // } catch (error) {\n // resolve({ error: String(error), type: \"VP_EDIT_RPC_REJECT\" });\n // }\n }\n\n break;\n default:\n resolve(undefined);\n }\n });\n }\n}\n"],"names":["row"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,UAAA,EAAA,OAAA,EAAA,KAAA,EAAA,MAAA,EAAA,MAAA,EAAA,kBAAA,EAAA,KAAA,EAAA,OAAA,EAAA,MAAA,CAAA;AAyDA,MAAM,EAAE,KAAA,EAAO,IAAK,EAAA,GAAI,OAAO,iBAAiB,CAAA,CAAA;AAEhD,MAAM,EAAE,KAAQ,GAAA,YAAA,CAAA;AAWhB,MAAM,eACJ,GAAA,CAAC,GACD,KAAA,CAAC,MAA4B,KAAiC,KAAA;AAC5D,EAAA,OAAO,CAAC,KAAA,EAAO,KAAO,EAAA,IAAA,EAAM,OAAO,CAAG,EAAA,CAAA,EAAG,MAAO,CAAA,IAAA,CAAK,GAAG,CAAC,CAAG,EAAA,CAAA,EAAG,GAAG,IAAI,CAAA,CAAA;AACxE,CAAA,CAAA;AAEF,MAAM,gBAAA,GAAmB,CACvB,OAAA,EACA,SACgB,KAAA;AAChB,EAAA,MAAM,MAAsB,GAAA;AAAA,IAC1B,OAAA,EAAS,QAAQ,GAAI,CAAA,CAAC,EAAE,IAAM,EAAA,cAAA,GAAiB,UAAgB,MAAA;AAAA,MAC7D,IAAA;AAAA,MACA,cAAA;AAAA,KACA,CAAA,CAAA;AAAA,IACF,GAAK,EAAA,SAAA,IAAa,OAAQ,CAAA,CAAC,CAAE,CAAA,IAAA;AAAA,IAC7B,KAAO,EAAA,EAAE,MAAQ,EAAA,EAAA,EAAI,OAAO,OAAQ,EAAA;AAAA,GACtC,CAAA;AAEA,EAAO,OAAA,MAAA,CAAA;AACT,CAAA,CAAA;AAEO,MAAM,wBACH,YAEV,CAAA;AAAA,EAoCE,WAAY,CAAA;AAAA,IACV,YAAA;AAAA;AAAA,IAEA,iBAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,OAAA;AAAA,IACA,SAAA;AAAA,IACA,iBAAoB,GAAA,OAAA;AAAA,IACpB,IAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAA;AAAA,GACkC,EAAA;AAClC,IAAM,KAAA,EAAA,CAAA;AAtCR,IAAA,IAAA,CAAQ,eAA4B,GAAA,EAAE,IAAM,EAAA,CAAA,EAAG,IAAI,CAAE,EAAA,CAAA;AAErD,IAAA,IAAA,CAAQ,gBAA0B,EAAC,CAAA;AAGnC;AAAA,IAAA,YAAA,CAAA,IAAA,EAAA,UAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AACA,IAA0B,YAAA,CAAA,IAAA,EAAA,OAAA,EAAA,aAAA,CAAA,CAAA;AAC1B,IAAA,YAAA,CAAA,IAAA,EAAA,KAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AACA,IAAmB,YAAA,CAAA,IAAA,EAAA,MAAA,EAAA,UAAA,CAAA,CAAA;AACnB,IAAqB,YAAA,CAAA,IAAA,EAAA,kBAAA,EAAA,CAAA,CAAA,CAAA;AACrB,IAAQ,YAAA,CAAA,IAAA,EAAA,KAAA,EAAA,CAAA,CAAA,CAAA;AACR,IAA4B,YAAA,CAAA,IAAA,EAAA,OAAA,EAAA,cAAA,CAAA,CAAA;AAC5B,IAAA,YAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,CAAA,CAAA,CAAA;AAGA,IAAA,IAAA,CAAU,eAA0B,EAAC,CAAA;AAKrC,IAAA,IAAA,CAAQ,IAAO,GAAA,IAAI,MAAO,CAAA,YAAA,CAAA,IAAA,EAAK,MAAM,CAAA,CAAA,CAAA;AACrC,IAAA,IAAA,CAAU,aAA6C,GAAA,KAAA,CAAA,CAAA;AAkVvD,IAAU,IAAA,CAAA,MAAA,GAAS,CAAC,GAA8B,KAAA;AAEhD,MAAA,MAAM,gBAAgB,eAAgB,CAAA,IAAA,CAAK,GAAG,CAAE,CAAA,GAAA,EAAK,KAAK,IAAI,CAAA,CAAA;AAC9D,MAAC,YAAA,CAAA,IAAA,EAAK,KAA0B,CAAA,CAAA,IAAA,CAAK,aAAa,CAAA,CAAA;AAClD,MAAA,MAAM,EAAE,IAAA,EAAM,EAAG,EAAA,GAAI,YAAK,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;AAC1B,MAAM,MAAA,CAAC,MAAM,CAAI,GAAA,aAAA,CAAA;AACjB,MAAI,IAAA,MAAA,IAAU,IAAQ,IAAA,MAAA,GAAS,EAAI,EAAA;AACjC,QAAA,IAAA,CAAK,gBAAiB,EAAA,CAAA;AAAA,OACxB;AAAA,KACF,CAAA;AAEA,IAAU,IAAA,CAAA,MAAA,GAAS,CAAC,GAAA,EAA2B,UAAuB,KAAA;AAEpE,MAAM,MAAA,QAAA,GAAW,GAAI,CAAA,IAAA,CAAK,GAAG,CAAA,CAAA;AAC7B,MAAM,MAAA,QAAA,GAAW,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA,CAAW,UAAU,CAAA,CAAA;AAC3C,MAAM,MAAA,YAAA,GAAe,IAAK,CAAA,OAAA,GAAU,UAAU,CAAA,CAAA;AAC9C,MAAM,MAAA,SAAA,GAAY,mBAAK,KAAM,CAAA,CAAA,SAAA,CAAU,CAACA,IAAQA,KAAAA,IAAAA,CAAI,GAAG,CAAA,KAAM,QAAQ,CAAA,CAAA;AACrE,MAAI,IAAA,SAAA,KAAc,CAAM,CAAA,IAAA,YAAA,KAAiB,KAAW,CAAA,EAAA;AAClD,QAAM,MAAA,aAAA,GAAgB,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA,CAAM,SAAS,CAAA,CAAA;AAC1C,QAAc,aAAA,CAAA,QAAQ,CAAI,GAAA,GAAA,CAAI,YAAY,CAAA,CAAA;AAC1C,QAAA,MAAM,EAAE,IAAA,EAAM,EAAG,EAAA,GAAI,YAAK,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;AAC1B,QAAM,MAAA,CAAC,MAAM,CAAI,GAAA,aAAA,CAAA;AACjB,QAAI,IAAA,MAAA,IAAU,IAAQ,IAAA,MAAA,GAAS,EAAI,EAAA;AACjC,UAAK,IAAA,CAAA,gBAAA,CAAiB,OAAO,aAAa,CAAA,CAAA;AAAA,SAC5C;AAAA,OACF;AAAA,KACF,CAAA;AAEA,IAAU,IAAA,CAAA,SAAA,GAAY,CAAC,GAA8B,KAAA;AAEnD,MAAM,MAAA,QAAA,GAAW,GAAI,CAAA,IAAA,CAAK,GAAG,CAAA,CAAA;AAC7B,MAAM,MAAA,SAAA,GAAY,mBAAK,KAAM,CAAA,CAAA,SAAA,CAAU,CAACA,IAAQA,KAAAA,IAAAA,CAAI,GAAG,CAAA,KAAM,QAAQ,CAAA,CAAA;AACrE,MAAA,IAAI,cAAc,CAAI,CAAA,EAAA;AACpB,QAAA,MAAM,gBAAgB,eAAgB,CAAA,IAAA,CAAK,GAAG,CAAA,CAAE,KAAK,SAAS,CAAA,CAAA;AAE9D,QAAK,YAAA,CAAA,IAAA,EAAA,KAAA,CAAA,CAAM,SAAS,CAAI,GAAA,aAAA,CAAA;AACxB,QAAA,MAAM,EAAE,IAAA,EAAM,EAAG,EAAA,GAAI,YAAK,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;AAC1B,QAAI,IAAA,SAAA,IAAa,IAAQ,IAAA,SAAA,GAAY,EAAI,EAAA;AACvC,UAAK,IAAA,CAAA,gBAAA,CAAiB,OAAO,aAAa,CAAA,CAAA;AAAA,SAC5C;AAAA,OACF;AAAA,KACF,CAAA;AAzWE,IAAI,IAAA,CAAC,IAAQ,IAAA,CAAC,iBAAmB,EAAA;AAC/B,MAAM,MAAA,KAAA;AAAA,QACJ,8EAAA;AAAA,OACF,CAAA;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,iBAAoB,GAAA,iBAAA,CAAA;AACzB,IAAA,IAAA,CAAK,OAAU,GAAA,OAAA,CAAA;AACf,IAAK,IAAA,CAAA,GAAA,GAAM,SACP,GAAA,IAAA,CAAK,iBAAkB,CAAA,SAAA,CAAU,CAAC,GAAQ,KAAA,GAAA,CAAI,IAAS,KAAA,SAAS,CAChE,GAAA,CAAA,CAAA;AACJ,IAAA,IAAA,CAAK,iBAAoB,GAAA,iBAAA,CAAA;AACzB,IAAK,IAAA,CAAA,WAAA,GAAc,gBAAiB,CAAA,iBAAA,EAAmB,SAAS,CAAA,CAAA;AAChE,IAAK,IAAA,CAAA,QAAA,GAAW,YAAY,IAAK,EAAA,CAAA;AACjC,IAAA,YAAA,CAAA,IAAA,EAAK,OAAQ,IAAK,CAAA,MAAA,CAAA,CAAA;AAClB,IAAA,YAAA,CAAA,IAAA,EAAK,MAAS,EAAA,KAAA,CAAA,CAAA;AAEd,IAAA,MAAM,UAAU,iBAAkB,CAAA,GAAA,CAAI,CAAC,GAAA,KAAQ,IAAI,IAAI,CAAA,CAAA;AACvD,IAAK,YAAA,CAAA,IAAA,EAAA,UAAA,EAAa,eAAe,OAAO,CAAA,CAAA,CAAA;AACxC,IAAA,IAAA,CAAK,WAAc,GAAA,oBAAA,CAAqB,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA,EAAY,KAAK,OAAO,CAAA,CAAA;AACrE,IAAA,YAAA,CAAA,IAAA,EAAK,OAAQ,IAAK,CAAA,GAAA,CAAmB,eAAgB,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,CAAA;AAE9D,IAAA,IAAA,CAAK,MAAS,GAAA;AAAA,MACZ,GAAG,YAAK,CAAA,IAAA,EAAA,OAAA,CAAA;AAAA,MACR,YAAA,EAAc,YAAgB,IAAA,YAAA,CAAA,IAAA,EAAK,OAAQ,CAAA,CAAA,YAAA;AAAA,MAC3C,OAAA;AAAA,MACA,MAAA,EAAQ,MAAU,IAAA,YAAA,CAAA,IAAA,EAAK,OAAQ,CAAA,CAAA,MAAA;AAAA,MAC/B,OAAA,EAAS,OAAW,IAAA,YAAA,CAAA,IAAA,EAAK,OAAQ,CAAA,CAAA,OAAA;AAAA,MACjC,IAAA,EAAM,IAAQ,IAAA,YAAA,CAAA,IAAA,EAAK,OAAQ,CAAA,CAAA,IAAA;AAAA,KAC7B,CAAA;AAEA,IAAA,KAAA,GAAQ,cAAc,IAAK,CAAA,SAAA,CAAU,YAAK,CAAA,IAAA,EAAA,UAAA,CAAU,CAAC,CAAE,CAAA,CAAA,CAAA;AAAA,GACzD;AAAA,EAEA,MAAM,SACJ,CAAA;AAAA,IACE,QAAA,GAAW,IAAK,CAAA,QAAA,IAAY,IAAK,EAAA;AAAA,IACjC,OAAA;AAAA,IACA,YAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,KAEF,QACA,EAAA;AACA,IAAA,IAAA,CAAK,cAAiB,GAAA,QAAA,CAAA;AACtB,IAAA,IAAA,CAAK,QAAW,GAAA,QAAA,CAAA;AAChB,IAAA,YAAA,CAAA,IAAA,EAAK,OAAU,EAAA,YAAA,CAAA,CAAA;AACf,IAAA,IAAA,CAAK,eAAkB,GAAA,EAAE,IAAM,EAAA,CAAA,EAAG,IAAI,CAAE,EAAA,CAAA;AAExC,IAAA,IAAI,SAAS,YAAK,CAAA,IAAA,EAAA,OAAA,CAAA,CAAA;AAElB,IAAA,MAAM,cAAiB,GAAA,YAAA,IAAgB,OAAW,IAAA,MAAA,IAAU,OAAW,IAAA,IAAA,CAAA;AACvE,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAA,IAAI,KAAO,EAAA;AACT,QAAA,YAAA,CAAA,IAAA,EAAK,MAAS,EAAA,KAAA,CAAA,CAAA;AAAA,OAChB;AACA,MAAS,MAAA,GAAA;AAAA,QACP,GAAG,MAAA;AAAA,QACH,YAAA,EAAc,YAAgB,IAAA,YAAA,CAAA,IAAA,EAAK,OAAQ,CAAA,CAAA,YAAA;AAAA,QAC3C,OAAA,EAAS,OAAW,IAAA,YAAA,CAAA,IAAA,EAAK,OAAQ,CAAA,CAAA,OAAA;AAAA,QACjC,MAAA,EAAQ,MAAU,IAAA,YAAA,CAAA,IAAA,EAAK,OAAQ,CAAA,CAAA,MAAA;AAAA,QAC/B,OAAA,EAAS,OAAW,IAAA,YAAA,CAAA,IAAA,EAAK,OAAQ,CAAA,CAAA,OAAA;AAAA,QACjC,IAAA,EAAM,IAAQ,IAAA,YAAA,CAAA,IAAA,EAAK,OAAQ,CAAA,CAAA,IAAA;AAAA,OAC7B,CAAA;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,cAAiB,GAAA;AAAA,MACpB,GAAG,MAAA;AAAA,MACH,IAAM,EAAA,YAAA;AAAA,MACN,kBAAkB,IAAK,CAAA,QAAA;AAAA,MACvB,OAAO,YAAK,CAAA,IAAA,EAAA,MAAA,CAAA;AAAA,MACZ,aAAa,IAAK,CAAA,WAAA;AAAA,KACnB,CAAA,CAAA;AAED,IAAA,IAAI,cAAgB,EAAA;AAElB,MAAA,IAAA,CAAK,MAAS,GAAA,MAAA,CAAA;AAAA,KACT,MAAA;AACL,MAAA,IAAA,CAAK,cAAe,CAAA;AAAA,QAClB,kBAAkB,IAAK,CAAA,QAAA;AAAA,QACvB,IAAM,EAAA,WAAA;AAAA,QACN,IAAM,EAAA,iBAAA;AAAA,QACN,IAAA,EAAM,mBAAK,KAAM,CAAA,CAAA,MAAA;AAAA,OAClB,CAAA,CAAA;AACD,MAAA,IAAI,KAAO,EAAA;AAET,QAAA,IAAA,CAAK,KAAQ,GAAA,KAAA,CAAA;AACb,QAAA,IAAA,CAAK,gBAAiB,EAAA,CAAA;AAAA,OACxB,MAAA,IAAW,YAAK,CAAA,IAAA,EAAA,MAAA,CAAA,KAAW,UAAY,EAAA;AACrC,QAAA,IAAA,CAAK,gBAAiB,EAAA,CAAA;AAAA,OACxB;AAAA,KACF;AAAA,GACF;AAAA,EAEA,WAAc,GAAA;AACZ,IAAA,OAAA,CAAQ,IAAI,CAAkB,gBAAA,CAAA,CAAA,CAAA;AAAA,GAChC;AAAA,EAEA,OAAU,GAAA;AACR,IAAA,OAAA,CAAQ,IAAI,CAAY,SAAA,EAAA,IAAA,CAAK,QAAQ,CAAoB,iBAAA,EAAA,YAAA,CAAA,IAAA,EAAK,QAAO,CAAE,CAAA,CAAA,CAAA;AACvE,IAAA,IAAA,GAAO,YAAY,IAAK,CAAA,QAAQ,CAAoB,iBAAA,EAAA,YAAA,CAAA,IAAA,EAAK,QAAO,CAAE,CAAA,CAAA,CAAA;AAClE,IAAA,YAAA,CAAA,IAAA,EAAK,OAAU,EAAA,WAAA,CAAA,CAAA;AAEf,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEA,MAAS,GAAA;AACP,IAAA,OAAA,CAAQ,IAAI,CAAW,QAAA,EAAA,IAAA,CAAK,QAAQ,CAAoB,iBAAA,EAAA,YAAA,CAAA,IAAA,EAAK,QAAO,CAAE,CAAA,CAAA,CAAA;AAEtE,IAAM,MAAA,WAAA,GAAc,mBAAK,OAAY,CAAA,KAAA,WAAA,CAAA;AACrC,IAAA,IAAA,GAAO,WAAW,IAAK,CAAA,QAAQ,CAAoB,iBAAA,EAAA,YAAA,CAAA,IAAA,EAAK,QAAO,CAAE,CAAA,CAAA,CAAA;AACjE,IAAA,OAAA,CAAQ,IAAI,CAAa,WAAA,CAAA,CAAA,CAAA;AACzB,IAAA,IAAI,WAAa,EAAA;AACf,MAAA,YAAA,CAAA,IAAA,EAAK,OAAU,EAAA,YAAA,CAAA,CAAA;AAAA,KACjB;AACA,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEA,OAAU,GAAA;AACR,IAAA,OAAA,CAAQ,IAAI,CAAc,YAAA,CAAA,CAAA,CAAA;AAC1B,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEA,MAAS,GAAA;AACP,IAAA,OAAA,CAAQ,IAAI,CAAa,WAAA,CAAA,CAAA,CAAA;AACzB,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAAA,EAEA,OAAO,QAAqB,EAAA;AAC1B,IAAA,YAAA,CAAA,IAAA,EAAK,oBAAqB,QAAS,CAAA,MAAA,CAAA,CAAA;AACnC,IAAA,KAAA,GAAQ,CAAU,OAAA,EAAA,IAAA,CAAK,SAAU,CAAA,QAAQ,CAAC,CAAE,CAAA,CAAA,CAAA;AAC5C,IAAA,IAAA,CAAK,YAAe,GAAA,QAAA,CAAA;AACpB,IAAA,IAAA,CAAK,QAAS,CAAA,UAAA,CAAW,YAAK,CAAA,IAAA,EAAA,MAAA,CAAM,GAAG,IAAI,CAAA,CAAA;AAAA,GAC7C;AAAA,EAEA,aAAa,GAAa,EAAA;AACxB,IAAK,IAAA,CAAA,aAAA,CAAc,KAAK,GAAG,CAAA,CAAA;AAC3B,IAAA,IAAA,CAAK,aAAgB,GAAA,WAAA;AAAA,MACnB,IAAK,CAAA,aAAA;AAAA,MACL,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA;AAAA,MACL,mBAAK,OAAQ,CAAA,CAAA,OAAA;AAAA,MACb,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA;AAAA,MACL,IAAK,CAAA,QAAA;AAAA,MACL,IAAK,CAAA,aAAA;AAAA,KACP,CAAA;AACA,IAAA,IAAA,CAAK,QAAS,CAAA,UAAA,CAAW,YAAK,CAAA,IAAA,EAAA,MAAA,CAAM,GAAG,IAAI,CAAA,CAAA;AAAA,GAC7C;AAAA,EAEA,cAAc,GAAa,EAAA;AACzB,IAAA,IAAA,CAAK,gBAAgB,IAAK,CAAA,aAAA,CAAc,OAAO,CAAC,KAAA,KAAU,UAAU,GAAG,CAAA,CAAA;AACvE,IAAA,IAAI,KAAK,aAAe,EAAA;AACtB,MAAA,IAAA,CAAK,aAAgB,GAAA,aAAA,CAAc,GAAK,EAAA,IAAA,CAAK,aAAa,CAAA,CAAA;AAC1D,MAAA,IAAA,CAAK,QAAS,CAAA,UAAA,CAAW,YAAK,CAAA,IAAA,EAAA,MAAA,CAAM,GAAG,IAAI,CAAA,CAAA;AAAA,KAC7C;AAAA,GACF;AAAA,EAEA,IAAI,KAAQ,GAAA;AACV,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,IAAO,GAAA;AACT,IAAA,OAAO,IAAK,CAAA,KAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,MAAS,GAAA;AACX,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,OAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,IAAO,GAAA;AACT,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA;AAAA,GACd;AAAA;AAAA,EAGA,IAAI,WAAc,GAAA;AAChB,IAAO,OAAA,IAAA,CAAK,iBAAiB,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA;AAAA,GACpC;AAAA,EAEA,IAAI,KAAQ,GAAA;AACV,IAAA,OAAO,KAAK,WAAY,CAAA,KAAA,CAAA;AAAA,GAC1B;AAAA,EAEA,IAAI,MAAS,GAAA;AACX,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,OAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,OAAO,MAA0B,EAAA;AACnC,IAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,WAAA,CAAY,MAAM,CAAA,CAAA;AAC7C,IAAA,IAAI,aAAe,EAAA;AACjB,MAAA,IAAI,MAAQ,EAAA;AACV,QAAA,MAAM,iBAAiB,YAAK,CAAA,IAAA,EAAA,OAAA,CAAA,CAAA;AAC5B,QAAA,MAAM,YACJ,MAAQ,EAAA,MAAA,EAAQ,UAAU,MAAQ,EAAA,MAAA,CAAO,iBAAiB,KACtD,CAAA,GAAA;AAAA,UACE,GAAG,MAAA;AAAA,UACH,MAAQ,EAAA;AAAA,YACN,MAAA,EAAQ,OAAO,MAAO,CAAA,MAAA;AAAA,YACtB,YAAc,EAAA,WAAA,CAAY,MAAO,CAAA,MAAA,CAAO,MAAM,CAAA;AAAA,WAChD;AAAA,SAEF,GAAA,MAAA,CAAA;AAEN,QAAK,YAAA,CAAA,IAAA,EAAA,OAAA,EAAU,mBAAmB,SAAS,CAAA,CAAA,CAAA;AAE3C,QAAI,IAAA,aAAA,CAAA;AAEJ,QAAI,IAAA,SAAA,CAAU,MAAM,CAAG,EAAA;AACrB,UAAA,MAAM,EAAE,MAAQ,EAAA,YAAA,GAAe,YAAY,MAAM,CAAA,KAAM,MAAO,CAAA,MAAA,CAAA;AAC9D,UAAA,IAAI,YAAc,EAAA;AAChB,YAAA,MAAM,EAAK,GAAA,eAAA,CAAgB,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA,EAAY,YAAY,CAAA,CAAA;AACxD,YAAgB,aAAA,GAAA,YAAA,CAAA,IAAA,EAAK,KAAM,CAAA,CAAA,MAAA,CAAO,EAAE,CAAA,CAAA;AAAA,WAC/B,MAAA;AACL,YAAA,MAAM,MAAM,kCAAkC,CAAA,CAAA;AAAA,WAChD;AAAA,SACF;AAEA,QAAI,IAAA,OAAA,CAAQ,MAAM,CAAG,EAAA;AACnB,UAAgB,aAAA,GAAA,QAAA;AAAA,YACd,iBAAiB,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA;AAAA,YACtB,MAAO,CAAA,IAAA;AAAA,YACP,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA;AAAA,WACP,CAAA;AAAA,SACF;AAEA,QAAA,IACE,KAAK,aAAc,CAAA,MAAA,GAAS,KAC5B,gBAAiB,CAAA,cAAA,EAAgB,MAAM,CACvC,EAAA;AACA,UAAA,IAAI,YAAK,CAAA,IAAA,EAAA,OAAA,CAAA,CAAQ,OAAQ,CAAA,MAAA,KAAW,CAAG,EAAA;AACrC,YAAA,IAAA,CAAK,cAAc,MAAS,GAAA,CAAA,CAAA;AAAA,WACvB,MAAA;AAEL,YAAA,OAAA,CAAQ,IAAI,2CAA6C,EAAA;AAAA,cACvD,iBAAiB,cAAe,CAAA,OAAA;AAAA,cAChC,YAAY,SAAU,CAAA,OAAA;AAAA,aACvB,CAAA,CAAA;AAAA,WACH;AAAA,SACF;AAEA,QAAI,IAAA,UAAA,CAAW,MAAM,CAAG,EAAA;AACtB,UAAM,MAAA,CAAC,WAAa,EAAA,QAAQ,CAAI,GAAA,SAAA;AAAA,YAC9B,iBAAiB,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA;AAAA,YACtB,MAAO,CAAA,OAAA;AAAA,YACP,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA;AAAA,WACP,CAAA;AACA,UAAA,IAAA,CAAK,QAAW,GAAA,QAAA,CAAA;AAChB,UAAgB,aAAA,GAAA,WAAA,CAAA;AAEhB,UAAI,IAAA,IAAA,CAAK,aAAc,CAAA,MAAA,GAAS,CAAG,EAAA;AACjC,YAAgB,aAAA,GAAA,WAAA;AAAA,cACd,IAAK,CAAA,aAAA;AAAA,cACL,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA;AAAA,cACL,mBAAK,OAAQ,CAAA,CAAA,OAAA;AAAA,cACb,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA;AAAA,cACL,IAAK,CAAA,QAAA;AAAA,cACL,aAAA;AAAA,aACF,CAAA;AAAA,WACF;AAAA,SACF;AAEA,QAAA,IAAA,CAAK,aAAgB,GAAA,aAAA,EAAe,GAAI,CAAA,CAAC,KAAK,CAAM,KAAA;AAClD,UAAM,MAAA,KAAA,GAAQ,IAAI,KAAM,EAAA,CAAA;AACxB,UAAA,KAAA,CAAM,CAAC,CAAI,GAAA,CAAA,CAAA;AACX,UAAA,KAAA,CAAM,CAAC,CAAI,GAAA,CAAA,CAAA;AACX,UAAO,OAAA,KAAA,CAAA;AAAA,SACR,CAAA,CAAA;AAAA,OACH;AAEA,MAAA,IAAA,CAAK,QAAS,CAAA,UAAA,CAAW,YAAK,CAAA,IAAA,EAAA,MAAA,CAAM,GAAG,IAAI,CAAA,CAAA;AAE3C,MAAA,IAAA,CAAK,IAAK,CAAA,QAAA,EAAU,YAAK,CAAA,IAAA,EAAA,OAAA,CAAA,EAAS,QAAW,aAAa,CAAA,CAAA;AAAA,KAC5D;AAAA,GACF;AAAA,EAEA,YAAY,MAA+D,EAAA;AACzE,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,YAAA,EAAiB,GAAA,eAAA;AAAA,MACrC,YAAK,CAAA,IAAA,EAAA,OAAA,CAAA;AAAA,MACL,MAAA;AAAA,KACF,CAAA;AAEA,IAAA,IAAI,cAAc,IAAM,EAAA;AACtB,MAAA,IAAI,MAAQ,EAAA;AACV,QAAA,MAAM,YACJ,MAAQ,EAAA,MAAA,EAAQ,UAAU,MAAQ,EAAA,MAAA,CAAO,iBAAiB,KACtD,CAAA,GAAA;AAAA,UACE,GAAG,MAAA;AAAA,UACH,MAAQ,EAAA;AAAA,YACN,MAAA,EAAQ,OAAO,MAAO,CAAA,MAAA;AAAA,YACtB,YAAc,EAAA,WAAA,CAAY,MAAO,CAAA,MAAA,CAAO,MAAM,CAAA;AAAA,WAChD;AAAA,SAEF,GAAA,MAAA,CAAA;AACN,QAAK,YAAA,CAAA,IAAA,EAAA,OAAA,EAAU,mBAAmB,SAAS,CAAA,CAAA,CAAA;AAC3C,QAAO,OAAA,YAAA,CAAA;AAAA,OACT;AAAA,KACF;AAAA,GACF;AAAA,EAEA,IAAI,iBAAoB,GAAA;AACtB,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,kBAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,IAAO,GAAA;AAET,IAAA,OAAO,IAAK,CAAA,aAAA,EAAe,MAAU,IAAA,YAAA,CAAA,IAAA,EAAK,KAAM,CAAA,CAAA,MAAA,CAAA;AAAA,GAClD;AAAA,EAEA,IAAI,KAAQ,GAAA;AACV,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,MAAM,KAAiB,EAAA;AACzB,IAAA,IAAA,CAAK,SAAS,KAAK,CAAA,CAAA;AAAA,GACrB;AAAA,EAEU,OAAO,GAA2B,EAAA;AAC1C,IAAA,OAAA,CAAQ,IAAI,CAAc,WAAA,EAAA,GAAA,CAAI,IAAK,CAAA,GAAG,CAAC,CAAE,CAAA,CAAA,CAAA;AAAA,GAC3C;AAAA,EA6CQ,QAAA,CAAS,KAAiB,EAAA,gBAAA,GAAmB,KAAO,EAAA;AAC1D,IAAI,IAAA,KAAA,CAAM,SAAS,YAAK,CAAA,IAAA,EAAA,MAAA,CAAA,CAAO,QAAQ,KAAM,CAAA,EAAA,KAAO,YAAK,CAAA,IAAA,EAAA,MAAA,CAAA,CAAO,EAAI,EAAA;AAClE,MAAA,YAAA,CAAA,IAAA,EAAK,MAAS,EAAA,KAAA,CAAA,CAAA;AACd,MAAA,MAAM,eAAkB,GAAA,IAAA,CAAK,IAAK,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AAC7C,MAAK,IAAA,CAAA,gBAAA,CAAiB,oBAAoB,eAAe,CAAA,CAAA;AAAA,eAChD,gBAAkB,EAAA;AAC3B,MAAA,IAAA,CAAK,iBAAiB,gBAAgB,CAAA,CAAA;AAAA,KACxC;AAAA,GACF;AAAA,EAEA,gBAAA,CAAiB,gBAAmB,GAAA,KAAA,EAAO,GAAqB,EAAA;AAC9D,IAAA,IAAI,GAAK,EAAA;AACP,MAAA,IAAA,CAAK,cAAiB,GAAA;AAAA,QACpB,kBAAkB,IAAK,CAAA,QAAA;AAAA,QACvB,IAAM,EAAA,QAAA;AAAA,QACN,IAAM,EAAA;AAAA,UACJ,YAAY,GAAK,EAAA,IAAA,CAAK,MAAM,IAAK,CAAA,YAAA,EAAc,KAAK,WAAW,CAAA;AAAA,SACjE;AAAA,QACA,IAAM,EAAA,iBAAA;AAAA,OACP,CAAA,CAAA;AAAA,KACI,MAAA;AACL,MAAA,MAAM,QACJ,GAAA,IAAA,CAAK,iBAAsB,KAAA,OAAA,IAAW,CAAC,gBAAA,GACnC,aAAc,CAAA,IAAA,CAAK,eAAiB,EAAA,YAAA,CAAA,IAAA,EAAK,MAAM,CAAA,CAAA,GAC/C,YAAK,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;AACX,MAAM,MAAA,IAAA,GAAO,IAAK,CAAA,aAAA,IAAiB,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA;AAExC,MAAA,MAAM,qBAAqB,IACxB,CAAA,KAAA,CAAM,SAAS,IAAM,EAAA,QAAA,CAAS,EAAE,CAChC,CAAA,GAAA;AAAA,QAAI,CAACA,SACJ,WAAYA,CAAAA,IAAAA,EAAK,KAAK,IAAM,EAAA,IAAA,CAAK,YAAc,EAAA,IAAA,CAAK,WAAW,CAAA;AAAA,OACjE,CAAA;AAEF,MAAA,IAAA,CAAK,cAAiB,GAAA;AAAA,QACpB,kBAAkB,IAAK,CAAA,QAAA;AAAA,QACvB,IAAM,EAAA,OAAA;AAAA,QACN,IAAM,EAAA,kBAAA;AAAA,QACN,MAAM,IAAK,CAAA,MAAA;AAAA,QACX,IAAM,EAAA,iBAAA;AAAA,OACP,CAAA,CAAA;AACD,MAAA,IAAA,CAAK,eAAkB,GAAA;AAAA,QACrB,IAAA,EAAM,mBAAK,MAAO,CAAA,CAAA,IAAA;AAAA,QAClB,IAAI,IAAK,CAAA,GAAA;AAAA,UACP,mBAAK,MAAO,CAAA,CAAA,EAAA;AAAA,UACZ,YAAA,CAAA,IAAA,EAAK,MAAO,CAAA,CAAA,IAAA,GAAO,kBAAmB,CAAA,MAAA;AAAA,SACxC;AAAA,OACF,CAAA;AAAA,KACF;AAAA,GACF;AAAA,EAEA,IAAI,OAAU,GAAA;AACZ,IAAA,OAAO,mBAAK,OAAQ,CAAA,CAAA,OAAA,CAAA;AAAA,GACtB;AAAA,EAEA,IAAI,QAAQ,OAAmB,EAAA;AAC7B,IAAA,MAAM,YAAe,GAAA,aAAA,CAAc,IAAK,CAAA,MAAA,CAAO,SAAS,OAAO,CAAA,CAAA;AAC/D,IAAI,IAAA,YAAA,CAAa,SAAS,CAAG,EAAA;AAC3B,MAAA,MAAM,yBAA4B,GAAA,eAAA;AAAA,QAChC,IAAK,CAAA,iBAAA;AAAA,QACL,YAAA;AAAA,QACA,CAAC,QAAQ,GAAI,CAAA,IAAA;AAAA,OACf,CAAA;AACA,MAAA,OAAA,CAAQ,IAAI,CAA6B,yBAAA,CAAA,EAAA;AAAA,QACvC,yBAAA;AAAA,OACD,CAAA,CAAA;AAAA,KACH;AACA,IAAK,YAAA,CAAA,IAAA,EAAA,UAAA,EAAa,eAAe,OAAO,CAAA,CAAA,CAAA;AACxC,IAAA,IAAA,CAAK,WAAc,GAAA,oBAAA,CAAqB,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA,EAAY,KAAK,OAAO,CAAA,CAAA;AAErE,IAAA,IAAA,CAAK,MAAS,GAAA;AAAA,MACZ,GAAG,YAAK,CAAA,IAAA,EAAA,OAAA,CAAA;AAAA,MACR,OAAA;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EAEA,IAAI,YAAe,GAAA;AACjB,IAAA,OAAO,mBAAK,OAAQ,CAAA,CAAA,YAAA,CAAA;AAAA,GACtB;AAAA,EAEA,IAAI,aAAa,YAAgC,EAAA;AAC/C,IAAA,YAAA,CAAA,IAAA,EAAK,OAAU,EAAA;AAAA,MACb,GAAG,YAAK,CAAA,IAAA,EAAA,OAAA,CAAA;AAAA,MACR,YAAA;AAAA,KACF,CAAA,CAAA;AAEA,IAAM,MAAA,UAAA,GAAa,IAAK,CAAA,aAAA,IAAiB,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA;AAC9C,IAAA,MAAM,WAAW,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA,CAAA;AAEtB,IAAA,aAAA;AAAA,MACE,YAAA;AAAA,MACA,UAAA;AAAA,MACA,mBAAK,OAAQ,CAAA,CAAA,OAAA;AAAA,MACb,QAAA;AAAA,MACA,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA;AAAA,MACL,IAAK,CAAA,QAAA;AAAA,KACP,CAAA;AACA,IAAA,IAAA,CAAK,QAAS,CAAA,UAAA,CAAW,YAAK,CAAA,IAAA,EAAA,MAAA,CAAM,GAAG,IAAI,CAAA,CAAA;AAE3C,IAAK,IAAA,CAAA,IAAA,CAAK,QAAU,EAAA,YAAA,CAAA,IAAA,EAAK,OAAO,CAAA,CAAA,CAAA;AAAA,GAClC;AAAA,EAEA,IAAI,IAAO,GAAA;AACT,IAAA,OAAO,mBAAK,OAAQ,CAAA,CAAA,IAAA,CAAA;AAAA,GACtB;AAAA,EAEA,IAAI,KAAK,IAAe,EAAA;AACtB,IAAA,KAAA,GAAQ,CAAQ,KAAA,EAAA,IAAA,CAAK,SAAU,CAAA,IAAI,CAAC,CAAE,CAAA,CAAA,CAAA;AACtC,IAAA,IAAA,CAAK,MAAS,GAAA;AAAA,MACZ,GAAG,YAAK,CAAA,IAAA,EAAA,OAAA,CAAA;AAAA,MACR,IAAA;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EAEA,IAAI,MAAS,GAAA;AACX,IAAA,OAAO,mBAAK,OAAQ,CAAA,CAAA,MAAA,CAAA;AAAA,GACtB;AAAA,EAEA,IAAI,OAAO,MAA0B,EAAA;AACnC,IAAA,KAAA,GAAQ,CAAU,OAAA,EAAA,IAAA,CAAK,SAAU,CAAA,MAAM,CAAC,CAAE,CAAA,CAAA,CAAA;AAE1C,IAAA,IAAA,CAAK,MAAS,GAAA;AAAA,MACZ,GAAG,YAAK,CAAA,IAAA,EAAA,OAAA,CAAA;AAAA,MACR,MAAA;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EAEA,IAAI,OAAU,GAAA;AACZ,IAAA,OAAO,mBAAK,OAAQ,CAAA,CAAA,OAAA,CAAA;AAAA,GACtB;AAAA,EAEA,IAAI,QAAQ,OAAqB,EAAA;AAC/B,IAAA,IAAA,CAAK,MAAS,GAAA;AAAA,MACZ,GAAG,YAAK,CAAA,IAAA,EAAA,OAAA,CAAA;AAAA,MACR,OAAA;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EAEA,IAAI,KAAQ,GAAA;AACV,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;AAAA,GACd;AAAA,EAEA,IAAI,MAAM,KAA2B,EAAA;AACnC,IAAA,YAAA,CAAA,IAAA,EAAK,MAAS,EAAA,KAAA,CAAA,CAAA;AAAA,GAChB;AAAA,EAEA,IAAI,eAAkB,GAAA;AACpB,IAAA,OAAO,IAAK,CAAA,cAAA,CAAA;AAAA,GACd;AAAA,EAEA,UAAW,CAAA;AAAA,IACT,UAAA;AAAA,IACA,IAAA,EAAM,EAAE,UAAA,EAAY,QAAS,EAAA;AAAA,GACH,EAAA;AAC1B,IAAA,OAAA,CAAQ,IAAI,aAAe,EAAA;AAAA,MACzB,UAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,UAAa,GAAA;AACX,IAAA,OAAA,CAAQ,IAAI,aAAa,CAAA,CAAA;AAAA,GAC3B;AAAA,EAEQ,QAAQ,MAAgB,EAAA;AAC9B,IAAM,MAAA,GAAA,GAAM,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA,CAAM,MAAM,CAAA,CAAA;AAC7B,IAAA,IAAI,GAAK,EAAA;AACP,MAAO,OAAA,GAAA,CAAA;AAAA,KACF,MAAA;AACL,MAAA,MAAM,wBAAwB,MAAM,CAAA,CAAA,CAAA;AAAA,KACtC;AAAA,GACF;AAAA,EAEA,SAAA,CACE,GACA,EAAA,UAAA,EACA,KACe,EAAA;AACf,IAAQ,OAAA,CAAA,GAAA,CAAI,6BAA6B,GAAI,CAAA,CAAC,CAAC,CAAI,CAAA,EAAA,UAAU,CAAI,CAAA,EAAA,KAAK,CAAE,CAAA,CAAA,CAAA;AACxE,IAAO,OAAA,OAAA,CAAQ,QAAQ,IAAI,CAAA,CAAA;AAAA,GAC7B;AAAA,EAEA,MAAM,YACJ,UAMA,EAAA;AACA,IAAO,OAAA,IAAI,OAAQ,CAAA,CAAC,OAAY,KAAA;AAC9B,MAAM,MAAA,EAAE,MAAS,GAAA,UAAA,CAAA;AACjB,MAAA,QAAQ,IAAM;AAAA,QACZ,KAAK,kBAAA;AAYH,UAAA,MAAA;AAAA,QACF;AACE,UAAA,OAAA,CAAQ,KAAS,CAAA,CAAA,CAAA;AAAA,OACrB;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AACF,CAAA;AAjmBE,UAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,OAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,KAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,MAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,MAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,kBAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,KAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,OAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AACA,MAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
@@ -0,0 +1,49 @@
1
+ import { getSelectionStatus, metadataKeys } from '@vuu-ui/vuu-utils';
2
+
3
+ const { RENDER_IDX, SELECTED } = metadataKeys;
4
+ const toClientRow = (row, keys, selection, dataIndices) => {
5
+ const [rowIndex] = row;
6
+ let clientRow;
7
+ if (dataIndices) {
8
+ const { count } = metadataKeys;
9
+ clientRow = row.slice(0, count).concat(dataIndices.map((idx) => row[idx]));
10
+ } else {
11
+ clientRow = row.slice();
12
+ }
13
+ clientRow[RENDER_IDX] = keys.keyFor(rowIndex);
14
+ clientRow[SELECTED] = getSelectionStatus(selection, rowIndex);
15
+ return clientRow;
16
+ };
17
+ const divergentMaps = (columnMap, dataMap) => {
18
+ if (dataMap) {
19
+ const { count: mapOffset } = metadataKeys;
20
+ for (const [columnName, index] of Object.entries(columnMap)) {
21
+ const dataIdx = dataMap[columnName];
22
+ if (dataIdx === void 0) {
23
+ throw Error(
24
+ `ArrayDataSource column ${columnName} is not in underlying data set`
25
+ );
26
+ } else if (dataIdx !== index - mapOffset) {
27
+ return true;
28
+ }
29
+ }
30
+ }
31
+ return false;
32
+ };
33
+ const getDataIndices = (columnMap, dataMap) => {
34
+ const { count: mapOffset } = metadataKeys;
35
+ const result = [];
36
+ Object.entries(columnMap).forEach(([columnName]) => {
37
+ result.push(dataMap[columnName] + mapOffset);
38
+ });
39
+ return result;
40
+ };
41
+ const buildDataToClientMap = (columnMap, dataMap) => {
42
+ if (dataMap && divergentMaps(columnMap, dataMap)) {
43
+ return getDataIndices(columnMap, dataMap);
44
+ }
45
+ return void 0;
46
+ };
47
+
48
+ export { buildDataToClientMap, toClientRow };
49
+ //# sourceMappingURL=array-data-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"array-data-utils.js","sources":["../../src/array-data-source/array-data-utils.ts"],"sourcesContent":["import type { DataSourceRow, Selection } from \"@vuu-ui/vuu-data-types\";\nimport {\n ColumnMap,\n getSelectionStatus,\n KeySet,\n metadataKeys,\n} from \"@vuu-ui/vuu-utils\";\n\nconst { RENDER_IDX, SELECTED } = metadataKeys;\n\nexport const toClientRow = (\n row: DataSourceRow,\n keys: KeySet,\n selection: Selection,\n dataIndices?: number[]\n) => {\n const [rowIndex] = row;\n let clientRow;\n if (dataIndices) {\n // If client has specified a different ordering of columns from the way they are\n // ordered inn the underlying data, this is where we effect the ordering.\n const { count } = metadataKeys;\n clientRow = row\n .slice(0, count)\n .concat(dataIndices.map((idx) => row[idx])) as DataSourceRow;\n } else {\n clientRow = row.slice() as DataSourceRow;\n }\n clientRow[RENDER_IDX] = keys.keyFor(rowIndex);\n clientRow[SELECTED] = getSelectionStatus(selection, rowIndex);\n return clientRow;\n};\n\nconst divergentMaps = (columnMap: ColumnMap, dataMap?: ColumnMap) => {\n if (dataMap) {\n const { count: mapOffset } = metadataKeys;\n for (const [columnName, index] of Object.entries(columnMap)) {\n const dataIdx = dataMap[columnName];\n if (dataIdx === undefined) {\n throw Error(\n `ArrayDataSource column ${columnName} is not in underlying data set`\n );\n } else if (dataIdx !== index - mapOffset) {\n return true;\n }\n }\n }\n return false;\n};\n\nconst getDataIndices = (columnMap: ColumnMap, dataMap: ColumnMap) => {\n const { count: mapOffset } = metadataKeys;\n const result: number[] = [];\n Object.entries(columnMap).forEach(([columnName]) => {\n result.push(dataMap[columnName] + mapOffset);\n });\n return result;\n};\n\nexport const buildDataToClientMap = (\n columnMap: ColumnMap,\n dataMap?: ColumnMap\n): number[] | undefined => {\n if (dataMap && divergentMaps(columnMap, dataMap)) {\n return getDataIndices(columnMap, dataMap);\n }\n return undefined;\n};\n"],"names":[],"mappings":";;AAQA,MAAM,EAAE,UAAY,EAAA,QAAA,EAAa,GAAA,YAAA,CAAA;AAE1B,MAAM,WAAc,GAAA,CACzB,GACA,EAAA,IAAA,EACA,WACA,WACG,KAAA;AACH,EAAM,MAAA,CAAC,QAAQ,CAAI,GAAA,GAAA,CAAA;AACnB,EAAI,IAAA,SAAA,CAAA;AACJ,EAAA,IAAI,WAAa,EAAA;AAGf,IAAM,MAAA,EAAE,OAAU,GAAA,YAAA,CAAA;AAClB,IAAA,SAAA,GAAY,GACT,CAAA,KAAA,CAAM,CAAG,EAAA,KAAK,CACd,CAAA,MAAA,CAAO,WAAY,CAAA,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAI,CAAA,GAAG,CAAC,CAAC,CAAA,CAAA;AAAA,GACvC,MAAA;AACL,IAAA,SAAA,GAAY,IAAI,KAAM,EAAA,CAAA;AAAA,GACxB;AACA,EAAA,SAAA,CAAU,UAAU,CAAA,GAAI,IAAK,CAAA,MAAA,CAAO,QAAQ,CAAA,CAAA;AAC5C,EAAA,SAAA,CAAU,QAAQ,CAAA,GAAI,kBAAmB,CAAA,SAAA,EAAW,QAAQ,CAAA,CAAA;AAC5D,EAAO,OAAA,SAAA,CAAA;AACT,EAAA;AAEA,MAAM,aAAA,GAAgB,CAAC,SAAA,EAAsB,OAAwB,KAAA;AACnE,EAAA,IAAI,OAAS,EAAA;AACX,IAAM,MAAA,EAAE,KAAO,EAAA,SAAA,EAAc,GAAA,YAAA,CAAA;AAC7B,IAAA,KAAA,MAAW,CAAC,UAAY,EAAA,KAAK,KAAK,MAAO,CAAA,OAAA,CAAQ,SAAS,CAAG,EAAA;AAC3D,MAAM,MAAA,OAAA,GAAU,QAAQ,UAAU,CAAA,CAAA;AAClC,MAAA,IAAI,YAAY,KAAW,CAAA,EAAA;AACzB,QAAM,MAAA,KAAA;AAAA,UACJ,0BAA0B,UAAU,CAAA,8BAAA,CAAA;AAAA,SACtC,CAAA;AAAA,OACF,MAAA,IAAW,OAAY,KAAA,KAAA,GAAQ,SAAW,EAAA;AACxC,QAAO,OAAA,IAAA,CAAA;AAAA,OACT;AAAA,KACF;AAAA,GACF;AACA,EAAO,OAAA,KAAA,CAAA;AACT,CAAA,CAAA;AAEA,MAAM,cAAA,GAAiB,CAAC,SAAA,EAAsB,OAAuB,KAAA;AACnE,EAAM,MAAA,EAAE,KAAO,EAAA,SAAA,EAAc,GAAA,YAAA,CAAA;AAC7B,EAAA,MAAM,SAAmB,EAAC,CAAA;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,CAAA;AAAA,GAC5C,CAAA,CAAA;AACD,EAAO,OAAA,MAAA,CAAA;AACT,CAAA,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,CAAA;AAAA,GAC1C;AACA,EAAO,OAAA,KAAA,CAAA,CAAA;AACT;;;;"}