@vuu-ui/vuu-data-test 2.1.4 → 2.1.6
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.
- package/cjs/SessionTable.js +8 -0
- package/cjs/SessionTable.js.map +1 -1
- package/cjs/TickingArrayDataSource.js +100 -18
- package/cjs/TickingArrayDataSource.js.map +1 -1
- package/cjs/core/module/VuuModule.js +159 -133
- package/cjs/core/module/VuuModule.js.map +1 -1
- package/cjs/simul/SimulModule.js +3 -3
- package/cjs/simul/SimulModule.js.map +1 -1
- package/esm/SessionTable.js +8 -1
- package/esm/SessionTable.js.map +1 -1
- package/esm/TickingArrayDataSource.js +101 -19
- package/esm/TickingArrayDataSource.js.map +1 -1
- package/esm/core/module/VuuModule.js +161 -135
- package/esm/core/module/VuuModule.js.map +1 -1
- package/esm/simul/SimulModule.js +3 -3
- package/esm/simul/SimulModule.js.map +1 -1
- package/package.json +6 -6
- package/types/SessionTable.d.ts +1 -0
- package/types/TickingArrayDataSource.d.ts +10 -4
- package/types/core/module/VuuModule.d.ts +11 -15
|
@@ -18,6 +18,16 @@ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read fr
|
|
|
18
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);
|
|
19
19
|
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
|
|
20
20
|
var _name, _runtimeVisualLinks, _sessionTableMap, _tableServices, _subscriptionMap, _moduleServices, _moduleMenuServices;
|
|
21
|
+
const assertUpdateIsValid = (schema, column, data) => {
|
|
22
|
+
const col = schema.columns.find((col2) => col2.name === column);
|
|
23
|
+
if (col) {
|
|
24
|
+
console.log(`data type ${col.serverDataType} data ${data}`);
|
|
25
|
+
} else {
|
|
26
|
+
throw Error(
|
|
27
|
+
`schema for table ${schema.table.table} does not include column ${column}`
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
21
31
|
class VuuModule {
|
|
22
32
|
constructor(name) {
|
|
23
33
|
__privateAdd(this, _name);
|
|
@@ -103,6 +113,7 @@ class VuuModule {
|
|
|
103
113
|
const columnDescriptors = this.getColumnDescriptors(tableName);
|
|
104
114
|
const table = this.tables[tableName];
|
|
105
115
|
const sessionTable = __privateGet(this, _sessionTableMap)[tableName];
|
|
116
|
+
const vuuModule = this;
|
|
106
117
|
const dataSource = new TickingArrayDataSource.TickingArrayDataSource({
|
|
107
118
|
...config,
|
|
108
119
|
columnDescriptors,
|
|
@@ -114,7 +125,8 @@ class VuuModule {
|
|
|
114
125
|
rpcMenuServices: this.getMenuServices(tableName),
|
|
115
126
|
sessionTables: __privateGet(this, _sessionTableMap),
|
|
116
127
|
viewport,
|
|
117
|
-
visualLinkService: this.visualLinkService
|
|
128
|
+
visualLinkService: this.visualLinkService,
|
|
129
|
+
vuuModule
|
|
118
130
|
});
|
|
119
131
|
dataSource.on("unsubscribed", this.unregisterViewport);
|
|
120
132
|
const existingSubscriptions = __privateGet(this, _subscriptionMap).get(tableName);
|
|
@@ -171,11 +183,20 @@ class VuuModule {
|
|
|
171
183
|
}
|
|
172
184
|
}
|
|
173
185
|
if (targetTable) {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
186
|
+
try {
|
|
187
|
+
assertUpdateIsValid(targetTable.schema, column, data);
|
|
188
|
+
targetTable.update(key, column, data);
|
|
189
|
+
return {
|
|
190
|
+
type: "SUCCESS_RESULT",
|
|
191
|
+
data: void 0
|
|
192
|
+
};
|
|
193
|
+
} catch (e) {
|
|
194
|
+
const { message } = e;
|
|
195
|
+
return {
|
|
196
|
+
type: "ERROR_RESULT",
|
|
197
|
+
errorMessage: message
|
|
198
|
+
};
|
|
199
|
+
}
|
|
179
200
|
} else {
|
|
180
201
|
throw Error("[VuuModule] editCell unable to find table for dataSource");
|
|
181
202
|
}
|
|
@@ -183,30 +204,91 @@ class VuuModule {
|
|
|
183
204
|
throw Error(`[VuuModule] editCell invalid rpc type`);
|
|
184
205
|
}
|
|
185
206
|
});
|
|
186
|
-
__publicField(this, "
|
|
207
|
+
__publicField(this, "beginEditSessionMenuHandler", async ({
|
|
208
|
+
rpcName,
|
|
209
|
+
type,
|
|
210
|
+
vpId
|
|
211
|
+
}) => {
|
|
212
|
+
if (type === "VIEW_PORT_MENUS_SELECT_RPC") {
|
|
213
|
+
console.log(`rpcName ${rpcName}`);
|
|
214
|
+
const result = await this.beginEditSession({
|
|
215
|
+
context: {
|
|
216
|
+
type: "VIEWPORT_CONTEXT",
|
|
217
|
+
viewPortId: vpId
|
|
218
|
+
},
|
|
219
|
+
params: {
|
|
220
|
+
editSessionMode: "selected-rows"
|
|
221
|
+
},
|
|
222
|
+
rpcName,
|
|
223
|
+
type: "RPC_REQUEST"
|
|
224
|
+
});
|
|
225
|
+
if (vuuUtils.isRpcSuccess(result)) {
|
|
226
|
+
const { table } = result.data;
|
|
227
|
+
return {
|
|
228
|
+
type: "VIEW_PORT_MENU_RESP",
|
|
229
|
+
rpcName,
|
|
230
|
+
action: {
|
|
231
|
+
renderComponent: "grid",
|
|
232
|
+
type: "OPEN_DIALOG_ACTION",
|
|
233
|
+
table
|
|
234
|
+
},
|
|
235
|
+
vpId
|
|
236
|
+
};
|
|
237
|
+
} else {
|
|
238
|
+
return {
|
|
239
|
+
error: result.errorMessage,
|
|
240
|
+
rpcName,
|
|
241
|
+
type: "VIEW_PORT_MENU_REJ",
|
|
242
|
+
vpId
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
} else {
|
|
246
|
+
return {
|
|
247
|
+
error: "no can do",
|
|
248
|
+
rpcName,
|
|
249
|
+
type: "VIEW_PORT_MENU_REJ",
|
|
250
|
+
vpId
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
});
|
|
254
|
+
__publicField(this, "beginEditSession", async (rpcRequest) => {
|
|
187
255
|
if (rpcRequest.context.type === "VIEWPORT_CONTEXT") {
|
|
188
256
|
const { viewPortId } = rpcRequest.context;
|
|
257
|
+
const { editSessionMode = "all-rows" } = rpcRequest.params;
|
|
189
258
|
const subscription = this.getSubscriptionByViewport(viewPortId);
|
|
190
|
-
const {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
if (dataTable) {
|
|
259
|
+
const { dataSource } = subscription;
|
|
260
|
+
const { table: vuuTable } = dataSource;
|
|
261
|
+
if (vuuTable) {
|
|
262
|
+
const sourceTable = this.tables[vuuTable.table];
|
|
263
|
+
if (sourceTable) {
|
|
196
264
|
const sessionTableName = `session-${vuuUtils.uuid()}`;
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
265
|
+
try {
|
|
266
|
+
const sessionTable = this.createSessionTable(
|
|
267
|
+
sourceTable,
|
|
268
|
+
sessionTableName,
|
|
269
|
+
editSessionMode,
|
|
270
|
+
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
271
|
+
// @ts-ignore
|
|
272
|
+
dataSource
|
|
273
|
+
);
|
|
274
|
+
__privateGet(this, _sessionTableMap)[sessionTableName] = sessionTable;
|
|
275
|
+
subscription.sessionTableName = sessionTableName;
|
|
276
|
+
return {
|
|
277
|
+
data: {
|
|
278
|
+
renderComponent: "inline-form",
|
|
279
|
+
table: {
|
|
280
|
+
module: vuuTable.module,
|
|
281
|
+
table: sessionTableName
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
type: "SUCCESS_RESULT"
|
|
285
|
+
};
|
|
286
|
+
} catch (e) {
|
|
287
|
+
return {
|
|
288
|
+
type: "ERROR_RESULT",
|
|
289
|
+
errorMessage: e.message
|
|
290
|
+
};
|
|
291
|
+
}
|
|
210
292
|
}
|
|
211
293
|
}
|
|
212
294
|
} else {
|
|
@@ -217,28 +299,35 @@ class VuuModule {
|
|
|
217
299
|
errorMessage: "not implemented yet"
|
|
218
300
|
};
|
|
219
301
|
});
|
|
220
|
-
__publicField(this, "
|
|
302
|
+
__publicField(this, "endEditSession", async (rpcRequest) => {
|
|
221
303
|
if (rpcRequest.context.type === "VIEWPORT_CONTEXT") {
|
|
222
304
|
const { viewPortId } = rpcRequest.context;
|
|
223
305
|
const sessionTable = __privateGet(this, _sessionTableMap)[viewPortId];
|
|
224
306
|
delete __privateGet(this, _sessionTableMap)[viewPortId];
|
|
225
307
|
const { dataSource } = this.getSubscriptionByViewport(viewPortId);
|
|
226
308
|
if (dataSource.table) {
|
|
227
|
-
const
|
|
309
|
+
const sourceTable = this.tables[dataSource.table.table];
|
|
228
310
|
if (rpcRequest.params.save === true) {
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
311
|
+
if (SessionTable.isProxySessionTable(sessionTable)) {
|
|
312
|
+
const updates = sessionTable.getSessionUpdates();
|
|
313
|
+
updates.forEach((rowUpdates, key) => {
|
|
314
|
+
const { cellUpdates, lastUpdateTimestamp } = rowUpdates;
|
|
315
|
+
const currentRow = sourceTable.findByKey(key);
|
|
316
|
+
const lastUpdateTimestampOnTable = currentRow[sourceTable.map.vuuUpdatedTimestamp];
|
|
317
|
+
if (lastUpdateTimestamp !== lastUpdateTimestampOnTable) {
|
|
318
|
+
console.log("Houston WE HAVE a PROBLEM");
|
|
319
|
+
}
|
|
320
|
+
Object.entries(cellUpdates).forEach(([column, value]) => {
|
|
321
|
+
sourceTable.update(key, column, value);
|
|
322
|
+
});
|
|
239
323
|
});
|
|
240
|
-
|
|
241
|
-
|
|
324
|
+
updates.clear();
|
|
325
|
+
} else {
|
|
326
|
+
for (let i = 0; i < sessionTable.data.length; i++) {
|
|
327
|
+
const newRow = sessionTable.data[i];
|
|
328
|
+
sourceTable.updateRow(newRow);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
242
331
|
}
|
|
243
332
|
return {
|
|
244
333
|
type: "SUCCESS_RESULT",
|
|
@@ -251,60 +340,6 @@ class VuuModule {
|
|
|
251
340
|
throw Error(`[VuuModule] endEditSession invalid rpc type`);
|
|
252
341
|
}
|
|
253
342
|
});
|
|
254
|
-
__publicField(this, "beginBulkEdit", async (rpcRequest) => {
|
|
255
|
-
if (rpcRequest.localDataParameters) {
|
|
256
|
-
const { localDataParameters, vpId } = rpcRequest;
|
|
257
|
-
const selectedRowIds = localDataParameters.selectedRowIds;
|
|
258
|
-
const table = localDataParameters.table;
|
|
259
|
-
if (selectedRowIds && table) {
|
|
260
|
-
const dataTable = this.tables[table.table];
|
|
261
|
-
if (dataTable) {
|
|
262
|
-
const sessionTable = this.createSessionTableFromSelectedRows(
|
|
263
|
-
dataTable,
|
|
264
|
-
selectedRowIds
|
|
265
|
-
);
|
|
266
|
-
const sessionTableName = `session-${vuuUtils.uuid()}`;
|
|
267
|
-
__privateGet(this, _sessionTableMap)[sessionTableName] = sessionTable;
|
|
268
|
-
return {
|
|
269
|
-
action: {
|
|
270
|
-
renderComponent: "grid",
|
|
271
|
-
table: {
|
|
272
|
-
module: table.module,
|
|
273
|
-
table: sessionTableName
|
|
274
|
-
},
|
|
275
|
-
tableSchema: dataTable.schema,
|
|
276
|
-
type: "OPEN_DIALOG_ACTION"
|
|
277
|
-
},
|
|
278
|
-
rpcName: "VP_BULK_EDIT_BEGIN_RPC",
|
|
279
|
-
type: "VIEW_PORT_MENU_RESP",
|
|
280
|
-
vpId
|
|
281
|
-
};
|
|
282
|
-
} else {
|
|
283
|
-
return {
|
|
284
|
-
action: { type: "NO_ACTION" },
|
|
285
|
-
clientViewportId: "na",
|
|
286
|
-
error: "No Table found",
|
|
287
|
-
rpcName: "VP_BULK_EDIT_REJECT",
|
|
288
|
-
type: "VIEW_PORT_MENU_REJ",
|
|
289
|
-
vpId
|
|
290
|
-
};
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
throw Error("openBulkEdits expects Table and selectedRowIds");
|
|
295
|
-
});
|
|
296
|
-
__publicField(this, "endEditSession", async (rpcRequest) => {
|
|
297
|
-
if (rpcRequest.context.type === "VIEWPORT_CONTEXT") {
|
|
298
|
-
const { viewPortId } = rpcRequest.context;
|
|
299
|
-
delete __privateGet(this, _sessionTableMap)[viewPortId];
|
|
300
|
-
return {
|
|
301
|
-
type: "SUCCESS_RESULT",
|
|
302
|
-
data: void 0
|
|
303
|
-
};
|
|
304
|
-
} else {
|
|
305
|
-
throw Error(`[VuuModule] endEditSession invalid rpc type`);
|
|
306
|
-
}
|
|
307
|
-
});
|
|
308
343
|
// Bulk-edit with input in session table
|
|
309
344
|
__publicField(this, "applyBulkEdits", async (rpcRequest) => {
|
|
310
345
|
if (rpcRequest.context.type === "VIEWPORT_CONTEXT") {
|
|
@@ -328,31 +363,6 @@ class VuuModule {
|
|
|
328
363
|
throw Error(`[VuuModule] applyBulkEdits invalid rpc type`);
|
|
329
364
|
}
|
|
330
365
|
});
|
|
331
|
-
// Save session table data to main table
|
|
332
|
-
__publicField(this, "saveBulkEdits", async (rpcRequest) => {
|
|
333
|
-
if (rpcRequest.context.type === "VIEWPORT_CONTEXT") {
|
|
334
|
-
const { viewPortId } = rpcRequest.context;
|
|
335
|
-
const sessionTable = this.getSessionTable(viewPortId);
|
|
336
|
-
const { table } = sessionTable.schema.table;
|
|
337
|
-
const baseTable = this.tables[table];
|
|
338
|
-
if (baseTable) {
|
|
339
|
-
for (let i = 0; i < sessionTable.data.length; i++) {
|
|
340
|
-
const newRow = sessionTable.data[i];
|
|
341
|
-
baseTable.updateRow(newRow);
|
|
342
|
-
}
|
|
343
|
-
return {
|
|
344
|
-
type: "SUCCESS_RESULT",
|
|
345
|
-
data: void 0
|
|
346
|
-
};
|
|
347
|
-
} else {
|
|
348
|
-
throw Error(
|
|
349
|
-
`[VuuModule] saveBulkEdits session base table ${table} not found for session table ${sessionTable.name}`
|
|
350
|
-
);
|
|
351
|
-
}
|
|
352
|
-
} else {
|
|
353
|
-
throw Error("[BasketModule] createNewBasket invalid request type");
|
|
354
|
-
}
|
|
355
|
-
});
|
|
356
366
|
/**
|
|
357
367
|
* These services are available on any table. The client must configure the appropriate
|
|
358
368
|
* menu item(s) on Table(s). The services to implement these RPC calls are built-in to
|
|
@@ -364,21 +374,13 @@ class VuuModule {
|
|
|
364
374
|
service: this.applyBulkEdits
|
|
365
375
|
},
|
|
366
376
|
{
|
|
367
|
-
rpcName: "
|
|
368
|
-
service: this.
|
|
377
|
+
rpcName: "beginEditSession",
|
|
378
|
+
service: this.beginEditSession
|
|
369
379
|
},
|
|
370
380
|
{
|
|
371
|
-
rpcName: "
|
|
381
|
+
rpcName: "endEditSession",
|
|
372
382
|
service: this.endEditSession
|
|
373
383
|
},
|
|
374
|
-
{
|
|
375
|
-
rpcName: "ENTER_EDIT_MODE",
|
|
376
|
-
service: this.enterEditMode
|
|
377
|
-
},
|
|
378
|
-
{
|
|
379
|
-
rpcName: "EXIT_EDIT_MODE",
|
|
380
|
-
service: this.exitEditMode
|
|
381
|
-
},
|
|
382
384
|
{
|
|
383
385
|
rpcName: "editCell",
|
|
384
386
|
service: this.editCell
|
|
@@ -391,8 +393,8 @@ class VuuModule {
|
|
|
391
393
|
*/
|
|
392
394
|
__privateAdd(this, _moduleMenuServices, [
|
|
393
395
|
{
|
|
394
|
-
rpcName: "
|
|
395
|
-
service: this.
|
|
396
|
+
rpcName: "beginEditSession",
|
|
397
|
+
service: this.beginEditSessionMenuHandler
|
|
396
398
|
}
|
|
397
399
|
]);
|
|
398
400
|
__privateSet(this, _name, name);
|
|
@@ -468,7 +470,31 @@ class VuuModule {
|
|
|
468
470
|
);
|
|
469
471
|
}
|
|
470
472
|
}
|
|
471
|
-
|
|
473
|
+
createSessionTable(sourceTable, sessionTableName, editSessionMode = "all-rows", dataSource) {
|
|
474
|
+
if (editSessionMode === "all-rows") {
|
|
475
|
+
return this.createSessionTableWithAllRows(sourceTable, sessionTableName);
|
|
476
|
+
} else if (editSessionMode === "selected-rows") {
|
|
477
|
+
return this.createSessionTableFromSelectedRows(
|
|
478
|
+
sourceTable,
|
|
479
|
+
sessionTableName,
|
|
480
|
+
dataSource
|
|
481
|
+
);
|
|
482
|
+
} else if (editSessionMode === "empty-session-table") {
|
|
483
|
+
return this.createEmptySessionTable(sourceTable);
|
|
484
|
+
} else {
|
|
485
|
+
throw Error(
|
|
486
|
+
`[VuuModule] createSessionTable, invalid editSessionMode ${editSessionMode}`
|
|
487
|
+
);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
createSessionTableWithAllRows(sourceTable, sessionTableName) {
|
|
491
|
+
return SessionTable.SessionTable(sourceTable, sessionTableName);
|
|
492
|
+
}
|
|
493
|
+
createEmptySessionTable({ schema }) {
|
|
494
|
+
return new Table.Table(schema, [], Table.buildDataColumnMapFromSchema(schema));
|
|
495
|
+
}
|
|
496
|
+
createSessionTableFromSelectedRows({ data, map, schema }, sessionTableName, dataSource) {
|
|
497
|
+
const selectedRowIds = dataSource.getSelectedRowIds();
|
|
472
498
|
const keyIndex = map[schema.key];
|
|
473
499
|
const sessionData = [];
|
|
474
500
|
for (let i = 0; i < selectedRowIds.length; i++) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VuuModule.js","sources":["../../../../../packages/vuu-data-test/src/core/module/VuuModule.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceConfig,\n DataSourceVisualLinkCreatedMessage,\n OpenDialogActionWithSchema,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuMenu,\n VuuRowDataItemType,\n VuuTable,\n VuuLink,\n LinkDescriptorWithLabel,\n VuuRpcMenuResponse,\n VuuCreateVisualLink,\n VuuRemoveVisualLink,\n VuuRpcServiceRequest,\n RpcResultSuccess,\n RpcResultError,\n VuuRpcMenuRequest,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { uuid } from \"@vuu-ui/vuu-utils\";\nimport { Table, buildDataColumnMapFromSchema } from \"../../Table\";\nimport { SessionTable } from \"../../SessionTable\";\nimport { TickingArrayDataSource } from \"../../TickingArrayDataSource\";\nimport { RuntimeVisualLink } from \"../../RuntimeVisualLink\";\nimport moduleContainer from \"./ModuleContainer\";\n\nexport interface IVuuModule<T extends string = string> {\n createDataSource: (tableName: T) => DataSource;\n}\n\nexport type SessionTableMap = Record<string, SessionTable | Table>;\n\nexport type LocalDataMenuParameters = {\n selectedRowIds: string[];\n table: VuuTable;\n};\n\nexport type ServiceHandler = (\n rpcRequest: VuuRpcServiceRequest,\n) => Promise<RpcResultSuccess | RpcResultError>;\n\nexport type MenuServiceHandler = (\n rpcRequest: VuuRpcMenuRequest & {\n localDataParameters?: LocalDataMenuParameters;\n },\n) => Promise<VuuRpcMenuResponse>;\n\nexport type RpcService = {\n rpcName: string;\n service: ServiceHandler;\n};\n\nexport type RpcMenuService = {\n rpcName: string;\n service: MenuServiceHandler;\n};\n\ntype Subscription = {\n viewportId: string;\n dataSource: DataSource;\n sessionTableName?: string;\n};\nexport abstract class VuuModule<T extends string = string>\n implements IVuuModule<T>\n{\n #name: string;\n #runtimeVisualLinks = new Map<string, RuntimeVisualLink>();\n #sessionTableMap: SessionTableMap = {};\n #tableServices: Record<T, RpcService[] | undefined> | undefined;\n #subscriptionMap: Map<string, Subscription[]> = new Map();\n\n constructor(name: string) {\n this.#name = name;\n moduleContainer.register(this);\n }\n\n protected abstract menus?: Record<T, VuuMenu | undefined> | undefined;\n protected abstract schemas: Record<T, Readonly<TableSchema>>;\n protected abstract tables: Record<T, Table>;\n protected abstract menuServices?:\n | Record<T, RpcMenuService[] | undefined>\n | undefined;\n protected abstract services?: Record<T, RpcService[] | undefined> | undefined;\n protected abstract visualLinks?: Record<T, VuuLink[] | undefined>;\n\n getTableSchema(tableName: string) {\n return this.schemas[tableName as T];\n }\n\n getTableList() {\n return Object.keys(this.tables);\n }\n\n protected unregisterViewport = (viewportId: string) => {\n for (const [tableName, subscriptions] of this.#subscriptionMap) {\n if (subscriptions[0].viewportId.toString() === viewportId) {\n this.#subscriptionMap.delete(tableName);\n } else {\n const links = subscriptions[0].dataSource.links;\n if (links) {\n for (let i = 0; i < links?.length; i++) {\n if (links[i].parentClientVpId === viewportId) {\n links.splice(i);\n }\n }\n }\n subscriptions[0].dataSource.links = links;\n }\n }\n };\n\n get name() {\n return this.#name;\n }\n\n getSubscriptionByViewport(viewportId: string) {\n for (const subscriptions of this.#subscriptionMap.values()) {\n for (const subscription of subscriptions) {\n if (subscription.viewportId === viewportId) {\n return subscription;\n }\n }\n }\n throw Error(\n `[VuuModule] getSubscriptionByViewport, no subscription found for ${viewportId}`,\n );\n }\n\n getSubscribedDataSource(vpId: string): DataSource {\n for (const subscriptions of this.#subscriptionMap.values()) {\n for (const { viewportId, dataSource } of subscriptions) {\n if (viewportId === vpId) {\n return dataSource;\n }\n }\n }\n throw Error(`getSubscribedDataSource #${vpId} not in subscriptionMap`);\n }\n\n getLinks = (\n subscriptionMap: Map<string, Subscription[]>,\n vuuLinks: VuuLink[],\n ) => {\n const visualLinks: LinkDescriptorWithLabel[] = [];\n for (let i = 0; i < vuuLinks.length; i++) {\n const subscriptions = subscriptionMap.get(vuuLinks[i].toTable);\n if (subscriptions) {\n subscriptions.forEach(({ viewportId, dataSource: { status } }) => {\n if (status !== \"suspended\") {\n const newLink: LinkDescriptorWithLabel = {\n parentClientVpId: viewportId,\n parentVpId: viewportId,\n link: vuuLinks[i],\n };\n visualLinks.push(newLink);\n }\n });\n }\n }\n return visualLinks;\n };\n\n visualLinkService = (\n message: VuuCreateVisualLink | VuuRemoveVisualLink,\n ): Promise<DataSourceVisualLinkCreatedMessage | void> =>\n new Promise((resolve) => {\n if (message.type === \"CREATE_VISUAL_LINK\") {\n const { childColumnName, childVpId, parentColumnName, parentVpId } =\n message;\n const childDataSource = this.getSubscribedDataSource(childVpId);\n const parentDataSource = this.getSubscribedDataSource(parentVpId);\n const runtimeVisualLink = new RuntimeVisualLink(\n childDataSource,\n parentDataSource,\n childColumnName,\n parentColumnName,\n );\n\n this.#runtimeVisualLinks.set(childVpId, runtimeVisualLink);\n\n resolve({\n clientViewportId: childVpId,\n colName: childColumnName,\n parentColName: parentColumnName,\n parentViewportId: parentVpId,\n type: \"vuu-link-created\",\n } as DataSourceVisualLinkCreatedMessage);\n } else {\n const runtimeVisualLink = this.#runtimeVisualLinks.get(\n message.childVpId,\n );\n if (runtimeVisualLink) {\n runtimeVisualLink.remove();\n this.#runtimeVisualLinks.delete(message.childVpId);\n } else {\n throw Error(\n `visualLinkService no visual link found for viewport #${message.childVpId}`,\n );\n }\n resolve();\n }\n });\n\n createDataSource = (\n tableName: T,\n viewport?: string,\n config?: DataSourceConfig,\n ) => {\n const getVisualLinks = (tableName: string) => {\n const linksForTable = this.visualLinks?.[tableName as T] as VuuLink[];\n return linksForTable === undefined\n ? undefined\n : this.getLinks(this.#subscriptionMap, linksForTable);\n };\n\n const columnDescriptors = this.getColumnDescriptors(tableName);\n const table = this.tables[tableName];\n const sessionTable = this.#sessionTableMap[tableName];\n\n const dataSource: DataSource = new TickingArrayDataSource({\n ...config,\n columnDescriptors,\n getVisualLinks,\n keyColumn:\n this.schemas[tableName] === undefined\n ? this.#sessionTableMap[tableName].schema.key\n : this.schemas[tableName].key,\n table: table || sessionTable,\n menu: this.menus?.[tableName],\n rpcServices: this.getServices(tableName),\n rpcMenuServices: this.getMenuServices(tableName),\n sessionTables: this.#sessionTableMap,\n viewport,\n visualLinkService: this.visualLinkService,\n });\n\n dataSource.on(\"unsubscribed\", this.unregisterViewport);\n\n const existingSubscriptions = this.#subscriptionMap.get(tableName);\n const subscription = {\n viewportId: dataSource.viewport as string,\n dataSource,\n };\n if (existingSubscriptions) {\n existingSubscriptions.push(subscription);\n } else {\n this.#subscriptionMap.set(tableName, [subscription]);\n }\n\n return dataSource;\n };\n\n getServices(tableName: T) {\n const tableServices = this.services?.[tableName];\n if (Array.isArray(tableServices)) {\n return this.#moduleServices.concat(tableServices);\n } else {\n return this.#moduleServices;\n }\n }\n\n getMenuServices(tableName: T) {\n const tableServices = this.menuServices?.[tableName];\n if (Array.isArray(tableServices)) {\n return this.#moduleMenuServices.concat(tableServices);\n } else {\n return this.#moduleMenuServices;\n }\n }\n\n protected get sessionTableMap() {\n return this.#sessionTableMap;\n }\n\n protected getSessionTable(sessionTableName: string): SessionTable;\n protected getSessionTable(\n sessionTableName: string,\n throwIfNotFound: true,\n ): SessionTable;\n protected getSessionTable(\n sessionTableName: string,\n throwIfNotFound: false,\n ): SessionTable | undefined;\n protected getSessionTable(sessionTableName: string, throwIfNotFound = true) {\n const sessionTable = this.#sessionTableMap[sessionTableName];\n if (sessionTable) {\n return sessionTable;\n } else if (throwIfNotFound) {\n throw Error(\n `getSessionTable: no session table with name ${sessionTableName}`,\n );\n }\n }\n\n protected deleteRow: ServiceHandler = async (rpcRequest) => {\n if (rpcRequest.context.type === \"VIEWPORT_CONTEXT\") {\n const { viewPortId } = rpcRequest.context;\n const { key } = rpcRequest.params;\n const sessionTable = this.getSessionTable(viewPortId, false);\n if (sessionTable) {\n sessionTable.delete(key as string);\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n } else {\n const { dataSource } = this.getSubscriptionByViewport(viewPortId);\n if (dataSource.table) {\n const table = this.tables[dataSource.table.table as T];\n if (table) {\n table.delete(key as string);\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n }\n }\n }\n }\n return {\n type: \"ERROR_RESULT\",\n errorMessage: \"something went wrong\",\n };\n };\n\n private getColumnDescriptors(tableName: T) {\n const schema =\n this.schemas[tableName] || this.getSessionTable(tableName)?.schema;\n if (schema) {\n return schema.columns;\n } else {\n throw Error(\n ` no schema found for module ${this.#name} table ${tableName}`,\n );\n }\n }\n\n private editCell: ServiceHandler = async (rpcRequest) => {\n if (rpcRequest.context.type === \"VIEWPORT_CONTEXT\") {\n const { viewPortId } = rpcRequest.context;\n const { column, data, key } = rpcRequest.params;\n let targetTable: SessionTable | Table = this.#sessionTableMap[viewPortId];\n if (!targetTable) {\n const { dataSource } = this.getSubscriptionByViewport(viewPortId);\n if (dataSource.table) {\n targetTable = this.tables[dataSource.table.table as T];\n }\n }\n if (targetTable) {\n targetTable.update(key as string, column as string, data);\n\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n } else {\n throw Error(\"[VuuModule] editCell unable to find table for dataSource\");\n }\n } else {\n throw Error(`[VuuModule] editCell invalid rpc type`);\n }\n };\n\n private enterEditMode: ServiceHandler = async (rpcRequest) => {\n if (rpcRequest.context.type === \"VIEWPORT_CONTEXT\") {\n const { viewPortId } = rpcRequest.context;\n const subscription = this.getSubscriptionByViewport(viewPortId);\n const {\n dataSource: { table },\n } = subscription;\n if (table) {\n const dataTable = this.tables[table.table as T];\n if (dataTable) {\n const sessionTableName = `session-${uuid()}`;\n const sessionTable = SessionTable(dataTable, sessionTableName);\n this.#sessionTableMap[sessionTableName] = sessionTable;\n subscription.sessionTableName = sessionTableName;\n\n return {\n data: {\n renderComponent: \"inline-form\",\n table: {\n module: table.module,\n table: sessionTableName,\n },\n },\n type: \"SUCCESS_RESULT\",\n };\n }\n }\n } else {\n throw Error(`[VuuModule] endEditSession invalid rpc type`);\n }\n\n return {\n type: \"ERROR_RESULT\",\n errorMessage: \"not implemented yet\",\n };\n };\n\n private exitEditMode: ServiceHandler = async (rpcRequest) => {\n if (rpcRequest.context.type === \"VIEWPORT_CONTEXT\") {\n const { viewPortId } = rpcRequest.context;\n // the viewport Id is the session table name\n const sessionTable = this.#sessionTableMap[viewPortId] as SessionTable;\n delete this.#sessionTableMap[viewPortId];\n const { dataSource } = this.getSubscriptionByViewport(viewPortId);\n\n if (dataSource.table) {\n const table = this.tables[dataSource.table.table as T];\n\n if (rpcRequest.params.save === true) {\n // apply changes to underlying table\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore TODO create a type for SessionTable\n const updates = sessionTable.getSessionUpdates();\n updates.forEach((rowUpdates, key) => {\n const { cellUpdates, lastUpdateTimestamp } = rowUpdates;\n const currentRow = table.findByKey(key);\n const lastUpdateTimestampOnTable =\n currentRow[table.map.vuuUpdatedTimestamp];\n if (lastUpdateTimestamp !== lastUpdateTimestampOnTable) {\n console.log(\"Houston WE HAVE a PROBLEM\");\n }\n Object.entries(cellUpdates).forEach(([column, value]) => {\n table.update(key, column, value);\n });\n });\n updates.clear();\n }\n\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n } else {\n throw Error(\"[VuuModule], exitEditMode\");\n }\n } else {\n throw Error(`[VuuModule] endEditSession invalid rpc type`);\n }\n\n // return {\n // type: \"ERROR_RESULT\",\n // errorMessage: \"not implemented yet\",\n // };\n };\n\n private beginBulkEdit: MenuServiceHandler = async (rpcRequest) => {\n if (rpcRequest.localDataParameters) {\n const { localDataParameters, vpId } = rpcRequest;\n const selectedRowIds = localDataParameters.selectedRowIds;\n const table = localDataParameters.table;\n\n if (selectedRowIds && table) {\n const dataTable = this.tables[table.table as T];\n if (dataTable) {\n const sessionTable = this.createSessionTableFromSelectedRows(\n dataTable,\n selectedRowIds,\n );\n const sessionTableName = `session-${uuid()}`;\n this.#sessionTableMap[sessionTableName] = sessionTable;\n\n return {\n action: {\n renderComponent: \"grid\",\n table: {\n module: table.module,\n table: sessionTableName,\n },\n tableSchema: dataTable.schema,\n type: \"OPEN_DIALOG_ACTION\",\n } as OpenDialogActionWithSchema,\n rpcName: \"VP_BULK_EDIT_BEGIN_RPC\",\n type: \"VIEW_PORT_MENU_RESP\",\n vpId,\n } as VuuRpcMenuResponse;\n } else {\n return {\n action: { type: \"NO_ACTION\" },\n clientViewportId: \"na\",\n error: \"No Table found\",\n rpcName: \"VP_BULK_EDIT_REJECT\",\n type: \"VIEW_PORT_MENU_REJ\",\n vpId,\n } as VuuRpcMenuResponse;\n }\n }\n }\n throw Error(\"openBulkEdits expects Table and selectedRowIds\");\n };\n\n private endEditSession: ServiceHandler = async (rpcRequest) => {\n if (rpcRequest.context.type === \"VIEWPORT_CONTEXT\") {\n const { viewPortId } = rpcRequest.context;\n delete this.#sessionTableMap[viewPortId];\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n } else {\n throw Error(`[VuuModule] endEditSession invalid rpc type`);\n }\n };\n\n // Bulk-edit with input in session table\n private applyBulkEdits: ServiceHandler = async (rpcRequest) => {\n if (rpcRequest.context.type === \"VIEWPORT_CONTEXT\") {\n const { viewPortId } = rpcRequest.context;\n const sessionTable = this.getSessionTable(viewPortId);\n for (let i = 0; i < sessionTable.data.length; i++) {\n const newRow = sessionTable.data[i];\n const { column, value } = rpcRequest.params;\n const keyIndex = sessionTable.map[sessionTable.schema.key];\n sessionTable.update(\n String(newRow[keyIndex]),\n column as string,\n value as VuuRowDataItemType,\n );\n }\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n } else {\n throw Error(`[VuuModule] applyBulkEdits invalid rpc type`);\n }\n };\n\n // Save session table data to main table\n private saveBulkEdits: ServiceHandler = async (rpcRequest) => {\n if (rpcRequest.context.type === \"VIEWPORT_CONTEXT\") {\n const { viewPortId } = rpcRequest.context;\n const sessionTable = this.getSessionTable(viewPortId);\n const { table } = sessionTable.schema.table;\n const baseTable = this.tables[table as T];\n if (baseTable) {\n for (let i = 0; i < sessionTable.data.length; i++) {\n const newRow = sessionTable.data[i];\n baseTable.updateRow(newRow);\n }\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n } else {\n throw Error(\n `[VuuModule] saveBulkEdits session base table ${table} not found for session table ${sessionTable.name}`,\n );\n }\n } else {\n throw Error(\"[BasketModule] createNewBasket invalid request type\");\n }\n };\n\n protected createSessionTableFromSelectedRows(\n { data, map, schema }: Table,\n selectedRowIds: string[],\n ) {\n const keyIndex = map[schema.key];\n const sessionData: VuuRowDataItemType[][] = [];\n for (let i = 0; i < selectedRowIds.length; i++) {\n for (let j = 0; j < data.length; j++) {\n if (data[j][keyIndex] === selectedRowIds[i]) {\n sessionData.push(data[j]);\n }\n }\n }\n return new Table(schema, sessionData, buildDataColumnMapFromSchema(schema));\n }\n\n /**\n * These services are available on any table. The client must configure the appropriate\n * menu item(s) on Table(s). The services to implement these RPC calls are built-in to\n * VuuModule\n */\n #moduleServices: RpcService[] = [\n {\n rpcName: \"VP_BULK_EDIT_COLUMN_CELLS_RPC\",\n service: this.applyBulkEdits,\n },\n {\n rpcName: \"VP_BULK_EDIT_SUBMIT_RPC\",\n service: this.saveBulkEdits,\n },\n {\n rpcName: \"VP_BULK_EDIT_END_RPC\",\n service: this.endEditSession,\n },\n {\n rpcName: \"ENTER_EDIT_MODE\",\n service: this.enterEditMode,\n },\n {\n rpcName: \"EXIT_EDIT_MODE\",\n service: this.exitEditMode,\n },\n {\n rpcName: \"editCell\",\n service: this.editCell,\n },\n ];\n\n /**\n * These services are available on any table. The client must configure the appropriate\n * menu item(s) on Table(s). The services to implement these RPC calls are built-in to\n * VuuModule\n */\n #moduleMenuServices: RpcMenuService[] = [\n {\n rpcName: \"VP_BULK_EDIT_BEGIN_RPC\",\n service: this.beginBulkEdit,\n },\n ];\n}\n"],"names":["RuntimeVisualLink","tableName","TickingArrayDataSource","uuid","SessionTable","moduleContainer","Table","buildDataColumnMapFromSchema"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,IAAA,KAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,mBAAA;AAgEO,MAAe,SAEtB,CAAA;AAAA,EAOE,YAAY,IAAc,EAAA;AAN1B,IAAA,YAAA,CAAA,IAAA,EAAA,KAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,mBAAA,sBAA0B,GAA+B,EAAA,CAAA;AACzD,IAAA,YAAA,CAAA,IAAA,EAAA,gBAAA,EAAoC,EAAC,CAAA;AACrC,IAAA,YAAA,CAAA,IAAA,EAAA,cAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,gBAAA,sBAAoD,GAAI,EAAA,CAAA;AAwBxD,IAAU,aAAA,CAAA,IAAA,EAAA,oBAAA,EAAqB,CAAC,UAAuB,KAAA;AACrD,MAAA,KAAA,MAAW,CAAC,SAAA,EAAW,aAAa,CAAA,IAAK,mBAAK,gBAAkB,CAAA,EAAA;AAC9D,QAAA,IAAI,cAAc,CAAC,CAAA,CAAE,UAAW,CAAA,QAAA,OAAe,UAAY,EAAA;AACzD,UAAK,YAAA,CAAA,IAAA,EAAA,gBAAA,CAAA,CAAiB,OAAO,SAAS,CAAA;AAAA,SACjC,MAAA;AACL,UAAA,MAAM,KAAQ,GAAA,aAAA,CAAc,CAAC,CAAA,CAAE,UAAW,CAAA,KAAA;AAC1C,UAAA,IAAI,KAAO,EAAA;AACT,YAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,KAAA,EAAO,QAAQ,CAAK,EAAA,EAAA;AACtC,cAAA,IAAI,KAAM,CAAA,CAAC,CAAE,CAAA,gBAAA,KAAqB,UAAY,EAAA;AAC5C,gBAAA,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA;AAChB;AACF;AAEF,UAAc,aAAA,CAAA,CAAC,CAAE,CAAA,UAAA,CAAW,KAAQ,GAAA,KAAA;AAAA;AACtC;AACF,KACF,CAAA;AA8BA,IAAW,aAAA,CAAA,IAAA,EAAA,UAAA,EAAA,CACT,iBACA,QACG,KAAA;AACH,MAAA,MAAM,cAAyC,EAAC;AAChD,MAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,QAAA,CAAS,QAAQ,CAAK,EAAA,EAAA;AACxC,QAAA,MAAM,gBAAgB,eAAgB,CAAA,GAAA,CAAI,QAAS,CAAA,CAAC,EAAE,OAAO,CAAA;AAC7D,QAAA,IAAI,aAAe,EAAA;AACjB,UAAc,aAAA,CAAA,OAAA,CAAQ,CAAC,EAAE,UAAA,EAAY,YAAY,EAAE,MAAA,IAAe,KAAA;AAChE,YAAA,IAAI,WAAW,WAAa,EAAA;AAC1B,cAAA,MAAM,OAAmC,GAAA;AAAA,gBACvC,gBAAkB,EAAA,UAAA;AAAA,gBAClB,UAAY,EAAA,UAAA;AAAA,gBACZ,IAAA,EAAM,SAAS,CAAC;AAAA,eAClB;AACA,cAAA,WAAA,CAAY,KAAK,OAAO,CAAA;AAAA;AAC1B,WACD,CAAA;AAAA;AACH;AAEF,MAAO,OAAA,WAAA;AAAA,KACT,CAAA;AAEA,IAAA,aAAA,CAAA,IAAA,EAAA,mBAAA,EAAoB,CAClB,OAAA,KAEA,IAAI,OAAA,CAAQ,CAAC,OAAY,KAAA;AACvB,MAAI,IAAA,OAAA,CAAQ,SAAS,oBAAsB,EAAA;AACzC,QAAA,MAAM,EAAE,eAAA,EAAiB,SAAW,EAAA,gBAAA,EAAkB,YACpD,GAAA,OAAA;AACF,QAAM,MAAA,eAAA,GAAkB,IAAK,CAAA,uBAAA,CAAwB,SAAS,CAAA;AAC9D,QAAM,MAAA,gBAAA,GAAmB,IAAK,CAAA,uBAAA,CAAwB,UAAU,CAAA;AAChE,QAAA,MAAM,oBAAoB,IAAIA,mCAAA;AAAA,UAC5B,eAAA;AAAA,UACA,gBAAA;AAAA,UACA,eAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAK,YAAA,CAAA,IAAA,EAAA,mBAAA,CAAA,CAAoB,GAAI,CAAA,SAAA,EAAW,iBAAiB,CAAA;AAEzD,QAAQ,OAAA,CAAA;AAAA,UACN,gBAAkB,EAAA,SAAA;AAAA,UAClB,OAAS,EAAA,eAAA;AAAA,UACT,aAAe,EAAA,gBAAA;AAAA,UACf,gBAAkB,EAAA,UAAA;AAAA,UAClB,IAAM,EAAA;AAAA,SAC+B,CAAA;AAAA,OAClC,MAAA;AACL,QAAM,MAAA,iBAAA,GAAoB,mBAAK,mBAAoB,CAAA,CAAA,GAAA;AAAA,UACjD,OAAQ,CAAA;AAAA,SACV;AACA,QAAA,IAAI,iBAAmB,EAAA;AACrB,UAAA,iBAAA,CAAkB,MAAO,EAAA;AACzB,UAAK,YAAA,CAAA,IAAA,EAAA,mBAAA,CAAA,CAAoB,MAAO,CAAA,OAAA,CAAQ,SAAS,CAAA;AAAA,SAC5C,MAAA;AACL,UAAM,MAAA,KAAA;AAAA,YACJ,CAAA,qDAAA,EAAwD,QAAQ,SAAS,CAAA;AAAA,WAC3E;AAAA;AAEF,QAAQ,OAAA,EAAA;AAAA;AACV,KACD,CAAA,CAAA;AAEH,IAAmB,aAAA,CAAA,IAAA,EAAA,kBAAA,EAAA,CACjB,SACA,EAAA,QAAA,EACA,MACG,KAAA;AACH,MAAM,MAAA,cAAA,GAAiB,CAACC,UAAsB,KAAA;AAC5C,QAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,WAAA,GAAcA,UAAc,CAAA;AACvD,QAAA,OAAO,kBAAkB,KACrB,CAAA,GAAA,KAAA,CAAA,GACA,KAAK,QAAS,CAAA,YAAA,CAAA,IAAA,EAAK,mBAAkB,aAAa,CAAA;AAAA,OACxD;AAEA,MAAM,MAAA,iBAAA,GAAoB,IAAK,CAAA,oBAAA,CAAqB,SAAS,CAAA;AAC7D,MAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,MAAA,CAAO,SAAS,CAAA;AACnC,MAAM,MAAA,YAAA,GAAe,YAAK,CAAA,IAAA,EAAA,gBAAA,CAAA,CAAiB,SAAS,CAAA;AAEpD,MAAM,MAAA,UAAA,GAAyB,IAAIC,6CAAuB,CAAA;AAAA,QACxD,GAAG,MAAA;AAAA,QACH,iBAAA;AAAA,QACA,cAAA;AAAA,QACA,SACE,EAAA,IAAA,CAAK,OAAQ,CAAA,SAAS,MAAM,KACxB,CAAA,GAAA,YAAA,CAAA,IAAA,EAAK,gBAAiB,CAAA,CAAA,SAAS,EAAE,MAAO,CAAA,GAAA,GACxC,IAAK,CAAA,OAAA,CAAQ,SAAS,CAAE,CAAA,GAAA;AAAA,QAC9B,OAAO,KAAS,IAAA,YAAA;AAAA,QAChB,IAAA,EAAM,IAAK,CAAA,KAAA,GAAQ,SAAS,CAAA;AAAA,QAC5B,WAAA,EAAa,IAAK,CAAA,WAAA,CAAY,SAAS,CAAA;AAAA,QACvC,eAAA,EAAiB,IAAK,CAAA,eAAA,CAAgB,SAAS,CAAA;AAAA,QAC/C,eAAe,YAAK,CAAA,IAAA,EAAA,gBAAA,CAAA;AAAA,QACpB,QAAA;AAAA,QACA,mBAAmB,IAAK,CAAA;AAAA,OACzB,CAAA;AAED,MAAW,UAAA,CAAA,EAAA,CAAG,cAAgB,EAAA,IAAA,CAAK,kBAAkB,CAAA;AAErD,MAAA,MAAM,qBAAwB,GAAA,YAAA,CAAA,IAAA,EAAK,gBAAiB,CAAA,CAAA,GAAA,CAAI,SAAS,CAAA;AACjE,MAAA,MAAM,YAAe,GAAA;AAAA,QACnB,YAAY,UAAW,CAAA,QAAA;AAAA,QACvB;AAAA,OACF;AACA,MAAA,IAAI,qBAAuB,EAAA;AACzB,QAAA,qBAAA,CAAsB,KAAK,YAAY,CAAA;AAAA,OAClC,MAAA;AACL,QAAA,YAAA,CAAA,IAAA,EAAK,gBAAiB,CAAA,CAAA,GAAA,CAAI,SAAW,EAAA,CAAC,YAAY,CAAC,CAAA;AAAA;AAGrD,MAAO,OAAA,UAAA;AAAA,KACT,CAAA;AA4CA,IAAU,aAAA,CAAA,IAAA,EAAA,WAAA,EAA4B,OAAO,UAAe,KAAA;AAC1D,MAAI,IAAA,UAAA,CAAW,OAAQ,CAAA,IAAA,KAAS,kBAAoB,EAAA;AAClD,QAAM,MAAA,EAAE,UAAW,EAAA,GAAI,UAAW,CAAA,OAAA;AAClC,QAAM,MAAA,EAAE,GAAI,EAAA,GAAI,UAAW,CAAA,MAAA;AAC3B,QAAA,MAAM,YAAe,GAAA,IAAA,CAAK,eAAgB,CAAA,UAAA,EAAY,KAAK,CAAA;AAC3D,QAAA,IAAI,YAAc,EAAA;AAChB,UAAA,YAAA,CAAa,OAAO,GAAa,CAAA;AACjC,UAAO,OAAA;AAAA,YACL,IAAM,EAAA,gBAAA;AAAA,YACN,IAAM,EAAA,KAAA;AAAA,WACR;AAAA,SACK,MAAA;AACL,UAAA,MAAM,EAAE,UAAA,EAAe,GAAA,IAAA,CAAK,0BAA0B,UAAU,CAAA;AAChE,UAAA,IAAI,WAAW,KAAO,EAAA;AACpB,YAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,MAAO,CAAA,UAAA,CAAW,MAAM,KAAU,CAAA;AACrD,YAAA,IAAI,KAAO,EAAA;AACT,cAAA,KAAA,CAAM,OAAO,GAAa,CAAA;AAC1B,cAAO,OAAA;AAAA,gBACL,IAAM,EAAA,gBAAA;AAAA,gBACN,IAAM,EAAA,KAAA;AAAA,eACR;AAAA;AACF;AACF;AACF;AAEF,MAAO,OAAA;AAAA,QACL,IAAM,EAAA,cAAA;AAAA,QACN,YAAc,EAAA;AAAA,OAChB;AAAA,KACF,CAAA;AAcA,IAAQ,aAAA,CAAA,IAAA,EAAA,UAAA,EAA2B,OAAO,UAAe,KAAA;AACvD,MAAI,IAAA,UAAA,CAAW,OAAQ,CAAA,IAAA,KAAS,kBAAoB,EAAA;AAClD,QAAM,MAAA,EAAE,UAAW,EAAA,GAAI,UAAW,CAAA,OAAA;AAClC,QAAA,MAAM,EAAE,MAAA,EAAQ,IAAM,EAAA,GAAA,KAAQ,UAAW,CAAA,MAAA;AACzC,QAAI,IAAA,WAAA,GAAoC,YAAK,CAAA,IAAA,EAAA,gBAAA,CAAA,CAAiB,UAAU,CAAA;AACxE,QAAA,IAAI,CAAC,WAAa,EAAA;AAChB,UAAA,MAAM,EAAE,UAAA,EAAe,GAAA,IAAA,CAAK,0BAA0B,UAAU,CAAA;AAChE,UAAA,IAAI,WAAW,KAAO,EAAA;AACpB,YAAA,WAAA,GAAc,IAAK,CAAA,MAAA,CAAO,UAAW,CAAA,KAAA,CAAM,KAAU,CAAA;AAAA;AACvD;AAEF,QAAA,IAAI,WAAa,EAAA;AACf,UAAY,WAAA,CAAA,MAAA,CAAO,GAAe,EAAA,MAAA,EAAkB,IAAI,CAAA;AAExD,UAAO,OAAA;AAAA,YACL,IAAM,EAAA,gBAAA;AAAA,YACN,IAAM,EAAA,KAAA;AAAA,WACR;AAAA,SACK,MAAA;AACL,UAAA,MAAM,MAAM,0DAA0D,CAAA;AAAA;AACxE,OACK,MAAA;AACL,QAAA,MAAM,MAAM,CAAuC,qCAAA,CAAA,CAAA;AAAA;AACrD,KACF,CAAA;AAEA,IAAQ,aAAA,CAAA,IAAA,EAAA,eAAA,EAAgC,OAAO,UAAe,KAAA;AAC5D,MAAI,IAAA,UAAA,CAAW,OAAQ,CAAA,IAAA,KAAS,kBAAoB,EAAA;AAClD,QAAM,MAAA,EAAE,UAAW,EAAA,GAAI,UAAW,CAAA,OAAA;AAClC,QAAM,MAAA,YAAA,GAAe,IAAK,CAAA,yBAAA,CAA0B,UAAU,CAAA;AAC9D,QAAM,MAAA;AAAA,UACJ,UAAA,EAAY,EAAE,KAAM;AAAA,SAClB,GAAA,YAAA;AACJ,QAAA,IAAI,KAAO,EAAA;AACT,UAAA,MAAM,SAAY,GAAA,IAAA,CAAK,MAAO,CAAA,KAAA,CAAM,KAAU,CAAA;AAC9C,UAAA,IAAI,SAAW,EAAA;AACb,YAAM,MAAA,gBAAA,GAAmB,CAAW,QAAA,EAAAC,aAAA,EAAM,CAAA,CAAA;AAC1C,YAAM,MAAA,YAAA,GAAeC,yBAAa,CAAA,SAAA,EAAW,gBAAgB,CAAA;AAC7D,YAAK,YAAA,CAAA,IAAA,EAAA,gBAAA,CAAA,CAAiB,gBAAgB,CAAI,GAAA,YAAA;AAC1C,YAAA,YAAA,CAAa,gBAAmB,GAAA,gBAAA;AAEhC,YAAO,OAAA;AAAA,cACL,IAAM,EAAA;AAAA,gBACJ,eAAiB,EAAA,aAAA;AAAA,gBACjB,KAAO,EAAA;AAAA,kBACL,QAAQ,KAAM,CAAA,MAAA;AAAA,kBACd,KAAO,EAAA;AAAA;AACT,eACF;AAAA,cACA,IAAM,EAAA;AAAA,aACR;AAAA;AACF;AACF,OACK,MAAA;AACL,QAAA,MAAM,MAAM,CAA6C,2CAAA,CAAA,CAAA;AAAA;AAG3D,MAAO,OAAA;AAAA,QACL,IAAM,EAAA,cAAA;AAAA,QACN,YAAc,EAAA;AAAA,OAChB;AAAA,KACF,CAAA;AAEA,IAAQ,aAAA,CAAA,IAAA,EAAA,cAAA,EAA+B,OAAO,UAAe,KAAA;AAC3D,MAAI,IAAA,UAAA,CAAW,OAAQ,CAAA,IAAA,KAAS,kBAAoB,EAAA;AAClD,QAAM,MAAA,EAAE,UAAW,EAAA,GAAI,UAAW,CAAA,OAAA;AAElC,QAAM,MAAA,YAAA,GAAe,YAAK,CAAA,IAAA,EAAA,gBAAA,CAAA,CAAiB,UAAU,CAAA;AACrD,QAAO,OAAA,YAAA,CAAA,IAAA,EAAK,kBAAiB,UAAU,CAAA;AACvC,QAAA,MAAM,EAAE,UAAA,EAAe,GAAA,IAAA,CAAK,0BAA0B,UAAU,CAAA;AAEhE,QAAA,IAAI,WAAW,KAAO,EAAA;AACpB,UAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,MAAO,CAAA,UAAA,CAAW,MAAM,KAAU,CAAA;AAErD,UAAI,IAAA,UAAA,CAAW,MAAO,CAAA,IAAA,KAAS,IAAM,EAAA;AAKnC,YAAM,MAAA,OAAA,GAAU,aAAa,iBAAkB,EAAA;AAC/C,YAAQ,OAAA,CAAA,OAAA,CAAQ,CAAC,UAAA,EAAY,GAAQ,KAAA;AACnC,cAAM,MAAA,EAAE,WAAa,EAAA,mBAAA,EAAwB,GAAA,UAAA;AAC7C,cAAM,MAAA,UAAA,GAAa,KAAM,CAAA,SAAA,CAAU,GAAG,CAAA;AACtC,cAAA,MAAM,0BACJ,GAAA,UAAA,CAAW,KAAM,CAAA,GAAA,CAAI,mBAAmB,CAAA;AAC1C,cAAA,IAAI,wBAAwB,0BAA4B,EAAA;AACtD,gBAAA,OAAA,CAAQ,IAAI,2BAA2B,CAAA;AAAA;AAEzC,cAAO,MAAA,CAAA,OAAA,CAAQ,WAAW,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,MAAA,EAAQ,KAAK,CAAM,KAAA;AACvD,gBAAM,KAAA,CAAA,MAAA,CAAO,GAAK,EAAA,MAAA,EAAQ,KAAK,CAAA;AAAA,eAChC,CAAA;AAAA,aACF,CAAA;AACD,YAAA,OAAA,CAAQ,KAAM,EAAA;AAAA;AAGhB,UAAO,OAAA;AAAA,YACL,IAAM,EAAA,gBAAA;AAAA,YACN,IAAM,EAAA,KAAA;AAAA,WACR;AAAA,SACK,MAAA;AACL,UAAA,MAAM,MAAM,2BAA2B,CAAA;AAAA;AACzC,OACK,MAAA;AACL,QAAA,MAAM,MAAM,CAA6C,2CAAA,CAAA,CAAA;AAAA;AAC3D,KAMF,CAAA;AAEA,IAAQ,aAAA,CAAA,IAAA,EAAA,eAAA,EAAoC,OAAO,UAAe,KAAA;AAChE,MAAA,IAAI,WAAW,mBAAqB,EAAA;AAClC,QAAM,MAAA,EAAE,mBAAqB,EAAA,IAAA,EAAS,GAAA,UAAA;AACtC,QAAA,MAAM,iBAAiB,mBAAoB,CAAA,cAAA;AAC3C,QAAA,MAAM,QAAQ,mBAAoB,CAAA,KAAA;AAElC,QAAA,IAAI,kBAAkB,KAAO,EAAA;AAC3B,UAAA,MAAM,SAAY,GAAA,IAAA,CAAK,MAAO,CAAA,KAAA,CAAM,KAAU,CAAA;AAC9C,UAAA,IAAI,SAAW,EAAA;AACb,YAAA,MAAM,eAAe,IAAK,CAAA,kCAAA;AAAA,cACxB,SAAA;AAAA,cACA;AAAA,aACF;AACA,YAAM,MAAA,gBAAA,GAAmB,CAAW,QAAA,EAAAD,aAAA,EAAM,CAAA,CAAA;AAC1C,YAAK,YAAA,CAAA,IAAA,EAAA,gBAAA,CAAA,CAAiB,gBAAgB,CAAI,GAAA,YAAA;AAE1C,YAAO,OAAA;AAAA,cACL,MAAQ,EAAA;AAAA,gBACN,eAAiB,EAAA,MAAA;AAAA,gBACjB,KAAO,EAAA;AAAA,kBACL,QAAQ,KAAM,CAAA,MAAA;AAAA,kBACd,KAAO,EAAA;AAAA,iBACT;AAAA,gBACA,aAAa,SAAU,CAAA,MAAA;AAAA,gBACvB,IAAM,EAAA;AAAA,eACR;AAAA,cACA,OAAS,EAAA,wBAAA;AAAA,cACT,IAAM,EAAA,qBAAA;AAAA,cACN;AAAA,aACF;AAAA,WACK,MAAA;AACL,YAAO,OAAA;AAAA,cACL,MAAA,EAAQ,EAAE,IAAA,EAAM,WAAY,EAAA;AAAA,cAC5B,gBAAkB,EAAA,IAAA;AAAA,cAClB,KAAO,EAAA,gBAAA;AAAA,cACP,OAAS,EAAA,qBAAA;AAAA,cACT,IAAM,EAAA,oBAAA;AAAA,cACN;AAAA,aACF;AAAA;AACF;AACF;AAEF,MAAA,MAAM,MAAM,gDAAgD,CAAA;AAAA,KAC9D,CAAA;AAEA,IAAQ,aAAA,CAAA,IAAA,EAAA,gBAAA,EAAiC,OAAO,UAAe,KAAA;AAC7D,MAAI,IAAA,UAAA,CAAW,OAAQ,CAAA,IAAA,KAAS,kBAAoB,EAAA;AAClD,QAAM,MAAA,EAAE,UAAW,EAAA,GAAI,UAAW,CAAA,OAAA;AAClC,QAAO,OAAA,YAAA,CAAA,IAAA,EAAK,kBAAiB,UAAU,CAAA;AACvC,QAAO,OAAA;AAAA,UACL,IAAM,EAAA,gBAAA;AAAA,UACN,IAAM,EAAA,KAAA;AAAA,SACR;AAAA,OACK,MAAA;AACL,QAAA,MAAM,MAAM,CAA6C,2CAAA,CAAA,CAAA;AAAA;AAC3D,KACF,CAAA;AAGA;AAAA,IAAQ,aAAA,CAAA,IAAA,EAAA,gBAAA,EAAiC,OAAO,UAAe,KAAA;AAC7D,MAAI,IAAA,UAAA,CAAW,OAAQ,CAAA,IAAA,KAAS,kBAAoB,EAAA;AAClD,QAAM,MAAA,EAAE,UAAW,EAAA,GAAI,UAAW,CAAA,OAAA;AAClC,QAAM,MAAA,YAAA,GAAe,IAAK,CAAA,eAAA,CAAgB,UAAU,CAAA;AACpD,QAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,YAAa,CAAA,IAAA,CAAK,QAAQ,CAAK,EAAA,EAAA;AACjD,UAAM,MAAA,MAAA,GAAS,YAAa,CAAA,IAAA,CAAK,CAAC,CAAA;AAClC,UAAA,MAAM,EAAE,MAAA,EAAQ,KAAM,EAAA,GAAI,UAAW,CAAA,MAAA;AACrC,UAAA,MAAM,QAAW,GAAA,YAAA,CAAa,GAAI,CAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACzD,UAAa,YAAA,CAAA,MAAA;AAAA,YACX,MAAA,CAAO,MAAO,CAAA,QAAQ,CAAC,CAAA;AAAA,YACvB,MAAA;AAAA,YACA;AAAA,WACF;AAAA;AAEF,QAAO,OAAA;AAAA,UACL,IAAM,EAAA,gBAAA;AAAA,UACN,IAAM,EAAA,KAAA;AAAA,SACR;AAAA,OACK,MAAA;AACL,QAAA,MAAM,MAAM,CAA6C,2CAAA,CAAA,CAAA;AAAA;AAC3D,KACF,CAAA;AAGA;AAAA,IAAQ,aAAA,CAAA,IAAA,EAAA,eAAA,EAAgC,OAAO,UAAe,KAAA;AAC5D,MAAI,IAAA,UAAA,CAAW,OAAQ,CAAA,IAAA,KAAS,kBAAoB,EAAA;AAClD,QAAM,MAAA,EAAE,UAAW,EAAA,GAAI,UAAW,CAAA,OAAA;AAClC,QAAM,MAAA,YAAA,GAAe,IAAK,CAAA,eAAA,CAAgB,UAAU,CAAA;AACpD,QAAA,MAAM,EAAE,KAAA,EAAU,GAAA,YAAA,CAAa,MAAO,CAAA,KAAA;AACtC,QAAM,MAAA,SAAA,GAAY,IAAK,CAAA,MAAA,CAAO,KAAU,CAAA;AACxC,QAAA,IAAI,SAAW,EAAA;AACb,UAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,YAAa,CAAA,IAAA,CAAK,QAAQ,CAAK,EAAA,EAAA;AACjD,YAAM,MAAA,MAAA,GAAS,YAAa,CAAA,IAAA,CAAK,CAAC,CAAA;AAClC,YAAA,SAAA,CAAU,UAAU,MAAM,CAAA;AAAA;AAE5B,UAAO,OAAA;AAAA,YACL,IAAM,EAAA,gBAAA;AAAA,YACN,IAAM,EAAA,KAAA;AAAA,WACR;AAAA,SACK,MAAA;AACL,UAAM,MAAA,KAAA;AAAA,YACJ,CAAgD,6CAAA,EAAA,KAAK,CAAgC,6BAAA,EAAA,YAAA,CAAa,IAAI,CAAA;AAAA,WACxG;AAAA;AACF,OACK,MAAA;AACL,QAAA,MAAM,MAAM,qDAAqD,CAAA;AAAA;AACnE,KACF,CAAA;AAuBA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAgC,YAAA,CAAA,IAAA,EAAA,eAAA,EAAA;AAAA,MAC9B;AAAA,QACE,OAAS,EAAA,+BAAA;AAAA,QACT,SAAS,IAAK,CAAA;AAAA,OAChB;AAAA,MACA;AAAA,QACE,OAAS,EAAA,yBAAA;AAAA,QACT,SAAS,IAAK,CAAA;AAAA,OAChB;AAAA,MACA;AAAA,QACE,OAAS,EAAA,sBAAA;AAAA,QACT,SAAS,IAAK,CAAA;AAAA,OAChB;AAAA,MACA;AAAA,QACE,OAAS,EAAA,iBAAA;AAAA,QACT,SAAS,IAAK,CAAA;AAAA,OAChB;AAAA,MACA;AAAA,QACE,OAAS,EAAA,gBAAA;AAAA,QACT,SAAS,IAAK,CAAA;AAAA,OAChB;AAAA,MACA;AAAA,QACE,OAAS,EAAA,UAAA;AAAA,QACT,SAAS,IAAK,CAAA;AAAA;AAChB,KACF,CAAA;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAwC,YAAA,CAAA,IAAA,EAAA,mBAAA,EAAA;AAAA,MACtC;AAAA,QACE,OAAS,EAAA,wBAAA;AAAA,QACT,SAAS,IAAK,CAAA;AAAA;AAChB,KACF,CAAA;AA/hBE,IAAA,YAAA,CAAA,IAAA,EAAK,KAAQ,EAAA,IAAA,CAAA;AACb,IAAAE,eAAA,CAAgB,SAAS,IAAI,CAAA;AAAA;AAC/B,EAWA,eAAe,SAAmB,EAAA;AAChC,IAAO,OAAA,IAAA,CAAK,QAAQ,SAAc,CAAA;AAAA;AACpC,EAEA,YAAe,GAAA;AACb,IAAO,OAAA,MAAA,CAAO,IAAK,CAAA,IAAA,CAAK,MAAM,CAAA;AAAA;AAChC,EAoBA,IAAI,IAAO,GAAA;AACT,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA;AAAA;AACd,EAEA,0BAA0B,UAAoB,EAAA;AAC5C,IAAA,KAAA,MAAW,aAAiB,IAAA,YAAA,CAAA,IAAA,EAAK,gBAAiB,CAAA,CAAA,MAAA,EAAU,EAAA;AAC1D,MAAA,KAAA,MAAW,gBAAgB,aAAe,EAAA;AACxC,QAAI,IAAA,YAAA,CAAa,eAAe,UAAY,EAAA;AAC1C,UAAO,OAAA,YAAA;AAAA;AACT;AACF;AAEF,IAAM,MAAA,KAAA;AAAA,MACJ,oEAAoE,UAAU,CAAA;AAAA,KAChF;AAAA;AACF,EAEA,wBAAwB,IAA0B,EAAA;AAChD,IAAA,KAAA,MAAW,aAAiB,IAAA,YAAA,CAAA,IAAA,EAAK,gBAAiB,CAAA,CAAA,MAAA,EAAU,EAAA;AAC1D,MAAA,KAAA,MAAW,EAAE,UAAA,EAAY,UAAW,EAAA,IAAK,aAAe,EAAA;AACtD,QAAA,IAAI,eAAe,IAAM,EAAA;AACvB,UAAO,OAAA,UAAA;AAAA;AACT;AACF;AAEF,IAAM,MAAA,KAAA,CAAM,CAA4B,yBAAA,EAAA,IAAI,CAAyB,uBAAA,CAAA,CAAA;AAAA;AACvE,EAmHA,YAAY,SAAc,EAAA;AACxB,IAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,QAAA,GAAW,SAAS,CAAA;AAC/C,IAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,aAAa,CAAG,EAAA;AAChC,MAAO,OAAA,YAAA,CAAA,IAAA,EAAK,eAAgB,CAAA,CAAA,MAAA,CAAO,aAAa,CAAA;AAAA,KAC3C,MAAA;AACL,MAAA,OAAO,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA;AAAA;AACd;AACF,EAEA,gBAAgB,SAAc,EAAA;AAC5B,IAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,YAAA,GAAe,SAAS,CAAA;AACnD,IAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,aAAa,CAAG,EAAA;AAChC,MAAO,OAAA,YAAA,CAAA,IAAA,EAAK,mBAAoB,CAAA,CAAA,MAAA,CAAO,aAAa,CAAA;AAAA,KAC/C,MAAA;AACL,MAAA,OAAO,YAAK,CAAA,IAAA,EAAA,mBAAA,CAAA;AAAA;AACd;AACF,EAEA,IAAc,eAAkB,GAAA;AAC9B,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,gBAAA,CAAA;AAAA;AACd,EAWU,eAAA,CAAgB,gBAA0B,EAAA,eAAA,GAAkB,IAAM,EAAA;AAC1E,IAAM,MAAA,YAAA,GAAe,YAAK,CAAA,IAAA,EAAA,gBAAA,CAAA,CAAiB,gBAAgB,CAAA;AAC3D,IAAA,IAAI,YAAc,EAAA;AAChB,MAAO,OAAA,YAAA;AAAA,eACE,eAAiB,EAAA;AAC1B,MAAM,MAAA,KAAA;AAAA,QACJ,+CAA+C,gBAAgB,CAAA;AAAA,OACjE;AAAA;AACF;AACF,EAiCQ,qBAAqB,SAAc,EAAA;AACzC,IAAM,MAAA,MAAA,GACJ,KAAK,OAAQ,CAAA,SAAS,KAAK,IAAK,CAAA,eAAA,CAAgB,SAAS,CAAG,EAAA,MAAA;AAC9D,IAAA,IAAI,MAAQ,EAAA;AACV,MAAA,OAAO,MAAO,CAAA,OAAA;AAAA,KACT,MAAA;AACL,MAAM,MAAA,KAAA;AAAA,QACJ,CAA+B,4BAAA,EAAA,YAAA,CAAA,IAAA,EAAK,KAAK,CAAA,CAAA,OAAA,EAAU,SAAS,CAAA;AAAA,OAC9D;AAAA;AACF;AACF,EA8NU,mCACR,EAAE,IAAA,EAAM,GAAK,EAAA,MAAA,IACb,cACA,EAAA;AACA,IAAM,MAAA,QAAA,GAAW,GAAI,CAAA,MAAA,CAAO,GAAG,CAAA;AAC/B,IAAA,MAAM,cAAsC,EAAC;AAC7C,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,cAAA,CAAe,QAAQ,CAAK,EAAA,EAAA;AAC9C,MAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,IAAA,CAAK,QAAQ,CAAK,EAAA,EAAA;AACpC,QAAA,IAAI,KAAK,CAAC,CAAA,CAAE,QAAQ,CAAM,KAAA,cAAA,CAAe,CAAC,CAAG,EAAA;AAC3C,UAAY,WAAA,CAAA,IAAA,CAAK,IAAK,CAAA,CAAC,CAAC,CAAA;AAAA;AAC1B;AACF;AAEF,IAAA,OAAO,IAAIC,WAAM,CAAA,MAAA,EAAQ,WAAa,EAAAC,kCAAA,CAA6B,MAAM,CAAC,CAAA;AAAA;AA8C9E;AAviBE,KAAA,GAAA,IAAA,OAAA,EAAA;AACA,mBAAA,GAAA,IAAA,OAAA,EAAA;AACA,gBAAA,GAAA,IAAA,OAAA,EAAA;AACA,cAAA,GAAA,IAAA,OAAA,EAAA;AACA,gBAAA,GAAA,IAAA,OAAA,EAAA;AA6fA,eAAA,GAAA,IAAA,OAAA,EAAA;AAgCA,mBAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"VuuModule.js","sources":["../../../../../packages/vuu-data-test/src/core/module/VuuModule.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceConfig,\n DataSourceVisualLinkCreatedMessage,\n EditSessionMode,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuMenu,\n VuuRowDataItemType,\n VuuLink,\n LinkDescriptorWithLabel,\n VuuRpcMenuResponse,\n VuuCreateVisualLink,\n VuuRemoveVisualLink,\n VuuRpcServiceRequest,\n RpcResultSuccess,\n RpcResultError,\n VuuRpcMenuRequest,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { isRpcSuccess, uuid } from \"@vuu-ui/vuu-utils\";\nimport { Table, buildDataColumnMapFromSchema } from \"../../Table\";\nimport { isProxySessionTable, SessionTable } from \"../../SessionTable\";\nimport { TickingArrayDataSource } from \"../../TickingArrayDataSource\";\nimport { RuntimeVisualLink } from \"../../RuntimeVisualLink\";\nimport moduleContainer from \"./ModuleContainer\";\n\nconst assertUpdateIsValid = (\n schema: TableSchema,\n column: string,\n data: VuuRowDataItemType,\n) => {\n const col = schema.columns.find((col) => col.name === column);\n if (col) {\n console.log(`data type ${col.serverDataType} data ${data}`);\n // switch (col.serverDataType){\n // }\n } else {\n throw Error(\n `schema for table ${schema.table.table} does not include column ${column}`,\n );\n }\n};\n\nexport interface IVuuModule<T extends string = string> {\n createDataSource: (tableName: T, viewport?: string) => DataSource;\n}\n\nexport type SessionTableMap = Record<string, SessionTable | Table>;\n\nexport type ServiceHandler = (\n rpcRequest: VuuRpcServiceRequest,\n) => Promise<RpcResultSuccess | RpcResultError>;\n\nexport type MenuServiceHandler = (\n rpcRequest: VuuRpcMenuRequest,\n) => Promise<VuuRpcMenuResponse>;\n\nexport type RpcService = {\n rpcName: string;\n service: ServiceHandler;\n};\n\nexport type RpcMenuService = {\n rpcName: string;\n service: MenuServiceHandler;\n};\n\ntype Subscription = {\n viewportId: string;\n dataSource: DataSource;\n sessionTableName?: string;\n};\nexport abstract class VuuModule<T extends string = string>\n implements IVuuModule<T>\n{\n #name: string;\n #runtimeVisualLinks = new Map<string, RuntimeVisualLink>();\n #sessionTableMap: SessionTableMap = {};\n #tableServices: Record<T, RpcService[] | undefined> | undefined;\n #subscriptionMap: Map<string, Subscription[]> = new Map();\n\n constructor(name: string) {\n this.#name = name;\n moduleContainer.register(this);\n }\n\n protected abstract menus?: Record<T, VuuMenu | undefined> | undefined;\n protected abstract schemas: Record<T, Readonly<TableSchema>>;\n protected abstract tables: Record<T, Table>;\n protected abstract menuServices?:\n | Record<T, RpcMenuService[] | undefined>\n | undefined;\n protected abstract services?: Record<T, RpcService[] | undefined> | undefined;\n protected abstract visualLinks?: Record<T, VuuLink[] | undefined>;\n\n getTableSchema(tableName: string) {\n return this.schemas[tableName as T];\n }\n\n getTableList() {\n return Object.keys(this.tables);\n }\n\n protected unregisterViewport = (viewportId: string) => {\n for (const [tableName, subscriptions] of this.#subscriptionMap) {\n if (subscriptions[0].viewportId.toString() === viewportId) {\n this.#subscriptionMap.delete(tableName);\n } else {\n const links = subscriptions[0].dataSource.links;\n if (links) {\n for (let i = 0; i < links?.length; i++) {\n if (links[i].parentClientVpId === viewportId) {\n links.splice(i);\n }\n }\n }\n subscriptions[0].dataSource.links = links;\n }\n }\n };\n\n get name() {\n return this.#name;\n }\n\n getSubscriptionByViewport(viewportId: string) {\n for (const subscriptions of this.#subscriptionMap.values()) {\n for (const subscription of subscriptions) {\n if (subscription.viewportId === viewportId) {\n return subscription;\n }\n }\n }\n throw Error(\n `[VuuModule] getSubscriptionByViewport, no subscription found for ${viewportId}`,\n );\n }\n\n getSubscribedDataSource(vpId: string): DataSource {\n for (const subscriptions of this.#subscriptionMap.values()) {\n for (const { viewportId, dataSource } of subscriptions) {\n if (viewportId === vpId) {\n return dataSource;\n }\n }\n }\n throw Error(`getSubscribedDataSource #${vpId} not in subscriptionMap`);\n }\n\n getLinks = (\n subscriptionMap: Map<string, Subscription[]>,\n vuuLinks: VuuLink[],\n ) => {\n const visualLinks: LinkDescriptorWithLabel[] = [];\n for (let i = 0; i < vuuLinks.length; i++) {\n const subscriptions = subscriptionMap.get(vuuLinks[i].toTable);\n if (subscriptions) {\n subscriptions.forEach(({ viewportId, dataSource: { status } }) => {\n if (status !== \"suspended\") {\n const newLink: LinkDescriptorWithLabel = {\n parentClientVpId: viewportId,\n parentVpId: viewportId,\n link: vuuLinks[i],\n };\n visualLinks.push(newLink);\n }\n });\n }\n }\n return visualLinks;\n };\n\n visualLinkService = (\n message: VuuCreateVisualLink | VuuRemoveVisualLink,\n ): Promise<DataSourceVisualLinkCreatedMessage | void> =>\n new Promise((resolve) => {\n if (message.type === \"CREATE_VISUAL_LINK\") {\n const { childColumnName, childVpId, parentColumnName, parentVpId } =\n message;\n const childDataSource = this.getSubscribedDataSource(childVpId);\n const parentDataSource = this.getSubscribedDataSource(parentVpId);\n const runtimeVisualLink = new RuntimeVisualLink(\n childDataSource,\n parentDataSource,\n childColumnName,\n parentColumnName,\n );\n\n this.#runtimeVisualLinks.set(childVpId, runtimeVisualLink);\n\n resolve({\n clientViewportId: childVpId,\n colName: childColumnName,\n parentColName: parentColumnName,\n parentViewportId: parentVpId,\n type: \"vuu-link-created\",\n } as DataSourceVisualLinkCreatedMessage);\n } else {\n const runtimeVisualLink = this.#runtimeVisualLinks.get(\n message.childVpId,\n );\n if (runtimeVisualLink) {\n runtimeVisualLink.remove();\n this.#runtimeVisualLinks.delete(message.childVpId);\n } else {\n throw Error(\n `visualLinkService no visual link found for viewport #${message.childVpId}`,\n );\n }\n resolve();\n }\n });\n\n createDataSource = (\n tableName: T,\n viewport?: string,\n config?: DataSourceConfig,\n ) => {\n const getVisualLinks = (tableName: string) => {\n const linksForTable = this.visualLinks?.[tableName as T] as VuuLink[];\n return linksForTable === undefined\n ? undefined\n : this.getLinks(this.#subscriptionMap, linksForTable);\n };\n\n const columnDescriptors = this.getColumnDescriptors(tableName);\n const table = this.tables[tableName];\n const sessionTable = this.#sessionTableMap[tableName];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const vuuModule = this as IVuuModule<any>;\n\n const dataSource: DataSource = new TickingArrayDataSource({\n ...config,\n columnDescriptors,\n getVisualLinks,\n keyColumn:\n this.schemas[tableName] === undefined\n ? this.#sessionTableMap[tableName].schema.key\n : this.schemas[tableName].key,\n table: table || sessionTable,\n menu: this.menus?.[tableName],\n rpcServices: this.getServices(tableName),\n rpcMenuServices: this.getMenuServices(tableName),\n sessionTables: this.#sessionTableMap,\n viewport,\n visualLinkService: this.visualLinkService,\n vuuModule,\n });\n\n dataSource.on(\"unsubscribed\", this.unregisterViewport);\n\n const existingSubscriptions = this.#subscriptionMap.get(tableName);\n const subscription = {\n viewportId: dataSource.viewport as string,\n dataSource,\n };\n if (existingSubscriptions) {\n existingSubscriptions.push(subscription);\n } else {\n this.#subscriptionMap.set(tableName, [subscription]);\n }\n\n return dataSource;\n };\n\n getServices(tableName: T) {\n const tableServices = this.services?.[tableName];\n if (Array.isArray(tableServices)) {\n return this.#moduleServices.concat(tableServices);\n } else {\n return this.#moduleServices;\n }\n }\n\n getMenuServices(tableName: T) {\n const tableServices = this.menuServices?.[tableName];\n if (Array.isArray(tableServices)) {\n return this.#moduleMenuServices.concat(tableServices);\n } else {\n return this.#moduleMenuServices;\n }\n }\n\n protected get sessionTableMap() {\n return this.#sessionTableMap;\n }\n\n protected getSessionTable(sessionTableName: string): SessionTable;\n protected getSessionTable(\n sessionTableName: string,\n throwIfNotFound: true,\n ): SessionTable;\n protected getSessionTable(\n sessionTableName: string,\n throwIfNotFound: false,\n ): SessionTable | undefined;\n protected getSessionTable(sessionTableName: string, throwIfNotFound = true) {\n const sessionTable = this.#sessionTableMap[sessionTableName];\n if (sessionTable) {\n return sessionTable;\n } else if (throwIfNotFound) {\n throw Error(\n `getSessionTable: no session table with name ${sessionTableName}`,\n );\n }\n }\n\n protected deleteRow: ServiceHandler = async (rpcRequest) => {\n if (rpcRequest.context.type === \"VIEWPORT_CONTEXT\") {\n const { viewPortId } = rpcRequest.context;\n const { key } = rpcRequest.params;\n const sessionTable = this.getSessionTable(viewPortId, false);\n if (sessionTable) {\n sessionTable.delete(key as string);\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n } else {\n const { dataSource } = this.getSubscriptionByViewport(viewPortId);\n if (dataSource.table) {\n const table = this.tables[dataSource.table.table as T];\n if (table) {\n table.delete(key as string);\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n }\n }\n }\n }\n return {\n type: \"ERROR_RESULT\",\n errorMessage: \"something went wrong\",\n };\n };\n\n private getColumnDescriptors(tableName: T) {\n const schema =\n this.schemas[tableName] || this.getSessionTable(tableName)?.schema;\n if (schema) {\n return schema.columns;\n } else {\n throw Error(\n ` no schema found for module ${this.#name} table ${tableName}`,\n );\n }\n }\n\n private editCell: ServiceHandler = async (rpcRequest) => {\n if (rpcRequest.context.type === \"VIEWPORT_CONTEXT\") {\n const { viewPortId } = rpcRequest.context;\n const { column, data, key } = rpcRequest.params;\n let targetTable: SessionTable | Table = this.#sessionTableMap[viewPortId];\n if (!targetTable) {\n const { dataSource } = this.getSubscriptionByViewport(viewPortId);\n if (dataSource.table) {\n targetTable = this.tables[dataSource.table.table as T];\n }\n }\n if (targetTable) {\n try {\n assertUpdateIsValid(targetTable.schema, column as string, data);\n targetTable.update(key as string, column as string, data);\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n } catch (e) {\n const { message } = e as Error;\n return {\n type: \"ERROR_RESULT\",\n errorMessage: message,\n };\n }\n } else {\n throw Error(\"[VuuModule] editCell unable to find table for dataSource\");\n }\n } else {\n throw Error(`[VuuModule] editCell invalid rpc type`);\n }\n };\n\n private beginEditSessionMenuHandler: MenuServiceHandler = async ({\n rpcName,\n type,\n vpId,\n }) => {\n if (type === \"VIEW_PORT_MENUS_SELECT_RPC\") {\n console.log(`rpcName ${rpcName}`);\n\n const result = await this.beginEditSession({\n context: {\n type: \"VIEWPORT_CONTEXT\",\n viewPortId: vpId,\n },\n params: {\n editSessionMode: \"selected-rows\",\n },\n rpcName,\n type: \"RPC_REQUEST\",\n });\n if (isRpcSuccess(result)) {\n const { table } = result.data as { table: VuuTable };\n return {\n type: \"VIEW_PORT_MENU_RESP\",\n rpcName,\n action: {\n renderComponent: \"grid\",\n type: \"OPEN_DIALOG_ACTION\",\n table,\n },\n vpId,\n };\n } else {\n return {\n error: result.errorMessage,\n rpcName,\n type: \"VIEW_PORT_MENU_REJ\",\n vpId,\n };\n }\n } else {\n return {\n error: \"no can do\",\n rpcName,\n type: \"VIEW_PORT_MENU_REJ\",\n vpId,\n };\n }\n };\n\n private beginEditSession: ServiceHandler = async (rpcRequest) => {\n if (rpcRequest.context.type === \"VIEWPORT_CONTEXT\") {\n const { viewPortId } = rpcRequest.context;\n const { editSessionMode = \"all-rows\" } = rpcRequest.params;\n const subscription = this.getSubscriptionByViewport(viewPortId);\n const { dataSource } = subscription;\n const { table: vuuTable } = dataSource;\n if (vuuTable) {\n const sourceTable = this.tables[vuuTable.table as T];\n if (sourceTable) {\n const sessionTableName = `session-${uuid()}`;\n try {\n const sessionTable = this.createSessionTable(\n sourceTable,\n sessionTableName,\n editSessionMode as EditSessionMode,\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n dataSource as TickingArrayDataSource,\n );\n this.#sessionTableMap[sessionTableName] = sessionTable;\n subscription.sessionTableName = sessionTableName;\n\n return {\n data: {\n renderComponent: \"inline-form\",\n table: {\n module: vuuTable.module,\n table: sessionTableName,\n },\n },\n type: \"SUCCESS_RESULT\",\n };\n } catch (e) {\n return {\n type: \"ERROR_RESULT\",\n errorMessage: (e as Error).message,\n };\n }\n }\n }\n } else {\n throw Error(`[VuuModule] endEditSession invalid rpc type`);\n }\n\n return {\n type: \"ERROR_RESULT\",\n errorMessage: \"not implemented yet\",\n };\n };\n\n private endEditSession: ServiceHandler = async (rpcRequest) => {\n if (rpcRequest.context.type === \"VIEWPORT_CONTEXT\") {\n const { viewPortId } = rpcRequest.context;\n // the viewport Id is the session table name\n const sessionTable = this.#sessionTableMap[viewPortId];\n delete this.#sessionTableMap[viewPortId];\n const { dataSource } = this.getSubscriptionByViewport(viewPortId);\n\n if (dataSource.table) {\n const sourceTable = this.tables[dataSource.table.table as T];\n\n if (rpcRequest.params.save === true) {\n if (isProxySessionTable(sessionTable)) {\n const updates = sessionTable.getSessionUpdates();\n updates.forEach((rowUpdates, key) => {\n const { cellUpdates, lastUpdateTimestamp } = rowUpdates;\n const currentRow = sourceTable.findByKey(key);\n const lastUpdateTimestampOnTable =\n currentRow[sourceTable.map.vuuUpdatedTimestamp];\n if (lastUpdateTimestamp !== lastUpdateTimestampOnTable) {\n console.log(\"Houston WE HAVE a PROBLEM\");\n }\n Object.entries(cellUpdates).forEach(([column, value]) => {\n sourceTable.update(key, column, value);\n });\n });\n updates.clear();\n } else {\n for (let i = 0; i < sessionTable.data.length; i++) {\n const newRow = sessionTable.data[i];\n sourceTable.updateRow(newRow);\n }\n }\n }\n\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n } else {\n throw Error(\"[VuuModule], exitEditMode\");\n }\n } else {\n throw Error(`[VuuModule] endEditSession invalid rpc type`);\n }\n\n // return {\n // type: \"ERROR_RESULT\",\n // errorMessage: \"not implemented yet\",\n // };\n };\n\n // Bulk-edit with input in session table\n private applyBulkEdits: ServiceHandler = async (rpcRequest) => {\n if (rpcRequest.context.type === \"VIEWPORT_CONTEXT\") {\n const { viewPortId } = rpcRequest.context;\n const sessionTable = this.getSessionTable(viewPortId);\n for (let i = 0; i < sessionTable.data.length; i++) {\n const newRow = sessionTable.data[i];\n const { column, value } = rpcRequest.params;\n const keyIndex = sessionTable.map[sessionTable.schema.key];\n sessionTable.update(\n String(newRow[keyIndex]),\n column as string,\n value as VuuRowDataItemType,\n );\n }\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n } else {\n throw Error(`[VuuModule] applyBulkEdits invalid rpc type`);\n }\n };\n\n protected createSessionTable(\n sourceTable: Table,\n sessionTableName: string,\n editSessionMode: EditSessionMode = \"all-rows\",\n dataSource: TickingArrayDataSource,\n ) {\n if (editSessionMode === \"all-rows\") {\n return this.createSessionTableWithAllRows(sourceTable, sessionTableName);\n } else if (editSessionMode === \"selected-rows\") {\n return this.createSessionTableFromSelectedRows(\n sourceTable,\n sessionTableName,\n dataSource,\n );\n } else if (editSessionMode === \"empty-session-table\") {\n return this.createEmptySessionTable(sourceTable);\n } else {\n throw Error(\n `[VuuModule] createSessionTable, invalid editSessionMode ${editSessionMode}`,\n );\n }\n }\n\n protected createSessionTableWithAllRows(\n sourceTable: Table,\n sessionTableName: string,\n ) {\n return SessionTable(sourceTable, sessionTableName);\n }\n\n protected createEmptySessionTable({ schema }: Table) {\n // Note we use the original table schema for the session table, including table name.\n // This will later be used to retrieve source table\n return new Table(schema, [], buildDataColumnMapFromSchema(schema));\n }\n\n protected createSessionTableFromSelectedRows(\n { data, map, schema }: Table,\n sessionTableName: string,\n dataSource: TickingArrayDataSource,\n ) {\n const selectedRowIds = dataSource.getSelectedRowIds();\n const keyIndex = map[schema.key];\n const sessionData: VuuRowDataItemType[][] = [];\n for (let i = 0; i < selectedRowIds.length; i++) {\n for (let j = 0; j < data.length; j++) {\n if (data[j][keyIndex] === selectedRowIds[i]) {\n sessionData.push(data[j]);\n }\n }\n }\n // Note we use the original table schema for the session table, including table name.\n // This will later be used to retrieve source table\n return new Table(schema, sessionData, buildDataColumnMapFromSchema(schema));\n }\n\n /**\n * These services are available on any table. The client must configure the appropriate\n * menu item(s) on Table(s). The services to implement these RPC calls are built-in to\n * VuuModule\n */\n #moduleServices: RpcService[] = [\n {\n rpcName: \"VP_BULK_EDIT_COLUMN_CELLS_RPC\",\n service: this.applyBulkEdits,\n },\n {\n rpcName: \"beginEditSession\",\n service: this.beginEditSession,\n },\n {\n rpcName: \"endEditSession\",\n service: this.endEditSession,\n },\n {\n rpcName: \"editCell\",\n service: this.editCell,\n },\n ];\n\n /**\n * These services are available on any table. The client must configure the appropriate\n * menu item(s) on Table(s). The services to implement these RPC calls are built-in to\n * VuuModule\n */\n #moduleMenuServices: RpcMenuService[] = [\n {\n rpcName: \"beginEditSession\",\n service: this.beginEditSessionMenuHandler,\n },\n ];\n}\n"],"names":["col","RuntimeVisualLink","tableName","TickingArrayDataSource","isRpcSuccess","uuid","isProxySessionTable","moduleContainer","SessionTable","Table","buildDataColumnMapFromSchema"],"mappings":"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"}
|
package/cjs/simul/SimulModule.js
CHANGED
|
@@ -93,14 +93,14 @@ class SimulModule extends VuuModule.VuuModule {
|
|
|
93
93
|
{
|
|
94
94
|
context: "selected-rows",
|
|
95
95
|
filter: "",
|
|
96
|
-
name: "Edit Row",
|
|
96
|
+
name: "Edit Row (server)",
|
|
97
97
|
rpcName: "EDIT_ROW"
|
|
98
98
|
},
|
|
99
99
|
{
|
|
100
100
|
context: "selected-rows",
|
|
101
101
|
filter: "",
|
|
102
|
-
name: "Edit Rows",
|
|
103
|
-
rpcName: "
|
|
102
|
+
name: "Edit Rows (server)",
|
|
103
|
+
rpcName: "beginEditSession"
|
|
104
104
|
}
|
|
105
105
|
]
|
|
106
106
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SimulModule.js","sources":["../../../../packages/vuu-data-test/src/simul/SimulModule.ts"],"sourcesContent":["import {\n ClientToServerMenuRowRPC,\n VuuLink,\n VuuMenu,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n MenuServiceHandler,\n RpcMenuService,\n RpcService,\n ServiceHandler,\n VuuModule,\n} from \"../core/module/VuuModule\";\nimport { Table } from \"../Table\";\nimport { instrumentsTable } from \"./reference-data/instruments\";\nimport { instrumentsExtendedTable } from \"./reference-data/instruments-extended\";\nimport { ordersTable } from \"./reference-data/orders\";\nimport {\n childOrdersTable,\n parentOrdersTable,\n startGeneratingNewOrders,\n stopGeneratingNewOrders,\n} from \"./reference-data/parent-child-orders\";\nimport { pricesTable } from \"./reference-data/prices\";\nimport { schemas, type SimulTableName } from \"./simul-schemas\";\nimport tableContainer from \"../core/table/TableContainer\";\n\nconst undefinedTables = {\n childOrders: undefined,\n instruments: undefined,\n instrumentsExtended: undefined,\n instrumentPrices: undefined,\n orders: undefined,\n parentOrders: undefined,\n prices: undefined,\n};\n\n/**\n * This is an example of how we might extend the built-in VuuModule to\n * implement a module-specific service in such a way that it can invoke\n * methods on the VuuModule.\n */\nexport class SimulModule extends VuuModule<SimulTableName> {\n constructor() {\n super(\"SIMUL\");\n }\n\n #schemas = schemas;\n #tables: Record<SimulTableName, Table> = {\n childOrders: childOrdersTable,\n instruments: instrumentsTable,\n instrumentsExtended: instrumentsExtendedTable,\n instrumentPrices: tableContainer.createJoinTable(\n { module: \"SIMUL\", table: \"instrumentPrices\" },\n { module: \"SIMUL\", table: \"instruments\" },\n { module: \"SIMUL\", table: \"prices\" },\n \"ric\",\n ),\n orders: ordersTable,\n parentOrders: parentOrdersTable,\n prices: pricesTable,\n };\n\n get menus(): Record<SimulTableName, VuuMenu | undefined> | undefined {\n return {\n childOrders: undefined,\n instruments: {\n name: \"ROOT\",\n menus: [\n {\n context: \"selected-rows\",\n filter: \"\",\n name: \"Add Instruments To Order\",\n rpcName: \"ADD_INSTRUMENTS_TO_ORDER\",\n },\n {\n context: \"selected-rows\",\n filter: \"\",\n name: \"Edit Row\",\n rpcName: \"EDIT_ROW\",\n },\n {\n context: \"selected-rows\",\n filter: \"\",\n name: \"Edit Rows\",\n rpcName: \"
|
|
1
|
+
{"version":3,"file":"SimulModule.js","sources":["../../../../packages/vuu-data-test/src/simul/SimulModule.ts"],"sourcesContent":["import {\n ClientToServerMenuRowRPC,\n VuuLink,\n VuuMenu,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n MenuServiceHandler,\n RpcMenuService,\n RpcService,\n ServiceHandler,\n VuuModule,\n} from \"../core/module/VuuModule\";\nimport { Table } from \"../Table\";\nimport { instrumentsTable } from \"./reference-data/instruments\";\nimport { instrumentsExtendedTable } from \"./reference-data/instruments-extended\";\nimport { ordersTable } from \"./reference-data/orders\";\nimport {\n childOrdersTable,\n parentOrdersTable,\n startGeneratingNewOrders,\n stopGeneratingNewOrders,\n} from \"./reference-data/parent-child-orders\";\nimport { pricesTable } from \"./reference-data/prices\";\nimport { schemas, type SimulTableName } from \"./simul-schemas\";\nimport tableContainer from \"../core/table/TableContainer\";\n\nconst undefinedTables = {\n childOrders: undefined,\n instruments: undefined,\n instrumentsExtended: undefined,\n instrumentPrices: undefined,\n orders: undefined,\n parentOrders: undefined,\n prices: undefined,\n};\n\n/**\n * This is an example of how we might extend the built-in VuuModule to\n * implement a module-specific service in such a way that it can invoke\n * methods on the VuuModule.\n */\nexport class SimulModule extends VuuModule<SimulTableName> {\n constructor() {\n super(\"SIMUL\");\n }\n\n #schemas = schemas;\n #tables: Record<SimulTableName, Table> = {\n childOrders: childOrdersTable,\n instruments: instrumentsTable,\n instrumentsExtended: instrumentsExtendedTable,\n instrumentPrices: tableContainer.createJoinTable(\n { module: \"SIMUL\", table: \"instrumentPrices\" },\n { module: \"SIMUL\", table: \"instruments\" },\n { module: \"SIMUL\", table: \"prices\" },\n \"ric\",\n ),\n orders: ordersTable,\n parentOrders: parentOrdersTable,\n prices: pricesTable,\n };\n\n get menus(): Record<SimulTableName, VuuMenu | undefined> | undefined {\n return {\n childOrders: undefined,\n instruments: {\n name: \"ROOT\",\n menus: [\n {\n context: \"selected-rows\",\n filter: \"\",\n name: \"Add Instruments To Order\",\n rpcName: \"ADD_INSTRUMENTS_TO_ORDER\",\n },\n {\n context: \"selected-rows\",\n filter: \"\",\n name: \"Edit Row (server)\",\n rpcName: \"EDIT_ROW\",\n },\n {\n context: \"selected-rows\",\n filter: \"\",\n name: \"Edit Rows (server)\",\n rpcName: \"beginEditSession\",\n },\n ],\n },\n instrumentsExtended: undefined,\n instrumentPrices: undefined,\n orders: {\n name: \"ROOT\",\n menus: [\n {\n context: \"row\",\n filter: `status in [\"New\",\"Partial Exec\"]`,\n name: \"Cancel Order\",\n rpcName: \"CANCEL_ORDER\",\n },\n ],\n },\n parentOrders: undefined,\n prices: undefined,\n };\n }\n\n get schemas() {\n return this.#schemas;\n }\n\n get editServices() {\n return undefined;\n }\n\n get menuServices():\n | Record<SimulTableName, RpcMenuService[] | undefined>\n | undefined {\n return {\n ...undefinedTables,\n orders: [\n {\n rpcName: \"CANCEL_ORDER\",\n service: this.cancelOrder,\n },\n ],\n };\n }\n\n get services(): Record<SimulTableName, RpcService[] | undefined> | undefined {\n return {\n ...undefinedTables,\n instruments: [\n {\n rpcName: \"DELETE_ROW\",\n service: this.deleteRow,\n },\n ],\n parentOrders: [\n {\n rpcName: \"startGeneratingNewOrders\",\n service: this.startOrders,\n },\n {\n rpcName: \"stopGeneratingNewOrders\",\n service: this.stopOrders,\n },\n ],\n };\n }\n\n get tables() {\n return this.#tables;\n }\n\n get visualLinks(): Record<SimulTableName, VuuLink[] | undefined> {\n return {\n ...undefinedTables,\n childOrders: [\n {\n fromColumn: \"parentOrderId\",\n toColumn: \"id\",\n toTable: \"parentOrders\",\n },\n ],\n parentOrders: [\n { fromColumn: \"ric\", toColumn: \"ric\", toTable: \"instruments\" },\n ],\n };\n }\n\n cancelOrder: MenuServiceHandler = async (rpcRequest) => {\n const { rowKey, vpId } = rpcRequest as ClientToServerMenuRowRPC;\n const table = this.tables.orders;\n const row = table.findByKey(rowKey);\n row[table.map.status] = \"Cancelled\";\n table.updateRow(row);\n\n return {\n action: {\n type: \"SHOW_NOTIFICATION_ACTION\",\n message: `Order id: ${rowKey}`,\n title: \"Order cancelled\",\n },\n rpcName: \"CANCEL_ORDER\",\n type: \"VIEW_PORT_MENU_RESP\",\n vpId,\n };\n };\n\n startOrders: ServiceHandler = async () => {\n startGeneratingNewOrders();\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n };\n stopOrders: ServiceHandler = async () => {\n stopGeneratingNewOrders();\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n };\n}\n\nexport const simulModule = new SimulModule();\n"],"names":["VuuModule","schemas","childOrdersTable","instrumentsTable","instrumentsExtendedTable","tableContainer","ordersTable","parentOrdersTable","pricesTable","startGeneratingNewOrders","stopGeneratingNewOrders"],"mappings":"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"}
|