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