@vuu-ui/vuu-data-test 2.2.1 → 3.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,10 +1,9 @@
1
1
  import { isDeleteSelectedRowsRpcRequest, isUndoRowChangeRpcRequest, isEditCellRpcRequest, isRpcSuccess, isCreateSessionTableRpcRequest, uuid, isBeginEditSessionRpcRequest, isAddRowRpcRequest, isEndEditSessionRpcRequest } from '@vuu-ui/vuu-utils';
2
2
  import { Table, buildDataColumnMapFromSchema } from '../../Table.js';
3
- import { SessionTable, isProxySessionTable } from '../../SessionTable.js';
4
3
  import { TickingArrayDataSource } from '../../TickingArrayDataSource.js';
5
4
  import { RuntimeVisualLink } from '../../RuntimeVisualLink.js';
6
5
  import moduleContainer from './ModuleContainer.js';
7
- import { sessionTableSchema } from '../../session-table-utils.js';
6
+ import { sessionTableSchema, sessionTableRow } from '../../session-table-utils.js';
8
7
 
9
8
  var __defProp = Object.defineProperty;
10
9
  var __typeError = (msg) => {
@@ -16,7 +15,7 @@ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot
16
15
  var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
17
16
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
18
17
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
19
- var _name, _sessionTableMessageColumn, _runtimeVisualLinks, _sessionTableMap, _tableServices, _subscriptionMap, _moduleServices, _moduleMenuServices;
18
+ var _name, _sessionTableMessageColumn, _runtimeVisualLinks, _sessionSourceTableMap, _sessionTableMap, _tableServices, _subscriptionMap, _moduleServices, _moduleMenuServices;
20
19
  const assertUpdateIsValid = (schema, column, data) => {
21
20
  const col = schema.columns.find((col2) => col2.name === column);
22
21
  if (col) {
@@ -32,6 +31,7 @@ class VuuModule {
32
31
  __privateAdd(this, _name);
33
32
  __privateAdd(this, _sessionTableMessageColumn);
34
33
  __privateAdd(this, _runtimeVisualLinks, /* @__PURE__ */ new Map());
34
+ __privateAdd(this, _sessionSourceTableMap, {});
35
35
  __privateAdd(this, _sessionTableMap, {});
36
36
  __privateAdd(this, _tableServices);
37
37
  __privateAdd(this, _subscriptionMap, /* @__PURE__ */ new Map());
@@ -190,7 +190,6 @@ class VuuModule {
190
190
  menu: this.menus?.[tableName],
191
191
  rpcServices: this.getServices(tableName),
192
192
  rpcMenuServices: this.getMenuServices(tableName),
193
- sessionTables: __privateGet(this, _sessionTableMap),
194
193
  viewport,
195
194
  visualLinkService: this.visualLinkService,
196
195
  vuuModule
@@ -200,7 +199,9 @@ class VuuModule {
200
199
  const existingSubscriptions = __privateGet(this, _subscriptionMap).get(tableName);
201
200
  const subscription = {
202
201
  viewportId: dataSource.viewport,
203
- dataSource
202
+ dataSource,
203
+ sessionTableName: sessionTable ? tableName : void 0,
204
+ sourceTableName: __privateGet(this, _sessionSourceTableMap)[tableName]
204
205
  };
205
206
  if (existingSubscriptions) {
206
207
  existingSubscriptions.push(subscription);
@@ -216,11 +217,7 @@ class VuuModule {
216
217
  const sessionTable = this.getSessionTable(viewPortId, false);
217
218
  if (sessionTable) {
218
219
  if (mode === "soft") {
219
- sessionTable.update(
220
- key,
221
- __privateGet(this, _sessionTableMessageColumn),
222
- "SOFT_DELETED"
223
- );
220
+ sessionTable.update(key, "vuu_action", "deleteRow");
224
221
  } else {
225
222
  sessionTable.delete(key);
226
223
  }
@@ -251,23 +248,20 @@ class VuuModule {
251
248
  const { viewPortId } = rpcRequest.context;
252
249
  const { mode = "soft" } = rpcRequest.params;
253
250
  const sessionTable = this.getSessionTable(viewPortId, false);
254
- if (sessionTable && isProxySessionTable(sessionTable)) {
251
+ if (sessionTable) {
255
252
  const { dataSource } = this.getSubscriptionByViewport(viewPortId);
256
253
  const selectedRowIds = dataSource.getSelectedRowIds();
257
254
  const deletedKeys = [];
258
255
  if (selectedRowIds.length > 0) {
259
256
  for (const key of selectedRowIds) {
260
257
  if (mode === "soft") {
261
- sessionTable.update(
262
- key,
263
- __privateGet(this, _sessionTableMessageColumn),
264
- "SOFT_DELETED"
265
- );
258
+ sessionTable.update(key, "vuu_action", "deleteRow");
266
259
  } else {
267
260
  sessionTable.delete(key);
268
261
  }
269
262
  deletedKeys.push(key);
270
263
  }
264
+ dataSource.select?.({ type: "DESELECT_ALL" });
271
265
  }
272
266
  return { type: "SUCCESS_RESULT", data: { deletedKeys } };
273
267
  }
@@ -286,34 +280,49 @@ class VuuModule {
286
280
  const { viewPortId } = rpcRequest.context;
287
281
  const { key } = rpcRequest.params;
288
282
  const sessionTable = this.getSessionTable(viewPortId, false);
289
- if (sessionTable && isProxySessionTable(sessionTable)) {
290
- const { dataSource } = this.getSubscriptionByViewport(viewPortId);
291
- const sourceTable = this.tables[dataSource.table?.table];
283
+ if (sessionTable) {
284
+ const subscription = this.getSubscriptionByViewport(viewPortId);
285
+ const { dataSource } = subscription;
286
+ const sourceTableName = subscription.sourceTableName ?? dataSource.table?.table;
287
+ const sourceTable = this.tables[sourceTableName];
292
288
  if (!sourceTable) {
293
289
  return {
294
290
  type: "ERROR_RESULT",
295
291
  errorMessage: `undoRowChange: source table not found for viewport ${viewPortId}`
296
292
  };
297
293
  }
298
- const sourceRow = sourceTable.findByKey(key);
299
- if (!sourceRow) {
294
+ const sessionRow = sessionTable.findByKey(key);
295
+ if (!sessionRow) {
296
+ return {
297
+ type: "ERROR_RESULT",
298
+ errorMessage: `undoRowChange: session row not found for key ${key}`
299
+ };
300
+ }
301
+ const action = sessionRow[sessionTable.map.vuu_action];
302
+ if (action === "addRow") {
300
303
  sessionTable.delete(key);
301
304
  return { type: "SUCCESS_RESULT", data: { wasInsertedRow: true } };
302
305
  }
303
- const updates = sessionTable.getSessionUpdates();
304
- const rowUpdates = updates.get(key);
305
- if (rowUpdates) {
306
- for (const column of Object.keys(rowUpdates.cellUpdates)) {
307
- const originalValue = sourceRow[sourceTable.map[column]];
308
- sessionTable.update(key, column, originalValue);
306
+ if (action === "deleteRow" || action === "editCell") {
307
+ const sourceRow = sourceTable.findByKey(key);
308
+ if (!sourceRow) {
309
+ return {
310
+ type: "ERROR_RESULT",
311
+ errorMessage: `undoRowChange: source row not found for key ${key}`
312
+ };
313
+ }
314
+ const restoredRow = sessionRow.slice();
315
+ for (const column of sourceTable.schema.columns) {
316
+ restoredRow[sessionTable.map[column.name]] = sourceRow[sourceTable.map[column.name]];
309
317
  }
310
- updates.delete(key);
318
+ sessionTable.updateRow(restoredRow);
319
+ sessionTable.update(key, "vuu_action", "");
311
320
  }
312
321
  return { type: "SUCCESS_RESULT", data: void 0 };
313
322
  }
314
323
  return {
315
324
  type: "ERROR_RESULT",
316
- errorMessage: `undoRowChange: no active proxy session table for viewport ${viewPortId}`
325
+ errorMessage: `undoRowChange: no active session table for viewport ${viewPortId}`
317
326
  };
318
327
  }
319
328
  return {
@@ -325,7 +334,8 @@ class VuuModule {
325
334
  if (isEditCellRpcRequest(rpcRequest)) {
326
335
  const { viewPortId } = rpcRequest.context;
327
336
  const { column, data, key } = rpcRequest.params;
328
- let targetTable = __privateGet(this, _sessionTableMap)[viewPortId];
337
+ const sessionTable = __privateGet(this, _sessionTableMap)[viewPortId];
338
+ let targetTable = sessionTable;
329
339
  if (!targetTable) {
330
340
  const { dataSource } = this.getSubscriptionByViewport(viewPortId);
331
341
  if (dataSource.table) {
@@ -334,8 +344,15 @@ class VuuModule {
334
344
  }
335
345
  if (targetTable) {
336
346
  try {
347
+ const sessionRow = sessionTable?.findByKey(key);
348
+ if (sessionRow?.[sessionTable.map.vuu_action] === "deleteRow") {
349
+ throw Error("editCell: cannot edit a deleted row");
350
+ }
337
351
  assertUpdateIsValid(targetTable.schema, column, data);
338
352
  targetTable.update(key, column, data);
353
+ if (sessionTable && sessionTable.findByKey(key)?.[sessionTable.map.vuu_action] !== "addRow") {
354
+ sessionTable.update(key, "vuu_action", "editCell");
355
+ }
339
356
  return {
340
357
  type: "SUCCESS_RESULT",
341
358
  data: void 0
@@ -351,7 +368,7 @@ class VuuModule {
351
368
  throw Error("[VuuModule] editCell unable to find table for dataSource");
352
369
  }
353
370
  } else {
354
- throw Error(`[VuuModule] editCell invalid rpc type`);
371
+ throw Error("[VuuModule] editCell invalid rpc type");
355
372
  }
356
373
  });
357
374
  __publicField(this, "beginEditSessionMenuHandler", async ({
@@ -422,11 +439,10 @@ class VuuModule {
422
439
  sourceTable,
423
440
  sessionTableName,
424
441
  copyOption,
425
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
426
- // @ts-ignore
427
442
  dataSource
428
443
  );
429
444
  __privateGet(this, _sessionTableMap)[sessionTableName] = sessionTable;
445
+ __privateGet(this, _sessionSourceTableMap)[sessionTableName] = vuuTable.table;
430
446
  subscription.sessionTableName = sessionTableName;
431
447
  return {
432
448
  data: {
@@ -464,11 +480,10 @@ class VuuModule {
464
480
  sourceTable,
465
481
  sessionTableName,
466
482
  editSessionMode,
467
- // eslint-disable-next-line @typescript-eslint/ban-ts-comment
468
- // @ts-ignore
469
483
  dataSource
470
484
  );
471
485
  __privateGet(this, _sessionTableMap)[sessionTableName] = sessionTable;
486
+ __privateGet(this, _sessionSourceTableMap)[sessionTableName] = vuuTable.table;
472
487
  subscription.sessionTableName = sessionTableName;
473
488
  return {
474
489
  data: {
@@ -489,7 +504,7 @@ class VuuModule {
489
504
  }
490
505
  }
491
506
  } else {
492
- throw Error(`[VuuModule] endEditSession invalid rpc type`);
507
+ throw Error("[VuuModule] endEditSession invalid rpc type");
493
508
  }
494
509
  return {
495
510
  type: "ERROR_RESULT",
@@ -500,7 +515,8 @@ class VuuModule {
500
515
  if (isAddRowRpcRequest(rpcRequest)) {
501
516
  const { viewPortId } = rpcRequest.context;
502
517
  const subscription = this.getSubscriptionByViewport(viewPortId);
503
- const sessionTable = subscription.sessionTableName ? __privateGet(this, _sessionTableMap)[subscription.sessionTableName] : void 0;
518
+ const sessionTableName = subscription.sessionTableName ?? viewPortId;
519
+ const sessionTable = __privateGet(this, _sessionTableMap)[sessionTableName];
504
520
  if (!sessionTable) {
505
521
  return {
506
522
  type: "ERROR_RESULT",
@@ -511,6 +527,7 @@ class VuuModule {
511
527
  const columnMap = sessionTable.map;
512
528
  const columnCount = Object.keys(columnMap).length;
513
529
  const row = new Array(columnCount).fill("");
530
+ row[columnMap.vuu_action] = "addRow";
514
531
  for (const [col, idx] of Object.entries(columnMap)) {
515
532
  if (data[col] !== void 0) {
516
533
  row[idx] = data[col];
@@ -532,44 +549,53 @@ class VuuModule {
532
549
  const sessionTable = __privateGet(this, _sessionTableMap)[sessionTableName];
533
550
  const { dataSource } = subscription;
534
551
  if (dataSource.table) {
535
- const sourceTable = this.tables[dataSource.table.table];
552
+ const sourceTableName = subscription.sourceTableName ?? dataSource.table.table;
553
+ const sourceTable = this.tables[sourceTableName];
536
554
  if (rpcRequest.params.save === true) {
537
555
  let rejectedCount = 0;
538
- if (isProxySessionTable(sessionTable)) {
539
- const updates = sessionTable.getSessionUpdates();
540
- updates.forEach((rowUpdates, key) => {
541
- const { cellUpdates, lastUpdateTimestamp } = rowUpdates;
542
- const currentRow = sourceTable.findByKey(key);
543
- const lastUpdateTimestampOnTable = currentRow[sourceTable.map.vuuUpdatedTimestamp];
544
- if (lastUpdateTimestamp !== lastUpdateTimestampOnTable) {
545
- rejectedCount += 1;
546
- const sessionTableRow = sessionTable.findByKey(key);
547
- const newRow = sessionTableRow.slice();
548
- const messages = [];
549
- Object.entries(cellUpdates).forEach(([column, value]) => {
550
- messages.push(`${column}:${value}`);
551
- });
552
- newRow[sessionTable.map[__privateGet(this, _sessionTableMessageColumn)]] = messages.join(",");
553
- sessionTable.updateRow(newRow);
554
- } else {
555
- const newRow = currentRow.slice();
556
- Object.entries(cellUpdates).forEach(([column, value]) => {
557
- newRow[sourceTable.map[column]] = value;
558
- });
559
- sourceTable.updateRow(newRow);
556
+ const vuuMsgIdx = sessionTable.map[__privateGet(this, _sessionTableMessageColumn)];
557
+ const actionIdx = sessionTable.map.vuu_action;
558
+ const sessionTimestampIdx = sessionTable.map.vuuUpdatedTimestamp;
559
+ const sourceTimestampIdx = sourceTable.map.vuuUpdatedTimestamp;
560
+ const sourceColumns = sourceTable.schema.columns;
561
+ for (let i = 0; i < sessionTable.data.length; i++) {
562
+ const sessionRow = sessionTable.data[i];
563
+ const key = String(
564
+ sessionRow[sessionTable.map[sourceTable.schema.key]]
565
+ );
566
+ const currentRow = sourceTable.findByKey(key);
567
+ const action = sessionRow[actionIdx];
568
+ if (action === "deleteRow") {
569
+ if (currentRow) {
570
+ const sessionTimestamp = sessionRow[sessionTimestampIdx];
571
+ const sourceTimestamp = currentRow[sourceTimestampIdx];
572
+ if (typeof sessionTimestamp === "number" && typeof sourceTimestamp === "number" && sourceTimestamp > sessionTimestamp) {
573
+ rejectedCount += 1;
574
+ sessionTable.update(
575
+ key,
576
+ __privateGet(this, _sessionTableMessageColumn),
577
+ "stale delete"
578
+ );
579
+ } else {
580
+ sourceTable.delete(key);
581
+ }
582
+ }
583
+ continue;
584
+ }
585
+ if (sessionRow[vuuMsgIdx]) continue;
586
+ if (action === "editCell" && currentRow) {
587
+ for (const column of sourceColumns) {
588
+ const value = sessionRow[sessionTable.map[column.name]];
589
+ if (currentRow[sourceTable.map[column.name]] !== value) {
590
+ sourceTable.update(key, column.name, value);
591
+ }
560
592
  }
561
- });
562
- updates.clear();
563
- } else {
564
- const vuuMsgIdx = sessionTable.map[__privateGet(this, _sessionTableMessageColumn)];
565
- const sourceColumns = sourceTable.schema.columns;
566
- for (let i = 0; i < sessionTable.data.length; i++) {
567
- const sessionRow = sessionTable.data[i];
568
- if (sessionRow[vuuMsgIdx]) continue;
569
- const sourceRow = sourceColumns.map(
570
- (col) => sessionRow[sessionTable.map[col.name]]
593
+ } else if (action === "addRow" && !currentRow) {
594
+ sourceTable.insert(
595
+ sourceColumns.map(
596
+ (column) => sessionRow[sessionTable.map[column.name]]
597
+ )
571
598
  );
572
- sourceTable.insert(sourceRow);
573
599
  }
574
600
  }
575
601
  if (rejectedCount > 0) {
@@ -577,12 +603,11 @@ class VuuModule {
577
603
  errorMessage: "stale update",
578
604
  type: "ERROR_RESULT"
579
605
  };
580
- } else {
581
- return {
582
- type: "SUCCESS_RESULT",
583
- data: void 0
584
- };
585
606
  }
607
+ return {
608
+ type: "SUCCESS_RESULT",
609
+ data: void 0
610
+ };
586
611
  } else {
587
612
  return {
588
613
  type: "SUCCESS_RESULT",
@@ -593,7 +618,7 @@ class VuuModule {
593
618
  throw Error("[VuuModule], exitEditMode");
594
619
  }
595
620
  } else {
596
- throw Error(`[VuuModule] endEditSession invalid rpc type`);
621
+ throw Error("[VuuModule] endEditSession invalid rpc type");
597
622
  }
598
623
  });
599
624
  // Bulk-edit with input in session table
@@ -616,7 +641,7 @@ class VuuModule {
616
641
  data: void 0
617
642
  };
618
643
  } else {
619
- throw Error(`[VuuModule] applyBulkEdits invalid rpc type`);
644
+ throw Error("[VuuModule] applyBulkEdits invalid rpc type");
620
645
  }
621
646
  });
622
647
  /**
@@ -747,7 +772,7 @@ class VuuModule {
747
772
  );
748
773
  }
749
774
  }
750
- createSessionTable(sourceTable, sessionTableName, editSessionMode = "inline-all-rows", dataSource) {
775
+ createSessionTable(sourceTable, sessionTableName, editSessionMode, dataSource) {
751
776
  if (editSessionMode === "All" || editSessionMode.endsWith("all-rows")) {
752
777
  return this.createSessionTableWithAllRows(sourceTable, sessionTableName);
753
778
  } else if (editSessionMode === "Selected" || editSessionMode === "selected-rows") {
@@ -764,8 +789,13 @@ class VuuModule {
764
789
  );
765
790
  }
766
791
  }
767
- createSessionTableWithAllRows(sourceTable, sessionTableName) {
768
- return SessionTable(sourceTable, sessionTableName);
792
+ createSessionTableWithAllRows({ data, schema }, _sessionTableName) {
793
+ const sessionSchema = sessionTableSchema(schema);
794
+ return new Table(
795
+ sessionSchema,
796
+ data.map((row) => sessionTableRow(row, schema)),
797
+ buildDataColumnMapFromSchema(sessionSchema)
798
+ );
769
799
  }
770
800
  createEmptySessionTable({ schema }, sessionTableName) {
771
801
  const sessionSchema = sessionTableSchema({
@@ -785,7 +815,7 @@ class VuuModule {
785
815
  for (let i = 0; i < selectedRowIds.length; i++) {
786
816
  for (let j = 0; j < data.length; j++) {
787
817
  if (data[j][keyIndex] === selectedRowIds[i]) {
788
- sessionData.push(data[j]);
818
+ sessionData.push(sessionTableRow(data[j], schema));
789
819
  }
790
820
  }
791
821
  }
@@ -800,6 +830,7 @@ class VuuModule {
800
830
  _name = new WeakMap();
801
831
  _sessionTableMessageColumn = new WeakMap();
802
832
  _runtimeVisualLinks = new WeakMap();
833
+ _sessionSourceTableMap = new WeakMap();
803
834
  _sessionTableMap = new WeakMap();
804
835
  _tableServices = new WeakMap();
805
836
  _subscriptionMap = new WeakMap();