@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.
@@ -1,5 +1,6 @@
1
1
  import { ArrayDataSource } from '@vuu-ui/vuu-data-local';
2
- import { isRpcSuccess, isInlineEditingSession, isTypeaheadRequest, uuid } from '@vuu-ui/vuu-utils';
2
+ import { isRpcSuccess, isTypeaheadRequest, uuid } from '@vuu-ui/vuu-utils';
3
+ import { StaleUpdateError } from '@vuu-ui/vuu-utils2';
3
4
  import { makeSuggestions } from './makeSuggestions.js';
4
5
 
5
6
  var __defProp = Object.defineProperty;
@@ -12,14 +13,13 @@ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot
12
13
  var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), member.get(obj));
13
14
  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);
14
15
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
15
- var _menuRpcServices, _pendingVisualLink, _rpcMenuServices, _rpcServices, _sessionTables, _sessionDataSource, _table, _selectionLinkSubscribers, _visualLinkService, _getVisualLinks, _vuuModule;
16
- class TickingArrayDataSource extends ArrayDataSource {
16
+ var _menuRpcServices, _pendingVisualLink, _rpcMenuServices, _rpcServices, _sourceTableDataSource, _table, _selectionLinkSubscribers, _visualLinkService, _getVisualLinks, _vuuModule;
17
+ const _TickingArrayDataSource = class _TickingArrayDataSource extends ArrayDataSource {
17
18
  constructor({
18
19
  data,
19
20
  getVisualLinks,
20
21
  rpcServices,
21
22
  rpcMenuServices,
22
- sessionTables,
23
23
  table,
24
24
  menu,
25
25
  visualLink,
@@ -39,9 +39,7 @@ class TickingArrayDataSource extends ArrayDataSource {
39
39
  __privateAdd(this, _pendingVisualLink);
40
40
  __privateAdd(this, _rpcMenuServices);
41
41
  __privateAdd(this, _rpcServices);
42
- // A reference to session tables hosted within client side module
43
- __privateAdd(this, _sessionTables);
44
- __privateAdd(this, _sessionDataSource);
42
+ __privateAdd(this, _sourceTableDataSource);
45
43
  __privateAdd(this, _table);
46
44
  __privateAdd(this, _selectionLinkSubscribers);
47
45
  __privateAdd(this, _visualLinkService);
@@ -52,18 +50,10 @@ class TickingArrayDataSource extends ArrayDataSource {
52
50
  this.updateRow(row, columnName);
53
51
  } else if (sessionId) {
54
52
  console.warn("THIS IS NEVER EXPECTED TO HAPPEN");
55
- } else if (__privateGet(this, _sessionDataSource)) ; else {
53
+ } else {
56
54
  this.updateRow(row, columnName);
57
55
  }
58
56
  });
59
- __publicField(this, "handleSessionMessage", (msg) => {
60
- if (msg.type === "subscribed") ; else if (msg.type === "viewport-update") {
61
- if (msg.size !== void 0 && msg.size !== this.size) {
62
- this.emit("resize", msg.size);
63
- }
64
- this.clientCallback?.(msg);
65
- }
66
- });
67
57
  __publicField(this, "addRow", async (rowData = {}) => {
68
58
  const keyColumn = this.tableSchema.key;
69
59
  const rowKey = rowData[keyColumn] ?? uuid();
@@ -82,8 +72,7 @@ class TickingArrayDataSource extends ArrayDataSource {
82
72
  return response?.errorMessage ?? "addRow failed";
83
73
  });
84
74
  __publicField(this, "deleteRow", async (key, mode = "hard") => {
85
- const rpcHost = __privateGet(this, _sessionDataSource) ?? this;
86
- const response = await rpcHost.rpcRequest?.({
75
+ const response = await this.rpcRequest({
87
76
  type: "RPC_REQUEST",
88
77
  rpcName: "deleteRow",
89
78
  params: { key, mode }
@@ -94,8 +83,7 @@ class TickingArrayDataSource extends ArrayDataSource {
94
83
  return response?.errorMessage ?? "deleteRow failed";
95
84
  });
96
85
  __publicField(this, "deleteSelectedRows", async (mode = "soft") => {
97
- const rpcHost = __privateGet(this, _sessionDataSource) ?? this;
98
- const response = await rpcHost.rpcRequest?.({
86
+ const response = await this.rpcRequest({
99
87
  type: "RPC_REQUEST",
100
88
  rpcName: "deleteSelectedRows",
101
89
  params: { mode }
@@ -106,8 +94,7 @@ class TickingArrayDataSource extends ArrayDataSource {
106
94
  };
107
95
  });
108
96
  __publicField(this, "undoRowChange", async (key) => {
109
- const rpcHost = __privateGet(this, _sessionDataSource) ?? this;
110
- const response = await rpcHost.rpcRequest?.({
97
+ const response = await this.rpcRequest({
111
98
  type: "RPC_REQUEST",
112
99
  rpcName: "undoRowChange",
113
100
  params: { key }
@@ -118,7 +105,6 @@ class TickingArrayDataSource extends ArrayDataSource {
118
105
  __privateSet(this, _rpcMenuServices, rpcMenuServices);
119
106
  __privateSet(this, _pendingVisualLink, visualLink);
120
107
  __privateSet(this, _rpcServices, rpcServices);
121
- __privateSet(this, _sessionTables, sessionTables);
122
108
  __privateSet(this, _table, table);
123
109
  __privateSet(this, _visualLinkService, visualLinkService);
124
110
  __privateSet(this, _getVisualLinks, getVisualLinks);
@@ -142,15 +128,6 @@ class TickingArrayDataSource extends ArrayDataSource {
142
128
  super.unsubscribe();
143
129
  __privateSet(this, _table, void 0);
144
130
  }
145
- set range(range) {
146
- super.range = range;
147
- if (__privateGet(this, _sessionDataSource)) {
148
- __privateGet(this, _sessionDataSource).range = range;
149
- }
150
- }
151
- get range() {
152
- return super.range;
153
- }
154
131
  set links(links) {
155
132
  super.links = links;
156
133
  }
@@ -161,33 +138,8 @@ class TickingArrayDataSource extends ArrayDataSource {
161
138
  getSelectedRowIds() {
162
139
  return Array.from(this.selectedRows);
163
140
  }
164
- /**
165
- * Suppress row flushes from the source datasource while a session is active.
166
- *
167
- * `updateRowWithSessionCheck` already blocks individual row updates arriving
168
- * via the table's "update" event. However, `sendRowsToClient` can also be
169
- * reached through other paths that bypass that handler:
170
- * - `setRange` (user scrolls the viewport)
171
- * - config changes (filter / sort / group-by)
172
- * - row inserts into the backing table
173
- *
174
- * Without this guard those paths would push source-table rows to the
175
- * client and overwrite the edited session view.
176
- */
177
- sendRowsToClient(forceFullRefresh = false, row) {
178
- if (__privateGet(this, _sessionDataSource)) {
179
- console.warn(
180
- `[TickingArrayDataSource] sendRowsToClient suppressed during active edit session (forceFullRefresh=${forceFullRefresh}, ${row ? `rowKey=${row[6]}` : "full batch - likely setRange/scroll"})`
181
- );
182
- return;
183
- }
184
- super.sendRowsToClient(forceFullRefresh, row);
185
- }
186
- select(selectRequest) {
187
- super.select(selectRequest);
188
- if (__privateGet(this, _sessionDataSource)) {
189
- __privateGet(this, _sessionDataSource).select(selectRequest);
190
- }
141
+ isSessionDataSourceOf(dataSource) {
142
+ return __privateGet(this, _sourceTableDataSource) === dataSource;
191
143
  }
192
144
  async createSessionDataSource(copyOption) {
193
145
  const rpcResponse = await this?.rpcRequest?.({
@@ -197,58 +149,24 @@ class TickingArrayDataSource extends ArrayDataSource {
197
149
  });
198
150
  if (isRpcSuccess(rpcResponse)) {
199
151
  const { table: sessionTable } = rpcResponse.data;
200
- return __privateGet(this, _vuuModule)?.createDataSource(
152
+ const columns = this.config.columns.includes("vuu_action") ? this.config.columns : this.config.columns.concat("vuu_action");
153
+ const sessionDataSource = __privateGet(this, _vuuModule)?.createDataSource(
201
154
  sessionTable.table,
202
155
  sessionTable.table,
203
- this.config
204
- );
205
- } else {
206
- throw Error(
207
- `[TickingArrayDataSource] createSessionDataSource ${rpcResponse?.errorMessage}`
156
+ { ...this.config, columns }
208
157
  );
209
- }
210
- }
211
- async beginEditSession(editSessionMode = "inline-all-rows") {
212
- const rpcResponse = await this?.rpcRequest?.({
213
- type: "RPC_REQUEST",
214
- rpcName: "beginEditSession",
215
- params: {
216
- editSessionMode
217
- }
218
- });
219
- if (isRpcSuccess(rpcResponse)) {
220
- const { table: sessionTable } = rpcResponse.data;
221
- if (isInlineEditingSession(editSessionMode)) {
222
- __privateSet(this, _sessionDataSource, __privateGet(this, _vuuModule)?.createDataSource(
223
- sessionTable.table,
224
- sessionTable.table,
225
- this.config
226
- ));
227
- __privateGet(this, _sessionDataSource)?.subscribe(
228
- {
229
- range: this.range
230
- },
231
- this.handleSessionMessage
232
- );
233
- } else {
234
- return __privateGet(this, _vuuModule)?.createDataSource(
235
- sessionTable.table,
236
- sessionTable.table,
237
- this.config
238
- );
158
+ if (sessionDataSource instanceof _TickingArrayDataSource) {
159
+ __privateSet(sessionDataSource, _sourceTableDataSource, this);
239
160
  }
161
+ return sessionDataSource;
240
162
  } else {
241
163
  throw Error(
242
- `[VuuDataSource] beginEditSession ${rpcResponse.errorMessage}`
164
+ `[TickingArrayDataSource] createSessionDataSource ${rpcResponse?.errorMessage}`
243
165
  );
244
166
  }
245
167
  }
246
168
  async editCell(key, column, data) {
247
- console.log(
248
- `[VuuDataSource] editCell ${__privateGet(this, _sessionDataSource)?.viewport} rowKey ${key}, column ${column}, value ${data}`
249
- );
250
- const rpcHost = __privateGet(this, _sessionDataSource) ?? this;
251
- return rpcHost.rpcRequest?.({
169
+ return this.rpcRequest({
252
170
  type: "RPC_REQUEST",
253
171
  rpcName: "editCell",
254
172
  params: {
@@ -258,26 +176,31 @@ class TickingArrayDataSource extends ArrayDataSource {
258
176
  }
259
177
  });
260
178
  }
179
+ set columns(columns) {
180
+ super.columns = columns;
181
+ }
182
+ get columns() {
183
+ return super.columns;
184
+ }
261
185
  async endEditSession(saveChanges = false) {
262
186
  const type = "RPC_REQUEST";
263
187
  const rpcName = "endEditSession";
264
- const sessionDataSource = __privateGet(this, _sessionDataSource);
265
- const rpcHost = sessionDataSource ?? this;
266
- if (sessionDataSource) {
267
- __privateSet(this, _sessionDataSource, void 0);
268
- }
269
- const rpcResponse = await rpcHost.rpcRequest?.(
188
+ const rpcResponse = await this.rpcRequest(
270
189
  saveChanges ? { type, rpcName, params: { save: true } } : { type, rpcName, params: {} }
271
190
  );
272
191
  if (isRpcSuccess(rpcResponse)) {
273
- sessionDataSource?.unsubscribe();
274
- this.sendRowsToClient(true);
192
+ const sourceTableDataSource = __privateGet(this, _sourceTableDataSource);
193
+ if (sourceTableDataSource) {
194
+ __privateSet(this, _sourceTableDataSource, void 0);
195
+ this.unsubscribe();
196
+ } else {
197
+ this.sendRowsToClient(true);
198
+ }
275
199
  } else {
276
200
  if (rpcResponse?.errorMessage === "stale update") {
277
- sessionDataSource?.unsubscribe();
278
- this.sendRowsToClient(true);
201
+ throw new StaleUpdateError(rpcResponse.errorMessage);
279
202
  } else {
280
- throw Error("unknown error");
203
+ throw Error(rpcResponse?.errorMessage ?? "endEditSession failed");
281
204
  }
282
205
  }
283
206
  }
@@ -385,18 +308,18 @@ class TickingArrayDataSource extends ArrayDataSource {
385
308
  unfreeze() {
386
309
  super.unfreeze();
387
310
  }
388
- }
311
+ };
389
312
  _menuRpcServices = new WeakMap();
390
313
  _pendingVisualLink = new WeakMap();
391
314
  _rpcMenuServices = new WeakMap();
392
315
  _rpcServices = new WeakMap();
393
- _sessionTables = new WeakMap();
394
- _sessionDataSource = new WeakMap();
316
+ _sourceTableDataSource = new WeakMap();
395
317
  _table = new WeakMap();
396
318
  _selectionLinkSubscribers = new WeakMap();
397
319
  _visualLinkService = new WeakMap();
398
320
  _getVisualLinks = new WeakMap();
399
321
  _vuuModule = new WeakMap();
322
+ let TickingArrayDataSource = _TickingArrayDataSource;
400
323
 
401
324
  export { TickingArrayDataSource };
402
325
  //# 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":[],"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":[],"mappings":"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"}