@vuu-ui/vuu-data-test 2.3.0 → 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,6 +2,7 @@
2
2
 
3
3
  var vuuDataLocal = require('@vuu-ui/vuu-data-local');
4
4
  var vuuUtils = require('@vuu-ui/vuu-utils');
5
+ var vuuUtils2 = require('@vuu-ui/vuu-utils2');
5
6
  var makeSuggestions = require('./makeSuggestions.js');
6
7
 
7
8
  var __defProp = Object.defineProperty;
@@ -14,14 +15,13 @@ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot
14
15
  var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), member.get(obj));
15
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);
16
17
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
17
- var _menuRpcServices, _pendingVisualLink, _rpcMenuServices, _rpcServices, _sessionTables, _sessionDataSource, _table, _selectionLinkSubscribers, _visualLinkService, _getVisualLinks, _vuuModule;
18
- class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
18
+ var _menuRpcServices, _pendingVisualLink, _rpcMenuServices, _rpcServices, _sourceTableDataSource, _table, _selectionLinkSubscribers, _visualLinkService, _getVisualLinks, _vuuModule;
19
+ const _TickingArrayDataSource = class _TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
19
20
  constructor({
20
21
  data,
21
22
  getVisualLinks,
22
23
  rpcServices,
23
24
  rpcMenuServices,
24
- sessionTables,
25
25
  table,
26
26
  menu,
27
27
  visualLink,
@@ -41,9 +41,7 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
41
41
  __privateAdd(this, _pendingVisualLink);
42
42
  __privateAdd(this, _rpcMenuServices);
43
43
  __privateAdd(this, _rpcServices);
44
- // A reference to session tables hosted within client side module
45
- __privateAdd(this, _sessionTables);
46
- __privateAdd(this, _sessionDataSource);
44
+ __privateAdd(this, _sourceTableDataSource);
47
45
  __privateAdd(this, _table);
48
46
  __privateAdd(this, _selectionLinkSubscribers);
49
47
  __privateAdd(this, _visualLinkService);
@@ -54,18 +52,10 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
54
52
  this.updateRow(row, columnName);
55
53
  } else if (sessionId) {
56
54
  console.warn("THIS IS NEVER EXPECTED TO HAPPEN");
57
- } else if (__privateGet(this, _sessionDataSource)) ; else {
55
+ } else {
58
56
  this.updateRow(row, columnName);
59
57
  }
60
58
  });
61
- __publicField(this, "handleSessionMessage", (msg) => {
62
- if (msg.type === "subscribed") ; else if (msg.type === "viewport-update") {
63
- if (msg.size !== void 0 && msg.size !== this.size) {
64
- this.emit("resize", msg.size);
65
- }
66
- this.clientCallback?.(msg);
67
- }
68
- });
69
59
  __publicField(this, "addRow", async (rowData = {}) => {
70
60
  const keyColumn = this.tableSchema.key;
71
61
  const rowKey = rowData[keyColumn] ?? vuuUtils.uuid();
@@ -84,8 +74,7 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
84
74
  return response?.errorMessage ?? "addRow failed";
85
75
  });
86
76
  __publicField(this, "deleteRow", async (key, mode = "hard") => {
87
- const rpcHost = __privateGet(this, _sessionDataSource) ?? this;
88
- const response = await rpcHost.rpcRequest?.({
77
+ const response = await this.rpcRequest({
89
78
  type: "RPC_REQUEST",
90
79
  rpcName: "deleteRow",
91
80
  params: { key, mode }
@@ -96,8 +85,7 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
96
85
  return response?.errorMessage ?? "deleteRow failed";
97
86
  });
98
87
  __publicField(this, "deleteSelectedRows", async (mode = "soft") => {
99
- const rpcHost = __privateGet(this, _sessionDataSource) ?? this;
100
- const response = await rpcHost.rpcRequest?.({
88
+ const response = await this.rpcRequest({
101
89
  type: "RPC_REQUEST",
102
90
  rpcName: "deleteSelectedRows",
103
91
  params: { mode }
@@ -108,8 +96,7 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
108
96
  };
109
97
  });
110
98
  __publicField(this, "undoRowChange", async (key) => {
111
- const rpcHost = __privateGet(this, _sessionDataSource) ?? this;
112
- const response = await rpcHost.rpcRequest?.({
99
+ const response = await this.rpcRequest({
113
100
  type: "RPC_REQUEST",
114
101
  rpcName: "undoRowChange",
115
102
  params: { key }
@@ -120,7 +107,6 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
120
107
  __privateSet(this, _rpcMenuServices, rpcMenuServices);
121
108
  __privateSet(this, _pendingVisualLink, visualLink);
122
109
  __privateSet(this, _rpcServices, rpcServices);
123
- __privateSet(this, _sessionTables, sessionTables);
124
110
  __privateSet(this, _table, table);
125
111
  __privateSet(this, _visualLinkService, visualLinkService);
126
112
  __privateSet(this, _getVisualLinks, getVisualLinks);
@@ -144,15 +130,6 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
144
130
  super.unsubscribe();
145
131
  __privateSet(this, _table, void 0);
146
132
  }
147
- set range(range) {
148
- super.range = range;
149
- if (__privateGet(this, _sessionDataSource)) {
150
- __privateGet(this, _sessionDataSource).range = range;
151
- }
152
- }
153
- get range() {
154
- return super.range;
155
- }
156
133
  set links(links) {
157
134
  super.links = links;
158
135
  }
@@ -163,33 +140,8 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
163
140
  getSelectedRowIds() {
164
141
  return Array.from(this.selectedRows);
165
142
  }
166
- /**
167
- * Suppress row flushes from the source datasource while a session is active.
168
- *
169
- * `updateRowWithSessionCheck` already blocks individual row updates arriving
170
- * via the table's "update" event. However, `sendRowsToClient` can also be
171
- * reached through other paths that bypass that handler:
172
- * - `setRange` (user scrolls the viewport)
173
- * - config changes (filter / sort / group-by)
174
- * - row inserts into the backing table
175
- *
176
- * Without this guard those paths would push source-table rows to the
177
- * client and overwrite the edited session view.
178
- */
179
- sendRowsToClient(forceFullRefresh = false, row) {
180
- if (__privateGet(this, _sessionDataSource)) {
181
- console.warn(
182
- `[TickingArrayDataSource] sendRowsToClient suppressed during active edit session (forceFullRefresh=${forceFullRefresh}, ${row ? `rowKey=${row[6]}` : "full batch - likely setRange/scroll"})`
183
- );
184
- return;
185
- }
186
- super.sendRowsToClient(forceFullRefresh, row);
187
- }
188
- select(selectRequest) {
189
- super.select(selectRequest);
190
- if (__privateGet(this, _sessionDataSource)) {
191
- __privateGet(this, _sessionDataSource).select(selectRequest);
192
- }
143
+ isSessionDataSourceOf(dataSource) {
144
+ return __privateGet(this, _sourceTableDataSource) === dataSource;
193
145
  }
194
146
  async createSessionDataSource(copyOption) {
195
147
  const rpcResponse = await this?.rpcRequest?.({
@@ -199,58 +151,24 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
199
151
  });
200
152
  if (vuuUtils.isRpcSuccess(rpcResponse)) {
201
153
  const { table: sessionTable } = rpcResponse.data;
202
- return __privateGet(this, _vuuModule)?.createDataSource(
154
+ const columns = this.config.columns.includes("vuu_action") ? this.config.columns : this.config.columns.concat("vuu_action");
155
+ const sessionDataSource = __privateGet(this, _vuuModule)?.createDataSource(
203
156
  sessionTable.table,
204
157
  sessionTable.table,
205
- this.config
206
- );
207
- } else {
208
- throw Error(
209
- `[TickingArrayDataSource] createSessionDataSource ${rpcResponse?.errorMessage}`
158
+ { ...this.config, columns }
210
159
  );
211
- }
212
- }
213
- async beginEditSession(editSessionMode = "inline-all-rows") {
214
- const rpcResponse = await this?.rpcRequest?.({
215
- type: "RPC_REQUEST",
216
- rpcName: "beginEditSession",
217
- params: {
218
- editSessionMode
219
- }
220
- });
221
- if (vuuUtils.isRpcSuccess(rpcResponse)) {
222
- const { table: sessionTable } = rpcResponse.data;
223
- if (vuuUtils.isInlineEditingSession(editSessionMode)) {
224
- __privateSet(this, _sessionDataSource, __privateGet(this, _vuuModule)?.createDataSource(
225
- sessionTable.table,
226
- sessionTable.table,
227
- this.config
228
- ));
229
- __privateGet(this, _sessionDataSource)?.subscribe(
230
- {
231
- range: this.range
232
- },
233
- this.handleSessionMessage
234
- );
235
- } else {
236
- return __privateGet(this, _vuuModule)?.createDataSource(
237
- sessionTable.table,
238
- sessionTable.table,
239
- this.config
240
- );
160
+ if (sessionDataSource instanceof _TickingArrayDataSource) {
161
+ __privateSet(sessionDataSource, _sourceTableDataSource, this);
241
162
  }
163
+ return sessionDataSource;
242
164
  } else {
243
165
  throw Error(
244
- `[VuuDataSource] beginEditSession ${rpcResponse.errorMessage}`
166
+ `[TickingArrayDataSource] createSessionDataSource ${rpcResponse?.errorMessage}`
245
167
  );
246
168
  }
247
169
  }
248
170
  async editCell(key, column, data) {
249
- console.log(
250
- `[VuuDataSource] editCell ${__privateGet(this, _sessionDataSource)?.viewport} rowKey ${key}, column ${column}, value ${data}`
251
- );
252
- const rpcHost = __privateGet(this, _sessionDataSource) ?? this;
253
- return rpcHost.rpcRequest?.({
171
+ return this.rpcRequest({
254
172
  type: "RPC_REQUEST",
255
173
  rpcName: "editCell",
256
174
  params: {
@@ -260,26 +178,31 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
260
178
  }
261
179
  });
262
180
  }
181
+ set columns(columns) {
182
+ super.columns = columns;
183
+ }
184
+ get columns() {
185
+ return super.columns;
186
+ }
263
187
  async endEditSession(saveChanges = false) {
264
188
  const type = "RPC_REQUEST";
265
189
  const rpcName = "endEditSession";
266
- const sessionDataSource = __privateGet(this, _sessionDataSource);
267
- const rpcHost = sessionDataSource ?? this;
268
- if (sessionDataSource) {
269
- __privateSet(this, _sessionDataSource, void 0);
270
- }
271
- const rpcResponse = await rpcHost.rpcRequest?.(
190
+ const rpcResponse = await this.rpcRequest(
272
191
  saveChanges ? { type, rpcName, params: { save: true } } : { type, rpcName, params: {} }
273
192
  );
274
193
  if (vuuUtils.isRpcSuccess(rpcResponse)) {
275
- sessionDataSource?.unsubscribe();
276
- this.sendRowsToClient(true);
194
+ const sourceTableDataSource = __privateGet(this, _sourceTableDataSource);
195
+ if (sourceTableDataSource) {
196
+ __privateSet(this, _sourceTableDataSource, void 0);
197
+ this.unsubscribe();
198
+ } else {
199
+ this.sendRowsToClient(true);
200
+ }
277
201
  } else {
278
202
  if (rpcResponse?.errorMessage === "stale update") {
279
- sessionDataSource?.unsubscribe();
280
- this.sendRowsToClient(true);
203
+ throw new vuuUtils2.StaleUpdateError(rpcResponse.errorMessage);
281
204
  } else {
282
- throw Error("unknown error");
205
+ throw Error(rpcResponse?.errorMessage ?? "endEditSession failed");
283
206
  }
284
207
  }
285
208
  }
@@ -387,18 +310,18 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
387
310
  unfreeze() {
388
311
  super.unfreeze();
389
312
  }
390
- }
313
+ };
391
314
  _menuRpcServices = new WeakMap();
392
315
  _pendingVisualLink = new WeakMap();
393
316
  _rpcMenuServices = new WeakMap();
394
317
  _rpcServices = new WeakMap();
395
- _sessionTables = new WeakMap();
396
- _sessionDataSource = new WeakMap();
318
+ _sourceTableDataSource = new WeakMap();
397
319
  _table = new WeakMap();
398
320
  _selectionLinkSubscribers = new WeakMap();
399
321
  _visualLinkService = new WeakMap();
400
322
  _getVisualLinks = new WeakMap();
401
323
  _vuuModule = new WeakMap();
324
+ let TickingArrayDataSource = _TickingArrayDataSource;
402
325
 
403
326
  exports.TickingArrayDataSource = TickingArrayDataSource;
404
327
  //# sourceMappingURL=TickingArrayDataSource.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"TickingArrayDataSource.js","sources":["../../../packages/vuu-data-test/src/TickingArrayDataSource.ts"],"sourcesContent":["import {\n ArrayDataSource,\n ArrayDataSourceConstructorProps,\n} from \"@vuu-ui/vuu-data-local\";\nimport type {\n DataSourceBase,\n DataSourceCallbackMessage,\n DataSourceRowWithBigint,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n DataSourceVisualLinkCreatedMessage,\n DeleteRowMode,\n EditSessionMode,\n CopyOption,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n LinkDescriptorWithLabel,\n RpcResultError,\n RpcResultSuccess,\n SelectRequest,\n VuuCreateVisualLink,\n VuuMenu,\n VuuRemoveVisualLink,\n VuuRowDataItemType,\n VuuRpcMenuRequest,\n VuuRpcMenuResponse,\n VuuRpcServiceRequest,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n isInlineEditingSession,\n isRpcSuccess,\n isTypeaheadRequest,\n Range,\n uuid,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n IVuuModule,\n RpcMenuService,\n RpcService,\n SessionTableMap,\n} from \"./core/module/VuuModule\";\nimport { makeSuggestions } from \"./makeSuggestions\";\nimport { Table } from \"./Table\";\n\nexport type VisualLinkHandler = (\n message: VuuCreateVisualLink | VuuRemoveVisualLink,\n) => Promise<DataSourceVisualLinkCreatedMessage | void>;\n\nexport interface TickingArrayDataSourceConstructorProps\n extends Omit<ArrayDataSourceConstructorProps, \"data\"> {\n data?: Array<VuuRowDataItemType[]>;\n getVisualLinks?: (tableName: string) => LinkDescriptorWithLabel[] | undefined;\n menu?: VuuMenu;\n rpcMenuServices?: RpcMenuService[];\n rpcServices?: RpcService[];\n sessionTables?: SessionTableMap;\n table?: Table;\n visualLinkService?: VisualLinkHandler;\n vuuModule?: IVuuModule;\n}\n\ntype LinkSubscription = {\n sourceColumnName?: string;\n columnName: string;\n linkType: \"subscribe-link-filter\" | \"subscribe-link-select\";\n};\n\nexport class TickingArrayDataSource extends ArrayDataSource {\n #menuRpcServices: RpcService[] | undefined;\n #pendingVisualLink?: LinkDescriptorWithLabel;\n #rpcMenuServices: RpcMenuService[] | undefined;\n #rpcServices: RpcService[] | undefined;\n // A reference to session tables hosted within client side module\n #sessionTables: SessionTableMap | undefined;\n #sessionDataSource: DataSourceBase<DataSourceRowWithBigint> | undefined =\n undefined;\n #table?: Table;\n #selectionLinkSubscribers: Map<string, LinkSubscription> | undefined;\n #visualLinkService?: VisualLinkHandler;\n #getVisualLinks?: (\n tableName: string,\n ) => LinkDescriptorWithLabel[] | undefined;\n #vuuModule?: IVuuModule;\n\n constructor({\n data,\n getVisualLinks,\n rpcServices,\n rpcMenuServices,\n sessionTables,\n table,\n menu,\n visualLink,\n visualLinkService,\n vuuModule,\n ...arrayDataSourceProps\n }: TickingArrayDataSourceConstructorProps) {\n if (data === undefined && table === undefined) {\n throw Error(\"TickingArrayDataSource must be constructed with data\");\n }\n super({\n ...arrayDataSourceProps,\n data: data ?? table?.data ?? [],\n dataMap: table?.map,\n });\n this._menu = menu;\n\n this.#rpcMenuServices = rpcMenuServices;\n this.#pendingVisualLink = visualLink;\n this.#rpcServices = rpcServices;\n this.#sessionTables = sessionTables;\n this.#table = table;\n this.#visualLinkService = visualLinkService;\n this.#getVisualLinks = getVisualLinks;\n this.#vuuModule = vuuModule;\n\n if (table) {\n this.tableSchema = table.schema;\n table.on(\"insert\", this.insert);\n table.on(\"update\", this.updateRowWithSessionCheck);\n // Use the base-class low-level handler so the overridden deleteRow\n // (which routes through rpcRequest)\n table.on(\"delete\", this.handleDeleteFromTable);\n }\n }\n\n updateRowWithSessionCheck = (\n row: Array<bigint | VuuRowDataItemType>,\n columnName?: string,\n sessionId?: string,\n ) => {\n if (sessionId && sessionId === this.viewport) {\n this.updateRow(row, columnName);\n } else if (sessionId) {\n // will never happen\n console.warn(\"THIS IS NEVER EXPECTED TO HAPPEN\");\n } else if (this.#sessionDataSource) {\n // queue updates for deferred application, issue warnings when edits in progress\n // this.emit(\"remote-update-during-local-edit\", row);\n } else {\n this.updateRow(row, columnName);\n }\n };\n\n async subscribe(\n subscribeProps: DataSourceSubscribeProps,\n callback: DataSourceSubscribeCallback,\n ) {\n const subscription = super.subscribe(subscribeProps, callback);\n // if (subscribeProps.range) {\n // this.#updateGenerator?.setRange(subscribeProps.range);\n // }\n if (this.#pendingVisualLink) {\n this.visualLink = this.#pendingVisualLink;\n this.#pendingVisualLink = undefined;\n }\n\n return subscription;\n }\n\n unsubscribe() {\n super.unsubscribe();\n this.#table = undefined;\n }\n\n set range(range: Range) {\n super.range = range;\n // Keep session datasource range in sync while editing.\n if (this.#sessionDataSource) {\n (this.#sessionDataSource as ArrayDataSource).range = range;\n }\n // this.#updateGenerator?.setRange(range);\n }\n get range() {\n return super.range;\n }\n\n set links(links: LinkDescriptorWithLabel[] | undefined) {\n super.links = links;\n }\n\n get links() {\n return this.#getVisualLinks?.(this.table.table);\n }\n\n getSelectedRowIds(): string[] {\n return Array.from(this.selectedRows);\n }\n\n /**\n * Suppress row flushes from the source datasource while a session is active.\n *\n * `updateRowWithSessionCheck` already blocks individual row updates arriving\n * via the table's \"update\" event. However, `sendRowsToClient` can also be\n * reached through other paths that bypass that handler:\n * - `setRange` (user scrolls the viewport)\n * - config changes (filter / sort / group-by)\n * - row inserts into the backing table\n *\n * Without this guard those paths would push source-table rows to the\n * client and overwrite the edited session view.\n */\n sendRowsToClient(forceFullRefresh = false, row?: DataSourceRowWithBigint) {\n if (this.#sessionDataSource) {\n console.warn(\n `[TickingArrayDataSource] sendRowsToClient suppressed during active edit session` +\n ` (forceFullRefresh=${forceFullRefresh}, ${row ? `rowKey=${row[6]}` : \"full batch - likely setRange/scroll\"})`,\n );\n return;\n }\n super.sendRowsToClient(forceFullRefresh, row);\n }\n\n select(selectRequest: Omit<SelectRequest, \"vpId\">) {\n // Forwarding the select request to the session\n // datasource causes it to update its own selectedRows\n // and re-send its rows\n super.select(selectRequest);\n if (this.#sessionDataSource) {\n (this.#sessionDataSource as ArrayDataSource).select(selectRequest);\n }\n }\n\n handleSessionMessage = (msg: DataSourceCallbackMessage) => {\n if (msg.type === \"subscribed\") {\n // console.log(`[VuuDataSource subscribed to session table]`);\n } else if (msg.type === \"viewport-update\") {\n if (msg.size !== undefined && msg.size !== this.size) {\n this.emit(\"resize\", msg.size);\n }\n this.clientCallback?.(msg);\n }\n };\n\n async createSessionDataSource(\n copyOption: CopyOption,\n ): Promise<DataSourceBase<DataSourceRowWithBigint> | undefined> {\n const rpcResponse = await this?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"createSessionTable\",\n params: { copyOption },\n });\n if (isRpcSuccess(rpcResponse)) {\n const { table: sessionTable } = rpcResponse.data as { table: VuuTable };\n return this.#vuuModule?.createDataSource(\n sessionTable.table,\n sessionTable.table,\n this.config,\n );\n } else {\n throw Error(\n `[TickingArrayDataSource] createSessionDataSource ${rpcResponse?.errorMessage}`,\n );\n }\n }\n\n async beginEditSession(editSessionMode: EditSessionMode = \"inline-all-rows\") {\n const rpcResponse = await this?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"beginEditSession\",\n params: {\n editSessionMode,\n },\n });\n\n if (isRpcSuccess(rpcResponse)) {\n const { table: sessionTable } = rpcResponse.data as { table: VuuTable };\n\n if (isInlineEditingSession(editSessionMode)) {\n this.#sessionDataSource = this.#vuuModule?.createDataSource(\n sessionTable.table,\n sessionTable.table,\n this.config,\n );\n\n this.#sessionDataSource?.subscribe(\n {\n range: this.range,\n },\n this.handleSessionMessage,\n );\n } else {\n return this.#vuuModule?.createDataSource(\n sessionTable.table,\n sessionTable.table,\n this.config,\n );\n }\n\n // we need to route messages from the session datasource to listening\n // client whilst still monitoring responses on the source table to which\n // we are currently subscribed.\n } else {\n throw Error(\n `[VuuDataSource] beginEditSession ${rpcResponse.errorMessage}`,\n );\n ///\n }\n }\n\n async editCell(key: string, column: string, data: VuuRowDataItemType) {\n console.log(\n `[VuuDataSource] editCell ${this.#sessionDataSource?.viewport} rowKey ${key}, column ${column}, value ${data}`,\n );\n\n const rpcHost = this.#sessionDataSource ?? this;\n\n return rpcHost.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"editCell\",\n params: {\n column,\n data,\n key,\n },\n });\n }\n\n addRow = async (\n rowData: Record<string, VuuRowDataItemType> = {},\n ): Promise<true | string> => {\n // Ensure each added row has a unique key.\n const keyColumn = this.tableSchema.key;\n const rowKey = (rowData[keyColumn] as string | undefined) ?? uuid();\n const rowDataWithKey: Record<string, VuuRowDataItemType> = {\n ...rowData,\n [keyColumn]: rowKey,\n };\n const response = await this.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"addRow\",\n params: { key: rowKey, data: rowDataWithKey },\n });\n if (isRpcSuccess(response)) {\n return true;\n }\n return response?.errorMessage ?? \"addRow failed\";\n };\n\n deleteRow = async (\n key: string,\n mode: DeleteRowMode = \"hard\",\n ): Promise<true | string> => {\n const rpcHost = this.#sessionDataSource ?? this;\n const response = await rpcHost.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"deleteRow\",\n params: { key, mode },\n });\n if (isRpcSuccess(response)) {\n return true;\n }\n return response?.errorMessage ?? \"deleteRow failed\";\n };\n\n deleteSelectedRows = async (\n mode: DeleteRowMode = \"soft\",\n ): Promise<RpcResultSuccess | RpcResultError> => {\n const rpcHost = this.#sessionDataSource ?? this;\n const response = await rpcHost.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"deleteSelectedRows\",\n params: { mode },\n });\n return (\n response ?? {\n type: \"ERROR_RESULT\",\n errorMessage: \"deleteSelectedRows failed\",\n }\n );\n };\n\n undoRowChange = async (\n key: string,\n ): Promise<RpcResultSuccess | RpcResultError> => {\n const rpcHost = this.#sessionDataSource ?? this;\n const response = await rpcHost.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"undoRowChange\",\n params: { key },\n });\n return (\n response ?? { type: \"ERROR_RESULT\", errorMessage: \"undoRowChange failed\" }\n );\n };\n\n async endEditSession(saveChanges = false) {\n const type = \"RPC_REQUEST\";\n const rpcName = \"endEditSession\";\n\n const sessionDataSource = this.#sessionDataSource;\n\n const rpcHost = sessionDataSource ?? this;\n\n if (sessionDataSource) {\n // timing is important here. By breaking this reference before\n // we send the endEdit RPC call, the application of session edits\n // to the source table will be handled correctly.\n this.#sessionDataSource = undefined;\n }\n\n const rpcResponse = await rpcHost.rpcRequest?.(\n saveChanges\n ? { type, rpcName, params: { save: true } }\n : { type, rpcName, params: {} },\n );\n\n if (isRpcSuccess(rpcResponse)) {\n sessionDataSource?.unsubscribe();\n this.sendRowsToClient(true);\n } else {\n // TODO do we reinstate the sessionDataSource ?\n if (rpcResponse?.errorMessage === \"stale update\") {\n sessionDataSource?.unsubscribe();\n this.sendRowsToClient(true);\n } else {\n throw Error(\"unknown error\");\n }\n }\n }\n\n async rpcRequest(\n rpcRequest: Omit<VuuRpcServiceRequest, \"context\">,\n ): Promise<RpcResultSuccess | RpcResultError> {\n if (isTypeaheadRequest(rpcRequest)) {\n const {\n params: { column, starts },\n } = rpcRequest;\n const data = await this.getTypeaheadSuggestions(column, starts);\n return {\n type: \"SUCCESS_RESULT\",\n data,\n } as RpcResultSuccess;\n } else {\n const rpcService = this.#rpcServices?.find(\n (service) => service.rpcName === rpcRequest.rpcName,\n );\n if (rpcService) {\n return rpcService.service({\n ...rpcRequest,\n context: {\n type: \"VIEWPORT_CONTEXT\",\n viewPortId: this.viewport,\n },\n });\n } else {\n throw Error(\n `[TickingArrayDataSource] no service to handle RPC request ${rpcRequest.rpcName}`,\n );\n }\n }\n }\n\n async menuRpcCall(\n rpcRequest: Omit<VuuRpcMenuRequest, \"vpId\">,\n ): Promise<VuuRpcMenuResponse> {\n const rpcService = this.#rpcMenuServices?.find(\n (service) => service.rpcName === rpcRequest.rpcName,\n );\n\n if (rpcService) {\n return rpcService.service({\n ...rpcRequest,\n vpId: this.viewport,\n } as VuuRpcMenuRequest);\n } else {\n throw Error(\n `[TickingArrayDataSource] menuRpcCall no service for ${rpcRequest.rpcName}`,\n );\n }\n }\n\n getTypeaheadSuggestions(column: string, pattern?: string): Promise<string[]> {\n if (this.#table) {\n const columnIndex = this.columnMap[column];\n if (columnIndex === undefined) {\n console.warn(\n `[TickingArrayDataSource] getTypeaheadSuggestions. No column ${column}`,\n );\n return Promise.resolve([]);\n } else {\n return makeSuggestions(this.currentData, columnIndex, pattern);\n }\n } else {\n throw Error(\n \"cannot call getTypeaheadSuggestions on TickingDataSource if table has not been provided\",\n );\n }\n }\n\n get visualLink() {\n return this._config.visualLink;\n }\n\n set visualLink(visualLink: LinkDescriptorWithLabel | undefined) {\n this._config = {\n ...this._config,\n visualLink,\n };\n\n if (visualLink) {\n const {\n parentClientVpId,\n link: { fromColumn, toColumn },\n } = visualLink;\n\n if (this.viewport) {\n this.#visualLinkService?.({\n childVpId: this.viewport,\n childColumnName: fromColumn,\n type: \"CREATE_VISUAL_LINK\",\n parentVpId: parentClientVpId,\n parentColumnName: toColumn,\n }).then((response) => {\n this.emit(\n \"visual-link-created\",\n response as DataSourceVisualLinkCreatedMessage,\n );\n });\n }\n } else {\n this.#visualLinkService?.({\n childVpId: this.viewport,\n type: \"REMOVE_VISUAL_LINK\",\n }).then((/* response */) => {\n this.emit(\"visual-link-removed\");\n });\n }\n }\n\n freeze() {\n super.freeze();\n }\n\n unfreeze() {\n super.unfreeze();\n }\n}\n"],"names":["ArrayDataSource","uuid","isRpcSuccess","isInlineEditingSession","isTypeaheadRequest","makeSuggestions"],"mappings":"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"}
1
+ {"version":3,"file":"TickingArrayDataSource.js","sources":["../../../packages/vuu-data-test/src/TickingArrayDataSource.ts"],"sourcesContent":["import {\n ArrayDataSource,\n type ArrayDataSourceConstructorProps,\n} from \"@vuu-ui/vuu-data-local\";\nimport type {\n DataSourceBase,\n DataSource,\n DataSourceRowWithBigint,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n DataSourceVisualLinkCreatedMessage,\n DeleteRowMode,\n CopyOption,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n LinkDescriptorWithLabel,\n RpcResultError,\n RpcResultSuccess,\n VuuCreateVisualLink,\n VuuMenu,\n VuuRemoveVisualLink,\n VuuRowDataItemType,\n VuuRpcMenuRequest,\n VuuRpcMenuResponse,\n VuuRpcServiceRequest,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n isRpcSuccess,\n isTypeaheadRequest,\n uuid,\n} from \"@vuu-ui/vuu-utils\";\nimport { StaleUpdateError } from \"@vuu-ui/vuu-utils2\";\nimport type {\n IVuuModule,\n RpcMenuService,\n RpcService,\n} from \"./core/module/VuuModule\";\nimport { makeSuggestions } from \"./makeSuggestions\";\nimport type { Table } from \"./Table\";\n\nexport type VisualLinkHandler = (\n message: VuuCreateVisualLink | VuuRemoveVisualLink,\n) => Promise<DataSourceVisualLinkCreatedMessage | void>;\n\nexport interface TickingArrayDataSourceConstructorProps\n extends Omit<ArrayDataSourceConstructorProps, \"data\"> {\n data?: Array<VuuRowDataItemType[]>;\n getVisualLinks?: (tableName: string) => LinkDescriptorWithLabel[] | undefined;\n menu?: VuuMenu;\n rpcMenuServices?: RpcMenuService[];\n rpcServices?: RpcService[];\n table?: Table;\n visualLinkService?: VisualLinkHandler;\n vuuModule?: IVuuModule;\n}\n\ntype LinkSubscription = {\n sourceColumnName?: string;\n columnName: string;\n linkType: \"subscribe-link-filter\" | \"subscribe-link-select\";\n};\n\nexport class TickingArrayDataSource extends ArrayDataSource {\n #menuRpcServices: RpcService[] | undefined;\n #pendingVisualLink?: LinkDescriptorWithLabel;\n #rpcMenuServices: RpcMenuService[] | undefined;\n #rpcServices: RpcService[] | undefined;\n #sourceTableDataSource: TickingArrayDataSource | undefined;\n #table?: Table;\n #selectionLinkSubscribers: Map<string, LinkSubscription> | undefined;\n #visualLinkService?: VisualLinkHandler;\n #getVisualLinks?: (\n tableName: string,\n ) => LinkDescriptorWithLabel[] | undefined;\n #vuuModule?: IVuuModule;\n\n constructor({\n data,\n getVisualLinks,\n rpcServices,\n rpcMenuServices,\n table,\n menu,\n visualLink,\n visualLinkService,\n vuuModule,\n ...arrayDataSourceProps\n }: TickingArrayDataSourceConstructorProps) {\n if (data === undefined && table === undefined) {\n throw Error(\"TickingArrayDataSource must be constructed with data\");\n }\n super({\n ...arrayDataSourceProps,\n data: data ?? table?.data ?? [],\n dataMap: table?.map,\n });\n this._menu = menu;\n\n this.#rpcMenuServices = rpcMenuServices;\n this.#pendingVisualLink = visualLink;\n this.#rpcServices = rpcServices;\n this.#table = table;\n this.#visualLinkService = visualLinkService;\n this.#getVisualLinks = getVisualLinks;\n this.#vuuModule = vuuModule;\n\n if (table) {\n this.tableSchema = table.schema;\n table.on(\"insert\", this.insert);\n table.on(\"update\", this.updateRowWithSessionCheck);\n // Use the base-class low-level handler so the overridden deleteRow\n // (which routes through rpcRequest)\n table.on(\"delete\", this.handleDeleteFromTable);\n }\n }\n\n updateRowWithSessionCheck = (\n row: Array<bigint | VuuRowDataItemType>,\n columnName?: string,\n sessionId?: string,\n ) => {\n if (sessionId && sessionId === this.viewport) {\n this.updateRow(row, columnName);\n } else if (sessionId) {\n // will never happen\n console.warn(\"THIS IS NEVER EXPECTED TO HAPPEN\");\n } else {\n this.updateRow(row, columnName);\n }\n };\n\n async subscribe(\n subscribeProps: DataSourceSubscribeProps,\n callback: DataSourceSubscribeCallback,\n ) {\n const subscription = super.subscribe(subscribeProps, callback);\n // if (subscribeProps.range) {\n // this.#updateGenerator?.setRange(subscribeProps.range);\n // }\n if (this.#pendingVisualLink) {\n this.visualLink = this.#pendingVisualLink;\n this.#pendingVisualLink = undefined;\n }\n\n return subscription;\n }\n\n unsubscribe() {\n super.unsubscribe();\n this.#table = undefined;\n }\n\n set links(links: LinkDescriptorWithLabel[] | undefined) {\n super.links = links;\n }\n\n get links() {\n return this.#getVisualLinks?.(this.table.table);\n }\n\n getSelectedRowIds(): string[] {\n return Array.from(this.selectedRows);\n }\n\n isSessionDataSourceOf(dataSource: DataSource): boolean {\n return this.#sourceTableDataSource === dataSource;\n }\n\n async createSessionDataSource(\n copyOption: CopyOption,\n ): Promise<DataSourceBase<DataSourceRowWithBigint> | undefined> {\n const rpcResponse = await this?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"createSessionTable\",\n params: { copyOption },\n });\n if (isRpcSuccess(rpcResponse)) {\n const { table: sessionTable } = rpcResponse.data as { table: VuuTable };\n const columns = this.config.columns.includes(\"vuu_action\")\n ? this.config.columns\n : this.config.columns.concat(\"vuu_action\");\n const sessionDataSource = this.#vuuModule?.createDataSource(\n sessionTable.table,\n sessionTable.table,\n { ...this.config, columns },\n );\n if (sessionDataSource instanceof TickingArrayDataSource) {\n sessionDataSource.#sourceTableDataSource = this;\n }\n return sessionDataSource;\n } else {\n throw Error(\n `[TickingArrayDataSource] createSessionDataSource ${rpcResponse?.errorMessage}`,\n );\n }\n }\n\n async editCell(key: string, column: string, data: VuuRowDataItemType) {\n return this.rpcRequest({\n type: \"RPC_REQUEST\",\n rpcName: \"editCell\",\n params: {\n column,\n data,\n key,\n },\n });\n }\n\n addRow = async (\n rowData: Record<string, VuuRowDataItemType> = {},\n ): Promise<true | string> => {\n // Ensure each added row has a unique key.\n const keyColumn = this.tableSchema.key;\n const rowKey = (rowData[keyColumn] as string | undefined) ?? uuid();\n const rowDataWithKey: Record<string, VuuRowDataItemType> = {\n ...rowData,\n [keyColumn]: rowKey,\n };\n const response = await this.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"addRow\",\n params: { key: rowKey, data: rowDataWithKey },\n });\n if (isRpcSuccess(response)) {\n return true;\n }\n return response?.errorMessage ?? \"addRow failed\";\n };\n\n deleteRow = async (\n key: string,\n mode: DeleteRowMode = \"hard\",\n ): Promise<true | string> => {\n const response = await this.rpcRequest({\n type: \"RPC_REQUEST\",\n rpcName: \"deleteRow\",\n params: { key, mode },\n });\n if (isRpcSuccess(response)) {\n return true;\n }\n return response?.errorMessage ?? \"deleteRow failed\";\n };\n\n deleteSelectedRows = async (\n mode: DeleteRowMode = \"soft\",\n ): Promise<RpcResultSuccess | RpcResultError> => {\n const response = await this.rpcRequest({\n type: \"RPC_REQUEST\",\n rpcName: \"deleteSelectedRows\",\n params: { mode },\n });\n return (\n response ?? {\n type: \"ERROR_RESULT\",\n errorMessage: \"deleteSelectedRows failed\",\n }\n );\n };\n\n undoRowChange = async (\n key: string,\n ): Promise<RpcResultSuccess | RpcResultError> => {\n const response = await this.rpcRequest({\n type: \"RPC_REQUEST\",\n rpcName: \"undoRowChange\",\n params: { key },\n });\n return (\n response ?? { type: \"ERROR_RESULT\", errorMessage: \"undoRowChange failed\" }\n );\n };\n\n set columns(columns: string[]) {\n super.columns = columns;\n }\n\n get columns() {\n return super.columns;\n }\n\n async endEditSession(saveChanges = false) {\n const type = \"RPC_REQUEST\";\n const rpcName = \"endEditSession\";\n\n const rpcResponse = await this.rpcRequest(\n saveChanges\n ? { type, rpcName, params: { save: true } }\n : { type, rpcName, params: {} },\n );\n\n if (isRpcSuccess(rpcResponse)) {\n const sourceTableDataSource = this.#sourceTableDataSource;\n if (sourceTableDataSource) {\n this.#sourceTableDataSource = undefined;\n this.unsubscribe();\n } else {\n this.sendRowsToClient(true);\n }\n } else {\n if (rpcResponse?.errorMessage === \"stale update\") {\n throw new StaleUpdateError(rpcResponse.errorMessage);\n } else {\n throw Error(rpcResponse?.errorMessage ?? \"endEditSession failed\");\n }\n }\n }\n\n async rpcRequest(\n rpcRequest: Omit<VuuRpcServiceRequest, \"context\">,\n ): Promise<RpcResultSuccess | RpcResultError> {\n if (isTypeaheadRequest(rpcRequest)) {\n const {\n params: { column, starts },\n } = rpcRequest;\n const data = await this.getTypeaheadSuggestions(column, starts);\n return {\n type: \"SUCCESS_RESULT\",\n data,\n } as RpcResultSuccess;\n } else {\n const rpcService = this.#rpcServices?.find(\n (service) => service.rpcName === rpcRequest.rpcName,\n );\n if (rpcService) {\n return rpcService.service({\n ...rpcRequest,\n context: {\n type: \"VIEWPORT_CONTEXT\",\n viewPortId: this.viewport,\n },\n });\n } else {\n throw Error(\n `[TickingArrayDataSource] no service to handle RPC request ${rpcRequest.rpcName}`,\n );\n }\n }\n }\n\n async menuRpcCall(\n rpcRequest: Omit<VuuRpcMenuRequest, \"vpId\">,\n ): Promise<VuuRpcMenuResponse> {\n const rpcService = this.#rpcMenuServices?.find(\n (service) => service.rpcName === rpcRequest.rpcName,\n );\n\n if (rpcService) {\n return rpcService.service({\n ...rpcRequest,\n vpId: this.viewport,\n } as VuuRpcMenuRequest);\n } else {\n throw Error(\n `[TickingArrayDataSource] menuRpcCall no service for ${rpcRequest.rpcName}`,\n );\n }\n }\n\n getTypeaheadSuggestions(column: string, pattern?: string): Promise<string[]> {\n if (this.#table) {\n const columnIndex = this.columnMap[column];\n if (columnIndex === undefined) {\n console.warn(\n `[TickingArrayDataSource] getTypeaheadSuggestions. No column ${column}`,\n );\n return Promise.resolve([]);\n } else {\n return makeSuggestions(this.currentData, columnIndex, pattern);\n }\n } else {\n throw Error(\n \"cannot call getTypeaheadSuggestions on TickingDataSource if table has not been provided\",\n );\n }\n }\n\n get visualLink() {\n return this._config.visualLink;\n }\n\n set visualLink(visualLink: LinkDescriptorWithLabel | undefined) {\n this._config = {\n ...this._config,\n visualLink,\n };\n\n if (visualLink) {\n const {\n parentClientVpId,\n link: { fromColumn, toColumn },\n } = visualLink;\n\n if (this.viewport) {\n this.#visualLinkService?.({\n childVpId: this.viewport,\n childColumnName: fromColumn,\n type: \"CREATE_VISUAL_LINK\",\n parentVpId: parentClientVpId,\n parentColumnName: toColumn,\n }).then((response) => {\n this.emit(\n \"visual-link-created\",\n response as DataSourceVisualLinkCreatedMessage,\n );\n });\n }\n } else {\n this.#visualLinkService?.({\n childVpId: this.viewport,\n type: \"REMOVE_VISUAL_LINK\",\n }).then((/* response */) => {\n this.emit(\"visual-link-removed\");\n });\n }\n }\n\n freeze() {\n super.freeze();\n }\n\n unfreeze() {\n super.unfreeze();\n }\n}\n"],"names":["ArrayDataSource","uuid","isRpcSuccess","StaleUpdateError","isTypeaheadRequest","makeSuggestions"],"mappings":"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"}