@vuu-ui/vuu-data-test 0.8.73 → 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) => {
@@ -141,6 +212,7 @@ const _TickingArrayDataSource = class _TickingArrayDataSource extends vuuDataLoc
141
212
  );
142
213
  if (rpcService) {
143
214
  switch (rpcRequest.type) {
215
+ case "VIEW_PORT_MENU_ROW_RPC":
144
216
  case "VIEW_PORT_MENUS_SELECT_RPC": {
145
217
  return rpcService.service({
146
218
  ...rpcRequest,
@@ -180,11 +252,16 @@ const _TickingArrayDataSource = class _TickingArrayDataSource extends vuuDataLoc
180
252
  );
181
253
  }
182
254
  }
255
+ sendBroadcastMessage(message) {
256
+ __privateGet(this, _broadcastChannel).postMessage(message);
257
+ }
183
258
  };
184
259
  _menuRpcServices = new WeakMap();
185
260
  _rpcServices = new WeakMap();
186
261
  _sessionTables = new WeakMap();
187
262
  _table = new WeakMap();
263
+ _broadcastChannel = new WeakMap();
264
+ _selectionLinkSubscribers = new WeakMap();
188
265
  let TickingArrayDataSource = _TickingArrayDataSource;
189
266
 
190
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_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
@@ -24,6 +24,8 @@ var __privateSet = (obj, member, value, setter) => {
24
24
  return value;
25
25
  };
26
26
  var _menus, _name, _schemas, _sessionTableMap, _tables, _tableServices, _visualLinks, _moduleServices;
27
+ const withParams = (rpcRequest) => "selectedRows" in rpcRequest || "selectedRowIds" in rpcRequest;
28
+ const withNamedParams = (rpcRequest) => "namedParams" in rpcRequest;
27
29
  class VuuModule {
28
30
  constructor({
29
31
  menus,
@@ -41,12 +43,12 @@ class VuuModule {
41
43
  __privateAdd(this, _tableServices, void 0);
42
44
  __privateAdd(this, _visualLinks, void 0);
43
45
  this.registerViewport = (subscriptionDetails) => {
44
- console.log("register new viewport", {
46
+ console.log("<subscription-open> register new viewport", {
45
47
  subscriptionDetails
46
48
  });
47
49
  };
48
- this.unregisterViewport = () => {
49
- console.log("unregister viewport");
50
+ this.unregisterViewport = (viewportId) => {
51
+ console.log(`<subscription-closed> unregister viewport ${viewportId}`);
50
52
  };
51
53
  this.createDataSource = (tableName) => {
52
54
  const columnDescriptors = this.getColumnDescriptors(tableName);
@@ -59,8 +61,8 @@ class VuuModule {
59
61
  sessionTables: __privateGet(this, _sessionTableMap),
60
62
  visualLinks: __privateGet(this, _visualLinks)?.[tableName]
61
63
  });
62
- dataSource.on("subscription-open", this.registerViewport);
63
- dataSource.on("subscription-closed", this.unregisterViewport);
64
+ dataSource.on("subscribed", this.registerViewport);
65
+ dataSource.on("unsubscribed", this.unregisterViewport);
64
66
  return dataSource;
65
67
  };
66
68
  this.suggestionFetcher = ([
@@ -78,53 +80,57 @@ class VuuModule {
78
80
  }
79
81
  };
80
82
  this.openBulkEdits = async (rpcRequest) => {
81
- const { selectedRowIds, table } = rpcRequest;
82
- if (selectedRowIds && table) {
83
- const dataTable = __privateGet(this, _tables)[table.table];
84
- if (dataTable) {
85
- const sessionTable = this.createSessionTableFromSelectedRows(
86
- dataTable,
87
- selectedRowIds
88
- );
89
- const sessionTableName = `${table.table}-${vuuUtils.uuid()}`;
90
- __privateGet(this, _sessionTableMap)[sessionTableName] = sessionTable;
91
- return {
92
- action: {
93
- renderComponent: "grid",
94
- table: {
95
- module: "SIMUL",
96
- table: sessionTableName
83
+ if (withParams(rpcRequest)) {
84
+ const { selectedRowIds, table } = rpcRequest;
85
+ if (selectedRowIds && table) {
86
+ const dataTable = __privateGet(this, _tables)[table.table];
87
+ if (dataTable) {
88
+ const sessionTable = this.createSessionTableFromSelectedRows(
89
+ dataTable,
90
+ selectedRowIds
91
+ );
92
+ const sessionTableName = `${table.table}-${vuuUtils.uuid()}`;
93
+ __privateGet(this, _sessionTableMap)[sessionTableName] = sessionTable;
94
+ return {
95
+ action: {
96
+ renderComponent: "grid",
97
+ table: {
98
+ module: "SIMUL",
99
+ table: sessionTableName
100
+ },
101
+ tableSchema: dataTable.schema,
102
+ type: "OPEN_DIALOG_ACTION"
97
103
  },
98
- tableSchema: dataTable.schema,
99
- type: "OPEN_DIALOG_ACTION"
100
- },
101
- requestId: "request_id",
102
- rpcName: "VP_BULK_EDIT_BEGIN_RPC"
103
- };
104
- } else {
105
- return {
106
- requestId: "request_id",
107
- rpcName: "VP_BULK_EDIT_REJECT"
108
- };
104
+ requestId: "request_id",
105
+ rpcName: "VP_BULK_EDIT_BEGIN_RPC"
106
+ };
107
+ } else {
108
+ return {
109
+ requestId: "request_id",
110
+ rpcName: "VP_BULK_EDIT_REJECT"
111
+ };
112
+ }
109
113
  }
110
114
  }
111
115
  };
112
116
  // Bulk-edit with input in session table
113
117
  this.applyBulkEdits = async (rpcRequest) => {
114
- const sessionTable = this.getSessionTable();
115
- for (let i = 0; i < sessionTable.data.length; i++) {
116
- const newRow = sessionTable.data[i];
117
- const { column, value } = rpcRequest.namedParams;
118
- const keyIndex = sessionTable.map[sessionTable.schema.key];
119
- sessionTable.update(String(newRow[keyIndex]), column, value);
118
+ if (withNamedParams(rpcRequest)) {
119
+ const sessionTable = this.getSessionTable();
120
+ for (let i = 0; i < sessionTable.data.length; i++) {
121
+ const newRow = sessionTable.data[i];
122
+ const { column, value } = rpcRequest.namedParams;
123
+ const keyIndex = sessionTable.map[sessionTable.schema.key];
124
+ sessionTable.update(String(newRow[keyIndex]), column, value);
125
+ }
126
+ return {
127
+ action: {
128
+ type: "NO_ACTION"
129
+ },
130
+ requestId: "request_id",
131
+ rpcName: "VP_BULK_EDIT_COLUMN_CELLS_RPC"
132
+ };
120
133
  }
121
- return {
122
- action: {
123
- type: "NO_ACTION"
124
- },
125
- requestId: "request_id",
126
- rpcName: "VP_BULK_EDIT_COLUMN_CELLS_RPC"
127
- };
128
134
  };
129
135
  // Save session table data to main table
130
136
  this.saveBulkEdits = async () => {
@@ -136,6 +142,9 @@ class VuuModule {
136
142
  const newRow = sessionTable.data[i];
137
143
  baseTable.updateRow(newRow);
138
144
  }
145
+ Object.keys(__privateGet(this, _sessionTableMap)).forEach((key) => {
146
+ delete __privateGet(this, _sessionTableMap)[key];
147
+ });
139
148
  return {
140
149
  action: {
141
150
  type: "NO_ACTION"
@@ -225,4 +234,6 @@ _visualLinks = new WeakMap();
225
234
  _moduleServices = new WeakMap();
226
235
 
227
236
  exports.VuuModule = VuuModule;
237
+ exports.withNamedParams = withNamedParams;
238
+ exports.withParams = withParams;
228
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 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 RpcService = {\n rpcName: string;\n service: (\n rpcRequest: Omit<ClientToServerViewportRpcCall, \"vpId\"> & {\n namedParams?: { [key: string]: unknown };\n selectedRows?: DataSourceRow[];\n selectedRowIds?: string[];\n table?: VuuTable;\n }\n ) => 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(\"register new viewport\", {\n subscriptionDetails,\n });\n };\n\n private unregisterViewport = () => {\n console.log(\"unregister viewport\");\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(\"subscription-open\", this.registerViewport);\n dataSource.on(\"subscription-closed\", 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 (\n rpcRequest: Omit<ClientToServerViewportRpcCall, \"vpId\"> & {\n selectedRowIds?: string[];\n table?: VuuTable;\n }\n ) => {\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 // Bulk-edit with input in session table\n private applyBulkEdits = async (\n rpcRequest: Omit<ClientToServerViewportRpcCall, \"vpId\"> & {\n namedParams: { [key: string]: unknown };\n table?: VuuTable;\n }\n ) => {\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 // 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 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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"}
@@ -99,24 +99,30 @@ async function addConstituent(rpcRequest) {
99
99
  console.log(`RPC call erceived ${rpcRequest.rpcName}`);
100
100
  }
101
101
  async function sendToMarket(rpcRequest) {
102
- const [basketInstanceId] = rpcRequest.params;
103
- basketTrading.update(basketInstanceId, "status", "ON_MARKET");
102
+ if (VuuModule.withParams(rpcRequest)) {
103
+ const [basketInstanceId] = rpcRequest.params;
104
+ basketTrading.update(basketInstanceId, "status", "ON_MARKET");
105
+ }
104
106
  }
105
107
  async function takeOffMarket(rpcRequest) {
106
- const [basketInstanceId] = rpcRequest.params;
107
- basketTrading.update(basketInstanceId, "status", "OFF-MARKET");
108
+ if (VuuModule.withParams(rpcRequest)) {
109
+ const [basketInstanceId] = rpcRequest.params;
110
+ basketTrading.update(basketInstanceId, "status", "OFF-MARKET");
111
+ }
108
112
  }
109
113
  async function createNewBasket(rpcRequest) {
110
- const {
111
- params: [basketId, basketName]
112
- } = rpcRequest;
113
- const key = createTradingBasket(basketId, basketName);
114
- return {
115
- action: {
116
- type: "VP_CREATE_SUCCESS",
117
- key
118
- }
119
- };
114
+ if (VuuModule.withParams(rpcRequest)) {
115
+ const {
116
+ params: [basketId, basketName]
117
+ } = rpcRequest;
118
+ const key = createTradingBasket(basketId, basketName);
119
+ return {
120
+ action: {
121
+ type: "VP_CREATE_SUCCESS",
122
+ key
123
+ }
124
+ };
125
+ }
120
126
  }
121
127
  const tables = {
122
128
  algoType: new Table.Table(
@@ -1 +1 @@
1
- {"version":3,"file":"basket-module.js","sources":["../../src/basket/basket-module.ts"],"sourcesContent":["import {\n ClientToServerViewportRpcCall,\n LinkDescriptorWithLabel,\n VuuMenu,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap } from \"@vuu-ui/vuu-utils\";\nimport pricesTable from \"./reference-data/prices\";\nimport { joinTables, Table } from \"../Table\";\nimport { BasketsTableName, schemas } from \"./basket-schemas\";\nimport basketConstituentData from \"./reference-data/constituents\";\nimport { RpcService, VuuModule } from \"../VuuModule\";\n\n// This is a 'local' columnMap\nconst buildDataColumnMap = (tableName: BasketsTableName) =>\n Object.values(schemas[tableName].columns).reduce<ColumnMap>(\n (map, col, index) => {\n map[col.name] = index;\n return map;\n },\n {}\n );\n\nconst tableMaps: Record<BasketsTableName, ColumnMap> = {\n algoType: buildDataColumnMap(\"algoType\"),\n basket: buildDataColumnMap(\"basket\"),\n basketTrading: buildDataColumnMap(\"basketTrading\"),\n basketTradingConstituent: buildDataColumnMap(\"basketTradingConstituent\"),\n basketConstituent: buildDataColumnMap(\"basketConstituent\"),\n basketTradingConstituentJoin: buildDataColumnMap(\n \"basketTradingConstituentJoin\"\n ),\n priceStrategyType: buildDataColumnMap(\"priceStrategyType\"),\n};\n\n/**\n * BasketConstituent\n */\n\nconst basketConstituent = new Table(\n schemas.basketConstituent,\n basketConstituentData,\n tableMaps.basketConstituent\n);\n\n/**\n * BasketTrading\n */\nconst basketTrading = new Table(\n schemas.basketTrading,\n [],\n tableMaps.basketTrading\n);\n\nlet basketIncrement = 1;\n/**\n * BasketTradingConstituent\n */\nconst basketTradingConstituent = new Table(\n schemas.basketTradingConstituent,\n [],\n tableMaps.basketTradingConstituent\n);\n\n// export as convenience for showcase examples\nexport const createBasketTradingRow = (\n basketId: string,\n basketName: string,\n side = \"BUY\",\n status = \"OFF MARKET\"\n) => [\n basketId,\n basketName,\n 0,\n 1.25,\n `steve-${basketIncrement++}`,\n side,\n status,\n 1_000_000,\n 1_250_000,\n 100,\n];\n\nfunction createTradingBasket(basketId: string, basketName: string) {\n const basketTradingRow = createBasketTradingRow(basketId, basketName);\n\n basketTrading.insert(basketTradingRow);\n\n const { basketId: key } = buildDataColumnMap(\"basketConstituent\");\n const constituents = basketConstituent.data.filter(\n (c) => c[key] === basketId\n );\n\n const { instanceId } = tableMaps.basketTrading;\n\n constituents.forEach(([, , description, , ric, , , quantity, weighting]) => {\n const algo = \"\";\n const algoParams = \"\";\n const limitPrice = 95;\n const notionalLocal = 0;\n const notionalUsd = 0;\n const pctFilled = 0;\n const priceSpread = 0;\n const priceStrategyId = \"\";\n const side = \"BUY\";\n const venue = \"venue\";\n\n const basketInstanceId = basketTradingRow[instanceId];\n const basketTradingConstituentRow: VuuRowDataItemType[] = [\n algo,\n algoParams,\n basketId,\n description,\n basketInstanceId,\n `${basketInstanceId}-${ric}`,\n limitPrice,\n notionalLocal,\n notionalUsd,\n pctFilled,\n priceSpread,\n priceStrategyId,\n quantity,\n ric,\n side,\n venue,\n weighting,\n ];\n basketTradingConstituent.insert(basketTradingConstituentRow);\n });\n\n // return the key\n return basketTradingRow[instanceId] as string;\n}\n\nasync function addConstituent(\n rpcRequest: Omit<ClientToServerViewportRpcCall, \"vpId\">\n) {\n console.log(`RPC call erceived ${rpcRequest.rpcName}`);\n}\nasync function sendToMarket(\n rpcRequest: Omit<ClientToServerViewportRpcCall, \"vpId\">\n) {\n const [basketInstanceId] = rpcRequest.params;\n basketTrading.update(basketInstanceId, \"status\", \"ON_MARKET\");\n}\nasync function takeOffMarket(\n rpcRequest: Omit<ClientToServerViewportRpcCall, \"vpId\">\n) {\n const [basketInstanceId] = rpcRequest.params;\n basketTrading.update(basketInstanceId, \"status\", \"OFF-MARKET\");\n}\n\nasync function createNewBasket(\n rpcRequest: Omit<ClientToServerViewportRpcCall, \"vpId\">\n) {\n const {\n params: [basketId, basketName],\n } = rpcRequest;\n const key = createTradingBasket(basketId, basketName);\n return {\n action: {\n type: \"VP_CREATE_SUCCESS\",\n key,\n },\n };\n}\n\n//-------------------\n\nexport const tables: Record<BasketsTableName, Table> = {\n algoType: new Table(\n schemas.algoType,\n [\n [\"Sniper\", 0],\n [\"Dark Liquidity\", 1],\n [\"VWAP\", 2],\n [\"POV\", 3],\n [\"Dynamic Close\", 4],\n ],\n tableMaps.algoType\n ),\n basket: new Table(\n schemas.basket,\n [\n [\".NASDAQ100\", \".NASDAQ100\", 0, 0],\n [\".HSI\", \".HSI\", 0, 0],\n [\".FTSE100\", \".FTSE100\", 0, 0],\n [\".SP500\", \".SP500\", 0, 0],\n ],\n tableMaps.basket\n ),\n basketConstituent,\n basketTrading,\n basketTradingConstituent,\n basketTradingConstituentJoin: joinTables(\n { module: \"BASKET\", table: \"basketTradingConstituentJoin\" },\n basketTradingConstituent,\n pricesTable,\n \"ric\"\n ),\n priceStrategyType: new Table(\n schemas.priceStrategyType,\n [\n [\"Peg to Near Touch\", 0],\n [\"Far Touch\", 1],\n [\"Limit\", 2],\n [\"Algo\", 3],\n ],\n tableMaps.priceStrategyType\n ),\n};\n\nconst visualLinks: Record<\n BasketsTableName,\n LinkDescriptorWithLabel[] | undefined\n> = {\n algoType: undefined,\n basket: undefined,\n basketConstituent: undefined,\n basketTrading: undefined,\n basketTradingConstituent: undefined,\n basketTradingConstituentJoin: undefined,\n priceStrategyType: undefined,\n};\n\nconst menus: Record<BasketsTableName, VuuMenu | undefined> = {\n algoType: undefined,\n basket: {\n name: \"ROOT\",\n menus: [\n {\n context: \"selected-rows\",\n filter: \"\",\n name: \"Add Basket\",\n rpcName: \"CREATE_NEW_BASKET\",\n },\n ],\n },\n basketConstituent: undefined,\n basketTrading: undefined,\n basketTradingConstituent: undefined,\n basketTradingConstituentJoin: undefined,\n priceStrategyType: undefined,\n};\n\nconst services: Record<BasketsTableName, RpcService[] | undefined> = {\n algoType: undefined,\n basket: [\n {\n rpcName: \"createBasket\",\n service: createNewBasket,\n },\n ],\n basketConstituent: undefined,\n basketTrading: [\n {\n rpcName: \"sendToMarket\",\n service: sendToMarket,\n },\n {\n rpcName: \"takeOffMarket\",\n service: takeOffMarket,\n },\n ],\n basketTradingConstituent: undefined,\n basketTradingConstituentJoin: [\n {\n rpcName: \"addConstituent\",\n service: addConstituent,\n },\n ],\n priceStrategyType: undefined,\n};\n\nexport const basketModule = new VuuModule<BasketsTableName>({\n menus,\n name: \"BASKET\",\n schemas,\n services,\n tables,\n visualLinks,\n});\n"],"names":["schemas","Table","basketConstituentData","joinTables","pricesTable","VuuModule"],"mappings":"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"}
1
+ {"version":3,"file":"basket-module.js","sources":["../../src/basket/basket-module.ts"],"sourcesContent":["import {\n LinkDescriptorWithLabel,\n VuuMenu,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap } from \"@vuu-ui/vuu-utils\";\nimport pricesTable from \"./reference-data/prices\";\nimport { joinTables, Table } from \"../Table\";\nimport { BasketsTableName, schemas } from \"./basket-schemas\";\nimport basketConstituentData from \"./reference-data/constituents\";\nimport {\n RpcService,\n RpcServiceRequest,\n VuuModule,\n withParams,\n} from \"../VuuModule\";\n\n// This is a 'local' columnMap\nconst buildDataColumnMap = (tableName: BasketsTableName) =>\n Object.values(schemas[tableName].columns).reduce<ColumnMap>(\n (map, col, index) => {\n map[col.name] = index;\n return map;\n },\n {}\n );\n\nconst tableMaps: Record<BasketsTableName, ColumnMap> = {\n algoType: buildDataColumnMap(\"algoType\"),\n basket: buildDataColumnMap(\"basket\"),\n basketTrading: buildDataColumnMap(\"basketTrading\"),\n basketTradingConstituent: buildDataColumnMap(\"basketTradingConstituent\"),\n basketConstituent: buildDataColumnMap(\"basketConstituent\"),\n basketTradingConstituentJoin: buildDataColumnMap(\n \"basketTradingConstituentJoin\"\n ),\n priceStrategyType: buildDataColumnMap(\"priceStrategyType\"),\n};\n\n/**\n * BasketConstituent\n */\n\nconst basketConstituent = new Table(\n schemas.basketConstituent,\n basketConstituentData,\n tableMaps.basketConstituent\n);\n\n/**\n * BasketTrading\n */\nconst basketTrading = new Table(\n schemas.basketTrading,\n [],\n tableMaps.basketTrading\n);\n\nlet basketIncrement = 1;\n/**\n * BasketTradingConstituent\n */\nconst basketTradingConstituent = new Table(\n schemas.basketTradingConstituent,\n [],\n tableMaps.basketTradingConstituent\n);\n\n// export as convenience for showcase examples\nexport const createBasketTradingRow = (\n basketId: string,\n basketName: string,\n side = \"BUY\",\n status = \"OFF MARKET\"\n) => [\n basketId,\n basketName,\n 0,\n 1.25,\n `steve-${basketIncrement++}`,\n side,\n status,\n 1_000_000,\n 1_250_000,\n 100,\n];\n\nfunction createTradingBasket(basketId: string, basketName: string) {\n const basketTradingRow = createBasketTradingRow(basketId, basketName);\n\n basketTrading.insert(basketTradingRow);\n\n const { basketId: key } = buildDataColumnMap(\"basketConstituent\");\n const constituents = basketConstituent.data.filter(\n (c) => c[key] === basketId\n );\n\n const { instanceId } = tableMaps.basketTrading;\n\n constituents.forEach(([, , description, , ric, , , quantity, weighting]) => {\n const algo = \"\";\n const algoParams = \"\";\n const limitPrice = 95;\n const notionalLocal = 0;\n const notionalUsd = 0;\n const pctFilled = 0;\n const priceSpread = 0;\n const priceStrategyId = \"\";\n const side = \"BUY\";\n const venue = \"venue\";\n\n const basketInstanceId = basketTradingRow[instanceId];\n const basketTradingConstituentRow: VuuRowDataItemType[] = [\n algo,\n algoParams,\n basketId,\n description,\n basketInstanceId,\n `${basketInstanceId}-${ric}`,\n limitPrice,\n notionalLocal,\n notionalUsd,\n pctFilled,\n priceSpread,\n priceStrategyId,\n quantity,\n ric,\n side,\n venue,\n weighting,\n ];\n basketTradingConstituent.insert(basketTradingConstituentRow);\n });\n\n // return the key\n return basketTradingRow[instanceId] as string;\n}\n\nasync function addConstituent(rpcRequest: RpcServiceRequest) {\n console.log(`RPC call erceived ${rpcRequest.rpcName}`);\n}\nasync function sendToMarket(rpcRequest: RpcServiceRequest) {\n if (withParams(rpcRequest)) {\n const [basketInstanceId] = rpcRequest.params;\n basketTrading.update(basketInstanceId, \"status\", \"ON_MARKET\");\n }\n}\nasync function takeOffMarket(rpcRequest: RpcServiceRequest) {\n if (withParams(rpcRequest)) {\n const [basketInstanceId] = rpcRequest.params;\n basketTrading.update(basketInstanceId, \"status\", \"OFF-MARKET\");\n }\n}\n\nasync function createNewBasket(rpcRequest: RpcServiceRequest) {\n if (withParams(rpcRequest)) {\n const {\n params: [basketId, basketName],\n } = rpcRequest;\n const key = createTradingBasket(basketId, basketName);\n return {\n action: {\n type: \"VP_CREATE_SUCCESS\",\n key,\n },\n };\n }\n}\n\n//-------------------\n\nexport const tables: Record<BasketsTableName, Table> = {\n algoType: new Table(\n schemas.algoType,\n [\n [\"Sniper\", 0],\n [\"Dark Liquidity\", 1],\n [\"VWAP\", 2],\n [\"POV\", 3],\n [\"Dynamic Close\", 4],\n ],\n tableMaps.algoType\n ),\n basket: new Table(\n schemas.basket,\n [\n [\".NASDAQ100\", \".NASDAQ100\", 0, 0],\n [\".HSI\", \".HSI\", 0, 0],\n [\".FTSE100\", \".FTSE100\", 0, 0],\n [\".SP500\", \".SP500\", 0, 0],\n ],\n tableMaps.basket\n ),\n basketConstituent,\n basketTrading,\n basketTradingConstituent,\n basketTradingConstituentJoin: joinTables(\n { module: \"BASKET\", table: \"basketTradingConstituentJoin\" },\n basketTradingConstituent,\n pricesTable,\n \"ric\"\n ),\n priceStrategyType: new Table(\n schemas.priceStrategyType,\n [\n [\"Peg to Near Touch\", 0],\n [\"Far Touch\", 1],\n [\"Limit\", 2],\n [\"Algo\", 3],\n ],\n tableMaps.priceStrategyType\n ),\n};\n\nconst visualLinks: Record<\n BasketsTableName,\n LinkDescriptorWithLabel[] | undefined\n> = {\n algoType: undefined,\n basket: undefined,\n basketConstituent: undefined,\n basketTrading: undefined,\n basketTradingConstituent: undefined,\n basketTradingConstituentJoin: undefined,\n priceStrategyType: undefined,\n};\n\nconst menus: Record<BasketsTableName, VuuMenu | undefined> = {\n algoType: undefined,\n basket: {\n name: \"ROOT\",\n menus: [\n {\n context: \"selected-rows\",\n filter: \"\",\n name: \"Add Basket\",\n rpcName: \"CREATE_NEW_BASKET\",\n },\n ],\n },\n basketConstituent: undefined,\n basketTrading: undefined,\n basketTradingConstituent: undefined,\n basketTradingConstituentJoin: undefined,\n priceStrategyType: undefined,\n};\n\nconst services: Record<BasketsTableName, RpcService[] | undefined> = {\n algoType: undefined,\n basket: [\n {\n rpcName: \"createBasket\",\n service: createNewBasket,\n },\n ],\n basketConstituent: undefined,\n basketTrading: [\n {\n rpcName: \"sendToMarket\",\n service: sendToMarket,\n },\n {\n rpcName: \"takeOffMarket\",\n service: takeOffMarket,\n },\n ],\n basketTradingConstituent: undefined,\n basketTradingConstituentJoin: [\n {\n rpcName: \"addConstituent\",\n service: addConstituent,\n },\n ],\n priceStrategyType: undefined,\n};\n\nexport const basketModule = new VuuModule<BasketsTableName>({\n menus,\n name: \"BASKET\",\n schemas,\n services,\n tables,\n visualLinks,\n});\n"],"names":["schemas","Table","basketConstituentData","withParams","joinTables","pricesTable","VuuModule"],"mappings":"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"}
package/cjs/index.js CHANGED
@@ -40,4 +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;
44
+ exports.withParams = VuuModule.withParams;
43
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -8,19 +8,30 @@ var simulSchemas = require('../simul-schemas.js');
8
8
 
9
9
  const SIDE = ["BUY", "SELL"];
10
10
  const traders = ["Trader A", "Trader B", "Trader C"];
11
+ const orderStatus = [
12
+ "Filled",
13
+ "Cancelled",
14
+ "New",
15
+ "Partial Exec",
16
+ "Booked",
17
+ "All Done"
18
+ ];
19
+ const isComplete = (status) => ["Filled", "All Done", "Booked"].includes(status);
11
20
  const ordersData = [];
12
21
  const now = +/* @__PURE__ */ new Date();
13
22
  for (let i = 0; i < 100; i++) {
23
+ const status = orderStatus[dataUtils.random(0, orderStatus.length - 1)];
14
24
  const ccy = currencies.currencies[dataUtils.random(0, currencies.currencies.length - 1)];
15
25
  const created = now;
16
- const filledQuantity = 100;
17
26
  const lastUpdate = now;
18
27
  const orderId = `ORD${("0000" + i).slice(-4)}`;
19
- const quantity = 1e3;
28
+ const quantity = dataUtils.random(1e3, 1e4);
29
+ const filledQuantity = isComplete(status) ? quantity : status === "New" ? 0 : dataUtils.random(0, quantity);
20
30
  const ric = instruments.getRic("AAP.L");
21
31
  const side = SIDE[dataUtils.random(0, 1)];
22
32
  const trader = traders[dataUtils.random(0, traders.length - 1)];
23
33
  ordersData.push([
34
+ status,
24
35
  ccy,
25
36
  created,
26
37
  filledQuantity,
@@ -35,7 +46,7 @@ for (let i = 0; i < 100; i++) {
35
46
  const ordersTable = new Table.Table(
36
47
  simulSchemas.schemas.orders,
37
48
  ordersData,
38
- Table.buildDataColumnMap(simulSchemas.schemas, "instruments")
49
+ Table.buildDataColumnMap(simulSchemas.schemas, "orders")
39
50
  );
40
51
 
41
52
  exports.ordersData = ordersData;
@@ -1 +1 @@
1
- {"version":3,"file":"orders.js","sources":["../../../src/simul/reference-data/orders.ts"],"sourcesContent":["import { currencies } from \"./currencies\";\nimport { getRic } from \"./instruments\";\nimport { random } from \"../../data-utils\";\nimport { buildDataColumnMap, Table } from \"../../Table\";\nimport { schemas } from \"../simul-schemas\";\n\nexport type ccy = string;\nexport type created = number;\nexport type filledQuantity = number;\nexport type lastUpdate = number;\nexport type orderId = string;\nexport type quantity = number;\nexport type ric = string;\nexport type side = string;\nexport type trader = string;\n\nconst SIDE = [\"BUY\", \"SELL\"];\nconst traders = [\"Trader A\", \"Trader B\", \"Trader C\"];\n\nexport type OrdersDataRow = [\n ccy,\n created,\n filledQuantity,\n lastUpdate,\n orderId,\n quantity,\n ric,\n side,\n trader\n];\n\nexport const OrderColumnMap = {\n ccy: 0,\n created: 1,\n filledQuantity: 2,\n lastUpdate: 3,\n orderId: 4,\n quantity: 5,\n ric: 6,\n side: 7,\n trader: 8,\n} as const;\n\nconst ordersData: OrdersDataRow[] = [];\n\n// const start = performance.now();\n// Create 10_000 Instruments\n\nconst now = +new Date();\nfor (let i = 0; i < 100; i++) {\n const ccy = currencies[random(0, currencies.length - 1)];\n const created = now;\n const filledQuantity = 100;\n const lastUpdate = now;\n const orderId = `ORD${(\"0000\" + i).slice(-4)}`;\n const quantity = 1000;\n const ric = getRic(\"AAP.L\");\n const side = SIDE[random(0, 1)];\n const trader = traders[random(0, traders.length - 1)];\n\n ordersData.push([\n ccy,\n created,\n filledQuantity,\n lastUpdate,\n orderId,\n quantity,\n ric,\n side,\n trader,\n ]);\n}\n// const end = performance.now();\n// console.log(`generating 10,000 instruments took ${end - start} ms`);\n\nexport const ordersTable = new Table(\n schemas.orders,\n ordersData,\n buildDataColumnMap(schemas, \"instruments\")\n);\n\nexport { ordersData };\n"],"names":["currencies","random","getRic","Table","schemas","buildDataColumnMap"],"mappings":";;;;;;;;AAgBA,MAAM,IAAA,GAAO,CAAC,KAAA,EAAO,MAAM,CAAA,CAAA;AAC3B,MAAM,OAAU,GAAA,CAAC,UAAY,EAAA,UAAA,EAAY,UAAU,CAAA,CAAA;AA0BnD,MAAM,aAA8B,GAAC;AAKrC,MAAM,GAAA,GAAM,iBAAC,IAAI,IAAK,EAAA,CAAA;AACtB,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,GAAA,EAAK,CAAK,EAAA,EAAA;AAC5B,EAAA,MAAM,MAAMA,qBAAW,CAAAC,gBAAA,CAAO,GAAGD,qBAAW,CAAA,MAAA,GAAS,CAAC,CAAC,CAAA,CAAA;AACvD,EAAA,MAAM,OAAU,GAAA,GAAA,CAAA;AAChB,EAAA,MAAM,cAAiB,GAAA,GAAA,CAAA;AACvB,EAAA,MAAM,UAAa,GAAA,GAAA,CAAA;AACnB,EAAA,MAAM,UAAU,CAAO,GAAA,EAAA,CAAA,MAAA,GAAS,CAAG,EAAA,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA,CAAA;AAC5C,EAAA,MAAM,QAAW,GAAA,GAAA,CAAA;AACjB,EAAM,MAAA,GAAA,GAAME,mBAAO,OAAO,CAAA,CAAA;AAC1B,EAAA,MAAM,IAAO,GAAA,IAAA,CAAKD,gBAAO,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAC9B,EAAA,MAAM,SAAS,OAAQ,CAAAA,gBAAA,CAAO,GAAG,OAAQ,CAAA,MAAA,GAAS,CAAC,CAAC,CAAA,CAAA;AAEpD,EAAA,UAAA,CAAW,IAAK,CAAA;AAAA,IACd,GAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,GACD,CAAA,CAAA;AACH,CAAA;AAIO,MAAM,cAAc,IAAIE,WAAA;AAAA,EAC7BC,oBAAQ,CAAA,MAAA;AAAA,EACR,UAAA;AAAA,EACAC,wBAAA,CAAmBD,sBAAS,aAAa,CAAA;AAC3C;;;;;"}
1
+ {"version":3,"file":"orders.js","sources":["../../../src/simul/reference-data/orders.ts"],"sourcesContent":["import { currencies } from \"./currencies\";\nimport { getRic } from \"./instruments\";\nimport { random } from \"../../data-utils\";\nimport { buildDataColumnMap, Table } from \"../../Table\";\nimport { schemas } from \"../simul-schemas\";\n\nexport type status = string;\nexport type ccy = string;\nexport type created = number;\nexport type filledQuantity = number;\nexport type lastUpdate = number;\nexport type orderId = string;\nexport type quantity = number;\nexport type ric = string;\nexport type side = string;\nexport type trader = string;\n\nconst SIDE = [\"BUY\", \"SELL\"];\nconst traders = [\"Trader A\", \"Trader B\", \"Trader C\"];\nconst orderStatus = [\n \"Filled\",\n \"Cancelled\",\n \"New\",\n \"Partial Exec\",\n \"Booked\",\n \"All Done\",\n];\n\nconst isComplete = (status: string) =>\n [\"Filled\", \"All Done\", \"Booked\"].includes(status);\n\nexport type OrdersDataRow = [\n status,\n ccy,\n created,\n filledQuantity,\n lastUpdate,\n orderId,\n quantity,\n ric,\n side,\n trader\n];\n\nexport const OrderColumnMap = {\n ccy: 0,\n created: 1,\n filledQuantity: 2,\n lastUpdate: 3,\n orderId: 4,\n quantity: 5,\n ric: 6,\n side: 7,\n trader: 8,\n} as const;\n\nconst ordersData: OrdersDataRow[] = [];\n\n// const start = performance.now();\n// Create 10_000 Instruments\n\nconst now = +new Date();\nfor (let i = 0; i < 100; i++) {\n const status = orderStatus[random(0, orderStatus.length - 1)];\n const ccy = currencies[random(0, currencies.length - 1)];\n const created = now;\n const lastUpdate = now;\n const orderId = `ORD${(\"0000\" + i).slice(-4)}`;\n const quantity = random(1000, 10000);\n const filledQuantity = isComplete(status)\n ? quantity\n : status === \"New\"\n ? 0\n : random(0, quantity);\n const ric = getRic(\"AAP.L\");\n const side = SIDE[random(0, 1)];\n const trader = traders[random(0, traders.length - 1)];\n\n ordersData.push([\n status,\n ccy,\n created,\n filledQuantity,\n lastUpdate,\n orderId,\n quantity,\n ric,\n side,\n trader,\n ]);\n}\n// const end = performance.now();\n// console.log(`generating 10,000 instruments took ${end - start} ms`);\n\nexport const ordersTable = new Table(\n schemas.orders,\n ordersData,\n buildDataColumnMap(schemas, \"orders\")\n);\n\nexport { ordersData };\n"],"names":["random","currencies","getRic","Table","schemas","buildDataColumnMap"],"mappings":";;;;;;;;AAiBA,MAAM,IAAA,GAAO,CAAC,KAAA,EAAO,MAAM,CAAA,CAAA;AAC3B,MAAM,OAAU,GAAA,CAAC,UAAY,EAAA,UAAA,EAAY,UAAU,CAAA,CAAA;AACnD,MAAM,WAAc,GAAA;AAAA,EAClB,QAAA;AAAA,EACA,WAAA;AAAA,EACA,KAAA;AAAA,EACA,cAAA;AAAA,EACA,QAAA;AAAA,EACA,UAAA;AACF,CAAA,CAAA;AAEA,MAAM,UAAA,GAAa,CAAC,MAClB,KAAA,CAAC,UAAU,UAAY,EAAA,QAAQ,CAAE,CAAA,QAAA,CAAS,MAAM,CAAA,CAAA;AA2BlD,MAAM,aAA8B,GAAC;AAKrC,MAAM,GAAA,GAAM,iBAAC,IAAI,IAAK,EAAA,CAAA;AACtB,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,GAAA,EAAK,CAAK,EAAA,EAAA;AAC5B,EAAA,MAAM,SAAS,WAAY,CAAAA,gBAAA,CAAO,GAAG,WAAY,CAAA,MAAA,GAAS,CAAC,CAAC,CAAA,CAAA;AAC5D,EAAA,MAAM,MAAMC,qBAAW,CAAAD,gBAAA,CAAO,GAAGC,qBAAW,CAAA,MAAA,GAAS,CAAC,CAAC,CAAA,CAAA;AACvD,EAAA,MAAM,OAAU,GAAA,GAAA,CAAA;AAChB,EAAA,MAAM,UAAa,GAAA,GAAA,CAAA;AACnB,EAAA,MAAM,UAAU,CAAO,GAAA,EAAA,CAAA,MAAA,GAAS,CAAG,EAAA,KAAA,CAAM,EAAE,CAAC,CAAA,CAAA,CAAA;AAC5C,EAAM,MAAA,QAAA,GAAWD,gBAAO,CAAA,GAAA,EAAM,GAAK,CAAA,CAAA;AACnC,EAAM,MAAA,cAAA,GAAiB,UAAW,CAAA,MAAM,CACpC,GAAA,QAAA,GACA,WAAW,KACX,GAAA,CAAA,GACAA,gBAAO,CAAA,CAAA,EAAG,QAAQ,CAAA,CAAA;AACtB,EAAM,MAAA,GAAA,GAAME,mBAAO,OAAO,CAAA,CAAA;AAC1B,EAAA,MAAM,IAAO,GAAA,IAAA,CAAKF,gBAAO,CAAA,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAC9B,EAAA,MAAM,SAAS,OAAQ,CAAAA,gBAAA,CAAO,GAAG,OAAQ,CAAA,MAAA,GAAS,CAAC,CAAC,CAAA,CAAA;AAEpD,EAAA,UAAA,CAAW,IAAK,CAAA;AAAA,IACd,MAAA;AAAA,IACA,GAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,GACD,CAAA,CAAA;AACH,CAAA;AAIO,MAAM,cAAc,IAAIG,WAAA;AAAA,EAC7BC,oBAAQ,CAAA,MAAA;AAAA,EACR,UAAA;AAAA,EACAC,wBAAA,CAAmBD,sBAAS,QAAQ,CAAA;AACtC;;;;;"}