@vuu-ui/vuu-data-test 0.8.74 → 0.8.75

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.
@@ -22,8 +22,9 @@ var __privateSet = (obj, member, value, setter) => {
22
22
  setter ? setter.call(obj, value) : member.set(obj, value);
23
23
  return value;
24
24
  };
25
- var _menuRpcServices, _rpcServices, _sessionTables, _table;
25
+ var _menuRpcServices, _rpcServices, _sessionTables, _table, _broadcastChannel, _selectionLinkSubscribers;
26
26
  const { KEY } = vuuUtils.metadataKeys;
27
+ const isMessageForSelf = (message, id) => message.targetId === id;
27
28
  const _TickingArrayDataSource = class _TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
28
29
  constructor({
29
30
  data,
@@ -47,6 +48,44 @@ const _TickingArrayDataSource = class _TickingArrayDataSource extends vuuDataLoc
47
48
  // A reference to session tables hosted within client side module
48
49
  __privateAdd(this, _sessionTables, void 0);
49
50
  __privateAdd(this, _table, void 0);
51
+ __privateAdd(this, _broadcastChannel, new BroadcastChannel("vuu-datasource"));
52
+ __privateAdd(this, _selectionLinkSubscribers, void 0);
53
+ this.receiveBroadcastMessage = (message) => {
54
+ switch (message.type) {
55
+ case "subscribe-link-filter":
56
+ case "subscribe-link-select":
57
+ {
58
+ const subscribers = __privateGet(this, _selectionLinkSubscribers) || __privateSet(this, _selectionLinkSubscribers, /* @__PURE__ */ new Map());
59
+ subscribers.set(message.sourceId, {
60
+ columnName: message.targetColumn,
61
+ linkType: message.type
62
+ });
63
+ }
64
+ break;
65
+ case "selection-changed":
66
+ {
67
+ const { columnName, linkType, selectedValues } = message;
68
+ const selectedIndices = [];
69
+ const colIndex = this.columnMap[columnName];
70
+ if (linkType === "subscribe-link-select") {
71
+ for (const value of selectedValues) {
72
+ const index = this.data.findIndex(
73
+ (row) => row[colIndex] === value
74
+ );
75
+ selectedIndices.push(index);
76
+ }
77
+ this.select(selectedIndices);
78
+ } else {
79
+ this.filter = {
80
+ filter: `${columnName} in ["${selectedValues.join('","')}"]`
81
+ };
82
+ }
83
+ }
84
+ break;
85
+ default:
86
+ console.log(`unrecognised message ${message.type}`);
87
+ }
88
+ };
50
89
  this._menu = menu;
51
90
  __privateSet(this, _menuRpcServices, menuRpcServices);
52
91
  __privateSet(this, _sessionTables, sessionTables);
@@ -58,6 +97,11 @@ const _TickingArrayDataSource = class _TickingArrayDataSource extends vuuDataLoc
58
97
  table.on("insert", this.insert);
59
98
  table.on("update", this.updateRow);
60
99
  }
100
+ __privateGet(this, _broadcastChannel).onmessage = (evt) => {
101
+ if (isMessageForSelf(evt.data, this.viewport)) {
102
+ this.receiveBroadcastMessage(evt.data);
103
+ }
104
+ };
61
105
  }
62
106
  async subscribe(subscribeProps, callback) {
63
107
  const subscription = super.subscribe(subscribeProps, callback);
@@ -69,6 +113,33 @@ const _TickingArrayDataSource = class _TickingArrayDataSource extends vuuDataLoc
69
113
  get range() {
70
114
  return super.range;
71
115
  }
116
+ pickUniqueSelectedValues(column) {
117
+ const map = this.columnMap;
118
+ const set = /* @__PURE__ */ new Set();
119
+ const colIndex = map[column];
120
+ for (const row of this.getSelectedRows()) {
121
+ set.add(row[colIndex]);
122
+ }
123
+ return Array.from(set);
124
+ }
125
+ select(selected) {
126
+ super.select(selected);
127
+ const numberOfSelectionSubscribers = __privateGet(this, _selectionLinkSubscribers)?.size ?? 0;
128
+ if (numberOfSelectionSubscribers > 0) {
129
+ __privateGet(this, _selectionLinkSubscribers)?.forEach(
130
+ ({ columnName, linkType }, targetId) => {
131
+ this.sendBroadcastMessage({
132
+ columnName,
133
+ linkType,
134
+ sourceId: this.viewport,
135
+ targetId,
136
+ type: "selection-changed",
137
+ selectedValues: this.pickUniqueSelectedValues(columnName)
138
+ });
139
+ }
140
+ );
141
+ }
142
+ }
72
143
  getSelectedRows() {
73
144
  return this.selectedRows.reduce(
74
145
  (rows, selected) => {
@@ -181,11 +252,16 @@ const _TickingArrayDataSource = class _TickingArrayDataSource extends vuuDataLoc
181
252
  );
182
253
  }
183
254
  }
255
+ sendBroadcastMessage(message) {
256
+ __privateGet(this, _broadcastChannel).postMessage(message);
257
+ }
184
258
  };
185
259
  _menuRpcServices = new WeakMap();
186
260
  _rpcServices = new WeakMap();
187
261
  _sessionTables = new WeakMap();
188
262
  _table = new WeakMap();
263
+ _broadcastChannel = new WeakMap();
264
+ _selectionLinkSubscribers = new WeakMap();
189
265
  let TickingArrayDataSource = _TickingArrayDataSource;
190
266
 
191
267
  exports.TickingArrayDataSource = TickingArrayDataSource;
@@ -1 +1 @@
1
- {"version":3,"file":"TickingArrayDataSource.js","sources":["../src/TickingArrayDataSource.ts"],"sourcesContent":["import {\n ArrayDataSource,\n ArrayDataSourceConstructorProps,\n} from \"@vuu-ui/vuu-data-local\";\nimport type {\n DataSourceRow,\n MenuRpcResponse,\n RpcResponse,\n SelectionItem,\n SubscribeCallback,\n SubscribeProps,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n ClientToServerEditRpc,\n ClientToServerMenuRPC,\n ClientToServerViewportRpcCall,\n LinkDescriptorWithLabel,\n VuuMenu,\n VuuRange,\n VuuRowDataItemType,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { metadataKeys } from \"@vuu-ui/vuu-utils\";\nimport { makeSuggestions } from \"./makeSuggestions\";\nimport { Table } from \"./Table\";\nimport { RpcService, SessionTableMap } from \"./VuuModule\";\n\nconst { KEY } = metadataKeys;\n\nexport interface TickingArrayDataSourceConstructorProps\n extends Omit<ArrayDataSourceConstructorProps, \"data\"> {\n data?: Array<VuuRowDataItemType[]>;\n menu?: VuuMenu;\n menuRpcServices?: RpcService[];\n rpcServices?: RpcService[];\n sessionTables?: SessionTableMap;\n table?: Table;\n visualLinks?: LinkDescriptorWithLabel[];\n}\n\nexport class TickingArrayDataSource extends ArrayDataSource {\n #menuRpcServices: RpcService[] | undefined;\n #rpcServices: RpcService[] | undefined;\n // A reference to session tables hosted within client side module\n #sessionTables: SessionTableMap | undefined;\n #table?: Table;\n\n constructor({\n data,\n menuRpcServices,\n rpcServices,\n sessionTables,\n table,\n menu,\n visualLinks,\n ...arrayDataSourceProps\n }: TickingArrayDataSourceConstructorProps) {\n if (data === undefined && table === undefined) {\n throw Error(\"TickingArrayDataSource must be constructed with data\");\n }\n super({\n ...arrayDataSourceProps,\n data: data ?? table?.data ?? [],\n });\n this._menu = menu;\n this.#menuRpcServices = menuRpcServices;\n this.#sessionTables = sessionTables;\n this.#rpcServices = rpcServices;\n this.#table = table;\n this.links = visualLinks;\n\n if (table) {\n this.tableSchema = table.schema;\n table.on(\"insert\", this.insert);\n table.on(\"update\", this.updateRow);\n }\n }\n\n async subscribe(subscribeProps: SubscribeProps, callback: SubscribeCallback) {\n const subscription = super.subscribe(subscribeProps, callback);\n // if (subscribeProps.range) {\n // this.#updateGenerator?.setRange(subscribeProps.range);\n // }\n return subscription;\n }\n\n set range(range: VuuRange) {\n super.range = range;\n // this.#updateGenerator?.setRange(range);\n }\n get range() {\n return super.range;\n }\n\n private getSelectedRows() {\n return this.selectedRows.reduce<DataSourceRow[]>(\n (rows: DataSourceRow[], selected: SelectionItem) => {\n if (Array.isArray(selected)) {\n for (let i = selected[0]; i <= selected[1]; i++) {\n const row = this.data[i];\n if (row) {\n rows.push(row);\n }\n }\n } else {\n const row = this.data[selected];\n if (row) {\n rows.push(row);\n }\n }\n return rows;\n },\n []\n );\n }\n\n private getSelectedRowIds() {\n return this.selectedRows.reduce<string[]>(\n (rowIds: string[], selection: SelectionItem) => {\n if (Array.isArray(selection)) {\n for (let i = selection[0]; i <= selection[1]; i++) {\n const row = this.data[i];\n if (row) {\n rowIds.push(row[KEY]);\n }\n }\n } else {\n const row = this.data[selection];\n if (row) {\n rowIds.push(row[KEY]);\n }\n }\n return rowIds;\n },\n []\n );\n }\n\n applyEdit(\n row: DataSourceRow,\n columnName: string,\n value: VuuRowDataItemType\n ): Promise<true> {\n const key = row[KEY];\n this.#table?.update(key, columnName, value);\n return Promise.resolve(true);\n }\n\n async rpcCall<T extends RpcResponse = RpcResponse>(\n rpcRequest: Omit<ClientToServerViewportRpcCall, \"vpId\">\n ): Promise<T | undefined> {\n const rpcService = this.#rpcServices?.find(\n (service) =>\n service.rpcName ===\n (rpcRequest as ClientToServerViewportRpcCall).rpcName\n );\n\n if (rpcService) {\n switch (rpcRequest.rpcName) {\n case \"VP_BULK_EDIT_COLUMN_CELLS_RPC\": {\n return rpcService.service(rpcRequest) as Promise<T>;\n }\n }\n const selectedRows = this.getSelectedRows();\n return rpcService.service({\n ...rpcRequest,\n selectedRows,\n }) as Promise<T>;\n } else {\n console.log(`no implementation for PRC service ${rpcRequest.rpcName}`);\n }\n }\n\n async menuRpcCall(\n rpcRequest: Omit<ClientToServerMenuRPC, \"vpId\"> | ClientToServerEditRpc\n ): Promise<\n | MenuRpcResponse\n | VuuUIMessageInRPCEditReject\n | VuuUIMessageInRPCEditResponse\n | undefined\n > {\n const rpcService = this.#rpcServices?.find(\n (service) =>\n service.rpcName === (rpcRequest as ClientToServerMenuRPC).rpcName\n );\n\n if (rpcService) {\n switch (rpcRequest.type) {\n case \"VIEW_PORT_MENU_ROW_RPC\":\n case \"VIEW_PORT_MENUS_SELECT_RPC\": {\n // selectedRowIds is specific to the client implementation. Because the dataSource\n // itself stores the selected rows (rather than server) we need to inject these\n // here so rpc service has access to them. In Vuu scenario, Vuu server module would\n // already know selected rows.\n return rpcService.service({\n ...rpcRequest,\n // vpId: this.viewport,\n selectedRowIds: this.getSelectedRowIds(),\n // include table for now in the rpcRequest. In future we will support\n //a viewportId, same as server, but for that we have to map viewports\n // to tables in module.\n table: this.tableSchema.table,\n } as any) as any;\n }\n default:\n }\n }\n return super.menuRpcCall(rpcRequest);\n }\n\n getTypeaheadSuggestions(column: string, pattern?: string): Promise<string[]> {\n if (this.#table) {\n return makeSuggestions(this.#table, column, pattern);\n } else {\n throw Error(\n \"cannot call getTypeaheadSuggestions on TickingDataSource if table has not been provided\"\n );\n }\n }\n\n createSessionDataSource(vuuTable: VuuTable) {\n const table = this.#sessionTables?.[vuuTable.table];\n if (table) {\n return new TickingArrayDataSource({\n columnDescriptors: table.schema.columns,\n keyColumn: table.schema.key,\n table,\n rpcServices: this.#rpcServices,\n });\n } else {\n throw Error(\n \"TickingDataSource cannot create session datasource, no session table ${table.table}\"\n );\n }\n }\n}\n"],"names":["metadataKeys","ArrayDataSource","makeSuggestions"],"mappings":"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"}
1
+ {"version":3,"file":"TickingArrayDataSource.js","sources":["../src/TickingArrayDataSource.ts"],"sourcesContent":["import {\n ArrayDataSource,\n ArrayDataSourceConstructorProps,\n} from \"@vuu-ui/vuu-data-local\";\nimport type {\n DataSourceRow,\n MenuRpcResponse,\n RpcResponse,\n Selection,\n SelectionItem,\n SubscribeCallback,\n SubscribeProps,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n ClientToServerEditRpc,\n ClientToServerMenuRPC,\n ClientToServerViewportRpcCall,\n LinkDescriptorWithLabel,\n VuuMenu,\n VuuRange,\n VuuRowDataItemType,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { VuuBroadcastChannel, metadataKeys } from \"@vuu-ui/vuu-utils\";\nimport { makeSuggestions } from \"./makeSuggestions\";\nimport { Table } from \"./Table\";\nimport { RpcService, SessionTableMap } from \"./VuuModule\";\n\nconst { KEY } = metadataKeys;\n\nexport interface TickingArrayDataSourceConstructorProps\n extends Omit<ArrayDataSourceConstructorProps, \"data\"> {\n data?: Array<VuuRowDataItemType[]>;\n menu?: VuuMenu;\n menuRpcServices?: RpcService[];\n rpcServices?: RpcService[];\n sessionTables?: SessionTableMap;\n table?: Table;\n visualLinks?: LinkDescriptorWithLabel[];\n}\n\ntype DataSourceBroadcastSubscribeMessage = {\n type: \"subscribe-link-filter\" | \"subscribe-link-select\" | \"unsubscribe\";\n targetId: string;\n targetColumn: string;\n sourceId: string;\n};\n\ntype DataSourceBroadcastSelectionMessage = {\n columnName: string;\n linkType: \"subscribe-link-filter\" | \"subscribe-link-select\";\n targetId: string;\n type: \"selection-changed\";\n selectedValues: string[];\n sourceId: string;\n};\n\ntype DataSourceBroadcastMessage =\n | DataSourceBroadcastSubscribeMessage\n | DataSourceBroadcastSelectionMessage;\n\nconst isMessageForSelf = (message: DataSourceBroadcastMessage, id: string) =>\n message.targetId === id;\n\ntype LinkSubscription = {\n columnName: string;\n linkType: \"subscribe-link-filter\" | \"subscribe-link-select\";\n};\n\nexport class TickingArrayDataSource extends ArrayDataSource {\n #menuRpcServices: RpcService[] | undefined;\n #rpcServices: RpcService[] | undefined;\n // A reference to session tables hosted within client side module\n #sessionTables: SessionTableMap | undefined;\n #table?: Table;\n #broadcastChannel: VuuBroadcastChannel<DataSourceBroadcastMessage> =\n new BroadcastChannel(\"vuu-datasource\");\n #selectionLinkSubscribers: Map<string, LinkSubscription> | undefined;\n\n constructor({\n data,\n menuRpcServices,\n rpcServices,\n sessionTables,\n table,\n menu,\n visualLinks,\n ...arrayDataSourceProps\n }: TickingArrayDataSourceConstructorProps) {\n if (data === undefined && table === undefined) {\n throw Error(\"TickingArrayDataSource must be constructed with data\");\n }\n super({\n ...arrayDataSourceProps,\n data: data ?? table?.data ?? [],\n });\n this._menu = menu;\n this.#menuRpcServices = menuRpcServices;\n this.#sessionTables = sessionTables;\n this.#rpcServices = rpcServices;\n this.#table = table;\n this.links = visualLinks;\n\n if (table) {\n this.tableSchema = table.schema;\n table.on(\"insert\", this.insert);\n table.on(\"update\", this.updateRow);\n }\n\n this.#broadcastChannel.onmessage = (evt) => {\n if (isMessageForSelf(evt.data, this.viewport)) {\n this.receiveBroadcastMessage(evt.data);\n }\n };\n }\n\n async subscribe(subscribeProps: SubscribeProps, callback: SubscribeCallback) {\n const subscription = super.subscribe(subscribeProps, callback);\n // if (subscribeProps.range) {\n // this.#updateGenerator?.setRange(subscribeProps.range);\n // }\n return subscription;\n }\n\n set range(range: VuuRange) {\n super.range = range;\n // this.#updateGenerator?.setRange(range);\n }\n get range() {\n return super.range;\n }\n\n private pickUniqueSelectedValues(column: string) {\n const map = this.columnMap;\n const set = new Set();\n const colIndex = map[column];\n for (const row of this.getSelectedRows()) {\n set.add(row[colIndex]);\n }\n return Array.from(set) as string[];\n }\n\n select(selected: Selection) {\n super.select(selected);\n const numberOfSelectionSubscribers =\n this.#selectionLinkSubscribers?.size ?? 0;\n if (numberOfSelectionSubscribers > 0) {\n this.#selectionLinkSubscribers?.forEach(\n ({ columnName, linkType }, targetId) => {\n this.sendBroadcastMessage({\n columnName,\n linkType,\n sourceId: this.viewport,\n targetId,\n type: \"selection-changed\",\n selectedValues: this.pickUniqueSelectedValues(columnName),\n });\n }\n );\n }\n }\n\n private getSelectedRows() {\n return this.selectedRows.reduce<DataSourceRow[]>(\n (rows: DataSourceRow[], selected: SelectionItem) => {\n if (Array.isArray(selected)) {\n for (let i = selected[0]; i <= selected[1]; i++) {\n const row = this.data[i];\n if (row) {\n rows.push(row);\n }\n }\n } else {\n const row = this.data[selected];\n if (row) {\n rows.push(row);\n }\n }\n return rows;\n },\n []\n );\n }\n\n private getSelectedRowIds() {\n return this.selectedRows.reduce<string[]>(\n (rowIds: string[], selection: SelectionItem) => {\n if (Array.isArray(selection)) {\n for (let i = selection[0]; i <= selection[1]; i++) {\n const row = this.data[i];\n if (row) {\n rowIds.push(row[KEY]);\n }\n }\n } else {\n const row = this.data[selection];\n if (row) {\n rowIds.push(row[KEY]);\n }\n }\n return rowIds;\n },\n []\n );\n }\n\n applyEdit(\n row: DataSourceRow,\n columnName: string,\n value: VuuRowDataItemType\n ): Promise<true> {\n const key = row[KEY];\n this.#table?.update(key, columnName, value);\n return Promise.resolve(true);\n }\n\n async rpcCall<T extends RpcResponse = RpcResponse>(\n rpcRequest: Omit<ClientToServerViewportRpcCall, \"vpId\">\n ): Promise<T | undefined> {\n const rpcService = this.#rpcServices?.find(\n (service) =>\n service.rpcName ===\n (rpcRequest as ClientToServerViewportRpcCall).rpcName\n );\n\n if (rpcService) {\n switch (rpcRequest.rpcName) {\n case \"VP_BULK_EDIT_COLUMN_CELLS_RPC\": {\n return rpcService.service(rpcRequest) as Promise<T>;\n }\n }\n const selectedRows = this.getSelectedRows();\n return rpcService.service({\n ...rpcRequest,\n selectedRows,\n }) as Promise<T>;\n } else {\n console.log(`no implementation for PRC service ${rpcRequest.rpcName}`);\n }\n }\n\n async menuRpcCall(\n rpcRequest: Omit<ClientToServerMenuRPC, \"vpId\"> | ClientToServerEditRpc\n ): Promise<\n | MenuRpcResponse\n | VuuUIMessageInRPCEditReject\n | VuuUIMessageInRPCEditResponse\n | undefined\n > {\n const rpcService = this.#rpcServices?.find(\n (service) =>\n service.rpcName === (rpcRequest as ClientToServerMenuRPC).rpcName\n );\n\n if (rpcService) {\n switch (rpcRequest.type) {\n case \"VIEW_PORT_MENU_ROW_RPC\":\n case \"VIEW_PORT_MENUS_SELECT_RPC\": {\n // selectedRowIds is specific to the client implementation. Because the dataSource\n // itself stores the selected rows (rather than server) we need to inject these\n // here so rpc service has access to them. In Vuu scenario, Vuu server module would\n // already know selected rows.\n return rpcService.service({\n ...rpcRequest,\n // vpId: this.viewport,\n selectedRowIds: this.getSelectedRowIds(),\n // include table for now in the rpcRequest. In future we will support\n //a viewportId, same as server, but for that we have to map viewports\n // to tables in module.\n table: this.tableSchema.table,\n } as any) as any;\n }\n default:\n }\n }\n return super.menuRpcCall(rpcRequest);\n }\n\n getTypeaheadSuggestions(column: string, pattern?: string): Promise<string[]> {\n if (this.#table) {\n return makeSuggestions(this.#table, column, pattern);\n } else {\n throw Error(\n \"cannot call getTypeaheadSuggestions on TickingDataSource if table has not been provided\"\n );\n }\n }\n\n createSessionDataSource(vuuTable: VuuTable) {\n const table = this.#sessionTables?.[vuuTable.table];\n if (table) {\n return new TickingArrayDataSource({\n columnDescriptors: table.schema.columns,\n keyColumn: table.schema.key,\n table,\n rpcServices: this.#rpcServices,\n });\n } else {\n throw Error(\n \"TickingDataSource cannot create session datasource, no session table ${table.table}\"\n );\n }\n }\n\n sendBroadcastMessage(message: DataSourceBroadcastMessage) {\n this.#broadcastChannel.postMessage(message);\n }\n\n protected receiveBroadcastMessage = (message: DataSourceBroadcastMessage) => {\n switch (message.type) {\n case \"subscribe-link-filter\":\n case \"subscribe-link-select\":\n {\n const subscribers =\n this.#selectionLinkSubscribers ||\n (this.#selectionLinkSubscribers = new Map<\n string,\n LinkSubscription\n >());\n subscribers.set(message.sourceId, {\n columnName: message.targetColumn,\n linkType: message.type,\n });\n }\n break;\n\n case \"selection-changed\":\n {\n const { columnName, linkType, selectedValues } = message;\n const selectedIndices = [];\n const colIndex = this.columnMap[columnName];\n if (linkType === \"subscribe-link-select\") {\n for (const value of selectedValues) {\n const index = this.data.findIndex(\n (row) => row[colIndex] === value\n );\n selectedIndices.push(index);\n }\n this.select(selectedIndices);\n } else {\n this.filter = {\n filter: `${columnName} in [\"${selectedValues.join('\",\"')}\"]`,\n };\n }\n }\n\n break;\n default:\n console.log(`unrecognised message ${message.type}`);\n }\n };\n}\n"],"names":["metadataKeys","ArrayDataSource","makeSuggestions"],"mappings":"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"}
package/cjs/VuuModule.js CHANGED
@@ -25,6 +25,7 @@ var __privateSet = (obj, member, value, setter) => {
25
25
  };
26
26
  var _menus, _name, _schemas, _sessionTableMap, _tables, _tableServices, _visualLinks, _moduleServices;
27
27
  const withParams = (rpcRequest) => "selectedRows" in rpcRequest || "selectedRowIds" in rpcRequest;
28
+ const withNamedParams = (rpcRequest) => "namedParams" in rpcRequest;
28
29
  class VuuModule {
29
30
  constructor({
30
31
  menus,
@@ -114,7 +115,7 @@ class VuuModule {
114
115
  };
115
116
  // Bulk-edit with input in session table
116
117
  this.applyBulkEdits = async (rpcRequest) => {
117
- if (withParams(rpcRequest)) {
118
+ if (withNamedParams(rpcRequest)) {
118
119
  const sessionTable = this.getSessionTable();
119
120
  for (let i = 0; i < sessionTable.data.length; i++) {
120
121
  const newRow = sessionTable.data[i];
@@ -233,5 +234,6 @@ _visualLinks = new WeakMap();
233
234
  _moduleServices = new WeakMap();
234
235
 
235
236
  exports.VuuModule = VuuModule;
237
+ exports.withNamedParams = withNamedParams;
236
238
  exports.withParams = withParams;
237
239
  //# sourceMappingURL=VuuModule.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VuuModule.js","sources":["../src/VuuModule.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceRow,\n DataSourceSubscribedMessage,\n OpenDialogActionWithSchema,\n SuggestionFetcher,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n ClientToServerMenuRPC,\n ClientToServerViewportRpcCall,\n LinkDescriptorWithLabel,\n TypeaheadParams,\n VuuMenu,\n VuuRowDataItemType,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { uuid } from \"@vuu-ui/vuu-utils\";\nimport { Table, buildDataColumnMapFromSchema } from \"./Table\";\nimport { TickingArrayDataSource } from \"./TickingArrayDataSource\";\nimport { makeSuggestions } from \"./makeSuggestions\";\n\nexport interface IVuuModule<T extends string = string> {\n createDataSource: (tableName: T) => DataSource;\n typeaheadHook: () => SuggestionFetcher;\n}\n\nexport interface VuuModuleConstructorProps<T extends string = string> {\n menus?: Record<T, VuuMenu | undefined>;\n name: string;\n schemas: Record<T, Readonly<TableSchema>>;\n services?: Record<T, RpcService[] | undefined>;\n tables: Record<T, Table>;\n visualLinks?: Record<T, LinkDescriptorWithLabel[] | undefined>;\n}\n\nexport type SessionTableMap = Record<string, Table>;\n\nexport type RpcServiceRequestWithParams = Omit<\n ClientToServerViewportRpcCall,\n \"vpId\"\n> & {\n namedParams?: { [key: string]: unknown };\n selectedRows?: DataSourceRow[];\n selectedRowIds?: string[];\n table?: VuuTable;\n};\nexport type RpcServiceRequest =\n | RpcServiceRequestWithParams\n | Omit<ClientToServerMenuRPC, \"vpId\">;\n\nexport const withParams = (\n rpcRequest: RpcServiceRequest\n): rpcRequest is RpcServiceRequestWithParams =>\n \"selectedRows\" in rpcRequest || \"selectedRowIds\" in rpcRequest;\n\nexport type RpcService = {\n rpcName: string;\n service: (rpcRequest: RpcServiceRequest) => Promise<unknown>;\n};\n\nexport class VuuModule<T extends string = string> implements IVuuModule<T> {\n #menus: Record<T, VuuMenu | undefined> | undefined;\n #name: string;\n #schemas: Record<T, Readonly<TableSchema>>;\n #sessionTableMap: SessionTableMap = {};\n #tables: Record<T, Table>;\n #tableServices: Record<T, RpcService[] | undefined> | undefined;\n #visualLinks: Record<T, LinkDescriptorWithLabel[] | undefined> | undefined;\n\n constructor({\n menus,\n name,\n schemas,\n services,\n tables,\n visualLinks,\n }: VuuModuleConstructorProps<T>) {\n this.#menus = menus;\n this.#name = name;\n this.#schemas = schemas;\n this.#tableServices = services;\n this.#tables = tables;\n this.#visualLinks = visualLinks;\n }\n\n private registerViewport = (\n subscriptionDetails: DataSourceSubscribedMessage\n ) => {\n console.log(\"<subscription-open> register new viewport\", {\n subscriptionDetails,\n });\n };\n\n private unregisterViewport = (viewportId: string) => {\n console.log(`<subscription-closed> unregister viewport ${viewportId}`);\n };\n\n createDataSource = (tableName: T) => {\n const columnDescriptors = this.getColumnDescriptors(tableName);\n const dataSource = new TickingArrayDataSource({\n columnDescriptors,\n keyColumn:\n this.#schemas[tableName] === undefined\n ? this.#sessionTableMap[tableName].schema.key\n : this.#schemas[tableName].key,\n table: this.#tables[tableName] || this.#sessionTableMap[tableName],\n menu: this.#menus?.[tableName],\n rpcServices: this.getServices(tableName),\n sessionTables: this.#sessionTableMap,\n visualLinks: this.#visualLinks?.[tableName],\n });\n\n dataSource.on(\"subscribed\", this.registerViewport);\n dataSource.on(\"unsubscribed\", this.unregisterViewport);\n\n return dataSource;\n };\n\n getServices(tableName: T) {\n const tableServices = this.#tableServices?.[tableName];\n if (Array.isArray(tableServices)) {\n return this.#moduleServices.concat(tableServices);\n } else {\n return this.#moduleServices;\n }\n }\n\n get typeaheadHook() {\n return () => this.suggestionFetcher;\n }\n\n private getSessionTable() {\n if (Object.keys(this.#sessionTableMap).length === 1) {\n const [sessionTable] = Object.values(this.#sessionTableMap);\n return sessionTable;\n } else {\n throw Error(\n \"getSessionTable: should never be more than one session table in map\"\n );\n }\n }\n\n private getColumnDescriptors(tableName: T) {\n const schema = this.#schemas[tableName] || this.getSessionTable()?.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 suggestionFetcher: SuggestionFetcher = ([\n vuuTable,\n column,\n pattern,\n ]: TypeaheadParams) => {\n const table = this.#tables[vuuTable.table as T];\n if (table) {\n return makeSuggestions(table, column, pattern);\n } else {\n throw Error(\n `${this.#name} suggestionFetcher, unknown table ${vuuTable.module} ${\n vuuTable.table\n }`\n );\n }\n };\n\n private openBulkEdits = async (rpcRequest: RpcServiceRequest) => {\n if (withParams(rpcRequest)) {\n const { selectedRowIds, table } = rpcRequest;\n if (selectedRowIds && table) {\n const dataTable = this.#tables[table.table as T];\n if (dataTable) {\n const sessionTable = this.createSessionTableFromSelectedRows(\n dataTable,\n selectedRowIds\n );\n const sessionTableName = `${table.table}-${uuid()}`;\n this.#sessionTableMap[sessionTableName] = sessionTable;\n\n return {\n action: {\n renderComponent: \"grid\",\n table: {\n module: \"SIMUL\",\n table: sessionTableName,\n },\n tableSchema: dataTable.schema,\n type: \"OPEN_DIALOG_ACTION\",\n } as OpenDialogActionWithSchema,\n requestId: \"request_id\",\n rpcName: \"VP_BULK_EDIT_BEGIN_RPC\",\n };\n } else {\n return {\n requestId: \"request_id\",\n rpcName: \"VP_BULK_EDIT_REJECT\",\n };\n }\n }\n }\n };\n\n // Bulk-edit with input in session table\n private applyBulkEdits = async (rpcRequest: RpcServiceRequest) => {\n if (withParams(rpcRequest)) {\n const sessionTable = this.getSessionTable();\n for (let i = 0; i < sessionTable.data.length; i++) {\n const newRow = sessionTable.data[i];\n const { column, value } = rpcRequest.namedParams;\n const keyIndex = sessionTable.map[sessionTable.schema.key];\n sessionTable.update(String(newRow[keyIndex]), column as string, value);\n }\n return {\n action: {\n type: \"NO_ACTION\",\n },\n requestId: \"request_id\",\n rpcName: \"VP_BULK_EDIT_COLUMN_CELLS_RPC\",\n };\n }\n };\n\n // Save session table data to main table\n private saveBulkEdits = async () => {\n const sessionTable = this.getSessionTable();\n const { table } = sessionTable.schema.table;\n const baseTable = this.#tables[table as T];\n if (baseTable) {\n for (let i = 0; i < sessionTable.data.length; i++) {\n const newRow = sessionTable.data[i];\n baseTable.updateRow(newRow);\n }\n\n Object.keys(this.#sessionTableMap).forEach((key) => {\n delete this.#sessionTableMap[key];\n });\n\n return {\n action: {\n type: \"NO_ACTION\",\n },\n requestId: \"request_id\",\n rpcName: \"VP_BULK_EDIT_SUBMIT_RPC\",\n };\n }\n };\n\n private createSessionTableFromSelectedRows(\n { data, map, schema }: Table,\n selectedRowIds: string[]\n ) {\n const keyIndex = map[schema.key];\n const sessionData: VuuRowDataItemType[][] = [];\n for (let i = 0; i < selectedRowIds.length; i++) {\n for (let j = 0; j < data.length; j++) {\n if (data[j][keyIndex] === selectedRowIds[i]) {\n sessionData.push(data[j]);\n }\n }\n }\n return new Table(schema, sessionData, buildDataColumnMapFromSchema(schema));\n }\n\n /**\n * These services are available on any table. The client must configure the appropriate\n * menu item(s) on Table(s). The services to implement these RPC calls are built-in to\n * VuuModule\n */\n #moduleServices: RpcService[] = [\n {\n rpcName: \"VP_BULK_EDIT_BEGIN_RPC\",\n service: this.openBulkEdits,\n },\n {\n rpcName: \"VP_BULK_EDIT_COLUMN_CELLS_RPC\",\n service: this.applyBulkEdits,\n },\n {\n rpcName: \"VP_BULK_EDIT_SUBMIT_RPC\",\n service: this.saveBulkEdits,\n },\n ];\n}\n"],"names":["TickingArrayDataSource","makeSuggestions","uuid","Table","buildDataColumnMapFromSchema"],"mappings":"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"}
1
+ {"version":3,"file":"VuuModule.js","sources":["../src/VuuModule.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceRow,\n DataSourceSubscribedMessage,\n OpenDialogActionWithSchema,\n SuggestionFetcher,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n ClientToServerMenuRPC,\n ClientToServerViewportRpcCall,\n LinkDescriptorWithLabel,\n TypeaheadParams,\n VuuMenu,\n VuuRowDataItemType,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { uuid } from \"@vuu-ui/vuu-utils\";\nimport { Table, buildDataColumnMapFromSchema } from \"./Table\";\nimport { TickingArrayDataSource } from \"./TickingArrayDataSource\";\nimport { makeSuggestions } from \"./makeSuggestions\";\n\nexport interface IVuuModule<T extends string = string> {\n createDataSource: (tableName: T) => DataSource;\n typeaheadHook: () => SuggestionFetcher;\n}\n\nexport interface VuuModuleConstructorProps<T extends string = string> {\n menus?: Record<T, VuuMenu | undefined>;\n name: string;\n schemas: Record<T, Readonly<TableSchema>>;\n services?: Record<T, RpcService[] | undefined>;\n tables: Record<T, Table>;\n visualLinks?: Record<T, LinkDescriptorWithLabel[] | undefined>;\n}\n\nexport type SessionTableMap = Record<string, Table>;\n\nexport type RpcServiceRequestWithParams = Omit<\n ClientToServerViewportRpcCall,\n \"vpId\"\n> & {\n namedParams?: { [key: string]: unknown };\n selectedRows?: DataSourceRow[];\n selectedRowIds?: string[];\n table?: VuuTable;\n};\nexport type RpcServiceRequest =\n | RpcServiceRequestWithParams\n | Omit<ClientToServerMenuRPC, \"vpId\">;\n\nexport const withParams = (\n rpcRequest: RpcServiceRequest\n): rpcRequest is RpcServiceRequestWithParams =>\n \"selectedRows\" in rpcRequest || \"selectedRowIds\" in rpcRequest;\n\nexport const withNamedParams = (\n rpcRequest: RpcServiceRequest\n): rpcRequest is RpcServiceRequestWithParams => \"namedParams\" in rpcRequest;\n\nexport type RpcService = {\n rpcName: string;\n service: (rpcRequest: RpcServiceRequest) => Promise<unknown>;\n};\n\nexport class VuuModule<T extends string = string> implements IVuuModule<T> {\n #menus: Record<T, VuuMenu | undefined> | undefined;\n #name: string;\n #schemas: Record<T, Readonly<TableSchema>>;\n #sessionTableMap: SessionTableMap = {};\n #tables: Record<T, Table>;\n #tableServices: Record<T, RpcService[] | undefined> | undefined;\n #visualLinks: Record<T, LinkDescriptorWithLabel[] | undefined> | undefined;\n\n constructor({\n menus,\n name,\n schemas,\n services,\n tables,\n visualLinks,\n }: VuuModuleConstructorProps<T>) {\n this.#menus = menus;\n this.#name = name;\n this.#schemas = schemas;\n this.#tableServices = services;\n this.#tables = tables;\n this.#visualLinks = visualLinks;\n }\n\n private registerViewport = (\n subscriptionDetails: DataSourceSubscribedMessage\n ) => {\n console.log(\"<subscription-open> register new viewport\", {\n subscriptionDetails,\n });\n };\n\n private unregisterViewport = (viewportId: string) => {\n console.log(`<subscription-closed> unregister viewport ${viewportId}`);\n };\n\n createDataSource = (tableName: T) => {\n const columnDescriptors = this.getColumnDescriptors(tableName);\n const dataSource = new TickingArrayDataSource({\n columnDescriptors,\n keyColumn:\n this.#schemas[tableName] === undefined\n ? this.#sessionTableMap[tableName].schema.key\n : this.#schemas[tableName].key,\n table: this.#tables[tableName] || this.#sessionTableMap[tableName],\n menu: this.#menus?.[tableName],\n rpcServices: this.getServices(tableName),\n sessionTables: this.#sessionTableMap,\n visualLinks: this.#visualLinks?.[tableName],\n });\n\n dataSource.on(\"subscribed\", this.registerViewport);\n dataSource.on(\"unsubscribed\", this.unregisterViewport);\n\n return dataSource;\n };\n\n getServices(tableName: T) {\n const tableServices = this.#tableServices?.[tableName];\n if (Array.isArray(tableServices)) {\n return this.#moduleServices.concat(tableServices);\n } else {\n return this.#moduleServices;\n }\n }\n\n get typeaheadHook() {\n return () => this.suggestionFetcher;\n }\n\n private getSessionTable() {\n if (Object.keys(this.#sessionTableMap).length === 1) {\n const [sessionTable] = Object.values(this.#sessionTableMap);\n return sessionTable;\n } else {\n throw Error(\n \"getSessionTable: should never be more than one session table in map\"\n );\n }\n }\n\n private getColumnDescriptors(tableName: T) {\n const schema = this.#schemas[tableName] || this.getSessionTable()?.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 suggestionFetcher: SuggestionFetcher = ([\n vuuTable,\n column,\n pattern,\n ]: TypeaheadParams) => {\n const table = this.#tables[vuuTable.table as T];\n if (table) {\n return makeSuggestions(table, column, pattern);\n } else {\n throw Error(\n `${this.#name} suggestionFetcher, unknown table ${vuuTable.module} ${\n vuuTable.table\n }`\n );\n }\n };\n\n private openBulkEdits = async (rpcRequest: RpcServiceRequest) => {\n if (withParams(rpcRequest)) {\n const { selectedRowIds, table } = rpcRequest;\n if (selectedRowIds && table) {\n const dataTable = this.#tables[table.table as T];\n if (dataTable) {\n const sessionTable = this.createSessionTableFromSelectedRows(\n dataTable,\n selectedRowIds\n );\n const sessionTableName = `${table.table}-${uuid()}`;\n this.#sessionTableMap[sessionTableName] = sessionTable;\n\n return {\n action: {\n renderComponent: \"grid\",\n table: {\n module: \"SIMUL\",\n table: sessionTableName,\n },\n tableSchema: dataTable.schema,\n type: \"OPEN_DIALOG_ACTION\",\n } as OpenDialogActionWithSchema,\n requestId: \"request_id\",\n rpcName: \"VP_BULK_EDIT_BEGIN_RPC\",\n };\n } else {\n return {\n requestId: \"request_id\",\n rpcName: \"VP_BULK_EDIT_REJECT\",\n };\n }\n }\n }\n };\n\n // Bulk-edit with input in session table\n private applyBulkEdits = async (rpcRequest: RpcServiceRequest) => {\n if (withNamedParams(rpcRequest)) {\n const sessionTable = this.getSessionTable();\n for (let i = 0; i < sessionTable.data.length; i++) {\n const newRow = sessionTable.data[i];\n const { column, value } = rpcRequest.namedParams;\n const keyIndex = sessionTable.map[sessionTable.schema.key];\n sessionTable.update(String(newRow[keyIndex]), column as string, value);\n }\n return {\n action: {\n type: \"NO_ACTION\",\n },\n requestId: \"request_id\",\n rpcName: \"VP_BULK_EDIT_COLUMN_CELLS_RPC\",\n };\n }\n };\n\n // Save session table data to main table\n private saveBulkEdits = async () => {\n const sessionTable = this.getSessionTable();\n const { table } = sessionTable.schema.table;\n const baseTable = this.#tables[table as T];\n if (baseTable) {\n for (let i = 0; i < sessionTable.data.length; i++) {\n const newRow = sessionTable.data[i];\n baseTable.updateRow(newRow);\n }\n\n Object.keys(this.#sessionTableMap).forEach((key) => {\n delete this.#sessionTableMap[key];\n });\n\n return {\n action: {\n type: \"NO_ACTION\",\n },\n requestId: \"request_id\",\n rpcName: \"VP_BULK_EDIT_SUBMIT_RPC\",\n };\n }\n };\n\n private createSessionTableFromSelectedRows(\n { data, map, schema }: Table,\n selectedRowIds: string[]\n ) {\n const keyIndex = map[schema.key];\n const sessionData: VuuRowDataItemType[][] = [];\n for (let i = 0; i < selectedRowIds.length; i++) {\n for (let j = 0; j < data.length; j++) {\n if (data[j][keyIndex] === selectedRowIds[i]) {\n sessionData.push(data[j]);\n }\n }\n }\n return new Table(schema, sessionData, buildDataColumnMapFromSchema(schema));\n }\n\n /**\n * These services are available on any table. The client must configure the appropriate\n * menu item(s) on Table(s). The services to implement these RPC calls are built-in to\n * VuuModule\n */\n #moduleServices: RpcService[] = [\n {\n rpcName: \"VP_BULK_EDIT_BEGIN_RPC\",\n service: this.openBulkEdits,\n },\n {\n rpcName: \"VP_BULK_EDIT_COLUMN_CELLS_RPC\",\n service: this.applyBulkEdits,\n },\n {\n rpcName: \"VP_BULK_EDIT_SUBMIT_RPC\",\n service: this.saveBulkEdits,\n },\n ];\n}\n"],"names":["TickingArrayDataSource","makeSuggestions","uuid","Table","buildDataColumnMapFromSchema"],"mappings":"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"}
package/cjs/index.js CHANGED
@@ -40,5 +40,6 @@ exports.buildDataColumnMap = Table.buildDataColumnMap;
40
40
  exports.buildDataColumnMapFromSchema = Table.buildDataColumnMapFromSchema;
41
41
  exports.joinTables = Table.joinTables;
42
42
  exports.VuuModule = VuuModule.VuuModule;
43
+ exports.withNamedParams = VuuModule.withNamedParams;
43
44
  exports.withParams = VuuModule.withParams;
44
45
  //# sourceMappingURL=index.js.map
package/cjs/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -20,8 +20,9 @@ var __privateSet = (obj, member, value, setter) => {
20
20
  setter ? setter.call(obj, value) : member.set(obj, value);
21
21
  return value;
22
22
  };
23
- var _menuRpcServices, _rpcServices, _sessionTables, _table;
23
+ var _menuRpcServices, _rpcServices, _sessionTables, _table, _broadcastChannel, _selectionLinkSubscribers;
24
24
  const { KEY } = metadataKeys;
25
+ const isMessageForSelf = (message, id) => message.targetId === id;
25
26
  const _TickingArrayDataSource = class _TickingArrayDataSource extends ArrayDataSource {
26
27
  constructor({
27
28
  data,
@@ -45,6 +46,44 @@ const _TickingArrayDataSource = class _TickingArrayDataSource extends ArrayDataS
45
46
  // A reference to session tables hosted within client side module
46
47
  __privateAdd(this, _sessionTables, void 0);
47
48
  __privateAdd(this, _table, void 0);
49
+ __privateAdd(this, _broadcastChannel, new BroadcastChannel("vuu-datasource"));
50
+ __privateAdd(this, _selectionLinkSubscribers, void 0);
51
+ this.receiveBroadcastMessage = (message) => {
52
+ switch (message.type) {
53
+ case "subscribe-link-filter":
54
+ case "subscribe-link-select":
55
+ {
56
+ const subscribers = __privateGet(this, _selectionLinkSubscribers) || __privateSet(this, _selectionLinkSubscribers, /* @__PURE__ */ new Map());
57
+ subscribers.set(message.sourceId, {
58
+ columnName: message.targetColumn,
59
+ linkType: message.type
60
+ });
61
+ }
62
+ break;
63
+ case "selection-changed":
64
+ {
65
+ const { columnName, linkType, selectedValues } = message;
66
+ const selectedIndices = [];
67
+ const colIndex = this.columnMap[columnName];
68
+ if (linkType === "subscribe-link-select") {
69
+ for (const value of selectedValues) {
70
+ const index = this.data.findIndex(
71
+ (row) => row[colIndex] === value
72
+ );
73
+ selectedIndices.push(index);
74
+ }
75
+ this.select(selectedIndices);
76
+ } else {
77
+ this.filter = {
78
+ filter: `${columnName} in ["${selectedValues.join('","')}"]`
79
+ };
80
+ }
81
+ }
82
+ break;
83
+ default:
84
+ console.log(`unrecognised message ${message.type}`);
85
+ }
86
+ };
48
87
  this._menu = menu;
49
88
  __privateSet(this, _menuRpcServices, menuRpcServices);
50
89
  __privateSet(this, _sessionTables, sessionTables);
@@ -56,6 +95,11 @@ const _TickingArrayDataSource = class _TickingArrayDataSource extends ArrayDataS
56
95
  table.on("insert", this.insert);
57
96
  table.on("update", this.updateRow);
58
97
  }
98
+ __privateGet(this, _broadcastChannel).onmessage = (evt) => {
99
+ if (isMessageForSelf(evt.data, this.viewport)) {
100
+ this.receiveBroadcastMessage(evt.data);
101
+ }
102
+ };
59
103
  }
60
104
  async subscribe(subscribeProps, callback) {
61
105
  const subscription = super.subscribe(subscribeProps, callback);
@@ -67,6 +111,33 @@ const _TickingArrayDataSource = class _TickingArrayDataSource extends ArrayDataS
67
111
  get range() {
68
112
  return super.range;
69
113
  }
114
+ pickUniqueSelectedValues(column) {
115
+ const map = this.columnMap;
116
+ const set = /* @__PURE__ */ new Set();
117
+ const colIndex = map[column];
118
+ for (const row of this.getSelectedRows()) {
119
+ set.add(row[colIndex]);
120
+ }
121
+ return Array.from(set);
122
+ }
123
+ select(selected) {
124
+ super.select(selected);
125
+ const numberOfSelectionSubscribers = __privateGet(this, _selectionLinkSubscribers)?.size ?? 0;
126
+ if (numberOfSelectionSubscribers > 0) {
127
+ __privateGet(this, _selectionLinkSubscribers)?.forEach(
128
+ ({ columnName, linkType }, targetId) => {
129
+ this.sendBroadcastMessage({
130
+ columnName,
131
+ linkType,
132
+ sourceId: this.viewport,
133
+ targetId,
134
+ type: "selection-changed",
135
+ selectedValues: this.pickUniqueSelectedValues(columnName)
136
+ });
137
+ }
138
+ );
139
+ }
140
+ }
70
141
  getSelectedRows() {
71
142
  return this.selectedRows.reduce(
72
143
  (rows, selected) => {
@@ -179,11 +250,16 @@ const _TickingArrayDataSource = class _TickingArrayDataSource extends ArrayDataS
179
250
  );
180
251
  }
181
252
  }
253
+ sendBroadcastMessage(message) {
254
+ __privateGet(this, _broadcastChannel).postMessage(message);
255
+ }
182
256
  };
183
257
  _menuRpcServices = new WeakMap();
184
258
  _rpcServices = new WeakMap();
185
259
  _sessionTables = new WeakMap();
186
260
  _table = new WeakMap();
261
+ _broadcastChannel = new WeakMap();
262
+ _selectionLinkSubscribers = new WeakMap();
187
263
  let TickingArrayDataSource = _TickingArrayDataSource;
188
264
 
189
265
  export { TickingArrayDataSource };
@@ -1 +1 @@
1
- {"version":3,"file":"TickingArrayDataSource.js","sources":["../src/TickingArrayDataSource.ts"],"sourcesContent":["import {\n ArrayDataSource,\n ArrayDataSourceConstructorProps,\n} from \"@vuu-ui/vuu-data-local\";\nimport type {\n DataSourceRow,\n MenuRpcResponse,\n RpcResponse,\n SelectionItem,\n SubscribeCallback,\n SubscribeProps,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n ClientToServerEditRpc,\n ClientToServerMenuRPC,\n ClientToServerViewportRpcCall,\n LinkDescriptorWithLabel,\n VuuMenu,\n VuuRange,\n VuuRowDataItemType,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { metadataKeys } from \"@vuu-ui/vuu-utils\";\nimport { makeSuggestions } from \"./makeSuggestions\";\nimport { Table } from \"./Table\";\nimport { RpcService, SessionTableMap } from \"./VuuModule\";\n\nconst { KEY } = metadataKeys;\n\nexport interface TickingArrayDataSourceConstructorProps\n extends Omit<ArrayDataSourceConstructorProps, \"data\"> {\n data?: Array<VuuRowDataItemType[]>;\n menu?: VuuMenu;\n menuRpcServices?: RpcService[];\n rpcServices?: RpcService[];\n sessionTables?: SessionTableMap;\n table?: Table;\n visualLinks?: LinkDescriptorWithLabel[];\n}\n\nexport class TickingArrayDataSource extends ArrayDataSource {\n #menuRpcServices: RpcService[] | undefined;\n #rpcServices: RpcService[] | undefined;\n // A reference to session tables hosted within client side module\n #sessionTables: SessionTableMap | undefined;\n #table?: Table;\n\n constructor({\n data,\n menuRpcServices,\n rpcServices,\n sessionTables,\n table,\n menu,\n visualLinks,\n ...arrayDataSourceProps\n }: TickingArrayDataSourceConstructorProps) {\n if (data === undefined && table === undefined) {\n throw Error(\"TickingArrayDataSource must be constructed with data\");\n }\n super({\n ...arrayDataSourceProps,\n data: data ?? table?.data ?? [],\n });\n this._menu = menu;\n this.#menuRpcServices = menuRpcServices;\n this.#sessionTables = sessionTables;\n this.#rpcServices = rpcServices;\n this.#table = table;\n this.links = visualLinks;\n\n if (table) {\n this.tableSchema = table.schema;\n table.on(\"insert\", this.insert);\n table.on(\"update\", this.updateRow);\n }\n }\n\n async subscribe(subscribeProps: SubscribeProps, callback: SubscribeCallback) {\n const subscription = super.subscribe(subscribeProps, callback);\n // if (subscribeProps.range) {\n // this.#updateGenerator?.setRange(subscribeProps.range);\n // }\n return subscription;\n }\n\n set range(range: VuuRange) {\n super.range = range;\n // this.#updateGenerator?.setRange(range);\n }\n get range() {\n return super.range;\n }\n\n private getSelectedRows() {\n return this.selectedRows.reduce<DataSourceRow[]>(\n (rows: DataSourceRow[], selected: SelectionItem) => {\n if (Array.isArray(selected)) {\n for (let i = selected[0]; i <= selected[1]; i++) {\n const row = this.data[i];\n if (row) {\n rows.push(row);\n }\n }\n } else {\n const row = this.data[selected];\n if (row) {\n rows.push(row);\n }\n }\n return rows;\n },\n []\n );\n }\n\n private getSelectedRowIds() {\n return this.selectedRows.reduce<string[]>(\n (rowIds: string[], selection: SelectionItem) => {\n if (Array.isArray(selection)) {\n for (let i = selection[0]; i <= selection[1]; i++) {\n const row = this.data[i];\n if (row) {\n rowIds.push(row[KEY]);\n }\n }\n } else {\n const row = this.data[selection];\n if (row) {\n rowIds.push(row[KEY]);\n }\n }\n return rowIds;\n },\n []\n );\n }\n\n applyEdit(\n row: DataSourceRow,\n columnName: string,\n value: VuuRowDataItemType\n ): Promise<true> {\n const key = row[KEY];\n this.#table?.update(key, columnName, value);\n return Promise.resolve(true);\n }\n\n async rpcCall<T extends RpcResponse = RpcResponse>(\n rpcRequest: Omit<ClientToServerViewportRpcCall, \"vpId\">\n ): Promise<T | undefined> {\n const rpcService = this.#rpcServices?.find(\n (service) =>\n service.rpcName ===\n (rpcRequest as ClientToServerViewportRpcCall).rpcName\n );\n\n if (rpcService) {\n switch (rpcRequest.rpcName) {\n case \"VP_BULK_EDIT_COLUMN_CELLS_RPC\": {\n return rpcService.service(rpcRequest) as Promise<T>;\n }\n }\n const selectedRows = this.getSelectedRows();\n return rpcService.service({\n ...rpcRequest,\n selectedRows,\n }) as Promise<T>;\n } else {\n console.log(`no implementation for PRC service ${rpcRequest.rpcName}`);\n }\n }\n\n async menuRpcCall(\n rpcRequest: Omit<ClientToServerMenuRPC, \"vpId\"> | ClientToServerEditRpc\n ): Promise<\n | MenuRpcResponse\n | VuuUIMessageInRPCEditReject\n | VuuUIMessageInRPCEditResponse\n | undefined\n > {\n const rpcService = this.#rpcServices?.find(\n (service) =>\n service.rpcName === (rpcRequest as ClientToServerMenuRPC).rpcName\n );\n\n if (rpcService) {\n switch (rpcRequest.type) {\n case \"VIEW_PORT_MENU_ROW_RPC\":\n case \"VIEW_PORT_MENUS_SELECT_RPC\": {\n // selectedRowIds is specific to the client implementation. Because the dataSource\n // itself stores the selected rows (rather than server) we need to inject these\n // here so rpc service has access to them. In Vuu scenario, Vuu server module would\n // already know selected rows.\n return rpcService.service({\n ...rpcRequest,\n // vpId: this.viewport,\n selectedRowIds: this.getSelectedRowIds(),\n // include table for now in the rpcRequest. In future we will support\n //a viewportId, same as server, but for that we have to map viewports\n // to tables in module.\n table: this.tableSchema.table,\n } as any) as any;\n }\n default:\n }\n }\n return super.menuRpcCall(rpcRequest);\n }\n\n getTypeaheadSuggestions(column: string, pattern?: string): Promise<string[]> {\n if (this.#table) {\n return makeSuggestions(this.#table, column, pattern);\n } else {\n throw Error(\n \"cannot call getTypeaheadSuggestions on TickingDataSource if table has not been provided\"\n );\n }\n }\n\n createSessionDataSource(vuuTable: VuuTable) {\n const table = this.#sessionTables?.[vuuTable.table];\n if (table) {\n return new TickingArrayDataSource({\n columnDescriptors: table.schema.columns,\n keyColumn: table.schema.key,\n table,\n rpcServices: this.#rpcServices,\n });\n } else {\n throw Error(\n \"TickingDataSource cannot create session datasource, no session table ${table.table}\"\n );\n }\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TickingArrayDataSource.js","sources":["../src/TickingArrayDataSource.ts"],"sourcesContent":["import {\n ArrayDataSource,\n ArrayDataSourceConstructorProps,\n} from \"@vuu-ui/vuu-data-local\";\nimport type {\n DataSourceRow,\n MenuRpcResponse,\n RpcResponse,\n Selection,\n SelectionItem,\n SubscribeCallback,\n SubscribeProps,\n VuuUIMessageInRPCEditReject,\n VuuUIMessageInRPCEditResponse,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n ClientToServerEditRpc,\n ClientToServerMenuRPC,\n ClientToServerViewportRpcCall,\n LinkDescriptorWithLabel,\n VuuMenu,\n VuuRange,\n VuuRowDataItemType,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { VuuBroadcastChannel, metadataKeys } from \"@vuu-ui/vuu-utils\";\nimport { makeSuggestions } from \"./makeSuggestions\";\nimport { Table } from \"./Table\";\nimport { RpcService, SessionTableMap } from \"./VuuModule\";\n\nconst { KEY } = metadataKeys;\n\nexport interface TickingArrayDataSourceConstructorProps\n extends Omit<ArrayDataSourceConstructorProps, \"data\"> {\n data?: Array<VuuRowDataItemType[]>;\n menu?: VuuMenu;\n menuRpcServices?: RpcService[];\n rpcServices?: RpcService[];\n sessionTables?: SessionTableMap;\n table?: Table;\n visualLinks?: LinkDescriptorWithLabel[];\n}\n\ntype DataSourceBroadcastSubscribeMessage = {\n type: \"subscribe-link-filter\" | \"subscribe-link-select\" | \"unsubscribe\";\n targetId: string;\n targetColumn: string;\n sourceId: string;\n};\n\ntype DataSourceBroadcastSelectionMessage = {\n columnName: string;\n linkType: \"subscribe-link-filter\" | \"subscribe-link-select\";\n targetId: string;\n type: \"selection-changed\";\n selectedValues: string[];\n sourceId: string;\n};\n\ntype DataSourceBroadcastMessage =\n | DataSourceBroadcastSubscribeMessage\n | DataSourceBroadcastSelectionMessage;\n\nconst isMessageForSelf = (message: DataSourceBroadcastMessage, id: string) =>\n message.targetId === id;\n\ntype LinkSubscription = {\n columnName: string;\n linkType: \"subscribe-link-filter\" | \"subscribe-link-select\";\n};\n\nexport class TickingArrayDataSource extends ArrayDataSource {\n #menuRpcServices: RpcService[] | undefined;\n #rpcServices: RpcService[] | undefined;\n // A reference to session tables hosted within client side module\n #sessionTables: SessionTableMap | undefined;\n #table?: Table;\n #broadcastChannel: VuuBroadcastChannel<DataSourceBroadcastMessage> =\n new BroadcastChannel(\"vuu-datasource\");\n #selectionLinkSubscribers: Map<string, LinkSubscription> | undefined;\n\n constructor({\n data,\n menuRpcServices,\n rpcServices,\n sessionTables,\n table,\n menu,\n visualLinks,\n ...arrayDataSourceProps\n }: TickingArrayDataSourceConstructorProps) {\n if (data === undefined && table === undefined) {\n throw Error(\"TickingArrayDataSource must be constructed with data\");\n }\n super({\n ...arrayDataSourceProps,\n data: data ?? table?.data ?? [],\n });\n this._menu = menu;\n this.#menuRpcServices = menuRpcServices;\n this.#sessionTables = sessionTables;\n this.#rpcServices = rpcServices;\n this.#table = table;\n this.links = visualLinks;\n\n if (table) {\n this.tableSchema = table.schema;\n table.on(\"insert\", this.insert);\n table.on(\"update\", this.updateRow);\n }\n\n this.#broadcastChannel.onmessage = (evt) => {\n if (isMessageForSelf(evt.data, this.viewport)) {\n this.receiveBroadcastMessage(evt.data);\n }\n };\n }\n\n async subscribe(subscribeProps: SubscribeProps, callback: SubscribeCallback) {\n const subscription = super.subscribe(subscribeProps, callback);\n // if (subscribeProps.range) {\n // this.#updateGenerator?.setRange(subscribeProps.range);\n // }\n return subscription;\n }\n\n set range(range: VuuRange) {\n super.range = range;\n // this.#updateGenerator?.setRange(range);\n }\n get range() {\n return super.range;\n }\n\n private pickUniqueSelectedValues(column: string) {\n const map = this.columnMap;\n const set = new Set();\n const colIndex = map[column];\n for (const row of this.getSelectedRows()) {\n set.add(row[colIndex]);\n }\n return Array.from(set) as string[];\n }\n\n select(selected: Selection) {\n super.select(selected);\n const numberOfSelectionSubscribers =\n this.#selectionLinkSubscribers?.size ?? 0;\n if (numberOfSelectionSubscribers > 0) {\n this.#selectionLinkSubscribers?.forEach(\n ({ columnName, linkType }, targetId) => {\n this.sendBroadcastMessage({\n columnName,\n linkType,\n sourceId: this.viewport,\n targetId,\n type: \"selection-changed\",\n selectedValues: this.pickUniqueSelectedValues(columnName),\n });\n }\n );\n }\n }\n\n private getSelectedRows() {\n return this.selectedRows.reduce<DataSourceRow[]>(\n (rows: DataSourceRow[], selected: SelectionItem) => {\n if (Array.isArray(selected)) {\n for (let i = selected[0]; i <= selected[1]; i++) {\n const row = this.data[i];\n if (row) {\n rows.push(row);\n }\n }\n } else {\n const row = this.data[selected];\n if (row) {\n rows.push(row);\n }\n }\n return rows;\n },\n []\n );\n }\n\n private getSelectedRowIds() {\n return this.selectedRows.reduce<string[]>(\n (rowIds: string[], selection: SelectionItem) => {\n if (Array.isArray(selection)) {\n for (let i = selection[0]; i <= selection[1]; i++) {\n const row = this.data[i];\n if (row) {\n rowIds.push(row[KEY]);\n }\n }\n } else {\n const row = this.data[selection];\n if (row) {\n rowIds.push(row[KEY]);\n }\n }\n return rowIds;\n },\n []\n );\n }\n\n applyEdit(\n row: DataSourceRow,\n columnName: string,\n value: VuuRowDataItemType\n ): Promise<true> {\n const key = row[KEY];\n this.#table?.update(key, columnName, value);\n return Promise.resolve(true);\n }\n\n async rpcCall<T extends RpcResponse = RpcResponse>(\n rpcRequest: Omit<ClientToServerViewportRpcCall, \"vpId\">\n ): Promise<T | undefined> {\n const rpcService = this.#rpcServices?.find(\n (service) =>\n service.rpcName ===\n (rpcRequest as ClientToServerViewportRpcCall).rpcName\n );\n\n if (rpcService) {\n switch (rpcRequest.rpcName) {\n case \"VP_BULK_EDIT_COLUMN_CELLS_RPC\": {\n return rpcService.service(rpcRequest) as Promise<T>;\n }\n }\n const selectedRows = this.getSelectedRows();\n return rpcService.service({\n ...rpcRequest,\n selectedRows,\n }) as Promise<T>;\n } else {\n console.log(`no implementation for PRC service ${rpcRequest.rpcName}`);\n }\n }\n\n async menuRpcCall(\n rpcRequest: Omit<ClientToServerMenuRPC, \"vpId\"> | ClientToServerEditRpc\n ): Promise<\n | MenuRpcResponse\n | VuuUIMessageInRPCEditReject\n | VuuUIMessageInRPCEditResponse\n | undefined\n > {\n const rpcService = this.#rpcServices?.find(\n (service) =>\n service.rpcName === (rpcRequest as ClientToServerMenuRPC).rpcName\n );\n\n if (rpcService) {\n switch (rpcRequest.type) {\n case \"VIEW_PORT_MENU_ROW_RPC\":\n case \"VIEW_PORT_MENUS_SELECT_RPC\": {\n // selectedRowIds is specific to the client implementation. Because the dataSource\n // itself stores the selected rows (rather than server) we need to inject these\n // here so rpc service has access to them. In Vuu scenario, Vuu server module would\n // already know selected rows.\n return rpcService.service({\n ...rpcRequest,\n // vpId: this.viewport,\n selectedRowIds: this.getSelectedRowIds(),\n // include table for now in the rpcRequest. In future we will support\n //a viewportId, same as server, but for that we have to map viewports\n // to tables in module.\n table: this.tableSchema.table,\n } as any) as any;\n }\n default:\n }\n }\n return super.menuRpcCall(rpcRequest);\n }\n\n getTypeaheadSuggestions(column: string, pattern?: string): Promise<string[]> {\n if (this.#table) {\n return makeSuggestions(this.#table, column, pattern);\n } else {\n throw Error(\n \"cannot call getTypeaheadSuggestions on TickingDataSource if table has not been provided\"\n );\n }\n }\n\n createSessionDataSource(vuuTable: VuuTable) {\n const table = this.#sessionTables?.[vuuTable.table];\n if (table) {\n return new TickingArrayDataSource({\n columnDescriptors: table.schema.columns,\n keyColumn: table.schema.key,\n table,\n rpcServices: this.#rpcServices,\n });\n } else {\n throw Error(\n \"TickingDataSource cannot create session datasource, no session table ${table.table}\"\n );\n }\n }\n\n sendBroadcastMessage(message: DataSourceBroadcastMessage) {\n this.#broadcastChannel.postMessage(message);\n }\n\n protected receiveBroadcastMessage = (message: DataSourceBroadcastMessage) => {\n switch (message.type) {\n case \"subscribe-link-filter\":\n case \"subscribe-link-select\":\n {\n const subscribers =\n this.#selectionLinkSubscribers ||\n (this.#selectionLinkSubscribers = new Map<\n string,\n LinkSubscription\n >());\n subscribers.set(message.sourceId, {\n columnName: message.targetColumn,\n linkType: message.type,\n });\n }\n break;\n\n case \"selection-changed\":\n {\n const { columnName, linkType, selectedValues } = message;\n const selectedIndices = [];\n const colIndex = this.columnMap[columnName];\n if (linkType === \"subscribe-link-select\") {\n for (const value of selectedValues) {\n const index = this.data.findIndex(\n (row) => row[colIndex] === value\n );\n selectedIndices.push(index);\n }\n this.select(selectedIndices);\n } else {\n this.filter = {\n filter: `${columnName} in [\"${selectedValues.join('\",\"')}\"]`,\n };\n }\n }\n\n break;\n default:\n console.log(`unrecognised message ${message.type}`);\n }\n };\n}\n"],"names":[],"mappings":"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"}
package/esm/VuuModule.js CHANGED
@@ -23,6 +23,7 @@ var __privateSet = (obj, member, value, setter) => {
23
23
  };
24
24
  var _menus, _name, _schemas, _sessionTableMap, _tables, _tableServices, _visualLinks, _moduleServices;
25
25
  const withParams = (rpcRequest) => "selectedRows" in rpcRequest || "selectedRowIds" in rpcRequest;
26
+ const withNamedParams = (rpcRequest) => "namedParams" in rpcRequest;
26
27
  class VuuModule {
27
28
  constructor({
28
29
  menus,
@@ -112,7 +113,7 @@ class VuuModule {
112
113
  };
113
114
  // Bulk-edit with input in session table
114
115
  this.applyBulkEdits = async (rpcRequest) => {
115
- if (withParams(rpcRequest)) {
116
+ if (withNamedParams(rpcRequest)) {
116
117
  const sessionTable = this.getSessionTable();
117
118
  for (let i = 0; i < sessionTable.data.length; i++) {
118
119
  const newRow = sessionTable.data[i];
@@ -230,5 +231,5 @@ _tableServices = new WeakMap();
230
231
  _visualLinks = new WeakMap();
231
232
  _moduleServices = new WeakMap();
232
233
 
233
- export { VuuModule, withParams };
234
+ export { VuuModule, withNamedParams, withParams };
234
235
  //# sourceMappingURL=VuuModule.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"VuuModule.js","sources":["../src/VuuModule.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceRow,\n DataSourceSubscribedMessage,\n OpenDialogActionWithSchema,\n SuggestionFetcher,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n ClientToServerMenuRPC,\n ClientToServerViewportRpcCall,\n LinkDescriptorWithLabel,\n TypeaheadParams,\n VuuMenu,\n VuuRowDataItemType,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { uuid } from \"@vuu-ui/vuu-utils\";\nimport { Table, buildDataColumnMapFromSchema } from \"./Table\";\nimport { TickingArrayDataSource } from \"./TickingArrayDataSource\";\nimport { makeSuggestions } from \"./makeSuggestions\";\n\nexport interface IVuuModule<T extends string = string> {\n createDataSource: (tableName: T) => DataSource;\n typeaheadHook: () => SuggestionFetcher;\n}\n\nexport interface VuuModuleConstructorProps<T extends string = string> {\n menus?: Record<T, VuuMenu | undefined>;\n name: string;\n schemas: Record<T, Readonly<TableSchema>>;\n services?: Record<T, RpcService[] | undefined>;\n tables: Record<T, Table>;\n visualLinks?: Record<T, LinkDescriptorWithLabel[] | undefined>;\n}\n\nexport type SessionTableMap = Record<string, Table>;\n\nexport type RpcServiceRequestWithParams = Omit<\n ClientToServerViewportRpcCall,\n \"vpId\"\n> & {\n namedParams?: { [key: string]: unknown };\n selectedRows?: DataSourceRow[];\n selectedRowIds?: string[];\n table?: VuuTable;\n};\nexport type RpcServiceRequest =\n | RpcServiceRequestWithParams\n | Omit<ClientToServerMenuRPC, \"vpId\">;\n\nexport const withParams = (\n rpcRequest: RpcServiceRequest\n): rpcRequest is RpcServiceRequestWithParams =>\n \"selectedRows\" in rpcRequest || \"selectedRowIds\" in rpcRequest;\n\nexport type RpcService = {\n rpcName: string;\n service: (rpcRequest: RpcServiceRequest) => Promise<unknown>;\n};\n\nexport class VuuModule<T extends string = string> implements IVuuModule<T> {\n #menus: Record<T, VuuMenu | undefined> | undefined;\n #name: string;\n #schemas: Record<T, Readonly<TableSchema>>;\n #sessionTableMap: SessionTableMap = {};\n #tables: Record<T, Table>;\n #tableServices: Record<T, RpcService[] | undefined> | undefined;\n #visualLinks: Record<T, LinkDescriptorWithLabel[] | undefined> | undefined;\n\n constructor({\n menus,\n name,\n schemas,\n services,\n tables,\n visualLinks,\n }: VuuModuleConstructorProps<T>) {\n this.#menus = menus;\n this.#name = name;\n this.#schemas = schemas;\n this.#tableServices = services;\n this.#tables = tables;\n this.#visualLinks = visualLinks;\n }\n\n private registerViewport = (\n subscriptionDetails: DataSourceSubscribedMessage\n ) => {\n console.log(\"<subscription-open> register new viewport\", {\n subscriptionDetails,\n });\n };\n\n private unregisterViewport = (viewportId: string) => {\n console.log(`<subscription-closed> unregister viewport ${viewportId}`);\n };\n\n createDataSource = (tableName: T) => {\n const columnDescriptors = this.getColumnDescriptors(tableName);\n const dataSource = new TickingArrayDataSource({\n columnDescriptors,\n keyColumn:\n this.#schemas[tableName] === undefined\n ? this.#sessionTableMap[tableName].schema.key\n : this.#schemas[tableName].key,\n table: this.#tables[tableName] || this.#sessionTableMap[tableName],\n menu: this.#menus?.[tableName],\n rpcServices: this.getServices(tableName),\n sessionTables: this.#sessionTableMap,\n visualLinks: this.#visualLinks?.[tableName],\n });\n\n dataSource.on(\"subscribed\", this.registerViewport);\n dataSource.on(\"unsubscribed\", this.unregisterViewport);\n\n return dataSource;\n };\n\n getServices(tableName: T) {\n const tableServices = this.#tableServices?.[tableName];\n if (Array.isArray(tableServices)) {\n return this.#moduleServices.concat(tableServices);\n } else {\n return this.#moduleServices;\n }\n }\n\n get typeaheadHook() {\n return () => this.suggestionFetcher;\n }\n\n private getSessionTable() {\n if (Object.keys(this.#sessionTableMap).length === 1) {\n const [sessionTable] = Object.values(this.#sessionTableMap);\n return sessionTable;\n } else {\n throw Error(\n \"getSessionTable: should never be more than one session table in map\"\n );\n }\n }\n\n private getColumnDescriptors(tableName: T) {\n const schema = this.#schemas[tableName] || this.getSessionTable()?.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 suggestionFetcher: SuggestionFetcher = ([\n vuuTable,\n column,\n pattern,\n ]: TypeaheadParams) => {\n const table = this.#tables[vuuTable.table as T];\n if (table) {\n return makeSuggestions(table, column, pattern);\n } else {\n throw Error(\n `${this.#name} suggestionFetcher, unknown table ${vuuTable.module} ${\n vuuTable.table\n }`\n );\n }\n };\n\n private openBulkEdits = async (rpcRequest: RpcServiceRequest) => {\n if (withParams(rpcRequest)) {\n const { selectedRowIds, table } = rpcRequest;\n if (selectedRowIds && table) {\n const dataTable = this.#tables[table.table as T];\n if (dataTable) {\n const sessionTable = this.createSessionTableFromSelectedRows(\n dataTable,\n selectedRowIds\n );\n const sessionTableName = `${table.table}-${uuid()}`;\n this.#sessionTableMap[sessionTableName] = sessionTable;\n\n return {\n action: {\n renderComponent: \"grid\",\n table: {\n module: \"SIMUL\",\n table: sessionTableName,\n },\n tableSchema: dataTable.schema,\n type: \"OPEN_DIALOG_ACTION\",\n } as OpenDialogActionWithSchema,\n requestId: \"request_id\",\n rpcName: \"VP_BULK_EDIT_BEGIN_RPC\",\n };\n } else {\n return {\n requestId: \"request_id\",\n rpcName: \"VP_BULK_EDIT_REJECT\",\n };\n }\n }\n }\n };\n\n // Bulk-edit with input in session table\n private applyBulkEdits = async (rpcRequest: RpcServiceRequest) => {\n if (withParams(rpcRequest)) {\n const sessionTable = this.getSessionTable();\n for (let i = 0; i < sessionTable.data.length; i++) {\n const newRow = sessionTable.data[i];\n const { column, value } = rpcRequest.namedParams;\n const keyIndex = sessionTable.map[sessionTable.schema.key];\n sessionTable.update(String(newRow[keyIndex]), column as string, value);\n }\n return {\n action: {\n type: \"NO_ACTION\",\n },\n requestId: \"request_id\",\n rpcName: \"VP_BULK_EDIT_COLUMN_CELLS_RPC\",\n };\n }\n };\n\n // Save session table data to main table\n private saveBulkEdits = async () => {\n const sessionTable = this.getSessionTable();\n const { table } = sessionTable.schema.table;\n const baseTable = this.#tables[table as T];\n if (baseTable) {\n for (let i = 0; i < sessionTable.data.length; i++) {\n const newRow = sessionTable.data[i];\n baseTable.updateRow(newRow);\n }\n\n Object.keys(this.#sessionTableMap).forEach((key) => {\n delete this.#sessionTableMap[key];\n });\n\n return {\n action: {\n type: \"NO_ACTION\",\n },\n requestId: \"request_id\",\n rpcName: \"VP_BULK_EDIT_SUBMIT_RPC\",\n };\n }\n };\n\n private createSessionTableFromSelectedRows(\n { data, map, schema }: Table,\n selectedRowIds: string[]\n ) {\n const keyIndex = map[schema.key];\n const sessionData: VuuRowDataItemType[][] = [];\n for (let i = 0; i < selectedRowIds.length; i++) {\n for (let j = 0; j < data.length; j++) {\n if (data[j][keyIndex] === selectedRowIds[i]) {\n sessionData.push(data[j]);\n }\n }\n }\n return new Table(schema, sessionData, buildDataColumnMapFromSchema(schema));\n }\n\n /**\n * These services are available on any table. The client must configure the appropriate\n * menu item(s) on Table(s). The services to implement these RPC calls are built-in to\n * VuuModule\n */\n #moduleServices: RpcService[] = [\n {\n rpcName: \"VP_BULK_EDIT_BEGIN_RPC\",\n service: this.openBulkEdits,\n },\n {\n rpcName: \"VP_BULK_EDIT_COLUMN_CELLS_RPC\",\n service: this.applyBulkEdits,\n },\n {\n rpcName: \"VP_BULK_EDIT_SUBMIT_RPC\",\n service: this.saveBulkEdits,\n },\n ];\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"VuuModule.js","sources":["../src/VuuModule.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceRow,\n DataSourceSubscribedMessage,\n OpenDialogActionWithSchema,\n SuggestionFetcher,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n ClientToServerMenuRPC,\n ClientToServerViewportRpcCall,\n LinkDescriptorWithLabel,\n TypeaheadParams,\n VuuMenu,\n VuuRowDataItemType,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { uuid } from \"@vuu-ui/vuu-utils\";\nimport { Table, buildDataColumnMapFromSchema } from \"./Table\";\nimport { TickingArrayDataSource } from \"./TickingArrayDataSource\";\nimport { makeSuggestions } from \"./makeSuggestions\";\n\nexport interface IVuuModule<T extends string = string> {\n createDataSource: (tableName: T) => DataSource;\n typeaheadHook: () => SuggestionFetcher;\n}\n\nexport interface VuuModuleConstructorProps<T extends string = string> {\n menus?: Record<T, VuuMenu | undefined>;\n name: string;\n schemas: Record<T, Readonly<TableSchema>>;\n services?: Record<T, RpcService[] | undefined>;\n tables: Record<T, Table>;\n visualLinks?: Record<T, LinkDescriptorWithLabel[] | undefined>;\n}\n\nexport type SessionTableMap = Record<string, Table>;\n\nexport type RpcServiceRequestWithParams = Omit<\n ClientToServerViewportRpcCall,\n \"vpId\"\n> & {\n namedParams?: { [key: string]: unknown };\n selectedRows?: DataSourceRow[];\n selectedRowIds?: string[];\n table?: VuuTable;\n};\nexport type RpcServiceRequest =\n | RpcServiceRequestWithParams\n | Omit<ClientToServerMenuRPC, \"vpId\">;\n\nexport const withParams = (\n rpcRequest: RpcServiceRequest\n): rpcRequest is RpcServiceRequestWithParams =>\n \"selectedRows\" in rpcRequest || \"selectedRowIds\" in rpcRequest;\n\nexport const withNamedParams = (\n rpcRequest: RpcServiceRequest\n): rpcRequest is RpcServiceRequestWithParams => \"namedParams\" in rpcRequest;\n\nexport type RpcService = {\n rpcName: string;\n service: (rpcRequest: RpcServiceRequest) => Promise<unknown>;\n};\n\nexport class VuuModule<T extends string = string> implements IVuuModule<T> {\n #menus: Record<T, VuuMenu | undefined> | undefined;\n #name: string;\n #schemas: Record<T, Readonly<TableSchema>>;\n #sessionTableMap: SessionTableMap = {};\n #tables: Record<T, Table>;\n #tableServices: Record<T, RpcService[] | undefined> | undefined;\n #visualLinks: Record<T, LinkDescriptorWithLabel[] | undefined> | undefined;\n\n constructor({\n menus,\n name,\n schemas,\n services,\n tables,\n visualLinks,\n }: VuuModuleConstructorProps<T>) {\n this.#menus = menus;\n this.#name = name;\n this.#schemas = schemas;\n this.#tableServices = services;\n this.#tables = tables;\n this.#visualLinks = visualLinks;\n }\n\n private registerViewport = (\n subscriptionDetails: DataSourceSubscribedMessage\n ) => {\n console.log(\"<subscription-open> register new viewport\", {\n subscriptionDetails,\n });\n };\n\n private unregisterViewport = (viewportId: string) => {\n console.log(`<subscription-closed> unregister viewport ${viewportId}`);\n };\n\n createDataSource = (tableName: T) => {\n const columnDescriptors = this.getColumnDescriptors(tableName);\n const dataSource = new TickingArrayDataSource({\n columnDescriptors,\n keyColumn:\n this.#schemas[tableName] === undefined\n ? this.#sessionTableMap[tableName].schema.key\n : this.#schemas[tableName].key,\n table: this.#tables[tableName] || this.#sessionTableMap[tableName],\n menu: this.#menus?.[tableName],\n rpcServices: this.getServices(tableName),\n sessionTables: this.#sessionTableMap,\n visualLinks: this.#visualLinks?.[tableName],\n });\n\n dataSource.on(\"subscribed\", this.registerViewport);\n dataSource.on(\"unsubscribed\", this.unregisterViewport);\n\n return dataSource;\n };\n\n getServices(tableName: T) {\n const tableServices = this.#tableServices?.[tableName];\n if (Array.isArray(tableServices)) {\n return this.#moduleServices.concat(tableServices);\n } else {\n return this.#moduleServices;\n }\n }\n\n get typeaheadHook() {\n return () => this.suggestionFetcher;\n }\n\n private getSessionTable() {\n if (Object.keys(this.#sessionTableMap).length === 1) {\n const [sessionTable] = Object.values(this.#sessionTableMap);\n return sessionTable;\n } else {\n throw Error(\n \"getSessionTable: should never be more than one session table in map\"\n );\n }\n }\n\n private getColumnDescriptors(tableName: T) {\n const schema = this.#schemas[tableName] || this.getSessionTable()?.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 suggestionFetcher: SuggestionFetcher = ([\n vuuTable,\n column,\n pattern,\n ]: TypeaheadParams) => {\n const table = this.#tables[vuuTable.table as T];\n if (table) {\n return makeSuggestions(table, column, pattern);\n } else {\n throw Error(\n `${this.#name} suggestionFetcher, unknown table ${vuuTable.module} ${\n vuuTable.table\n }`\n );\n }\n };\n\n private openBulkEdits = async (rpcRequest: RpcServiceRequest) => {\n if (withParams(rpcRequest)) {\n const { selectedRowIds, table } = rpcRequest;\n if (selectedRowIds && table) {\n const dataTable = this.#tables[table.table as T];\n if (dataTable) {\n const sessionTable = this.createSessionTableFromSelectedRows(\n dataTable,\n selectedRowIds\n );\n const sessionTableName = `${table.table}-${uuid()}`;\n this.#sessionTableMap[sessionTableName] = sessionTable;\n\n return {\n action: {\n renderComponent: \"grid\",\n table: {\n module: \"SIMUL\",\n table: sessionTableName,\n },\n tableSchema: dataTable.schema,\n type: \"OPEN_DIALOG_ACTION\",\n } as OpenDialogActionWithSchema,\n requestId: \"request_id\",\n rpcName: \"VP_BULK_EDIT_BEGIN_RPC\",\n };\n } else {\n return {\n requestId: \"request_id\",\n rpcName: \"VP_BULK_EDIT_REJECT\",\n };\n }\n }\n }\n };\n\n // Bulk-edit with input in session table\n private applyBulkEdits = async (rpcRequest: RpcServiceRequest) => {\n if (withNamedParams(rpcRequest)) {\n const sessionTable = this.getSessionTable();\n for (let i = 0; i < sessionTable.data.length; i++) {\n const newRow = sessionTable.data[i];\n const { column, value } = rpcRequest.namedParams;\n const keyIndex = sessionTable.map[sessionTable.schema.key];\n sessionTable.update(String(newRow[keyIndex]), column as string, value);\n }\n return {\n action: {\n type: \"NO_ACTION\",\n },\n requestId: \"request_id\",\n rpcName: \"VP_BULK_EDIT_COLUMN_CELLS_RPC\",\n };\n }\n };\n\n // Save session table data to main table\n private saveBulkEdits = async () => {\n const sessionTable = this.getSessionTable();\n const { table } = sessionTable.schema.table;\n const baseTable = this.#tables[table as T];\n if (baseTable) {\n for (let i = 0; i < sessionTable.data.length; i++) {\n const newRow = sessionTable.data[i];\n baseTable.updateRow(newRow);\n }\n\n Object.keys(this.#sessionTableMap).forEach((key) => {\n delete this.#sessionTableMap[key];\n });\n\n return {\n action: {\n type: \"NO_ACTION\",\n },\n requestId: \"request_id\",\n rpcName: \"VP_BULK_EDIT_SUBMIT_RPC\",\n };\n }\n };\n\n private createSessionTableFromSelectedRows(\n { data, map, schema }: Table,\n selectedRowIds: string[]\n ) {\n const keyIndex = map[schema.key];\n const sessionData: VuuRowDataItemType[][] = [];\n for (let i = 0; i < selectedRowIds.length; i++) {\n for (let j = 0; j < data.length; j++) {\n if (data[j][keyIndex] === selectedRowIds[i]) {\n sessionData.push(data[j]);\n }\n }\n }\n return new Table(schema, sessionData, buildDataColumnMapFromSchema(schema));\n }\n\n /**\n * These services are available on any table. The client must configure the appropriate\n * menu item(s) on Table(s). The services to implement these RPC calls are built-in to\n * VuuModule\n */\n #moduleServices: RpcService[] = [\n {\n rpcName: \"VP_BULK_EDIT_BEGIN_RPC\",\n service: this.openBulkEdits,\n },\n {\n rpcName: \"VP_BULK_EDIT_COLUMN_CELLS_RPC\",\n service: this.applyBulkEdits,\n },\n {\n rpcName: \"VP_BULK_EDIT_SUBMIT_RPC\",\n service: this.saveBulkEdits,\n },\n ];\n}\n"],"names":[],"mappings":"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"}
package/esm/index.js CHANGED
@@ -10,5 +10,5 @@ export { schemas as simulSchemas } from './simul/simul-schemas.js';
10
10
  export { simulModule } from './simul/simul-module.js';
11
11
  export { testModule } from './test/test-module.js';
12
12
  export { Table, buildDataColumnMap, buildDataColumnMapFromSchema, joinTables } from './Table.js';
13
- export { VuuModule, withParams } from './VuuModule.js';
13
+ export { VuuModule, withNamedParams, withParams } from './VuuModule.js';
14
14
  //# sourceMappingURL=index.js.map
package/package.json CHANGED
@@ -1,16 +1,16 @@
1
1
  {
2
- "version": "0.8.74",
2
+ "version": "0.8.75",
3
3
  "author": "heswell",
4
4
  "license": "Apache-2.0",
5
5
  "dependencies": {
6
- "@vuu-ui/vuu-data-local": "0.8.74",
7
- "@vuu-ui/vuu-utils": "0.8.74",
6
+ "@vuu-ui/vuu-data-local": "0.8.75",
7
+ "@vuu-ui/vuu-utils": "0.8.75",
8
8
  "@thomaschaplin/isin-generator": "1.0.3"
9
9
  },
10
10
  "devDependencies": {
11
- "@vuu-ui/vuu-protocol-types": "0.8.74",
12
- "@vuu-ui/vuu-data-types": "0.8.74",
13
- "@vuu-ui/vuu-table-types": "0.8.74"
11
+ "@vuu-ui/vuu-protocol-types": "0.8.75",
12
+ "@vuu-ui/vuu-data-types": "0.8.75",
13
+ "@vuu-ui/vuu-table-types": "0.8.75"
14
14
  },
15
15
  "sideEffects": false,
16
16
  "files": [
@@ -1,5 +1,5 @@
1
1
  import { ArrayDataSource, ArrayDataSourceConstructorProps } from "@vuu-ui/vuu-data-local";
2
- import type { DataSourceRow, MenuRpcResponse, RpcResponse, SubscribeCallback, SubscribeProps, VuuUIMessageInRPCEditReject, VuuUIMessageInRPCEditResponse } from "@vuu-ui/vuu-data-types";
2
+ import type { DataSourceRow, MenuRpcResponse, RpcResponse, Selection, SubscribeCallback, SubscribeProps, VuuUIMessageInRPCEditReject, VuuUIMessageInRPCEditResponse } from "@vuu-ui/vuu-data-types";
3
3
  import type { ClientToServerEditRpc, ClientToServerMenuRPC, ClientToServerViewportRpcCall, LinkDescriptorWithLabel, VuuMenu, VuuRange, VuuRowDataItemType, VuuTable } from "@vuu-ui/vuu-protocol-types";
4
4
  import { Table } from "./Table";
5
5
  import { RpcService, SessionTableMap } from "./VuuModule";
@@ -12,12 +12,29 @@ export interface TickingArrayDataSourceConstructorProps extends Omit<ArrayDataSo
12
12
  table?: Table;
13
13
  visualLinks?: LinkDescriptorWithLabel[];
14
14
  }
15
+ type DataSourceBroadcastSubscribeMessage = {
16
+ type: "subscribe-link-filter" | "subscribe-link-select" | "unsubscribe";
17
+ targetId: string;
18
+ targetColumn: string;
19
+ sourceId: string;
20
+ };
21
+ type DataSourceBroadcastSelectionMessage = {
22
+ columnName: string;
23
+ linkType: "subscribe-link-filter" | "subscribe-link-select";
24
+ targetId: string;
25
+ type: "selection-changed";
26
+ selectedValues: string[];
27
+ sourceId: string;
28
+ };
29
+ type DataSourceBroadcastMessage = DataSourceBroadcastSubscribeMessage | DataSourceBroadcastSelectionMessage;
15
30
  export declare class TickingArrayDataSource extends ArrayDataSource {
16
31
  #private;
17
32
  constructor({ data, menuRpcServices, rpcServices, sessionTables, table, menu, visualLinks, ...arrayDataSourceProps }: TickingArrayDataSourceConstructorProps);
18
33
  subscribe(subscribeProps: SubscribeProps, callback: SubscribeCallback): Promise<void>;
19
34
  set range(range: VuuRange);
20
35
  get range(): VuuRange;
36
+ private pickUniqueSelectedValues;
37
+ select(selected: Selection): void;
21
38
  private getSelectedRows;
22
39
  private getSelectedRowIds;
23
40
  applyEdit(row: DataSourceRow, columnName: string, value: VuuRowDataItemType): Promise<true>;
@@ -25,4 +42,7 @@ export declare class TickingArrayDataSource extends ArrayDataSource {
25
42
  menuRpcCall(rpcRequest: Omit<ClientToServerMenuRPC, "vpId"> | ClientToServerEditRpc): Promise<MenuRpcResponse | VuuUIMessageInRPCEditReject | VuuUIMessageInRPCEditResponse | undefined>;
26
43
  getTypeaheadSuggestions(column: string, pattern?: string): Promise<string[]>;
27
44
  createSessionDataSource(vuuTable: VuuTable): TickingArrayDataSource;
45
+ sendBroadcastMessage(message: DataSourceBroadcastMessage): void;
46
+ protected receiveBroadcastMessage: (message: DataSourceBroadcastMessage) => void;
28
47
  }
48
+ export {};
@@ -25,6 +25,7 @@ export type RpcServiceRequestWithParams = Omit<ClientToServerViewportRpcCall, "v
25
25
  };
26
26
  export type RpcServiceRequest = RpcServiceRequestWithParams | Omit<ClientToServerMenuRPC, "vpId">;
27
27
  export declare const withParams: (rpcRequest: RpcServiceRequest) => rpcRequest is RpcServiceRequestWithParams;
28
+ export declare const withNamedParams: (rpcRequest: RpcServiceRequest) => rpcRequest is RpcServiceRequestWithParams;
28
29
  export type RpcService = {
29
30
  rpcName: string;
30
31
  service: (rpcRequest: RpcServiceRequest) => Promise<unknown>;