@vuu-ui/vuu-data-test 2.1.16 → 2.1.17

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.
@@ -36,20 +36,87 @@ class VuuModule {
36
36
  __privateAdd(this, _sessionTableMap, {});
37
37
  __privateAdd(this, _tableServices);
38
38
  __privateAdd(this, _subscriptionMap, /* @__PURE__ */ new Map());
39
+ __publicField(this, "handlePostSubscribeActivities", ({
40
+ clientViewportId,
41
+ tableSchema
42
+ }) => {
43
+ const visualLinks = this.getVisualLinks(tableSchema.table.table);
44
+ const { dataSource } = this.getSubscriptionByViewport(clientViewportId);
45
+ requestAnimationFrame(() => {
46
+ dataSource.links = visualLinks;
47
+ });
48
+ if (this.visualLinks && dataSource.tableSchema) {
49
+ const {
50
+ table: { table: sourceTable }
51
+ } = dataSource.tableSchema;
52
+ for (const [table, links] of Object.entries(
53
+ this.visualLinks
54
+ )) {
55
+ if (links) {
56
+ const potentialTargets = links.filter(
57
+ (l) => l.toTable === sourceTable
58
+ );
59
+ if (potentialTargets.length) {
60
+ for (const subscriptions of __privateGet(this, _subscriptionMap).values()) {
61
+ for (const { dataSource: dataSource2 } of subscriptions) {
62
+ if (dataSource2.tableSchema?.table.table === table) {
63
+ dataSource2.links = this.getVisualLinks(table);
64
+ }
65
+ }
66
+ }
67
+ }
68
+ }
69
+ }
70
+ }
71
+ });
39
72
  __publicField(this, "unregisterViewport", (viewportId) => {
40
- for (const [tableName, subscriptions] of __privateGet(this, _subscriptionMap)) {
73
+ const { dataSource } = this.getSubscriptionByViewport(viewportId);
74
+ const tableName = dataSource.tableSchema?.table.table;
75
+ if (tableName) {
76
+ const subscriptionsForTable = __privateGet(this, _subscriptionMap).get(tableName);
77
+ if (subscriptionsForTable) {
78
+ for (const { viewportId: vp } of subscriptionsForTable) {
79
+ if (vp === viewportId) {
80
+ if (subscriptionsForTable.length === 1) {
81
+ __privateGet(this, _subscriptionMap).delete(tableName);
82
+ } else {
83
+ __privateGet(this, _subscriptionMap).set(
84
+ tableName,
85
+ subscriptionsForTable.filter(
86
+ (s) => s.viewportId !== viewportId
87
+ )
88
+ );
89
+ }
90
+ }
91
+ }
92
+ }
93
+ }
94
+ for (const [tableName2, subscriptions] of __privateGet(this, _subscriptionMap)) {
41
95
  if (subscriptions[0].viewportId.toString() === viewportId) {
42
- __privateGet(this, _subscriptionMap).delete(tableName);
43
- } else {
44
- const links = subscriptions[0].dataSource.links;
96
+ __privateGet(this, _subscriptionMap).delete(tableName2);
97
+ }
98
+ }
99
+ if (this.visualLinks && dataSource.tableSchema) {
100
+ const {
101
+ table: { table: sourceTable }
102
+ } = dataSource.tableSchema;
103
+ for (const [table, links] of Object.entries(
104
+ this.visualLinks
105
+ )) {
45
106
  if (links) {
46
- for (let i = 0; i < links?.length; i++) {
47
- if (links[i].parentClientVpId === viewportId) {
48
- links.splice(i);
107
+ const potentialTargets = links.filter(
108
+ (l) => l.toTable === sourceTable
109
+ );
110
+ if (potentialTargets.length) {
111
+ for (const subscriptions of __privateGet(this, _subscriptionMap).values()) {
112
+ for (const { dataSource: dataSource2 } of subscriptions) {
113
+ if (dataSource2.tableSchema?.table.table === table) {
114
+ dataSource2.links = this.getVisualLinks(table);
115
+ }
116
+ }
49
117
  }
50
118
  }
51
119
  }
52
- subscriptions[0].dataSource.links = links;
53
120
  }
54
121
  }
55
122
  });
@@ -106,11 +173,11 @@ class VuuModule {
106
173
  resolve();
107
174
  }
108
175
  }));
176
+ __publicField(this, "getVisualLinks", (tableName) => {
177
+ const linksForTable = this.visualLinks?.[tableName];
178
+ return linksForTable === void 0 ? void 0 : this.getLinks(__privateGet(this, _subscriptionMap), linksForTable);
179
+ });
109
180
  __publicField(this, "createDataSource", (tableName, viewport, config) => {
110
- const getVisualLinks = (tableName2) => {
111
- const linksForTable = this.visualLinks?.[tableName2];
112
- return linksForTable === void 0 ? void 0 : this.getLinks(__privateGet(this, _subscriptionMap), linksForTable);
113
- };
114
181
  const columnDescriptors = this.getColumnDescriptors(tableName);
115
182
  const table = this.tables[tableName];
116
183
  const sessionTable = __privateGet(this, _sessionTableMap)[tableName];
@@ -118,7 +185,7 @@ class VuuModule {
118
185
  const dataSource = new TickingArrayDataSource.TickingArrayDataSource({
119
186
  ...config,
120
187
  columnDescriptors,
121
- getVisualLinks,
188
+ getVisualLinks: this.getVisualLinks,
122
189
  keyColumn: this.schemas[tableName] === void 0 ? __privateGet(this, _sessionTableMap)[tableName].schema.key : this.schemas[tableName].key,
123
190
  table: table || sessionTable,
124
191
  menu: this.menus?.[tableName],
@@ -129,6 +196,7 @@ class VuuModule {
129
196
  visualLinkService: this.visualLinkService,
130
197
  vuuModule
131
198
  });
199
+ dataSource.on("subscribed", this.handlePostSubscribeActivities);
132
200
  dataSource.on("unsubscribed", this.unregisterViewport);
133
201
  const existingSubscriptions = __privateGet(this, _subscriptionMap).get(tableName);
134
202
  const subscription = {
@@ -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 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 VuuDataRow,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n isAddRowRpcRequest,\n isBeginEditSessionRpcRequest,\n isEditCellRpcRequest,\n isEndEditSessionRpcRequest,\n isRpcSuccess,\n uuid,\n} 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\";\nimport { sessionTableSchema } from \"../../session-table-utils\";\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: (\n tableName: T,\n viewport?: string,\n config?: DataSourceConfig,\n ) => 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 (isEditCellRpcRequest(rpcRequest)) {\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 (isBeginEditSessionRpcRequest(rpcRequest)) {\n const { viewPortId } = rpcRequest.context;\n const { editSessionMode = \"inline-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 addRow: ServiceHandler = async (rpcRequest) => {\n if (isAddRowRpcRequest(rpcRequest)) {\n const { viewPortId } = rpcRequest.context;\n const subscription = this.getSubscriptionByViewport(viewPortId);\n const sessionTable = subscription.sessionTableName\n ? this.#sessionTableMap[subscription.sessionTableName]\n : undefined;\n if (!sessionTable) {\n return {\n type: \"ERROR_RESULT\",\n errorMessage: `addRow: no active session table for viewport ${viewPortId}`,\n };\n }\n const { data } = rpcRequest.params;\n\n const columnMap = sessionTable.map;\n const columnCount = Object.keys(columnMap).length;\n const row: VuuDataRow = new Array(columnCount).fill(\"\");\n for (const [col, idx] of Object.entries(columnMap)) {\n if (data[col] !== undefined) {\n row[idx] = data[col];\n }\n }\n sessionTable.insert(row);\n return { type: \"SUCCESS_RESULT\", data: undefined };\n }\n return {\n type: \"ERROR_RESULT\",\n errorMessage: \"addRow: invalid rpc context\",\n };\n };\n\n private endEditSession: ServiceHandler = async (rpcRequest) => {\n if (isEndEditSessionRpcRequest(rpcRequest)) {\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 let rejectedCount = 0;\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 // We will reject updates for this row, update sessionn table row with message\n rejectedCount += 1;\n const sessionTableRow = sessionTable.findByKey(key);\n const newRow = sessionTableRow.slice();\n const messages: string[] = [];\n Object.entries(cellUpdates).forEach(([column, value]) => {\n messages.push(`${column}:${value}`);\n });\n newRow[sessionTable.map.vuuMsg] = messages.join(\",\");\n sessionTable.updateRow(newRow);\n } else {\n const newRow = currentRow.slice();\n Object.entries(cellUpdates).forEach(([column, value]) => {\n newRow[sourceTable.map[column]] = value;\n });\n sourceTable.updateRow(newRow);\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 if (rejectedCount > 0) {\n return {\n errorMessage: \"stale update\",\n type: \"ERROR_RESULT\",\n };\n } else {\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n }\n } else {\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\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 as {\n column: NamedCurve;\n value: VuuRowDataItemType;\n };\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 = \"inline-all-rows\",\n dataSource: TickingArrayDataSource,\n ) {\n if (editSessionMode.endsWith(\"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 preserve the original table name on the schema for the session table,\n // this will later be used to retrieve source table\n const sessionSchema = sessionTableSchema(schema);\n\n return new Table(\n sessionSchema,\n sessionData,\n buildDataColumnMapFromSchema(sessionSchema),\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 #moduleServices: RpcService[] = [\n {\n rpcName: \"addRow\",\n service: this.addRow,\n },\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","isEditCellRpcRequest","isRpcSuccess","isBeginEditSessionRpcRequest","uuid","isAddRowRpcRequest","isEndEditSessionRpcRequest","isProxySessionTable","moduleContainer","SessionTable","Table","buildDataColumnMapFromSchema","sessionTableSchema"],"mappings":"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"}
1
+ {"version":3,"file":"VuuModule.js","sources":["../../../../../packages/vuu-data-test/src/core/module/VuuModule.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceConfig,\n DataSourceSubscribedMessage,\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 VuuDataRow,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n isAddRowRpcRequest,\n isBeginEditSessionRpcRequest,\n isEditCellRpcRequest,\n isEndEditSessionRpcRequest,\n isRpcSuccess,\n uuid,\n} 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\";\nimport { sessionTableSchema } from \"../../session-table-utils\";\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: (\n tableName: T,\n viewport?: string,\n config?: DataSourceConfig,\n ) => 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 handlePostSubscribeActivities = ({\n clientViewportId,\n tableSchema,\n }: DataSourceSubscribedMessage) => {\n const visualLinks = this.getVisualLinks(tableSchema.table.table);\n const { dataSource } = this.getSubscriptionByViewport(clientViewportId);\n requestAnimationFrame(() => {\n dataSource.links = visualLinks;\n });\n\n // check whether newly subscribed viewport is associated with table that is a potential\n // visual link target. If so send links update message to any active subscription\n // associated with a table that is a potential link source\n if (this.visualLinks && dataSource.tableSchema) {\n const {\n table: { table: sourceTable },\n } = dataSource.tableSchema;\n for (const [table, links] of Object.entries<VuuLink[] | undefined>(\n this.visualLinks,\n )) {\n if (links) {\n const potentialTargets = links.filter(\n (l) => l.toTable === sourceTable,\n );\n if (potentialTargets.length) {\n for (const subscriptions of this.#subscriptionMap.values()) {\n for (const { dataSource } of subscriptions) {\n if (dataSource.tableSchema?.table.table === table) {\n dataSource.links = this.getVisualLinks(table);\n }\n }\n }\n }\n }\n }\n }\n };\n\n protected unregisterViewport = (viewportId: string) => {\n const { dataSource } = this.getSubscriptionByViewport(viewportId);\n const tableName = dataSource.tableSchema?.table.table;\n if (tableName) {\n const subscriptionsForTable = this.#subscriptionMap.get(tableName);\n if (subscriptionsForTable) {\n for (const { viewportId: vp } of subscriptionsForTable) {\n if (vp === viewportId) {\n if (subscriptionsForTable.length === 1) {\n this.#subscriptionMap.delete(tableName);\n } else {\n this.#subscriptionMap.set(\n tableName,\n subscriptionsForTable.filter(\n (s) => s.viewportId !== viewportId,\n ),\n );\n }\n }\n }\n }\n }\n\n for (const [tableName, subscriptions] of this.#subscriptionMap) {\n if (subscriptions[0].viewportId.toString() === viewportId) {\n this.#subscriptionMap.delete(tableName);\n }\n }\n\n // check whether newly unsubscribed viewport is associated with table that is a potential\n // visual link target. If so send links update message to any active subscription\n // associated with a table that is a potential link source\n if (this.visualLinks && dataSource.tableSchema) {\n const {\n table: { table: sourceTable },\n } = dataSource.tableSchema;\n for (const [table, links] of Object.entries<VuuLink[] | undefined>(\n this.visualLinks,\n )) {\n if (links) {\n const potentialTargets = links.filter(\n (l) => l.toTable === sourceTable,\n );\n if (potentialTargets.length) {\n for (const subscriptions of this.#subscriptionMap.values()) {\n for (const { dataSource } of subscriptions) {\n if (dataSource.tableSchema?.table.table === table) {\n dataSource.links = this.getVisualLinks(table);\n }\n }\n }\n }\n }\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 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 createDataSource = (\n tableName: T,\n viewport?: string,\n config?: DataSourceConfig,\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: this.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(\"subscribed\", this.handlePostSubscribeActivities);\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 (isEditCellRpcRequest(rpcRequest)) {\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 (isBeginEditSessionRpcRequest(rpcRequest)) {\n const { viewPortId } = rpcRequest.context;\n const { editSessionMode = \"inline-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 addRow: ServiceHandler = async (rpcRequest) => {\n if (isAddRowRpcRequest(rpcRequest)) {\n const { viewPortId } = rpcRequest.context;\n const subscription = this.getSubscriptionByViewport(viewPortId);\n const sessionTable = subscription.sessionTableName\n ? this.#sessionTableMap[subscription.sessionTableName]\n : undefined;\n if (!sessionTable) {\n return {\n type: \"ERROR_RESULT\",\n errorMessage: `addRow: no active session table for viewport ${viewPortId}`,\n };\n }\n const { data } = rpcRequest.params;\n\n const columnMap = sessionTable.map;\n const columnCount = Object.keys(columnMap).length;\n const row: VuuDataRow = new Array(columnCount).fill(\"\");\n for (const [col, idx] of Object.entries(columnMap)) {\n if (data[col] !== undefined) {\n row[idx] = data[col];\n }\n }\n sessionTable.insert(row);\n return { type: \"SUCCESS_RESULT\", data: undefined };\n }\n return {\n type: \"ERROR_RESULT\",\n errorMessage: \"addRow: invalid rpc context\",\n };\n };\n\n private endEditSession: ServiceHandler = async (rpcRequest) => {\n if (isEndEditSessionRpcRequest(rpcRequest)) {\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 let rejectedCount = 0;\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 // We will reject updates for this row, update sessionn table row with message\n rejectedCount += 1;\n const sessionTableRow = sessionTable.findByKey(key);\n const newRow = sessionTableRow.slice();\n const messages: string[] = [];\n Object.entries(cellUpdates).forEach(([column, value]) => {\n messages.push(`${column}:${value}`);\n });\n newRow[sessionTable.map.vuuMsg] = messages.join(\",\");\n sessionTable.updateRow(newRow);\n } else {\n const newRow = currentRow.slice();\n Object.entries(cellUpdates).forEach(([column, value]) => {\n newRow[sourceTable.map[column]] = value;\n });\n sourceTable.updateRow(newRow);\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 if (rejectedCount > 0) {\n return {\n errorMessage: \"stale update\",\n type: \"ERROR_RESULT\",\n };\n } else {\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n }\n } else {\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\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 as {\n column: NamedCurve;\n value: VuuRowDataItemType;\n };\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 = \"inline-all-rows\",\n dataSource: TickingArrayDataSource,\n ) {\n if (editSessionMode.endsWith(\"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 preserve the original table name on the schema for the session table,\n // this will later be used to retrieve source table\n const sessionSchema = sessionTableSchema(schema);\n\n return new Table(\n sessionSchema,\n sessionData,\n buildDataColumnMapFromSchema(sessionSchema),\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 #moduleServices: RpcService[] = [\n {\n rpcName: \"addRow\",\n service: this.addRow,\n },\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","dataSource","tableName","RuntimeVisualLink","TickingArrayDataSource","isEditCellRpcRequest","isRpcSuccess","isBeginEditSessionRpcRequest","uuid","isAddRowRpcRequest","isEndEditSessionRpcRequest","isProxySessionTable","moduleContainer","SessionTable","Table","buildDataColumnMapFromSchema","sessionTableSchema"],"mappings":"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"}
@@ -34,20 +34,87 @@ class VuuModule {
34
34
  __privateAdd(this, _sessionTableMap, {});
35
35
  __privateAdd(this, _tableServices);
36
36
  __privateAdd(this, _subscriptionMap, /* @__PURE__ */ new Map());
37
+ __publicField(this, "handlePostSubscribeActivities", ({
38
+ clientViewportId,
39
+ tableSchema
40
+ }) => {
41
+ const visualLinks = this.getVisualLinks(tableSchema.table.table);
42
+ const { dataSource } = this.getSubscriptionByViewport(clientViewportId);
43
+ requestAnimationFrame(() => {
44
+ dataSource.links = visualLinks;
45
+ });
46
+ if (this.visualLinks && dataSource.tableSchema) {
47
+ const {
48
+ table: { table: sourceTable }
49
+ } = dataSource.tableSchema;
50
+ for (const [table, links] of Object.entries(
51
+ this.visualLinks
52
+ )) {
53
+ if (links) {
54
+ const potentialTargets = links.filter(
55
+ (l) => l.toTable === sourceTable
56
+ );
57
+ if (potentialTargets.length) {
58
+ for (const subscriptions of __privateGet(this, _subscriptionMap).values()) {
59
+ for (const { dataSource: dataSource2 } of subscriptions) {
60
+ if (dataSource2.tableSchema?.table.table === table) {
61
+ dataSource2.links = this.getVisualLinks(table);
62
+ }
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
68
+ }
69
+ });
37
70
  __publicField(this, "unregisterViewport", (viewportId) => {
38
- for (const [tableName, subscriptions] of __privateGet(this, _subscriptionMap)) {
71
+ const { dataSource } = this.getSubscriptionByViewport(viewportId);
72
+ const tableName = dataSource.tableSchema?.table.table;
73
+ if (tableName) {
74
+ const subscriptionsForTable = __privateGet(this, _subscriptionMap).get(tableName);
75
+ if (subscriptionsForTable) {
76
+ for (const { viewportId: vp } of subscriptionsForTable) {
77
+ if (vp === viewportId) {
78
+ if (subscriptionsForTable.length === 1) {
79
+ __privateGet(this, _subscriptionMap).delete(tableName);
80
+ } else {
81
+ __privateGet(this, _subscriptionMap).set(
82
+ tableName,
83
+ subscriptionsForTable.filter(
84
+ (s) => s.viewportId !== viewportId
85
+ )
86
+ );
87
+ }
88
+ }
89
+ }
90
+ }
91
+ }
92
+ for (const [tableName2, subscriptions] of __privateGet(this, _subscriptionMap)) {
39
93
  if (subscriptions[0].viewportId.toString() === viewportId) {
40
- __privateGet(this, _subscriptionMap).delete(tableName);
41
- } else {
42
- const links = subscriptions[0].dataSource.links;
94
+ __privateGet(this, _subscriptionMap).delete(tableName2);
95
+ }
96
+ }
97
+ if (this.visualLinks && dataSource.tableSchema) {
98
+ const {
99
+ table: { table: sourceTable }
100
+ } = dataSource.tableSchema;
101
+ for (const [table, links] of Object.entries(
102
+ this.visualLinks
103
+ )) {
43
104
  if (links) {
44
- for (let i = 0; i < links?.length; i++) {
45
- if (links[i].parentClientVpId === viewportId) {
46
- links.splice(i);
105
+ const potentialTargets = links.filter(
106
+ (l) => l.toTable === sourceTable
107
+ );
108
+ if (potentialTargets.length) {
109
+ for (const subscriptions of __privateGet(this, _subscriptionMap).values()) {
110
+ for (const { dataSource: dataSource2 } of subscriptions) {
111
+ if (dataSource2.tableSchema?.table.table === table) {
112
+ dataSource2.links = this.getVisualLinks(table);
113
+ }
114
+ }
47
115
  }
48
116
  }
49
117
  }
50
- subscriptions[0].dataSource.links = links;
51
118
  }
52
119
  }
53
120
  });
@@ -104,11 +171,11 @@ class VuuModule {
104
171
  resolve();
105
172
  }
106
173
  }));
174
+ __publicField(this, "getVisualLinks", (tableName) => {
175
+ const linksForTable = this.visualLinks?.[tableName];
176
+ return linksForTable === void 0 ? void 0 : this.getLinks(__privateGet(this, _subscriptionMap), linksForTable);
177
+ });
107
178
  __publicField(this, "createDataSource", (tableName, viewport, config) => {
108
- const getVisualLinks = (tableName2) => {
109
- const linksForTable = this.visualLinks?.[tableName2];
110
- return linksForTable === void 0 ? void 0 : this.getLinks(__privateGet(this, _subscriptionMap), linksForTable);
111
- };
112
179
  const columnDescriptors = this.getColumnDescriptors(tableName);
113
180
  const table = this.tables[tableName];
114
181
  const sessionTable = __privateGet(this, _sessionTableMap)[tableName];
@@ -116,7 +183,7 @@ class VuuModule {
116
183
  const dataSource = new TickingArrayDataSource({
117
184
  ...config,
118
185
  columnDescriptors,
119
- getVisualLinks,
186
+ getVisualLinks: this.getVisualLinks,
120
187
  keyColumn: this.schemas[tableName] === void 0 ? __privateGet(this, _sessionTableMap)[tableName].schema.key : this.schemas[tableName].key,
121
188
  table: table || sessionTable,
122
189
  menu: this.menus?.[tableName],
@@ -127,6 +194,7 @@ class VuuModule {
127
194
  visualLinkService: this.visualLinkService,
128
195
  vuuModule
129
196
  });
197
+ dataSource.on("subscribed", this.handlePostSubscribeActivities);
130
198
  dataSource.on("unsubscribed", this.unregisterViewport);
131
199
  const existingSubscriptions = __privateGet(this, _subscriptionMap).get(tableName);
132
200
  const subscription = {
@@ -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 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 VuuDataRow,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n isAddRowRpcRequest,\n isBeginEditSessionRpcRequest,\n isEditCellRpcRequest,\n isEndEditSessionRpcRequest,\n isRpcSuccess,\n uuid,\n} 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\";\nimport { sessionTableSchema } from \"../../session-table-utils\";\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: (\n tableName: T,\n viewport?: string,\n config?: DataSourceConfig,\n ) => 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 (isEditCellRpcRequest(rpcRequest)) {\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 (isBeginEditSessionRpcRequest(rpcRequest)) {\n const { viewPortId } = rpcRequest.context;\n const { editSessionMode = \"inline-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 addRow: ServiceHandler = async (rpcRequest) => {\n if (isAddRowRpcRequest(rpcRequest)) {\n const { viewPortId } = rpcRequest.context;\n const subscription = this.getSubscriptionByViewport(viewPortId);\n const sessionTable = subscription.sessionTableName\n ? this.#sessionTableMap[subscription.sessionTableName]\n : undefined;\n if (!sessionTable) {\n return {\n type: \"ERROR_RESULT\",\n errorMessage: `addRow: no active session table for viewport ${viewPortId}`,\n };\n }\n const { data } = rpcRequest.params;\n\n const columnMap = sessionTable.map;\n const columnCount = Object.keys(columnMap).length;\n const row: VuuDataRow = new Array(columnCount).fill(\"\");\n for (const [col, idx] of Object.entries(columnMap)) {\n if (data[col] !== undefined) {\n row[idx] = data[col];\n }\n }\n sessionTable.insert(row);\n return { type: \"SUCCESS_RESULT\", data: undefined };\n }\n return {\n type: \"ERROR_RESULT\",\n errorMessage: \"addRow: invalid rpc context\",\n };\n };\n\n private endEditSession: ServiceHandler = async (rpcRequest) => {\n if (isEndEditSessionRpcRequest(rpcRequest)) {\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 let rejectedCount = 0;\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 // We will reject updates for this row, update sessionn table row with message\n rejectedCount += 1;\n const sessionTableRow = sessionTable.findByKey(key);\n const newRow = sessionTableRow.slice();\n const messages: string[] = [];\n Object.entries(cellUpdates).forEach(([column, value]) => {\n messages.push(`${column}:${value}`);\n });\n newRow[sessionTable.map.vuuMsg] = messages.join(\",\");\n sessionTable.updateRow(newRow);\n } else {\n const newRow = currentRow.slice();\n Object.entries(cellUpdates).forEach(([column, value]) => {\n newRow[sourceTable.map[column]] = value;\n });\n sourceTable.updateRow(newRow);\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 if (rejectedCount > 0) {\n return {\n errorMessage: \"stale update\",\n type: \"ERROR_RESULT\",\n };\n } else {\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n }\n } else {\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\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 as {\n column: NamedCurve;\n value: VuuRowDataItemType;\n };\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 = \"inline-all-rows\",\n dataSource: TickingArrayDataSource,\n ) {\n if (editSessionMode.endsWith(\"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 preserve the original table name on the schema for the session table,\n // this will later be used to retrieve source table\n const sessionSchema = sessionTableSchema(schema);\n\n return new Table(\n sessionSchema,\n sessionData,\n buildDataColumnMapFromSchema(sessionSchema),\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 #moduleServices: RpcService[] = [\n {\n rpcName: \"addRow\",\n service: this.addRow,\n },\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","tableName"],"mappings":"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"}
1
+ {"version":3,"file":"VuuModule.js","sources":["../../../../../packages/vuu-data-test/src/core/module/VuuModule.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceConfig,\n DataSourceSubscribedMessage,\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 VuuDataRow,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n isAddRowRpcRequest,\n isBeginEditSessionRpcRequest,\n isEditCellRpcRequest,\n isEndEditSessionRpcRequest,\n isRpcSuccess,\n uuid,\n} 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\";\nimport { sessionTableSchema } from \"../../session-table-utils\";\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: (\n tableName: T,\n viewport?: string,\n config?: DataSourceConfig,\n ) => 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 handlePostSubscribeActivities = ({\n clientViewportId,\n tableSchema,\n }: DataSourceSubscribedMessage) => {\n const visualLinks = this.getVisualLinks(tableSchema.table.table);\n const { dataSource } = this.getSubscriptionByViewport(clientViewportId);\n requestAnimationFrame(() => {\n dataSource.links = visualLinks;\n });\n\n // check whether newly subscribed viewport is associated with table that is a potential\n // visual link target. If so send links update message to any active subscription\n // associated with a table that is a potential link source\n if (this.visualLinks && dataSource.tableSchema) {\n const {\n table: { table: sourceTable },\n } = dataSource.tableSchema;\n for (const [table, links] of Object.entries<VuuLink[] | undefined>(\n this.visualLinks,\n )) {\n if (links) {\n const potentialTargets = links.filter(\n (l) => l.toTable === sourceTable,\n );\n if (potentialTargets.length) {\n for (const subscriptions of this.#subscriptionMap.values()) {\n for (const { dataSource } of subscriptions) {\n if (dataSource.tableSchema?.table.table === table) {\n dataSource.links = this.getVisualLinks(table);\n }\n }\n }\n }\n }\n }\n }\n };\n\n protected unregisterViewport = (viewportId: string) => {\n const { dataSource } = this.getSubscriptionByViewport(viewportId);\n const tableName = dataSource.tableSchema?.table.table;\n if (tableName) {\n const subscriptionsForTable = this.#subscriptionMap.get(tableName);\n if (subscriptionsForTable) {\n for (const { viewportId: vp } of subscriptionsForTable) {\n if (vp === viewportId) {\n if (subscriptionsForTable.length === 1) {\n this.#subscriptionMap.delete(tableName);\n } else {\n this.#subscriptionMap.set(\n tableName,\n subscriptionsForTable.filter(\n (s) => s.viewportId !== viewportId,\n ),\n );\n }\n }\n }\n }\n }\n\n for (const [tableName, subscriptions] of this.#subscriptionMap) {\n if (subscriptions[0].viewportId.toString() === viewportId) {\n this.#subscriptionMap.delete(tableName);\n }\n }\n\n // check whether newly unsubscribed viewport is associated with table that is a potential\n // visual link target. If so send links update message to any active subscription\n // associated with a table that is a potential link source\n if (this.visualLinks && dataSource.tableSchema) {\n const {\n table: { table: sourceTable },\n } = dataSource.tableSchema;\n for (const [table, links] of Object.entries<VuuLink[] | undefined>(\n this.visualLinks,\n )) {\n if (links) {\n const potentialTargets = links.filter(\n (l) => l.toTable === sourceTable,\n );\n if (potentialTargets.length) {\n for (const subscriptions of this.#subscriptionMap.values()) {\n for (const { dataSource } of subscriptions) {\n if (dataSource.tableSchema?.table.table === table) {\n dataSource.links = this.getVisualLinks(table);\n }\n }\n }\n }\n }\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 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 createDataSource = (\n tableName: T,\n viewport?: string,\n config?: DataSourceConfig,\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: this.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(\"subscribed\", this.handlePostSubscribeActivities);\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 (isEditCellRpcRequest(rpcRequest)) {\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 (isBeginEditSessionRpcRequest(rpcRequest)) {\n const { viewPortId } = rpcRequest.context;\n const { editSessionMode = \"inline-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 addRow: ServiceHandler = async (rpcRequest) => {\n if (isAddRowRpcRequest(rpcRequest)) {\n const { viewPortId } = rpcRequest.context;\n const subscription = this.getSubscriptionByViewport(viewPortId);\n const sessionTable = subscription.sessionTableName\n ? this.#sessionTableMap[subscription.sessionTableName]\n : undefined;\n if (!sessionTable) {\n return {\n type: \"ERROR_RESULT\",\n errorMessage: `addRow: no active session table for viewport ${viewPortId}`,\n };\n }\n const { data } = rpcRequest.params;\n\n const columnMap = sessionTable.map;\n const columnCount = Object.keys(columnMap).length;\n const row: VuuDataRow = new Array(columnCount).fill(\"\");\n for (const [col, idx] of Object.entries(columnMap)) {\n if (data[col] !== undefined) {\n row[idx] = data[col];\n }\n }\n sessionTable.insert(row);\n return { type: \"SUCCESS_RESULT\", data: undefined };\n }\n return {\n type: \"ERROR_RESULT\",\n errorMessage: \"addRow: invalid rpc context\",\n };\n };\n\n private endEditSession: ServiceHandler = async (rpcRequest) => {\n if (isEndEditSessionRpcRequest(rpcRequest)) {\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 let rejectedCount = 0;\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 // We will reject updates for this row, update sessionn table row with message\n rejectedCount += 1;\n const sessionTableRow = sessionTable.findByKey(key);\n const newRow = sessionTableRow.slice();\n const messages: string[] = [];\n Object.entries(cellUpdates).forEach(([column, value]) => {\n messages.push(`${column}:${value}`);\n });\n newRow[sessionTable.map.vuuMsg] = messages.join(\",\");\n sessionTable.updateRow(newRow);\n } else {\n const newRow = currentRow.slice();\n Object.entries(cellUpdates).forEach(([column, value]) => {\n newRow[sourceTable.map[column]] = value;\n });\n sourceTable.updateRow(newRow);\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 if (rejectedCount > 0) {\n return {\n errorMessage: \"stale update\",\n type: \"ERROR_RESULT\",\n };\n } else {\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n }\n } else {\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\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 as {\n column: NamedCurve;\n value: VuuRowDataItemType;\n };\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 = \"inline-all-rows\",\n dataSource: TickingArrayDataSource,\n ) {\n if (editSessionMode.endsWith(\"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 preserve the original table name on the schema for the session table,\n // this will later be used to retrieve source table\n const sessionSchema = sessionTableSchema(schema);\n\n return new Table(\n sessionSchema,\n sessionData,\n buildDataColumnMapFromSchema(sessionSchema),\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 #moduleServices: RpcService[] = [\n {\n rpcName: \"addRow\",\n service: this.addRow,\n },\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","dataSource","tableName"],"mappings":"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"}
package/package.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
- "version": "2.1.16",
2
+ "version": "2.1.17",
3
3
  "author": "heswell",
4
4
  "license": "Apache-2.0",
5
5
  "dependencies": {
6
- "@vuu-ui/vuu-data-local": "2.1.16",
7
- "@vuu-ui/vuu-utils": "2.1.16"
6
+ "@vuu-ui/vuu-data-local": "2.1.17",
7
+ "@vuu-ui/vuu-utils": "2.1.17"
8
8
  },
9
9
  "devDependencies": {
10
- "@vuu-ui/vuu-protocol-types": "2.1.16",
11
- "@vuu-ui/vuu-data-types": "2.1.16",
12
- "@vuu-ui/vuu-table-types": "2.1.16"
10
+ "@vuu-ui/vuu-protocol-types": "2.1.17",
11
+ "@vuu-ui/vuu-data-types": "2.1.17",
12
+ "@vuu-ui/vuu-table-types": "2.1.17"
13
13
  },
14
14
  "sideEffects": false,
15
15
  "files": [
@@ -1,4 +1,4 @@
1
- import { DataSource, DataSourceConfig, DataSourceVisualLinkCreatedMessage, EditSessionMode, TableSchema } from "@vuu-ui/vuu-data-types";
1
+ import { DataSource, DataSourceConfig, DataSourceSubscribedMessage, DataSourceVisualLinkCreatedMessage, EditSessionMode, TableSchema } from "@vuu-ui/vuu-data-types";
2
2
  import { VuuMenu, VuuLink, LinkDescriptorWithLabel, VuuRpcMenuResponse, VuuCreateVisualLink, VuuRemoveVisualLink, VuuRpcServiceRequest, RpcResultSuccess, RpcResultError, VuuRpcMenuRequest } from "@vuu-ui/vuu-protocol-types";
3
3
  import { Table } from "../../Table";
4
4
  import { SessionTable } from "../../SessionTable";
@@ -33,12 +33,14 @@ export declare abstract class VuuModule<T extends string = string> implements IV
33
33
  protected abstract visualLinks?: Record<T, VuuLink[] | undefined>;
34
34
  getTableSchema(tableName: string): Record<T, Readonly<TableSchema>>[T];
35
35
  getTableList(): string[];
36
+ protected handlePostSubscribeActivities: ({ clientViewportId, tableSchema, }: DataSourceSubscribedMessage) => void;
36
37
  protected unregisterViewport: (viewportId: string) => void;
37
38
  get name(): string;
38
39
  getSubscriptionByViewport(viewportId: string): Subscription;
39
40
  getSubscribedDataSource(vpId: string): DataSource;
40
41
  getLinks: (subscriptionMap: Map<string, Subscription[]>, vuuLinks: VuuLink[]) => LinkDescriptorWithLabel[];
41
42
  visualLinkService: (message: VuuCreateVisualLink | VuuRemoveVisualLink) => Promise<DataSourceVisualLinkCreatedMessage | void>;
43
+ getVisualLinks: (tableName: string) => LinkDescriptorWithLabel[] | undefined;
42
44
  createDataSource: (tableName: T, viewport?: string, config?: DataSourceConfig) => DataSource;
43
45
  getServices(tableName: T): RpcService[];
44
46
  getMenuServices(tableName: T): RpcMenuService[];