@vuu-ui/vuu-data-test 0.13.18 → 0.13.20

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.
Files changed (78) hide show
  1. package/cjs/Table.js +3 -86
  2. package/cjs/Table.js.map +1 -1
  3. package/cjs/basket/BasketModule.js +11 -11
  4. package/cjs/basket/BasketModule.js.map +1 -1
  5. package/cjs/core/module/ModuleContainer.js +3 -0
  6. package/cjs/core/module/ModuleContainer.js.map +1 -1
  7. package/cjs/core/module/VuuModule.js +6 -0
  8. package/cjs/core/module/VuuModule.js.map +1 -1
  9. package/cjs/core/table/TableContainer.js +138 -0
  10. package/cjs/core/table/TableContainer.js.map +1 -0
  11. package/cjs/data-utils.js +0 -10
  12. package/cjs/data-utils.js.map +1 -1
  13. package/cjs/index.js +9 -8
  14. package/cjs/index.js.map +1 -1
  15. package/cjs/local-datasource-provider/LocalDatasourceProvider.js +18 -18
  16. package/cjs/local-datasource-provider/LocalDatasourceProvider.js.map +1 -1
  17. package/cjs/simul/SimulModule.js +4 -4
  18. package/cjs/simul/SimulModule.js.map +1 -1
  19. package/cjs/simul/reference-data/instruments-extended.js +2 -1
  20. package/cjs/simul/reference-data/instruments-extended.js.map +1 -1
  21. package/cjs/simul/reference-data/instruments.js +3 -1
  22. package/cjs/simul/reference-data/instruments.js.map +1 -1
  23. package/cjs/simul/reference-data/orders.js +2 -1
  24. package/cjs/simul/reference-data/orders.js.map +1 -1
  25. package/cjs/simul/reference-data/parent-child-orders.js +4 -3
  26. package/cjs/simul/reference-data/parent-child-orders.js.map +1 -1
  27. package/cjs/simul/reference-data/prices.js +2 -1
  28. package/cjs/simul/reference-data/prices.js.map +1 -1
  29. package/cjs/vuu-modules.js +1 -1
  30. package/cjs/vuu-modules.js.map +1 -1
  31. package/esm/Table.js +4 -86
  32. package/esm/Table.js.map +1 -1
  33. package/esm/basket/BasketModule.js +11 -11
  34. package/esm/basket/BasketModule.js.map +1 -1
  35. package/esm/core/module/ModuleContainer.js +3 -0
  36. package/esm/core/module/ModuleContainer.js.map +1 -1
  37. package/esm/core/module/VuuModule.js +6 -0
  38. package/esm/core/module/VuuModule.js.map +1 -1
  39. package/esm/core/table/TableContainer.js +136 -0
  40. package/esm/core/table/TableContainer.js.map +1 -0
  41. package/esm/data-utils.js +1 -10
  42. package/esm/data-utils.js.map +1 -1
  43. package/esm/index.js +5 -4
  44. package/esm/index.js.map +1 -1
  45. package/esm/local-datasource-provider/LocalDatasourceProvider.js +18 -18
  46. package/esm/local-datasource-provider/LocalDatasourceProvider.js.map +1 -1
  47. package/esm/simul/SimulModule.js +4 -4
  48. package/esm/simul/SimulModule.js.map +1 -1
  49. package/esm/simul/reference-data/instruments-extended.js +3 -2
  50. package/esm/simul/reference-data/instruments-extended.js.map +1 -1
  51. package/esm/simul/reference-data/instruments.js +4 -2
  52. package/esm/simul/reference-data/instruments.js.map +1 -1
  53. package/esm/simul/reference-data/orders.js +3 -2
  54. package/esm/simul/reference-data/orders.js.map +1 -1
  55. package/esm/simul/reference-data/parent-child-orders.js +5 -4
  56. package/esm/simul/reference-data/parent-child-orders.js.map +1 -1
  57. package/esm/simul/reference-data/prices.js +3 -2
  58. package/esm/simul/reference-data/prices.js.map +1 -1
  59. package/esm/vuu-modules.js +1 -1
  60. package/esm/vuu-modules.js.map +1 -1
  61. package/package.json +6 -6
  62. package/types/Table.d.ts +2 -2
  63. package/types/basket/BasketModule.d.ts +2 -2
  64. package/types/basket/reference-data/prices.d.ts +1 -2
  65. package/types/core/module/ModuleContainer.d.ts +1 -0
  66. package/types/core/module/VuuModule.d.ts +2 -0
  67. package/types/core/table/TableContainer.d.ts +16 -0
  68. package/types/index.d.ts +3 -2
  69. package/types/simul/reference-data/instruments-extended.d.ts +1 -2
  70. package/types/simul/reference-data/instruments.d.ts +1 -2
  71. package/types/simul/reference-data/orders.d.ts +1 -2
  72. package/types/simul/reference-data/parent-child-orders.d.ts +2 -3
  73. package/types/simul/reference-data/prices.d.ts +1 -2
  74. package/types/vuu-modules.d.ts +3 -0
  75. package/cjs/basket/reference-data/prices.js +0 -54
  76. package/cjs/basket/reference-data/prices.js.map +0 -1
  77. package/esm/basket/reference-data/prices.js +0 -52
  78. package/esm/basket/reference-data/prices.js.map +0 -1
package/cjs/Table.js CHANGED
@@ -41,6 +41,9 @@ class Table extends vuuUtils.EventEmitter {
41
41
  get schema() {
42
42
  return __privateGet(this, _schema);
43
43
  }
44
+ get name() {
45
+ return __privateGet(this, _schema).table.table;
46
+ }
44
47
  insert(row, emitEvent = true) {
45
48
  const index = __privateGet(this, _data).length;
46
49
  __privateGet(this, _data).push(row);
@@ -95,94 +98,8 @@ function buildDataColumnMapFromSchema(schema) {
95
98
  function buildDataColumnMap(schemas, tableName) {
96
99
  return buildDataColumnMapFromSchema(schemas[tableName]);
97
100
  }
98
- const getServerDataType = (columnName, { columns: cols1, table: t1 }, { columns: cols2, table: t2 }) => {
99
- const col1 = cols1.find((col) => col.name === columnName);
100
- const col2 = cols2.find((col) => col.name === columnName);
101
- if (col1 && col2) {
102
- if (col1.serverDataType === col2.serverDataType) {
103
- return col1.serverDataType;
104
- } else {
105
- throw Error(
106
- `both tables ${t1.table} and ${t2.table} implement column ${columnName}, but with types differ`
107
- );
108
- }
109
- } else if (col1) {
110
- return col1.serverDataType;
111
- } else if (col2) {
112
- return col2.serverDataType;
113
- } else {
114
- throw Error(`WTF how is this possible`);
115
- }
116
- };
117
- const joinTables = (joinTable, table1, table2, joinColumn) => {
118
- const { map: m1, schema: schema1 } = table1;
119
- const { map: m2, schema: schema2 } = table2;
120
- const k1 = m1[joinColumn];
121
- const k2 = m2[joinColumn];
122
- const combinedColumns = new Set(
123
- [...schema1.columns, ...schema2.columns].map((col) => col.name).sort()
124
- );
125
- const combinedSchema = {
126
- key: joinColumn,
127
- table: joinTable,
128
- columns: Array.from(combinedColumns).map((columnName) => ({
129
- name: columnName,
130
- serverDataType: getServerDataType(columnName, schema1, schema2)
131
- }))
132
- };
133
- console.log({ combinedSchema });
134
- const data = [];
135
- const combinedColumnMap = buildDataColumnMapFromSchema(combinedSchema);
136
- console.log({ combinedColumnMap });
137
- for (const row of table1.data) {
138
- const row2 = table2.findByKey(String(row[k1]));
139
- if (row2) {
140
- const out = [];
141
- for (const column of table1.schema.columns) {
142
- const value = row[m1[column.name]];
143
- out[combinedColumnMap[column.name]] = value;
144
- }
145
- for (const column of table2.schema.columns) {
146
- const value = row2[m2[column.name]];
147
- out[combinedColumnMap[column.name]] = value;
148
- }
149
- data.push(out);
150
- }
151
- }
152
- const newTable = new Table(combinedSchema, data, combinedColumnMap);
153
- table1.on("insert", (row) => {
154
- const row2 = table2.findByKey(String(row[k1]));
155
- if (row2) {
156
- const out = [];
157
- for (const column of table1.schema.columns) {
158
- const value = row[m1[column.name]];
159
- out[combinedColumnMap[column.name]] = value;
160
- }
161
- for (const column of table2.schema.columns) {
162
- const value = row2[m2[column.name]];
163
- out[combinedColumnMap[column.name]] = value;
164
- }
165
- newTable.insert(out);
166
- }
167
- });
168
- table2.on("update", (row) => {
169
- const keyValue = row[k2];
170
- const targetRow = newTable.findByKey(keyValue);
171
- if (targetRow) {
172
- const updatedRow = targetRow.slice();
173
- for (const { name } of table2.schema.columns) {
174
- if (row[m2[name]] !== updatedRow[combinedColumnMap[name]]) {
175
- updatedRow[combinedColumnMap[name]] = row[m2[name]];
176
- }
177
- }
178
- newTable.updateRow(updatedRow);
179
- }
180
- });
181
- return newTable;
182
- };
183
101
 
184
102
  exports.Table = Table;
185
103
  exports.buildDataColumnMap = buildDataColumnMap;
186
104
  exports.buildDataColumnMapFromSchema = buildDataColumnMapFromSchema;
187
- exports.joinTables = joinTables;
188
105
  //# sourceMappingURL=Table.js.map
package/cjs/Table.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Table.js","sources":["../../../packages/vuu-data-test/src/Table.ts"],"sourcesContent":["import { SchemaColumn, TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRowDataItemType, VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap, EventEmitter } from \"@vuu-ui/vuu-utils\";\nimport { UpdateGenerator } from \"./rowUpdates\";\n\nexport type TableEvents = {\n delete: (row: VuuRowDataItemType[]) => void;\n insert: (row: VuuRowDataItemType[]) => void;\n update: (row: VuuRowDataItemType[], columnName?: string) => void;\n};\n\nexport class Table extends EventEmitter<TableEvents> {\n #data: VuuRowDataItemType[][];\n #dataMap: ColumnMap;\n #indexOfKey: number;\n #index = new Map<string, number>();\n #schema: TableSchema;\n\n constructor(\n schema: TableSchema,\n data: VuuRowDataItemType[][],\n dataMap: ColumnMap,\n updateGenerator?: UpdateGenerator,\n ) {\n super();\n this.#data = data;\n this.#dataMap = dataMap;\n this.#schema = schema;\n this.#indexOfKey = dataMap[schema.key];\n this.buildIndex();\n updateGenerator?.setTable(this);\n updateGenerator?.setRange({ from: 0, to: 100 });\n }\n\n private buildIndex() {\n for (let i = 0; i < this.#data.length; i++) {\n const key = this.#data[i][this.#indexOfKey] as string;\n this.#index.set(key, i);\n }\n }\n\n get data() {\n return this.#data;\n }\n\n get map() {\n return this.#dataMap;\n }\n\n get schema() {\n return this.#schema;\n }\n\n insert(row: VuuRowDataItemType[], emitEvent = true) {\n const index = this.#data.length;\n this.#data.push(row);\n const key = row[this.#indexOfKey] as string;\n this.#index.set(key, index);\n if (emitEvent) {\n this.emit(\"insert\", row);\n }\n }\n\n findByKey(key: string) {\n const index = this.#index.get(key) ?? -1;\n return this.#data[index];\n }\n\n update(key: string, columnName: string, value: VuuRowDataItemType) {\n const rowIndex = this.#data.findIndex(\n (row) => row[this.#indexOfKey] === key,\n );\n const colIndex = this.#dataMap[columnName];\n if (rowIndex !== -1) {\n const row = this.#data[rowIndex];\n const newRow = row.slice();\n newRow[colIndex] = value;\n this.#data[rowIndex] = newRow;\n this.emit(\"update\", newRow, columnName);\n }\n }\n updateRow(row: VuuRowDataItemType[]) {\n const key = row[this.#indexOfKey];\n const rowIndex = this.#data.findIndex(\n (row) => row[this.#indexOfKey] === key,\n );\n if (rowIndex !== -1) {\n this.#data[rowIndex] = row;\n this.emit(\"update\", row);\n }\n }\n}\n\nexport function buildDataColumnMapFromSchema(schema: Readonly<TableSchema>) {\n return Object.values(schema.columns).reduce<ColumnMap>(\n (map, col, index) => ({\n ...map,\n [col.name]: index,\n }),\n {},\n );\n}\n\n/**\n * Build a data ColumnMap for a table in the provided schema.\n * A data ColumnMap is a mapping from a raw data array to a map, keyed\n * by column name with no additional metadata.\n *\n * @param schemas\n * @param tableName\n * @returns\n */\nexport function buildDataColumnMap<TableName extends string = string>(\n schemas: Readonly<Record<TableName, Readonly<TableSchema>>>,\n tableName: TableName,\n) {\n return buildDataColumnMapFromSchema(schemas[tableName]);\n}\n\nconst getServerDataType = (\n columnName: string,\n { columns: cols1, table: t1 }: TableSchema,\n { columns: cols2, table: t2 }: TableSchema,\n) => {\n const col1 = cols1.find((col) => col.name === columnName);\n const col2 = cols2.find((col) => col.name === columnName);\n if (col1 && col2) {\n if (col1.serverDataType === col2.serverDataType) {\n return col1.serverDataType;\n } else {\n throw Error(\n `both tables ${t1.table} and ${t2.table} implement column ${columnName}, but with types differ`,\n );\n }\n } else if (col1) {\n return col1.serverDataType;\n } else if (col2) {\n return col2.serverDataType;\n } else {\n throw Error(`WTF how is this possible`);\n }\n};\n\n// Just copies source tables, then registers update listeners.\n// Not terribly efficient, but good enough for showcase\nexport const joinTables = (\n joinTable: VuuTable,\n table1: Table,\n table2: Table,\n joinColumn: string,\n) => {\n const { map: m1, schema: schema1 } = table1;\n const { map: m2, schema: schema2 } = table2;\n const k1 = m1[joinColumn];\n const k2 = m2[joinColumn];\n\n const combinedColumns = new Set(\n [...schema1.columns, ...schema2.columns].map((col) => col.name).sort(),\n );\n\n const combinedSchema: TableSchema = {\n key: joinColumn,\n table: joinTable,\n columns: Array.from(combinedColumns).map<SchemaColumn>((columnName) => ({\n name: columnName,\n serverDataType: getServerDataType(columnName, schema1, schema2),\n })),\n };\n\n console.log({ combinedSchema });\n\n const data: VuuRowDataItemType[][] = [];\n const combinedColumnMap = buildDataColumnMapFromSchema(combinedSchema);\n console.log({ combinedColumnMap });\n // const start = performance.now();\n for (const row of table1.data) {\n const row2 = table2.findByKey(String(row[k1]));\n if (row2) {\n const out = [];\n for (const column of table1.schema.columns) {\n const value = row[m1[column.name]];\n out[combinedColumnMap[column.name]] = value;\n }\n for (const column of table2.schema.columns) {\n const value = row2[m2[column.name]];\n out[combinedColumnMap[column.name]] = value;\n }\n data.push(out);\n }\n }\n // const end = performance.now();\n // console.log(`took ${end - start} ms to create join table ${joinTable.table}`);\n\n const newTable = new Table(combinedSchema, data, combinedColumnMap);\n\n table1.on(\"insert\", (row) => {\n const row2 = table2.findByKey(String(row[k1]));\n if (row2) {\n const out = [];\n for (const column of table1.schema.columns) {\n const value = row[m1[column.name]];\n out[combinedColumnMap[column.name]] = value;\n }\n for (const column of table2.schema.columns) {\n const value = row2[m2[column.name]];\n out[combinedColumnMap[column.name]] = value;\n }\n newTable.insert(out);\n }\n });\n\n table2.on(\"update\", (row) => {\n const keyValue = row[k2] as string;\n const targetRow = newTable.findByKey(keyValue);\n if (targetRow) {\n const updatedRow = targetRow.slice();\n for (const { name } of table2.schema.columns) {\n if (row[m2[name]] !== updatedRow[combinedColumnMap[name]]) {\n updatedRow[combinedColumnMap[name]] = row[m2[name]];\n }\n }\n newTable.updateRow(updatedRow);\n }\n });\n\n return newTable;\n};\n"],"names":["EventEmitter","row"],"mappings":"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"}
1
+ {"version":3,"file":"Table.js","sources":["../../../packages/vuu-data-test/src/Table.ts"],"sourcesContent":["import { TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap, EventEmitter } from \"@vuu-ui/vuu-utils\";\nimport { UpdateGenerator } from \"./rowUpdates\";\n\nexport type TableEvents = {\n delete: (row: VuuRowDataItemType[]) => void;\n insert: (row: VuuRowDataItemType[]) => void;\n update: (row: VuuRowDataItemType[], columnName?: string) => void;\n};\n\nexport class Table extends EventEmitter<TableEvents> {\n #data: VuuRowDataItemType[][];\n #dataMap: ColumnMap;\n #indexOfKey: number;\n #index = new Map<string, number>();\n #schema: TableSchema;\n\n constructor(\n schema: TableSchema,\n data: VuuRowDataItemType[][],\n dataMap: ColumnMap,\n updateGenerator?: UpdateGenerator,\n ) {\n super();\n this.#data = data;\n this.#dataMap = dataMap;\n this.#schema = schema;\n this.#indexOfKey = dataMap[schema.key];\n this.buildIndex();\n updateGenerator?.setTable(this);\n updateGenerator?.setRange({ from: 0, to: 100 });\n }\n\n private buildIndex() {\n for (let i = 0; i < this.#data.length; i++) {\n const key = this.#data[i][this.#indexOfKey] as string;\n this.#index.set(key, i);\n }\n }\n\n get data() {\n return this.#data;\n }\n\n get map() {\n return this.#dataMap;\n }\n\n get schema() {\n return this.#schema;\n }\n\n get name() {\n return this.#schema.table.table;\n }\n\n insert(row: VuuRowDataItemType[], emitEvent = true) {\n const index = this.#data.length;\n this.#data.push(row);\n const key = row[this.#indexOfKey] as string;\n this.#index.set(key, index);\n if (emitEvent) {\n this.emit(\"insert\", row);\n }\n }\n\n findByKey(key: string) {\n const index = this.#index.get(key) ?? -1;\n return this.#data[index];\n }\n\n update(key: string, columnName: string, value: VuuRowDataItemType) {\n const rowIndex = this.#data.findIndex(\n (row) => row[this.#indexOfKey] === key,\n );\n const colIndex = this.#dataMap[columnName];\n if (rowIndex !== -1) {\n const row = this.#data[rowIndex];\n const newRow = row.slice();\n newRow[colIndex] = value;\n this.#data[rowIndex] = newRow;\n this.emit(\"update\", newRow, columnName);\n }\n }\n updateRow(row: VuuRowDataItemType[]) {\n const key = row[this.#indexOfKey];\n const rowIndex = this.#data.findIndex(\n (row) => row[this.#indexOfKey] === key,\n );\n if (rowIndex !== -1) {\n this.#data[rowIndex] = row;\n this.emit(\"update\", row);\n }\n }\n}\n\nexport function buildDataColumnMapFromSchema(schema: Readonly<TableSchema>) {\n return Object.values(schema.columns).reduce<ColumnMap>(\n (map, col, index) => ({\n ...map,\n [col.name]: index,\n }),\n {},\n );\n}\n\n/**\n * Build a data ColumnMap for a table in the provided schema.\n * A data ColumnMap is a mapping from a raw data array to a map, keyed\n * by column name with no additional metadata.\n *\n * @param schemas\n * @param tableName\n * @returns\n */\nexport function buildDataColumnMap<TableName extends string = string>(\n schemas: Readonly<Record<TableName, Readonly<TableSchema>>>,\n tableName: TableName,\n) {\n return buildDataColumnMapFromSchema(schemas[tableName]);\n}\n"],"names":["EventEmitter","row"],"mappings":"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"}
@@ -2,10 +2,9 @@
2
2
 
3
3
  var vuuUtils = require('@vuu-ui/vuu-utils');
4
4
  var VuuModule = require('../core/module/VuuModule.js');
5
+ var TableContainer = require('../core/table/TableContainer.js');
5
6
  var basketSchemas = require('./basket-schemas.js');
6
- var Table = require('../Table.js');
7
7
  var constituents = require('./reference-data/constituents.js');
8
- var prices = require('./reference-data/prices.js');
9
8
 
10
9
  var __defProp = Object.defineProperty;
11
10
  var __typeError = (msg) => {
@@ -17,6 +16,7 @@ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot
17
16
  var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
18
17
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
19
18
  var _tables;
19
+ const { createTable } = TableContainer;
20
20
  let basketIncrement = 1;
21
21
  const createBasketTradingRow = (basketId, basketName, side = "BUY", status = "OFF MARKET") => [
22
22
  basketId,
@@ -68,7 +68,7 @@ const tableMaps = {
68
68
  ),
69
69
  priceStrategyType: buildDataColumnMap("priceStrategyType")
70
70
  };
71
- const basketTradingConstituent = new Table.Table(
71
+ const basketTradingConstituent = TableContainer.createTable(
72
72
  basketSchemas.schemas.basketTradingConstituent,
73
73
  [],
74
74
  tableMaps.basketTradingConstituent
@@ -77,7 +77,7 @@ class BasketModule extends VuuModule.VuuModule {
77
77
  constructor() {
78
78
  super("BASKET");
79
79
  __privateAdd(this, _tables, {
80
- algoType: new Table.Table(
80
+ algoType: createTable(
81
81
  basketSchemas.schemas.algoType,
82
82
  [
83
83
  ["Sniper", 0],
@@ -88,7 +88,7 @@ class BasketModule extends VuuModule.VuuModule {
88
88
  ],
89
89
  tableMaps.algoType
90
90
  ),
91
- basket: new Table.Table(
91
+ basket: createTable(
92
92
  basketSchemas.schemas.basket,
93
93
  [
94
94
  [".NASDAQ100", ".NASDAQ100", 0, 0],
@@ -98,24 +98,24 @@ class BasketModule extends VuuModule.VuuModule {
98
98
  ],
99
99
  tableMaps.basket
100
100
  ),
101
- basketConstituent: new Table.Table(
101
+ basketConstituent: createTable(
102
102
  basketSchemas.schemas.basketConstituent,
103
103
  constituents,
104
104
  tableMaps.basketConstituent
105
105
  ),
106
- basketTrading: new Table.Table(
106
+ basketTrading: createTable(
107
107
  basketSchemas.schemas.basketTrading,
108
108
  [],
109
109
  tableMaps.basketTrading
110
110
  ),
111
111
  basketTradingConstituent,
112
- basketTradingConstituentJoin: Table.joinTables(
112
+ basketTradingConstituentJoin: TableContainer.createJoinTable(
113
113
  { module: "BASKET", table: "basketTradingConstituentJoin" },
114
- basketTradingConstituent,
115
- prices,
114
+ { module: "BASKET", table: "basketTradingConstituent" },
115
+ { module: "SIMUL", table: "prices" },
116
116
  "ric"
117
117
  ),
118
- priceStrategyType: new Table.Table(
118
+ priceStrategyType: createTable(
119
119
  basketSchemas.schemas.priceStrategyType,
120
120
  [
121
121
  ["Peg to Near Touch", 0],
@@ -1 +1 @@
1
- {"version":3,"file":"BasketModule.js","sources":["../../../../packages/vuu-data-test/src/basket/BasketModule.ts"],"sourcesContent":["import { ColumnMap, isViewportRpcRequest } from \"@vuu-ui/vuu-utils\";\nimport { ServiceHandler, VuuModule } from \"../core/module/VuuModule\";\nimport { BasketsTableName, schemas } from \"./basket-schemas\";\nimport { joinTables, Table } from \"../Table\";\nimport basketConstituentData from \"./reference-data/constituents\";\nimport pricesTable from \"./reference-data/prices\";\nimport {\n VuuMenu,\n VuuRowDataItemType,\n VuuRpcViewportAction,\n VuuRpcViewportResponse,\n} from \"@vuu-ui/vuu-protocol-types\";\n\nlet basketIncrement = 1;\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\nconst viewportRpcResponse = (\n params: string[],\n vpId: string,\n action?: Partial<VuuRpcViewportAction>,\n): VuuRpcViewportResponse => ({\n type: \"VIEW_PORT_RPC_RESPONSE\",\n action: {\n type: \"VP_RPC_SUCCESS\",\n ...action,\n },\n method: \"???\",\n namedParams: {},\n params,\n vpId,\n});\n\nconst undefinedTables = {\n algoType: undefined,\n basket: undefined,\n basketTrading: undefined,\n basketTradingConstituent: undefined,\n basketConstituent: undefined,\n basketTradingConstituentJoin: undefined,\n priceStrategyType: undefined,\n};\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\nconst basketTradingConstituent = new Table(\n schemas.basketTradingConstituent,\n [],\n tableMaps.basketTradingConstituent,\n);\n\n/**\n * This is an example of how we might extend the built-in VuuModule to\n * implement a module-specific service in such a way that it can invoke\n * methods on the VuuModule.\n */\nexport class BasketModule extends VuuModule<BasketsTableName> {\n #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: new Table(\n schemas.basketConstituent,\n basketConstituentData,\n tableMaps.basketConstituent,\n ),\n basketTrading: new Table(\n schemas.basketTrading,\n [],\n tableMaps.basketTrading,\n ),\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\n constructor() {\n super(\"BASKET\");\n }\n\n get menus(): Record<BasketsTableName, VuuMenu | undefined> {\n return {\n ...undefinedTables,\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 };\n }\n\n get schemas() {\n return schemas;\n }\n\n get services() {\n return {\n ...undefinedTables,\n basket: [\n {\n rpcName: \"createBasket\",\n service: this.createNewBasket,\n },\n ],\n basketTrading: [\n {\n rpcName: \"sendToMarket\",\n service: this.sendToMarket,\n },\n {\n rpcName: \"takeOffMarket\",\n service: this.takeOffMarket,\n },\n ],\n basketTradingConstituentJoin: [\n {\n rpcName: \"addConstituent\",\n service: this.addConstituent,\n },\n ],\n };\n }\n\n get tables() {\n return this.#tables;\n }\n\n get visualLinks() {\n return {\n ...undefinedTables,\n basketConstituent: [\n { fromColumn: \"basketId\", toColumn: \"id\", toTable: \"basket\" },\n ],\n };\n }\n\n private createTradingBasket(basketId: string, basketName: string) {\n const basketTradingRow = createBasketTradingRow(basketId, basketName);\n\n this.tables.basketTrading.insert(basketTradingRow);\n\n const { basketId: key } = buildDataColumnMap(\"basketConstituent\");\n const constituents = this.tables.basketConstituent.data.filter(\n (c) => c[key] === basketId,\n );\n\n const { instanceId } = tableMaps.basketTrading;\n\n constituents.forEach(\n ([, , 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\n // return the key\n return basketTradingRow[instanceId] as string;\n }\n\n private createNewBasket: ServiceHandler = async (rpcRequest) => {\n if (isViewportRpcRequest(rpcRequest)) {\n const { vpId } = rpcRequest;\n const params = rpcRequest.params as string[];\n const [basketId, basketName] = params;\n const key = this.createTradingBasket(basketId, basketName);\n return viewportRpcResponse(params, vpId, { key });\n } else {\n throw Error(`createNewBasket invalid rpcRequest`);\n }\n };\n\n private sendToMarket: ServiceHandler = async (rpcRequest) => {\n if (isViewportRpcRequest(rpcRequest)) {\n const { vpId } = rpcRequest;\n const params = rpcRequest.params as string[];\n const [basketInstanceId] = params;\n this.tables.basketTrading.update(basketInstanceId, \"status\", \"ON_MARKET\");\n return viewportRpcResponse(params, vpId);\n } else {\n throw Error(`sendToMarket invalid rpcRequest`);\n }\n };\n private takeOffMarket: ServiceHandler = async (rpcRequest) => {\n if (isViewportRpcRequest(rpcRequest)) {\n const { vpId } = rpcRequest;\n const params = rpcRequest.params as string[];\n const [basketInstanceId] = params;\n this.tables.basketTrading.update(\n basketInstanceId,\n \"status\",\n \"OFF-MARKET\",\n );\n return viewportRpcResponse(params, vpId);\n } else {\n throw Error(`takeOffMarket invalid rpcRequest`);\n }\n };\n\n private addConstituent: ServiceHandler = async (rpcRequest) => {\n if (isViewportRpcRequest(rpcRequest)) {\n throw Error(`addConstituent not implemented`);\n } else {\n throw Error(`addConstituent invalid rpcRequest`);\n }\n };\n}\n\nexport const basketModule = new BasketModule();\n"],"names":["schemas","Table","VuuModule","basketConstituentData","joinTables","pricesTable","isViewportRpcRequest"],"mappings":";;;;;;;;;;;;;;;;;;AAAA,IAAA,OAAA;AAaA,IAAI,eAAkB,GAAA,CAAA;AAGf,MAAM,yBAAyB,CACpC,QAAA,EACA,YACA,IAAO,GAAA,KAAA,EACP,SAAS,YACN,KAAA;AAAA,EACH,QAAA;AAAA,EACA,UAAA;AAAA,EACA,CAAA;AAAA,EACA,IAAA;AAAA,EACA,SAAS,eAAiB,EAAA,CAAA,CAAA;AAAA,EAC1B,IAAA;AAAA,EACA,MAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA;AAAA,EACA;AACF;AAEA,MAAM,mBAAsB,GAAA,CAC1B,MACA,EAAA,IAAA,EACA,MAC4B,MAAA;AAAA,EAC5B,IAAM,EAAA,wBAAA;AAAA,EACN,MAAQ,EAAA;AAAA,IACN,IAAM,EAAA,gBAAA;AAAA,IACN,GAAG;AAAA,GACL;AAAA,EACA,MAAQ,EAAA,KAAA;AAAA,EACR,aAAa,EAAC;AAAA,EACd,MAAA;AAAA,EACA;AACF,CAAA,CAAA;AAEA,MAAM,eAAkB,GAAA;AAAA,EACtB,QAAU,EAAA,KAAA,CAAA;AAAA,EACV,MAAQ,EAAA,KAAA,CAAA;AAAA,EACR,aAAe,EAAA,KAAA,CAAA;AAAA,EACf,wBAA0B,EAAA,KAAA,CAAA;AAAA,EAC1B,iBAAmB,EAAA,KAAA,CAAA;AAAA,EACnB,4BAA8B,EAAA,KAAA,CAAA;AAAA,EAC9B,iBAAmB,EAAA,KAAA;AACrB,CAAA;AAGA,MAAM,kBAAA,GAAqB,CAAC,SAC1B,KAAA,MAAA,CAAO,OAAOA,qBAAQ,CAAA,SAAS,CAAE,CAAA,OAAO,CAAE,CAAA,MAAA;AAAA,EACxC,CAAC,GAAK,EAAA,GAAA,EAAK,KAAU,KAAA;AACnB,IAAI,GAAA,CAAA,GAAA,CAAI,IAAI,CAAI,GAAA,KAAA;AAChB,IAAO,OAAA,GAAA;AAAA,GACT;AAAA,EACA;AACF,CAAA;AAEF,MAAM,SAAiD,GAAA;AAAA,EACrD,QAAA,EAAU,mBAAmB,UAAU,CAAA;AAAA,EACvC,MAAA,EAAQ,mBAAmB,QAAQ,CAAA;AAAA,EACnC,aAAA,EAAe,mBAAmB,eAAe,CAAA;AAAA,EACjD,wBAAA,EAA0B,mBAAmB,0BAA0B,CAAA;AAAA,EACvE,iBAAA,EAAmB,mBAAmB,mBAAmB,CAAA;AAAA,EACzD,4BAA8B,EAAA,kBAAA;AAAA,IAC5B;AAAA,GACF;AAAA,EACA,iBAAA,EAAmB,mBAAmB,mBAAmB;AAC3D,CAAA;AAEA,MAAM,2BAA2B,IAAIC,WAAA;AAAA,EACnCD,qBAAQ,CAAA,wBAAA;AAAA,EACR,EAAC;AAAA,EACD,SAAU,CAAA;AACZ,CAAA;AAOO,MAAM,qBAAqBE,mBAA4B,CAAA;AAAA,EAoD5D,WAAc,GAAA;AACZ,IAAA,KAAA,CAAM,QAAQ,CAAA;AApDhB,IAA2C,YAAA,CAAA,IAAA,EAAA,OAAA,EAAA;AAAA,MACzC,UAAU,IAAID,WAAA;AAAA,QACZD,qBAAQ,CAAA,QAAA;AAAA,QACR;AAAA,UACE,CAAC,UAAU,CAAC,CAAA;AAAA,UACZ,CAAC,kBAAkB,CAAC,CAAA;AAAA,UACpB,CAAC,QAAQ,CAAC,CAAA;AAAA,UACV,CAAC,OAAO,CAAC,CAAA;AAAA,UACT,CAAC,iBAAiB,CAAC;AAAA,SACrB;AAAA,QACA,SAAU,CAAA;AAAA,OACZ;AAAA,MACA,QAAQ,IAAIC,WAAA;AAAA,QACVD,qBAAQ,CAAA,MAAA;AAAA,QACR;AAAA,UACE,CAAC,YAAA,EAAc,YAAc,EAAA,CAAA,EAAG,CAAC,CAAA;AAAA,UACjC,CAAC,MAAA,EAAQ,MAAQ,EAAA,CAAA,EAAG,CAAC,CAAA;AAAA,UACrB,CAAC,UAAA,EAAY,UAAY,EAAA,CAAA,EAAG,CAAC,CAAA;AAAA,UAC7B,CAAC,QAAA,EAAU,QAAU,EAAA,CAAA,EAAG,CAAC;AAAA,SAC3B;AAAA,QACA,SAAU,CAAA;AAAA,OACZ;AAAA,MACA,mBAAmB,IAAIC,WAAA;AAAA,QACrBD,qBAAQ,CAAA,iBAAA;AAAA,QACRG,YAAA;AAAA,QACA,SAAU,CAAA;AAAA,OACZ;AAAA,MACA,eAAe,IAAIF,WAAA;AAAA,QACjBD,qBAAQ,CAAA,aAAA;AAAA,QACR,EAAC;AAAA,QACD,SAAU,CAAA;AAAA,OACZ;AAAA,MACA,wBAAA;AAAA,MACA,4BAA8B,EAAAI,gBAAA;AAAA,QAC5B,EAAE,MAAA,EAAQ,QAAU,EAAA,KAAA,EAAO,8BAA+B,EAAA;AAAA,QAC1D,wBAAA;AAAA,QACAC,MAAA;AAAA,QACA;AAAA,OACF;AAAA,MACA,mBAAmB,IAAIJ,WAAA;AAAA,QACrBD,qBAAQ,CAAA,iBAAA;AAAA,QACR;AAAA,UACE,CAAC,qBAAqB,CAAC,CAAA;AAAA,UACvB,CAAC,aAAa,CAAC,CAAA;AAAA,UACf,CAAC,SAAS,CAAC,CAAA;AAAA,UACX,CAAC,QAAQ,CAAC;AAAA,SACZ;AAAA,QACA,SAAU,CAAA;AAAA;AACZ,KACF,CAAA;AAyHA,IAAQ,aAAA,CAAA,IAAA,EAAA,iBAAA,EAAkC,OAAO,UAAe,KAAA;AAC9D,MAAI,IAAAM,6BAAA,CAAqB,UAAU,CAAG,EAAA;AACpC,QAAM,MAAA,EAAE,MAAS,GAAA,UAAA;AACjB,QAAA,MAAM,SAAS,UAAW,CAAA,MAAA;AAC1B,QAAM,MAAA,CAAC,QAAU,EAAA,UAAU,CAAI,GAAA,MAAA;AAC/B,QAAA,MAAM,GAAM,GAAA,IAAA,CAAK,mBAAoB,CAAA,QAAA,EAAU,UAAU,CAAA;AACzD,QAAA,OAAO,mBAAoB,CAAA,MAAA,EAAQ,IAAM,EAAA,EAAE,KAAK,CAAA;AAAA,OAC3C,MAAA;AACL,QAAA,MAAM,MAAM,CAAoC,kCAAA,CAAA,CAAA;AAAA;AAClD,KACF,CAAA;AAEA,IAAQ,aAAA,CAAA,IAAA,EAAA,cAAA,EAA+B,OAAO,UAAe,KAAA;AAC3D,MAAI,IAAAA,6BAAA,CAAqB,UAAU,CAAG,EAAA;AACpC,QAAM,MAAA,EAAE,MAAS,GAAA,UAAA;AACjB,QAAA,MAAM,SAAS,UAAW,CAAA,MAAA;AAC1B,QAAM,MAAA,CAAC,gBAAgB,CAAI,GAAA,MAAA;AAC3B,QAAA,IAAA,CAAK,MAAO,CAAA,aAAA,CAAc,MAAO,CAAA,gBAAA,EAAkB,UAAU,WAAW,CAAA;AACxE,QAAO,OAAA,mBAAA,CAAoB,QAAQ,IAAI,CAAA;AAAA,OAClC,MAAA;AACL,QAAA,MAAM,MAAM,CAAiC,+BAAA,CAAA,CAAA;AAAA;AAC/C,KACF,CAAA;AACA,IAAQ,aAAA,CAAA,IAAA,EAAA,eAAA,EAAgC,OAAO,UAAe,KAAA;AAC5D,MAAI,IAAAA,6BAAA,CAAqB,UAAU,CAAG,EAAA;AACpC,QAAM,MAAA,EAAE,MAAS,GAAA,UAAA;AACjB,QAAA,MAAM,SAAS,UAAW,CAAA,MAAA;AAC1B,QAAM,MAAA,CAAC,gBAAgB,CAAI,GAAA,MAAA;AAC3B,QAAA,IAAA,CAAK,OAAO,aAAc,CAAA,MAAA;AAAA,UACxB,gBAAA;AAAA,UACA,QAAA;AAAA,UACA;AAAA,SACF;AACA,QAAO,OAAA,mBAAA,CAAoB,QAAQ,IAAI,CAAA;AAAA,OAClC,MAAA;AACL,QAAA,MAAM,MAAM,CAAkC,gCAAA,CAAA,CAAA;AAAA;AAChD,KACF,CAAA;AAEA,IAAQ,aAAA,CAAA,IAAA,EAAA,gBAAA,EAAiC,OAAO,UAAe,KAAA;AAC7D,MAAI,IAAAA,6BAAA,CAAqB,UAAU,CAAG,EAAA;AACpC,QAAA,MAAM,MAAM,CAAgC,8BAAA,CAAA,CAAA;AAAA,OACvC,MAAA;AACL,QAAA,MAAM,MAAM,CAAmC,iCAAA,CAAA,CAAA;AAAA;AACjD,KACF,CAAA;AAAA;AAlKA,EAEA,IAAI,KAAuD,GAAA;AACzD,IAAO,OAAA;AAAA,MACL,GAAG,eAAA;AAAA,MACH,MAAQ,EAAA;AAAA,QACN,IAAM,EAAA,MAAA;AAAA,QACN,KAAO,EAAA;AAAA,UACL;AAAA,YACE,OAAS,EAAA,eAAA;AAAA,YACT,MAAQ,EAAA,EAAA;AAAA,YACR,IAAM,EAAA,YAAA;AAAA,YACN,OAAS,EAAA;AAAA;AACX;AACF;AACF,KACF;AAAA;AACF,EAEA,IAAI,OAAU,GAAA;AACZ,IAAO,OAAAN,qBAAA;AAAA;AACT,EAEA,IAAI,QAAW,GAAA;AACb,IAAO,OAAA;AAAA,MACL,GAAG,eAAA;AAAA,MACH,MAAQ,EAAA;AAAA,QACN;AAAA,UACE,OAAS,EAAA,cAAA;AAAA,UACT,SAAS,IAAK,CAAA;AAAA;AAChB,OACF;AAAA,MACA,aAAe,EAAA;AAAA,QACb;AAAA,UACE,OAAS,EAAA,cAAA;AAAA,UACT,SAAS,IAAK,CAAA;AAAA,SAChB;AAAA,QACA;AAAA,UACE,OAAS,EAAA,eAAA;AAAA,UACT,SAAS,IAAK,CAAA;AAAA;AAChB,OACF;AAAA,MACA,4BAA8B,EAAA;AAAA,QAC5B;AAAA,UACE,OAAS,EAAA,gBAAA;AAAA,UACT,SAAS,IAAK,CAAA;AAAA;AAChB;AACF,KACF;AAAA;AACF,EAEA,IAAI,MAAS,GAAA;AACX,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,OAAA,CAAA;AAAA;AACd,EAEA,IAAI,WAAc,GAAA;AAChB,IAAO,OAAA;AAAA,MACL,GAAG,eAAA;AAAA,MACH,iBAAmB,EAAA;AAAA,QACjB,EAAE,UAAY,EAAA,UAAA,EAAY,QAAU,EAAA,IAAA,EAAM,SAAS,QAAS;AAAA;AAC9D,KACF;AAAA;AACF,EAEQ,mBAAA,CAAoB,UAAkB,UAAoB,EAAA;AAChE,IAAM,MAAA,gBAAA,GAAmB,sBAAuB,CAAA,QAAA,EAAU,UAAU,CAAA;AAEpE,IAAK,IAAA,CAAA,MAAA,CAAO,aAAc,CAAA,MAAA,CAAO,gBAAgB,CAAA;AAEjD,IAAA,MAAM,EAAE,QAAA,EAAU,GAAI,EAAA,GAAI,mBAAmB,mBAAmB,CAAA;AAChE,IAAA,MAAM,YAAe,GAAA,IAAA,CAAK,MAAO,CAAA,iBAAA,CAAkB,IAAK,CAAA,MAAA;AAAA,MACtD,CAAC,CAAA,KAAM,CAAE,CAAA,GAAG,CAAM,KAAA;AAAA,KACpB;AAEA,IAAM,MAAA,EAAE,UAAW,EAAA,GAAI,SAAU,CAAA,aAAA;AAEjC,IAAa,YAAA,CAAA,OAAA;AAAA,MACX,CAAC,KAAK,WAAA,IAAe,GAAA,MAAS,QAAU,EAAA,SAAS,CAAM,KAAA;AACrD,QAAA,MAAM,IAAO,GAAA,EAAA;AACb,QAAA,MAAM,UAAa,GAAA,EAAA;AACnB,QAAA,MAAM,UAAa,GAAA,EAAA;AACnB,QAAA,MAAM,aAAgB,GAAA,CAAA;AACtB,QAAA,MAAM,WAAc,GAAA,CAAA;AACpB,QAAA,MAAM,SAAY,GAAA,CAAA;AAClB,QAAA,MAAM,WAAc,GAAA,CAAA;AACpB,QAAA,MAAM,eAAkB,GAAA,EAAA;AACxB,QAAA,MAAM,IAAO,GAAA,KAAA;AACb,QAAA,MAAM,KAAQ,GAAA,OAAA;AAEd,QAAM,MAAA,gBAAA,GAAmB,iBAAiB,UAAU,CAAA;AACpD,QAAA,MAAM,2BAAoD,GAAA;AAAA,UACxD,IAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UACA,WAAA;AAAA,UACA,gBAAA;AAAA,UACA,CAAA,EAAG,gBAAgB,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA;AAAA,UAC1B,UAAA;AAAA,UACA,aAAA;AAAA,UACA,WAAA;AAAA,UACA,SAAA;AAAA,UACA,WAAA;AAAA,UACA,eAAA;AAAA,UACA,QAAA;AAAA,UACA,GAAA;AAAA,UACA,IAAA;AAAA,UACA,KAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA,wBAAA,CAAyB,OAAO,2BAA2B,CAAA;AAAA;AAC7D,KACF;AAGA,IAAA,OAAO,iBAAiB,UAAU,CAAA;AAAA;AAiDtC;AAxNE,OAAA,GAAA,IAAA,OAAA,EAAA;AA0NW,MAAA,YAAA,GAAe,IAAI,YAAa;;;;;;"}
1
+ {"version":3,"file":"BasketModule.js","sources":["../../../../packages/vuu-data-test/src/basket/BasketModule.ts"],"sourcesContent":["import {\n VuuMenu,\n VuuRowDataItemType,\n VuuRpcViewportAction,\n VuuRpcViewportResponse,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap, isViewportRpcRequest } from \"@vuu-ui/vuu-utils\";\nimport { ServiceHandler, VuuModule } from \"../core/module/VuuModule\";\nimport tableContainer from \"../core/table/TableContainer\";\nimport { BasketsTableName, schemas } from \"./basket-schemas\";\nimport basketConstituentData from \"./reference-data/constituents\";\nimport { type Table } from \"../Table\";\n\nconst { createTable } = tableContainer;\n\nlet basketIncrement = 1;\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\nconst viewportRpcResponse = (\n params: string[],\n vpId: string,\n action?: Partial<VuuRpcViewportAction>,\n): VuuRpcViewportResponse => ({\n type: \"VIEW_PORT_RPC_RESPONSE\",\n action: {\n type: \"VP_RPC_SUCCESS\",\n ...action,\n },\n method: \"???\",\n namedParams: {},\n params,\n vpId,\n});\n\nconst undefinedTables = {\n algoType: undefined,\n basket: undefined,\n basketTrading: undefined,\n basketTradingConstituent: undefined,\n basketConstituent: undefined,\n basketTradingConstituentJoin: undefined,\n priceStrategyType: undefined,\n};\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\nconst basketTradingConstituent = tableContainer.createTable(\n schemas.basketTradingConstituent,\n [],\n tableMaps.basketTradingConstituent,\n);\n\n/**\n * This is an example of how we might extend the built-in VuuModule to\n * implement a module-specific service in such a way that it can invoke\n * methods on the VuuModule.\n */\nexport class BasketModule extends VuuModule<BasketsTableName> {\n #tables: Record<BasketsTableName, Table> = {\n algoType: createTable(\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: createTable(\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: createTable(\n schemas.basketConstituent,\n basketConstituentData,\n tableMaps.basketConstituent,\n ),\n basketTrading: createTable(\n schemas.basketTrading,\n [],\n tableMaps.basketTrading,\n ),\n basketTradingConstituent,\n basketTradingConstituentJoin: tableContainer.createJoinTable(\n { module: \"BASKET\", table: \"basketTradingConstituentJoin\" },\n { module: \"BASKET\", table: \"basketTradingConstituent\" },\n { module: \"SIMUL\", table: \"prices\" },\n \"ric\",\n ),\n priceStrategyType: createTable(\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\n constructor() {\n super(\"BASKET\");\n }\n\n get menus(): Record<BasketsTableName, VuuMenu | undefined> {\n return {\n ...undefinedTables,\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 };\n }\n\n get schemas() {\n return schemas;\n }\n\n get services() {\n return {\n ...undefinedTables,\n basket: [\n {\n rpcName: \"createBasket\",\n service: this.createNewBasket,\n },\n ],\n basketTrading: [\n {\n rpcName: \"sendToMarket\",\n service: this.sendToMarket,\n },\n {\n rpcName: \"takeOffMarket\",\n service: this.takeOffMarket,\n },\n ],\n basketTradingConstituentJoin: [\n {\n rpcName: \"addConstituent\",\n service: this.addConstituent,\n },\n ],\n };\n }\n\n get tables() {\n return this.#tables;\n }\n\n get visualLinks() {\n return {\n ...undefinedTables,\n basketConstituent: [\n { fromColumn: \"basketId\", toColumn: \"id\", toTable: \"basket\" },\n ],\n };\n }\n\n private createTradingBasket(basketId: string, basketName: string) {\n const basketTradingRow = createBasketTradingRow(basketId, basketName);\n\n this.tables.basketTrading.insert(basketTradingRow);\n\n const { basketId: key } = buildDataColumnMap(\"basketConstituent\");\n const constituents = this.tables.basketConstituent.data.filter(\n (c) => c[key] === basketId,\n );\n\n const { instanceId } = tableMaps.basketTrading;\n\n constituents.forEach(\n ([, , 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\n // return the key\n return basketTradingRow[instanceId] as string;\n }\n\n private createNewBasket: ServiceHandler = async (rpcRequest) => {\n if (isViewportRpcRequest(rpcRequest)) {\n const { vpId } = rpcRequest;\n const params = rpcRequest.params as string[];\n const [basketId, basketName] = params;\n const key = this.createTradingBasket(basketId, basketName);\n return viewportRpcResponse(params, vpId, { key });\n } else {\n throw Error(`createNewBasket invalid rpcRequest`);\n }\n };\n\n private sendToMarket: ServiceHandler = async (rpcRequest) => {\n if (isViewportRpcRequest(rpcRequest)) {\n const { vpId } = rpcRequest;\n const params = rpcRequest.params as string[];\n const [basketInstanceId] = params;\n this.tables.basketTrading.update(basketInstanceId, \"status\", \"ON_MARKET\");\n return viewportRpcResponse(params, vpId);\n } else {\n throw Error(`sendToMarket invalid rpcRequest`);\n }\n };\n private takeOffMarket: ServiceHandler = async (rpcRequest) => {\n if (isViewportRpcRequest(rpcRequest)) {\n const { vpId } = rpcRequest;\n const params = rpcRequest.params as string[];\n const [basketInstanceId] = params;\n this.tables.basketTrading.update(\n basketInstanceId,\n \"status\",\n \"OFF-MARKET\",\n );\n return viewportRpcResponse(params, vpId);\n } else {\n throw Error(`takeOffMarket invalid rpcRequest`);\n }\n };\n\n private addConstituent: ServiceHandler = async (rpcRequest) => {\n if (isViewportRpcRequest(rpcRequest)) {\n throw Error(`addConstituent not implemented`);\n } else {\n throw Error(`addConstituent invalid rpcRequest`);\n }\n };\n}\n\nexport const basketModule = new BasketModule();\n"],"names":["tableContainer","schemas","VuuModule","basketConstituentData","isViewportRpcRequest"],"mappings":"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"}
@@ -30,6 +30,9 @@ const _ModuleContainer = class _ModuleContainer {
30
30
  }
31
31
  throw Error(`[ModuleFactory] module ${name} not found`);
32
32
  }
33
+ get moduleNames() {
34
+ return __privateGet(this, _modules).keys();
35
+ }
33
36
  };
34
37
  _instance = new WeakMap();
35
38
  _modules = new WeakMap();
@@ -1 +1 @@
1
- {"version":3,"file":"ModuleContainer.js","sources":["../../../../../packages/vuu-data-test/src/core/module/ModuleContainer.ts"],"sourcesContent":["import { VuuModule } from \"./VuuModule\";\n\nclass ModuleContainer {\n private constructor() {\n // empty constructor is all we need\n }\n static #instance: ModuleContainer;\n\n public static get instance(): ModuleContainer {\n if (!ModuleContainer.#instance) {\n ModuleContainer.#instance = new ModuleContainer();\n }\n return ModuleContainer.#instance;\n }\n\n #modules = new Map<string, VuuModule>();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n register(module: VuuModule<any>) {\n console.log(`register module ${module.name}`);\n this.#modules.set(module.name, module);\n }\n\n get(name: string) {\n const module = this.#modules.get(name);\n if (module) {\n return module;\n }\n throw Error(`[ModuleFactory] module ${name} not found`);\n }\n}\n\nexport default ModuleContainer.instance;\n"],"names":[],"mappings":";;;;;;;;;AAAA,IAAA,SAAA,EAAA,QAAA;AAEA,MAAM,gBAAA,GAAN,MAAM,gBAAgB,CAAA;AAAA,EACZ,WAAc,GAAA;AAYtB,IAAA,YAAA,CAAA,IAAA,EAAA,QAAA,sBAAe,GAAuB,EAAA,CAAA;AAAA;AAVtC,EAGA,WAAkB,QAA4B,GAAA;AAC5C,IAAI,IAAA,CAAC,+BAAgB,SAAW,CAAA,EAAA;AAC9B,MAAgB,YAAA,CAAA,gBAAA,EAAA,SAAA,EAAY,IAAI,gBAAgB,EAAA,CAAA;AAAA;AAElD,IAAA,OAAO,YAAgB,CAAA,gBAAA,EAAA,SAAA,CAAA;AAAA;AACzB;AAAA,EAKA,SAAS,MAAwB,EAAA;AAC/B,IAAA,OAAA,CAAQ,GAAI,CAAA,CAAA,gBAAA,EAAmB,MAAO,CAAA,IAAI,CAAE,CAAA,CAAA;AAC5C,IAAA,YAAA,CAAA,IAAA,EAAK,QAAS,CAAA,CAAA,GAAA,CAAI,MAAO,CAAA,IAAA,EAAM,MAAM,CAAA;AAAA;AACvC,EAEA,IAAI,IAAc,EAAA;AAChB,IAAA,MAAM,MAAS,GAAA,YAAA,CAAA,IAAA,EAAK,QAAS,CAAA,CAAA,GAAA,CAAI,IAAI,CAAA;AACrC,IAAA,IAAI,MAAQ,EAAA;AACV,MAAO,OAAA,MAAA;AAAA;AAET,IAAM,MAAA,KAAA,CAAM,CAA0B,uBAAA,EAAA,IAAI,CAAY,UAAA,CAAA,CAAA;AAAA;AAE1D,CAAA;AAxBS,SAAA,GAAA,IAAA,OAAA,EAAA;AASP,QAAA,GAAA,IAAA,OAAA,EAAA;AATA,YAAA,CAJI,gBAIG,EAAA,SAAA,CAAA;AAJT,IAAM,eAAN,GAAA,gBAAA;AA8BA,sBAAe,eAAgB,CAAA,QAAA;;;;"}
1
+ {"version":3,"file":"ModuleContainer.js","sources":["../../../../../packages/vuu-data-test/src/core/module/ModuleContainer.ts"],"sourcesContent":["import { VuuModule } from \"./VuuModule\";\n\nclass ModuleContainer {\n private constructor() {\n // empty constructor is all we need\n }\n static #instance: ModuleContainer;\n\n public static get instance(): ModuleContainer {\n if (!ModuleContainer.#instance) {\n ModuleContainer.#instance = new ModuleContainer();\n }\n return ModuleContainer.#instance;\n }\n\n #modules = new Map<string, VuuModule>();\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n register(module: VuuModule<any>) {\n console.log(`register module ${module.name}`);\n this.#modules.set(module.name, module);\n }\n\n get(name: string) {\n const module = this.#modules.get(name);\n if (module) {\n return module;\n }\n throw Error(`[ModuleFactory] module ${name} not found`);\n }\n\n get moduleNames() {\n return this.#modules.keys();\n }\n}\n\nexport default ModuleContainer.instance;\n"],"names":[],"mappings":";;;;;;;;;AAAA,IAAA,SAAA,EAAA,QAAA;AAEA,MAAM,gBAAA,GAAN,MAAM,gBAAgB,CAAA;AAAA,EACZ,WAAc,GAAA;AAYtB,IAAA,YAAA,CAAA,IAAA,EAAA,QAAA,sBAAe,GAAuB,EAAA,CAAA;AAAA;AAVtC,EAGA,WAAkB,QAA4B,GAAA;AAC5C,IAAI,IAAA,CAAC,+BAAgB,SAAW,CAAA,EAAA;AAC9B,MAAgB,YAAA,CAAA,gBAAA,EAAA,SAAA,EAAY,IAAI,gBAAgB,EAAA,CAAA;AAAA;AAElD,IAAA,OAAO,YAAgB,CAAA,gBAAA,EAAA,SAAA,CAAA;AAAA;AACzB;AAAA,EAKA,SAAS,MAAwB,EAAA;AAC/B,IAAA,OAAA,CAAQ,GAAI,CAAA,CAAA,gBAAA,EAAmB,MAAO,CAAA,IAAI,CAAE,CAAA,CAAA;AAC5C,IAAA,YAAA,CAAA,IAAA,EAAK,QAAS,CAAA,CAAA,GAAA,CAAI,MAAO,CAAA,IAAA,EAAM,MAAM,CAAA;AAAA;AACvC,EAEA,IAAI,IAAc,EAAA;AAChB,IAAA,MAAM,MAAS,GAAA,YAAA,CAAA,IAAA,EAAK,QAAS,CAAA,CAAA,GAAA,CAAI,IAAI,CAAA;AACrC,IAAA,IAAI,MAAQ,EAAA;AACV,MAAO,OAAA,MAAA;AAAA;AAET,IAAM,MAAA,KAAA,CAAM,CAA0B,uBAAA,EAAA,IAAI,CAAY,UAAA,CAAA,CAAA;AAAA;AACxD,EAEA,IAAI,WAAc,GAAA;AAChB,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,UAAS,IAAK,EAAA;AAAA;AAE9B,CAAA;AA5BS,SAAA,GAAA,IAAA,OAAA,EAAA;AASP,QAAA,GAAA,IAAA,OAAA,EAAA;AATA,YAAA,CAJI,gBAIG,EAAA,SAAA,CAAA;AAJT,IAAM,eAAN,GAAA,gBAAA;AAkCA,sBAAe,eAAgB,CAAA,QAAA;;;;"}
@@ -264,6 +264,12 @@ class VuuModule {
264
264
  __privateSet(this, _name, name);
265
265
  ModuleContainer.register(this);
266
266
  }
267
+ getTableSchema(tableName) {
268
+ return this.schemas[tableName];
269
+ }
270
+ getTableList() {
271
+ return Object.keys(this.tables);
272
+ }
267
273
  get name() {
268
274
  return __privateGet(this, _name);
269
275
  }
@@ -1 +1 @@
1
- {"version":3,"file":"VuuModule.js","sources":["../../../../../packages/vuu-data-test/src/core/module/VuuModule.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceConfig,\n DataSourceVisualLinkCreatedMessage,\n OpenDialogActionWithSchema,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuRpcMenuRequest,\n VuuRpcViewportRequest,\n VuuMenu,\n VuuRowDataItemType,\n VuuTable,\n VuuLink,\n LinkDescriptorWithLabel,\n RpcNamedParams,\n VuuRpcRequest,\n VuuRpcResponse,\n VuuRpcMenuResponse,\n VuuRpcViewportResponse,\n VuuCreateVisualLink,\n VuuRemoveVisualLink,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { isViewportRpcRequest, uuid } from \"@vuu-ui/vuu-utils\";\nimport { Table, buildDataColumnMapFromSchema } from \"../../Table\";\nimport { TickingArrayDataSource } from \"../../TickingArrayDataSource\";\nimport { RuntimeVisualLink } from \"../../RuntimeVisualLink\";\nimport moduleContainer from \"./ModuleContainer\";\n\nexport interface IVuuModule<T extends string = string> {\n createDataSource: (tableName: T) => DataSource;\n}\n\nexport type SessionTableMap = Record<string, Table>;\n\nexport type RpcServiceRequestWithParams = VuuRpcViewportRequest & {\n namedParams: RpcNamedParams;\n};\nexport type RpcServiceRequest =\n | RpcServiceRequestWithParams\n | VuuRpcViewportRequest\n | VuuRpcMenuRequest;\n\nexport const withParams = (\n rpcRequest: VuuRpcRequest,\n): rpcRequest is RpcServiceRequestWithParams => \"namedParams\" in rpcRequest;\n\nexport const withNamedParams = (\n rpcRequest: RpcServiceRequest,\n): rpcRequest is RpcServiceRequestWithParams => \"namedParams\" in rpcRequest;\n\nexport type ServiceHandler = (\n rpcRequest: VuuRpcRequest & {\n namedParams?: RpcNamedParams;\n },\n) => Promise<VuuRpcResponse>;\n\nexport type RpcService = {\n rpcName: string;\n service: ServiceHandler;\n};\n\ntype Subscription = {\n viewportId: string;\n dataSource: DataSource;\n};\nexport abstract class VuuModule<T extends string = string>\n implements IVuuModule<T>\n{\n #name: string;\n #runtimeVisualLinks = new Map<string, RuntimeVisualLink>();\n #sessionTableMap: SessionTableMap = {};\n #tableServices: Record<T, RpcService[] | undefined> | undefined;\n #subscriptionMap: Map<string, Subscription[]> = new Map();\n\n constructor(name: string) {\n this.#name = name;\n moduleContainer.register(this);\n }\n\n protected abstract menus?: Record<T, VuuMenu | undefined> | undefined;\n protected abstract schemas: Record<T, Readonly<TableSchema>>;\n protected abstract tables: Record<T, Table>;\n protected abstract services?: Record<T, RpcService[] | undefined> | undefined;\n protected abstract visualLinks?: Record<T, VuuLink[] | undefined>;\n\n private unregisterViewport = (viewportId: string) => {\n for (const [tableName, subscriptions] of this.#subscriptionMap) {\n if (subscriptions[0].viewportId.toString() === viewportId) {\n this.#subscriptionMap.delete(tableName);\n } else {\n const links = subscriptions[0].dataSource.links;\n if (links) {\n for (let i = 0; i < links?.length; i++) {\n if (links[i].parentClientVpId === viewportId) {\n links.splice(i);\n }\n }\n }\n subscriptions[0].dataSource.links = links;\n }\n }\n };\n\n get name() {\n return this.#name;\n }\n\n getSubscribedDataSource(vpId: string): DataSource {\n for (const subscriptions of this.#subscriptionMap.values()) {\n for (const { viewportId, dataSource } of subscriptions) {\n if (viewportId === vpId) {\n return dataSource;\n }\n }\n }\n throw Error(`getSubscribedDataSource #${vpId} not in subscriptionMap`);\n }\n\n getLinks = (\n subscriptionMap: Map<string, Subscription[]>,\n vuuLinks: VuuLink[],\n ) => {\n const visualLinks: LinkDescriptorWithLabel[] = [];\n for (let i = 0; i < vuuLinks.length; i++) {\n const subscriptions = subscriptionMap.get(vuuLinks[i].toTable);\n if (subscriptions) {\n subscriptions.forEach(({ viewportId, dataSource: { status } }) => {\n if (status !== \"suspended\") {\n const newLink: LinkDescriptorWithLabel = {\n parentClientVpId: viewportId,\n parentVpId: viewportId,\n link: vuuLinks[i],\n };\n visualLinks.push(newLink);\n }\n });\n }\n }\n return visualLinks;\n };\n\n visualLinkService = (\n message: VuuCreateVisualLink | VuuRemoveVisualLink,\n ): Promise<DataSourceVisualLinkCreatedMessage | void> =>\n new Promise((resolve) => {\n if (message.type === \"CREATE_VISUAL_LINK\") {\n const { childColumnName, childVpId, parentColumnName, parentVpId } =\n message;\n const childDataSource = this.getSubscribedDataSource(childVpId);\n const parentDataSource = this.getSubscribedDataSource(parentVpId);\n const runtimeVisualLink = new RuntimeVisualLink(\n childDataSource,\n parentDataSource,\n childColumnName,\n parentColumnName,\n );\n\n this.#runtimeVisualLinks.set(childVpId, runtimeVisualLink);\n\n resolve({\n clientViewportId: childVpId,\n colName: childColumnName,\n parentColName: parentColumnName,\n parentViewportId: parentVpId,\n type: \"vuu-link-created\",\n } as DataSourceVisualLinkCreatedMessage);\n } else {\n const runtimeVisualLink = this.#runtimeVisualLinks.get(\n message.childVpId,\n );\n if (runtimeVisualLink) {\n runtimeVisualLink.remove();\n this.#runtimeVisualLinks.delete(message.childVpId);\n } else {\n throw Error(\n `visualLinkService no visual link found for viewport #${message.childVpId}`,\n );\n }\n resolve();\n }\n });\n\n createDataSource = (\n tableName: T,\n viewport?: string,\n config?: DataSourceConfig,\n ) => {\n const getVisualLinks = (tableName: string) => {\n const linksForTable = this.visualLinks?.[tableName as T] as VuuLink[];\n return linksForTable === undefined\n ? undefined\n : this.getLinks(this.#subscriptionMap, linksForTable);\n };\n\n const columnDescriptors = this.getColumnDescriptors(tableName);\n const table = this.tables[tableName];\n const sessionTable = this.#sessionTableMap[tableName];\n\n const dataSource: DataSource = new TickingArrayDataSource({\n ...config,\n columnDescriptors,\n getVisualLinks,\n keyColumn:\n this.schemas[tableName] === undefined\n ? this.#sessionTableMap[tableName].schema.key\n : this.schemas[tableName].key,\n table: table || sessionTable,\n menu: this.menus?.[tableName],\n rpcServices: this.getServices(tableName),\n sessionTables: this.#sessionTableMap,\n viewport,\n visualLinkService: this.visualLinkService,\n });\n\n dataSource.on(\"unsubscribed\", this.unregisterViewport);\n\n const existingSubscriptions = this.#subscriptionMap.get(tableName);\n const subscription = {\n viewportId: dataSource.viewport as string,\n dataSource,\n };\n if (existingSubscriptions) {\n existingSubscriptions.push(subscription);\n } else {\n this.#subscriptionMap.set(tableName, [subscription]);\n }\n\n return dataSource;\n };\n\n getServices(tableName: T) {\n const tableServices = this.services?.[tableName];\n if (Array.isArray(tableServices)) {\n return this.#moduleServices.concat(tableServices);\n } else {\n return this.#moduleServices;\n }\n }\n\n protected get sessionTableMap() {\n return this.#sessionTableMap;\n }\n\n private getSessionTable(sessionTableName: string) {\n const sessionTable = this.#sessionTableMap[sessionTableName];\n if (sessionTable) {\n return sessionTable;\n } else {\n throw Error(\n `getSessionTable: no session table with name ${sessionTableName}`,\n );\n }\n }\n\n private getColumnDescriptors(tableName: T) {\n const schema =\n this.schemas[tableName] || this.getSessionTable(tableName)?.schema;\n if (schema) {\n return schema.columns;\n } else {\n throw Error(\n ` no schema found for module ${this.#name} table ${tableName}`,\n );\n }\n }\n\n private openBulkEdits: ServiceHandler = async (rpcRequest) => {\n if (withParams(rpcRequest)) {\n const { namedParams, vpId } = rpcRequest;\n const selectedRowIds = namedParams.selectedRowIds as string[];\n const table = namedParams.table as VuuTable;\n\n if (selectedRowIds && table) {\n const dataTable = this.tables[table.table as T];\n if (dataTable) {\n const sessionTable = this.createSessionTableFromSelectedRows(\n dataTable,\n selectedRowIds,\n );\n const sessionTableName = `session-${uuid()}`;\n this.#sessionTableMap[sessionTableName] = sessionTable;\n\n return {\n action: {\n renderComponent: \"grid\",\n table: {\n module: table.module,\n table: sessionTableName,\n },\n tableSchema: dataTable.schema,\n type: \"OPEN_DIALOG_ACTION\",\n } as OpenDialogActionWithSchema,\n rpcName: \"VP_BULK_EDIT_BEGIN_RPC\",\n type: \"VIEW_PORT_MENU_RESP\",\n vpId,\n } as VuuRpcMenuResponse;\n } else {\n return {\n action: { type: \"NO_ACTION\" },\n clientViewportId: \"na\",\n error: \"No Table found\",\n rpcName: \"VP_BULK_EDIT_REJECT\",\n type: \"VIEW_PORT_MENU_REJ\",\n vpId,\n } as VuuRpcMenuResponse;\n }\n }\n }\n throw Error(\"openBulkEdits expects Table and selectedRowIds\");\n };\n\n private endEditSession: ServiceHandler = async (rpcRequest) => {\n if (isViewportRpcRequest(rpcRequest)) {\n const { vpId } = rpcRequest;\n delete this.#sessionTableMap[vpId];\n return {\n action: { type: \"VP_RPC_SUCCESS\" },\n method: \"???\",\n namedParams: {},\n params: [],\n type: \"VIEW_PORT_RPC_RESPONSE\",\n vpId,\n } as VuuRpcViewportResponse;\n } else {\n throw Error(\"endEditSession invalid request\");\n }\n };\n\n // Bulk-edit with input in session table\n private applyBulkEdits: ServiceHandler = async (rpcRequest) => {\n if (withParams(rpcRequest)) {\n const { vpId } = rpcRequest;\n const sessionTable = this.getSessionTable(vpId);\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(\n String(newRow[keyIndex]),\n column as string,\n value as VuuRowDataItemType,\n );\n }\n return {\n action: {\n type: \"NO_ACTION\",\n },\n rpcName: \"VP_BULK_EDIT_COLUMN_CELLS_RPC\",\n type: \"VIEW_PORT_MENU_RESP\",\n vpId,\n } as VuuRpcMenuResponse;\n }\n throw Error(\"applyBulkEdits expects column and value as namedParams\");\n };\n\n // Save session table data to main table\n private saveBulkEdits: ServiceHandler = async (rpcRequest) => {\n if (withParams(rpcRequest)) {\n const { vpId } = rpcRequest;\n const sessionTable = this.getSessionTable(vpId);\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 return {\n action: {\n type: \"VP_RPC_SUCCESS\",\n },\n requestId: \"request_id\",\n rpcName: \"VP_BULK_EDIT_SUBMIT_RPC\",\n type: \"VIEW_PORT_MENU_RESP\",\n vpId,\n } as unknown as VuuRpcViewportResponse;\n }\n }\n throw Error(\"saveBulkEdits base table not found\");\n };\n\n protected createSessionTableFromSelectedRows(\n { data, map, schema }: Table,\n selectedRowIds: string[],\n ) {\n const keyIndex = map[schema.key];\n const sessionData: VuuRowDataItemType[][] = [];\n for (let i = 0; i < selectedRowIds.length; i++) {\n for (let j = 0; j < data.length; j++) {\n if (data[j][keyIndex] === selectedRowIds[i]) {\n sessionData.push(data[j]);\n }\n }\n }\n return new Table(schema, sessionData, buildDataColumnMapFromSchema(schema));\n }\n\n /**\n * These services are available on any table. The client must configure the appropriate\n * menu item(s) on Table(s). The services to implement these RPC calls are built-in to\n * VuuModule\n */\n #moduleServices: RpcService[] = [\n {\n rpcName: \"VP_BULK_EDIT_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 rpcName: \"VP_BULK_EDIT_END_RPC\",\n service: this.endEditSession,\n },\n ];\n}\n"],"names":["RuntimeVisualLink","tableName","TickingArrayDataSource","uuid","isViewportRpcRequest","moduleContainer","Table","buildDataColumnMapFromSchema"],"mappings":";;;;;;;;;;;;;;;;;;AAAA,IAAA,KAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA;AA2Ca,MAAA,UAAA,GAAa,CACxB,UAAA,KAC8C,aAAiB,IAAA;AAEpD,MAAA,eAAA,GAAkB,CAC7B,UAAA,KAC8C,aAAiB,IAAA;AAiB1D,MAAe,SAEtB,CAAA;AAAA,EAOE,YAAY,IAAc,EAAA;AAN1B,IAAA,YAAA,CAAA,IAAA,EAAA,KAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,mBAAA,sBAA0B,GAA+B,EAAA,CAAA;AACzD,IAAA,YAAA,CAAA,IAAA,EAAA,gBAAA,EAAoC,EAAC,CAAA;AACrC,IAAA,YAAA,CAAA,IAAA,EAAA,cAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,gBAAA,sBAAoD,GAAI,EAAA,CAAA;AAaxD,IAAQ,aAAA,CAAA,IAAA,EAAA,oBAAA,EAAqB,CAAC,UAAuB,KAAA;AACnD,MAAA,KAAA,MAAW,CAAC,SAAA,EAAW,aAAa,CAAA,IAAK,mBAAK,gBAAkB,CAAA,EAAA;AAC9D,QAAA,IAAI,cAAc,CAAC,CAAA,CAAE,UAAW,CAAA,QAAA,OAAe,UAAY,EAAA;AACzD,UAAK,YAAA,CAAA,IAAA,EAAA,gBAAA,CAAA,CAAiB,OAAO,SAAS,CAAA;AAAA,SACjC,MAAA;AACL,UAAA,MAAM,KAAQ,GAAA,aAAA,CAAc,CAAC,CAAA,CAAE,UAAW,CAAA,KAAA;AAC1C,UAAA,IAAI,KAAO,EAAA;AACT,YAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,KAAA,EAAO,QAAQ,CAAK,EAAA,EAAA;AACtC,cAAA,IAAI,KAAM,CAAA,CAAC,CAAE,CAAA,gBAAA,KAAqB,UAAY,EAAA;AAC5C,gBAAA,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA;AAChB;AACF;AAEF,UAAc,aAAA,CAAA,CAAC,CAAE,CAAA,UAAA,CAAW,KAAQ,GAAA,KAAA;AAAA;AACtC;AACF,KACF,CAAA;AAiBA,IAAW,aAAA,CAAA,IAAA,EAAA,UAAA,EAAA,CACT,iBACA,QACG,KAAA;AACH,MAAA,MAAM,cAAyC,EAAC;AAChD,MAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,QAAA,CAAS,QAAQ,CAAK,EAAA,EAAA;AACxC,QAAA,MAAM,gBAAgB,eAAgB,CAAA,GAAA,CAAI,QAAS,CAAA,CAAC,EAAE,OAAO,CAAA;AAC7D,QAAA,IAAI,aAAe,EAAA;AACjB,UAAc,aAAA,CAAA,OAAA,CAAQ,CAAC,EAAE,UAAA,EAAY,YAAY,EAAE,MAAA,IAAe,KAAA;AAChE,YAAA,IAAI,WAAW,WAAa,EAAA;AAC1B,cAAA,MAAM,OAAmC,GAAA;AAAA,gBACvC,gBAAkB,EAAA,UAAA;AAAA,gBAClB,UAAY,EAAA,UAAA;AAAA,gBACZ,IAAA,EAAM,SAAS,CAAC;AAAA,eAClB;AACA,cAAA,WAAA,CAAY,KAAK,OAAO,CAAA;AAAA;AAC1B,WACD,CAAA;AAAA;AACH;AAEF,MAAO,OAAA,WAAA;AAAA,KACT,CAAA;AAEA,IAAA,aAAA,CAAA,IAAA,EAAA,mBAAA,EAAoB,CAClB,OAAA,KAEA,IAAI,OAAA,CAAQ,CAAC,OAAY,KAAA;AACvB,MAAI,IAAA,OAAA,CAAQ,SAAS,oBAAsB,EAAA;AACzC,QAAA,MAAM,EAAE,eAAA,EAAiB,SAAW,EAAA,gBAAA,EAAkB,YACpD,GAAA,OAAA;AACF,QAAM,MAAA,eAAA,GAAkB,IAAK,CAAA,uBAAA,CAAwB,SAAS,CAAA;AAC9D,QAAM,MAAA,gBAAA,GAAmB,IAAK,CAAA,uBAAA,CAAwB,UAAU,CAAA;AAChE,QAAA,MAAM,oBAAoB,IAAIA,mCAAA;AAAA,UAC5B,eAAA;AAAA,UACA,gBAAA;AAAA,UACA,eAAA;AAAA,UACA;AAAA,SACF;AAEA,QAAK,YAAA,CAAA,IAAA,EAAA,mBAAA,CAAA,CAAoB,GAAI,CAAA,SAAA,EAAW,iBAAiB,CAAA;AAEzD,QAAQ,OAAA,CAAA;AAAA,UACN,gBAAkB,EAAA,SAAA;AAAA,UAClB,OAAS,EAAA,eAAA;AAAA,UACT,aAAe,EAAA,gBAAA;AAAA,UACf,gBAAkB,EAAA,UAAA;AAAA,UAClB,IAAM,EAAA;AAAA,SAC+B,CAAA;AAAA,OAClC,MAAA;AACL,QAAM,MAAA,iBAAA,GAAoB,mBAAK,mBAAoB,CAAA,CAAA,GAAA;AAAA,UACjD,OAAQ,CAAA;AAAA,SACV;AACA,QAAA,IAAI,iBAAmB,EAAA;AACrB,UAAA,iBAAA,CAAkB,MAAO,EAAA;AACzB,UAAK,YAAA,CAAA,IAAA,EAAA,mBAAA,CAAA,CAAoB,MAAO,CAAA,OAAA,CAAQ,SAAS,CAAA;AAAA,SAC5C,MAAA;AACL,UAAM,MAAA,KAAA;AAAA,YACJ,CAAA,qDAAA,EAAwD,QAAQ,SAAS,CAAA;AAAA,WAC3E;AAAA;AAEF,QAAQ,OAAA,EAAA;AAAA;AACV,KACD,CAAA,CAAA;AAEH,IAAmB,aAAA,CAAA,IAAA,EAAA,kBAAA,EAAA,CACjB,SACA,EAAA,QAAA,EACA,MACG,KAAA;AACH,MAAM,MAAA,cAAA,GAAiB,CAACC,UAAsB,KAAA;AAC5C,QAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,WAAA,GAAcA,UAAc,CAAA;AACvD,QAAA,OAAO,kBAAkB,KACrB,CAAA,GAAA,KAAA,CAAA,GACA,KAAK,QAAS,CAAA,YAAA,CAAA,IAAA,EAAK,mBAAkB,aAAa,CAAA;AAAA,OACxD;AAEA,MAAM,MAAA,iBAAA,GAAoB,IAAK,CAAA,oBAAA,CAAqB,SAAS,CAAA;AAC7D,MAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,MAAA,CAAO,SAAS,CAAA;AACnC,MAAM,MAAA,YAAA,GAAe,YAAK,CAAA,IAAA,EAAA,gBAAA,CAAA,CAAiB,SAAS,CAAA;AAEpD,MAAM,MAAA,UAAA,GAAyB,IAAIC,6CAAuB,CAAA;AAAA,QACxD,GAAG,MAAA;AAAA,QACH,iBAAA;AAAA,QACA,cAAA;AAAA,QACA,SACE,EAAA,IAAA,CAAK,OAAQ,CAAA,SAAS,MAAM,KACxB,CAAA,GAAA,YAAA,CAAA,IAAA,EAAK,gBAAiB,CAAA,CAAA,SAAS,EAAE,MAAO,CAAA,GAAA,GACxC,IAAK,CAAA,OAAA,CAAQ,SAAS,CAAE,CAAA,GAAA;AAAA,QAC9B,OAAO,KAAS,IAAA,YAAA;AAAA,QAChB,IAAA,EAAM,IAAK,CAAA,KAAA,GAAQ,SAAS,CAAA;AAAA,QAC5B,WAAA,EAAa,IAAK,CAAA,WAAA,CAAY,SAAS,CAAA;AAAA,QACvC,eAAe,YAAK,CAAA,IAAA,EAAA,gBAAA,CAAA;AAAA,QACpB,QAAA;AAAA,QACA,mBAAmB,IAAK,CAAA;AAAA,OACzB,CAAA;AAED,MAAW,UAAA,CAAA,EAAA,CAAG,cAAgB,EAAA,IAAA,CAAK,kBAAkB,CAAA;AAErD,MAAA,MAAM,qBAAwB,GAAA,YAAA,CAAA,IAAA,EAAK,gBAAiB,CAAA,CAAA,GAAA,CAAI,SAAS,CAAA;AACjE,MAAA,MAAM,YAAe,GAAA;AAAA,QACnB,YAAY,UAAW,CAAA,QAAA;AAAA,QACvB;AAAA,OACF;AACA,MAAA,IAAI,qBAAuB,EAAA;AACzB,QAAA,qBAAA,CAAsB,KAAK,YAAY,CAAA;AAAA,OAClC,MAAA;AACL,QAAA,YAAA,CAAA,IAAA,EAAK,gBAAiB,CAAA,CAAA,GAAA,CAAI,SAAW,EAAA,CAAC,YAAY,CAAC,CAAA;AAAA;AAGrD,MAAO,OAAA,UAAA;AAAA,KACT,CAAA;AAsCA,IAAQ,aAAA,CAAA,IAAA,EAAA,eAAA,EAAgC,OAAO,UAAe,KAAA;AAC5D,MAAI,IAAA,UAAA,CAAW,UAAU,CAAG,EAAA;AAC1B,QAAM,MAAA,EAAE,WAAa,EAAA,IAAA,EAAS,GAAA,UAAA;AAC9B,QAAA,MAAM,iBAAiB,WAAY,CAAA,cAAA;AACnC,QAAA,MAAM,QAAQ,WAAY,CAAA,KAAA;AAE1B,QAAA,IAAI,kBAAkB,KAAO,EAAA;AAC3B,UAAA,MAAM,SAAY,GAAA,IAAA,CAAK,MAAO,CAAA,KAAA,CAAM,KAAU,CAAA;AAC9C,UAAA,IAAI,SAAW,EAAA;AACb,YAAA,MAAM,eAAe,IAAK,CAAA,kCAAA;AAAA,cACxB,SAAA;AAAA,cACA;AAAA,aACF;AACA,YAAM,MAAA,gBAAA,GAAmB,CAAW,QAAA,EAAAC,aAAA,EAAM,CAAA,CAAA;AAC1C,YAAK,YAAA,CAAA,IAAA,EAAA,gBAAA,CAAA,CAAiB,gBAAgB,CAAI,GAAA,YAAA;AAE1C,YAAO,OAAA;AAAA,cACL,MAAQ,EAAA;AAAA,gBACN,eAAiB,EAAA,MAAA;AAAA,gBACjB,KAAO,EAAA;AAAA,kBACL,QAAQ,KAAM,CAAA,MAAA;AAAA,kBACd,KAAO,EAAA;AAAA,iBACT;AAAA,gBACA,aAAa,SAAU,CAAA,MAAA;AAAA,gBACvB,IAAM,EAAA;AAAA,eACR;AAAA,cACA,OAAS,EAAA,wBAAA;AAAA,cACT,IAAM,EAAA,qBAAA;AAAA,cACN;AAAA,aACF;AAAA,WACK,MAAA;AACL,YAAO,OAAA;AAAA,cACL,MAAA,EAAQ,EAAE,IAAA,EAAM,WAAY,EAAA;AAAA,cAC5B,gBAAkB,EAAA,IAAA;AAAA,cAClB,KAAO,EAAA,gBAAA;AAAA,cACP,OAAS,EAAA,qBAAA;AAAA,cACT,IAAM,EAAA,oBAAA;AAAA,cACN;AAAA,aACF;AAAA;AACF;AACF;AAEF,MAAA,MAAM,MAAM,gDAAgD,CAAA;AAAA,KAC9D,CAAA;AAEA,IAAQ,aAAA,CAAA,IAAA,EAAA,gBAAA,EAAiC,OAAO,UAAe,KAAA;AAC7D,MAAI,IAAAC,6BAAA,CAAqB,UAAU,CAAG,EAAA;AACpC,QAAM,MAAA,EAAE,MAAS,GAAA,UAAA;AACjB,QAAO,OAAA,YAAA,CAAA,IAAA,EAAK,kBAAiB,IAAI,CAAA;AACjC,QAAO,OAAA;AAAA,UACL,MAAA,EAAQ,EAAE,IAAA,EAAM,gBAAiB,EAAA;AAAA,UACjC,MAAQ,EAAA,KAAA;AAAA,UACR,aAAa,EAAC;AAAA,UACd,QAAQ,EAAC;AAAA,UACT,IAAM,EAAA,wBAAA;AAAA,UACN;AAAA,SACF;AAAA,OACK,MAAA;AACL,QAAA,MAAM,MAAM,gCAAgC,CAAA;AAAA;AAC9C,KACF,CAAA;AAGA;AAAA,IAAQ,aAAA,CAAA,IAAA,EAAA,gBAAA,EAAiC,OAAO,UAAe,KAAA;AAC7D,MAAI,IAAA,UAAA,CAAW,UAAU,CAAG,EAAA;AAC1B,QAAM,MAAA,EAAE,MAAS,GAAA,UAAA;AACjB,QAAM,MAAA,YAAA,GAAe,IAAK,CAAA,eAAA,CAAgB,IAAI,CAAA;AAC9C,QAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,YAAa,CAAA,IAAA,CAAK,QAAQ,CAAK,EAAA,EAAA;AACjD,UAAM,MAAA,MAAA,GAAS,YAAa,CAAA,IAAA,CAAK,CAAC,CAAA;AAClC,UAAA,MAAM,EAAE,MAAA,EAAQ,KAAM,EAAA,GAAI,UAAW,CAAA,WAAA;AACrC,UAAA,MAAM,QAAW,GAAA,YAAA,CAAa,GAAI,CAAA,YAAA,CAAa,OAAO,GAAG,CAAA;AACzD,UAAa,YAAA,CAAA,MAAA;AAAA,YACX,MAAA,CAAO,MAAO,CAAA,QAAQ,CAAC,CAAA;AAAA,YACvB,MAAA;AAAA,YACA;AAAA,WACF;AAAA;AAEF,QAAO,OAAA;AAAA,UACL,MAAQ,EAAA;AAAA,YACN,IAAM,EAAA;AAAA,WACR;AAAA,UACA,OAAS,EAAA,+BAAA;AAAA,UACT,IAAM,EAAA,qBAAA;AAAA,UACN;AAAA,SACF;AAAA;AAEF,MAAA,MAAM,MAAM,wDAAwD,CAAA;AAAA,KACtE,CAAA;AAGA;AAAA,IAAQ,aAAA,CAAA,IAAA,EAAA,eAAA,EAAgC,OAAO,UAAe,KAAA;AAC5D,MAAI,IAAA,UAAA,CAAW,UAAU,CAAG,EAAA;AAC1B,QAAM,MAAA,EAAE,MAAS,GAAA,UAAA;AACjB,QAAM,MAAA,YAAA,GAAe,IAAK,CAAA,eAAA,CAAgB,IAAI,CAAA;AAC9C,QAAA,MAAM,EAAE,KAAA,EAAU,GAAA,YAAA,CAAa,MAAO,CAAA,KAAA;AACtC,QAAM,MAAA,SAAA,GAAY,IAAK,CAAA,MAAA,CAAO,KAAU,CAAA;AACxC,QAAA,IAAI,SAAW,EAAA;AACb,UAAA,KAAA,IAAS,IAAI,CAAG,EAAA,CAAA,GAAI,YAAa,CAAA,IAAA,CAAK,QAAQ,CAAK,EAAA,EAAA;AACjD,YAAM,MAAA,MAAA,GAAS,YAAa,CAAA,IAAA,CAAK,CAAC,CAAA;AAClC,YAAA,SAAA,CAAU,UAAU,MAAM,CAAA;AAAA;AAG5B,UAAO,OAAA;AAAA,YACL,MAAQ,EAAA;AAAA,cACN,IAAM,EAAA;AAAA,aACR;AAAA,YACA,SAAW,EAAA,YAAA;AAAA,YACX,OAAS,EAAA,yBAAA;AAAA,YACT,IAAM,EAAA,qBAAA;AAAA,YACN;AAAA,WACF;AAAA;AACF;AAEF,MAAA,MAAM,MAAM,oCAAoC,CAAA;AAAA,KAClD,CAAA;AAuBA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAgC,YAAA,CAAA,IAAA,EAAA,eAAA,EAAA;AAAA,MAC9B;AAAA,QACE,OAAS,EAAA,wBAAA;AAAA,QACT,SAAS,IAAK,CAAA;AAAA,OAChB;AAAA,MACA;AAAA,QACE,OAAS,EAAA,+BAAA;AAAA,QACT,SAAS,IAAK,CAAA;AAAA,OAChB;AAAA,MACA;AAAA,QACE,OAAS,EAAA,yBAAA;AAAA,QACT,SAAS,IAAK,CAAA;AAAA,OAChB;AAAA,MACA;AAAA,QACE,OAAS,EAAA,sBAAA;AAAA,QACT,SAAS,IAAK,CAAA;AAAA;AAChB,KACF,CAAA;AAzVE,IAAA,YAAA,CAAA,IAAA,EAAK,KAAQ,EAAA,IAAA,CAAA;AACb,IAAAC,eAAA,CAAgB,SAAS,IAAI,CAAA;AAAA;AAC/B,EA0BA,IAAI,IAAO,GAAA;AACT,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,KAAA,CAAA;AAAA;AACd,EAEA,wBAAwB,IAA0B,EAAA;AAChD,IAAA,KAAA,MAAW,aAAiB,IAAA,YAAA,CAAA,IAAA,EAAK,gBAAiB,CAAA,CAAA,MAAA,EAAU,EAAA;AAC1D,MAAA,KAAA,MAAW,EAAE,UAAA,EAAY,UAAW,EAAA,IAAK,aAAe,EAAA;AACtD,QAAA,IAAI,eAAe,IAAM,EAAA;AACvB,UAAO,OAAA,UAAA;AAAA;AACT;AACF;AAEF,IAAM,MAAA,KAAA,CAAM,CAA4B,yBAAA,EAAA,IAAI,CAAyB,uBAAA,CAAA,CAAA;AAAA;AACvE,EAkHA,YAAY,SAAc,EAAA;AACxB,IAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,QAAA,GAAW,SAAS,CAAA;AAC/C,IAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,aAAa,CAAG,EAAA;AAChC,MAAO,OAAA,YAAA,CAAA,IAAA,EAAK,eAAgB,CAAA,CAAA,MAAA,CAAO,aAAa,CAAA;AAAA,KAC3C,MAAA;AACL,MAAA,OAAO,YAAK,CAAA,IAAA,EAAA,eAAA,CAAA;AAAA;AACd;AACF,EAEA,IAAc,eAAkB,GAAA;AAC9B,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,gBAAA,CAAA;AAAA;AACd,EAEQ,gBAAgB,gBAA0B,EAAA;AAChD,IAAM,MAAA,YAAA,GAAe,YAAK,CAAA,IAAA,EAAA,gBAAA,CAAA,CAAiB,gBAAgB,CAAA;AAC3D,IAAA,IAAI,YAAc,EAAA;AAChB,MAAO,OAAA,YAAA;AAAA,KACF,MAAA;AACL,MAAM,MAAA,KAAA;AAAA,QACJ,+CAA+C,gBAAgB,CAAA;AAAA,OACjE;AAAA;AACF;AACF,EAEQ,qBAAqB,SAAc,EAAA;AACzC,IAAM,MAAA,MAAA,GACJ,KAAK,OAAQ,CAAA,SAAS,KAAK,IAAK,CAAA,eAAA,CAAgB,SAAS,CAAG,EAAA,MAAA;AAC9D,IAAA,IAAI,MAAQ,EAAA;AACV,MAAA,OAAO,MAAO,CAAA,OAAA;AAAA,KACT,MAAA;AACL,MAAM,MAAA,KAAA;AAAA,QACJ,CAA+B,4BAAA,EAAA,YAAA,CAAA,IAAA,EAAK,KAAK,CAAA,CAAA,OAAA,EAAU,SAAS,CAAA;AAAA,OAC9D;AAAA;AACF;AACF,EAsHU,mCACR,EAAE,IAAA,EAAM,GAAK,EAAA,MAAA,IACb,cACA,EAAA;AACA,IAAM,MAAA,QAAA,GAAW,GAAI,CAAA,MAAA,CAAO,GAAG,CAAA;AAC/B,IAAA,MAAM,cAAsC,EAAC;AAC7C,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,cAAA,CAAe,QAAQ,CAAK,EAAA,EAAA;AAC9C,MAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,IAAA,CAAK,QAAQ,CAAK,EAAA,EAAA;AACpC,QAAA,IAAI,KAAK,CAAC,CAAA,CAAE,QAAQ,CAAM,KAAA,cAAA,CAAe,CAAC,CAAG,EAAA;AAC3C,UAAY,WAAA,CAAA,IAAA,CAAK,IAAK,CAAA,CAAC,CAAC,CAAA;AAAA;AAC1B;AACF;AAEF,IAAA,OAAO,IAAIC,WAAM,CAAA,MAAA,EAAQ,WAAa,EAAAC,kCAAA,CAA6B,MAAM,CAAC,CAAA;AAAA;AA0B9E;AAjWE,KAAA,GAAA,IAAA,OAAA,EAAA;AACA,mBAAA,GAAA,IAAA,OAAA,EAAA;AACA,gBAAA,GAAA,IAAA,OAAA,EAAA;AACA,cAAA,GAAA,IAAA,OAAA,EAAA;AACA,gBAAA,GAAA,IAAA,OAAA,EAAA;AA2UA,eAAA,GAAA,IAAA,OAAA,EAAA;;;;;;"}
1
+ {"version":3,"file":"VuuModule.js","sources":["../../../../../packages/vuu-data-test/src/core/module/VuuModule.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceConfig,\n DataSourceVisualLinkCreatedMessage,\n OpenDialogActionWithSchema,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuRpcMenuRequest,\n VuuRpcViewportRequest,\n VuuMenu,\n VuuRowDataItemType,\n VuuTable,\n VuuLink,\n LinkDescriptorWithLabel,\n RpcNamedParams,\n VuuRpcRequest,\n VuuRpcResponse,\n VuuRpcMenuResponse,\n VuuRpcViewportResponse,\n VuuCreateVisualLink,\n VuuRemoveVisualLink,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { isViewportRpcRequest, uuid } from \"@vuu-ui/vuu-utils\";\nimport { Table, buildDataColumnMapFromSchema } from \"../../Table\";\nimport { TickingArrayDataSource } from \"../../TickingArrayDataSource\";\nimport { RuntimeVisualLink } from \"../../RuntimeVisualLink\";\nimport moduleContainer from \"./ModuleContainer\";\n\nexport interface IVuuModule<T extends string = string> {\n createDataSource: (tableName: T) => DataSource;\n}\n\nexport type SessionTableMap = Record<string, Table>;\n\nexport type RpcServiceRequestWithParams = VuuRpcViewportRequest & {\n namedParams: RpcNamedParams;\n};\nexport type RpcServiceRequest =\n | RpcServiceRequestWithParams\n | VuuRpcViewportRequest\n | VuuRpcMenuRequest;\n\nexport const withParams = (\n rpcRequest: VuuRpcRequest,\n): rpcRequest is RpcServiceRequestWithParams => \"namedParams\" in rpcRequest;\n\nexport const withNamedParams = (\n rpcRequest: RpcServiceRequest,\n): rpcRequest is RpcServiceRequestWithParams => \"namedParams\" in rpcRequest;\n\nexport type ServiceHandler = (\n rpcRequest: VuuRpcRequest & {\n namedParams?: RpcNamedParams;\n },\n) => Promise<VuuRpcResponse>;\n\nexport type RpcService = {\n rpcName: string;\n service: ServiceHandler;\n};\n\ntype Subscription = {\n viewportId: string;\n dataSource: DataSource;\n};\nexport abstract class VuuModule<T extends string = string>\n implements IVuuModule<T>\n{\n #name: string;\n #runtimeVisualLinks = new Map<string, RuntimeVisualLink>();\n #sessionTableMap: SessionTableMap = {};\n #tableServices: Record<T, RpcService[] | undefined> | undefined;\n #subscriptionMap: Map<string, Subscription[]> = new Map();\n\n constructor(name: string) {\n this.#name = name;\n moduleContainer.register(this);\n }\n\n protected abstract menus?: Record<T, VuuMenu | undefined> | undefined;\n protected abstract schemas: Record<T, Readonly<TableSchema>>;\n protected abstract tables: Record<T, Table>;\n protected abstract services?: Record<T, RpcService[] | undefined> | undefined;\n protected abstract visualLinks?: Record<T, VuuLink[] | undefined>;\n\n getTableSchema(tableName: string) {\n return this.schemas[tableName as T];\n }\n\n getTableList() {\n return Object.keys(this.tables);\n }\n\n private unregisterViewport = (viewportId: string) => {\n for (const [tableName, subscriptions] of this.#subscriptionMap) {\n if (subscriptions[0].viewportId.toString() === viewportId) {\n this.#subscriptionMap.delete(tableName);\n } else {\n const links = subscriptions[0].dataSource.links;\n if (links) {\n for (let i = 0; i < links?.length; i++) {\n if (links[i].parentClientVpId === viewportId) {\n links.splice(i);\n }\n }\n }\n subscriptions[0].dataSource.links = links;\n }\n }\n };\n\n get name() {\n return this.#name;\n }\n\n getSubscribedDataSource(vpId: string): DataSource {\n for (const subscriptions of this.#subscriptionMap.values()) {\n for (const { viewportId, dataSource } of subscriptions) {\n if (viewportId === vpId) {\n return dataSource;\n }\n }\n }\n throw Error(`getSubscribedDataSource #${vpId} not in subscriptionMap`);\n }\n\n getLinks = (\n subscriptionMap: Map<string, Subscription[]>,\n vuuLinks: VuuLink[],\n ) => {\n const visualLinks: LinkDescriptorWithLabel[] = [];\n for (let i = 0; i < vuuLinks.length; i++) {\n const subscriptions = subscriptionMap.get(vuuLinks[i].toTable);\n if (subscriptions) {\n subscriptions.forEach(({ viewportId, dataSource: { status } }) => {\n if (status !== \"suspended\") {\n const newLink: LinkDescriptorWithLabel = {\n parentClientVpId: viewportId,\n parentVpId: viewportId,\n link: vuuLinks[i],\n };\n visualLinks.push(newLink);\n }\n });\n }\n }\n return visualLinks;\n };\n\n visualLinkService = (\n message: VuuCreateVisualLink | VuuRemoveVisualLink,\n ): Promise<DataSourceVisualLinkCreatedMessage | void> =>\n new Promise((resolve) => {\n if (message.type === \"CREATE_VISUAL_LINK\") {\n const { childColumnName, childVpId, parentColumnName, parentVpId } =\n message;\n const childDataSource = this.getSubscribedDataSource(childVpId);\n const parentDataSource = this.getSubscribedDataSource(parentVpId);\n const runtimeVisualLink = new RuntimeVisualLink(\n childDataSource,\n parentDataSource,\n childColumnName,\n parentColumnName,\n );\n\n this.#runtimeVisualLinks.set(childVpId, runtimeVisualLink);\n\n resolve({\n clientViewportId: childVpId,\n colName: childColumnName,\n parentColName: parentColumnName,\n parentViewportId: parentVpId,\n type: \"vuu-link-created\",\n } as DataSourceVisualLinkCreatedMessage);\n } else {\n const runtimeVisualLink = this.#runtimeVisualLinks.get(\n message.childVpId,\n );\n if (runtimeVisualLink) {\n runtimeVisualLink.remove();\n this.#runtimeVisualLinks.delete(message.childVpId);\n } else {\n throw Error(\n `visualLinkService no visual link found for viewport #${message.childVpId}`,\n );\n }\n resolve();\n }\n });\n\n createDataSource = (\n tableName: T,\n viewport?: string,\n config?: DataSourceConfig,\n ) => {\n const getVisualLinks = (tableName: string) => {\n const linksForTable = this.visualLinks?.[tableName as T] as VuuLink[];\n return linksForTable === undefined\n ? undefined\n : this.getLinks(this.#subscriptionMap, linksForTable);\n };\n\n const columnDescriptors = this.getColumnDescriptors(tableName);\n const table = this.tables[tableName];\n const sessionTable = this.#sessionTableMap[tableName];\n\n const dataSource: DataSource = new TickingArrayDataSource({\n ...config,\n columnDescriptors,\n getVisualLinks,\n keyColumn:\n this.schemas[tableName] === undefined\n ? this.#sessionTableMap[tableName].schema.key\n : this.schemas[tableName].key,\n table: table || sessionTable,\n menu: this.menus?.[tableName],\n rpcServices: this.getServices(tableName),\n sessionTables: this.#sessionTableMap,\n viewport,\n visualLinkService: this.visualLinkService,\n });\n\n dataSource.on(\"unsubscribed\", this.unregisterViewport);\n\n const existingSubscriptions = this.#subscriptionMap.get(tableName);\n const subscription = {\n viewportId: dataSource.viewport as string,\n dataSource,\n };\n if (existingSubscriptions) {\n existingSubscriptions.push(subscription);\n } else {\n this.#subscriptionMap.set(tableName, [subscription]);\n }\n\n return dataSource;\n };\n\n getServices(tableName: T) {\n const tableServices = this.services?.[tableName];\n if (Array.isArray(tableServices)) {\n return this.#moduleServices.concat(tableServices);\n } else {\n return this.#moduleServices;\n }\n }\n\n protected get sessionTableMap() {\n return this.#sessionTableMap;\n }\n\n private getSessionTable(sessionTableName: string) {\n const sessionTable = this.#sessionTableMap[sessionTableName];\n if (sessionTable) {\n return sessionTable;\n } else {\n throw Error(\n `getSessionTable: no session table with name ${sessionTableName}`,\n );\n }\n }\n\n private getColumnDescriptors(tableName: T) {\n const schema =\n this.schemas[tableName] || this.getSessionTable(tableName)?.schema;\n if (schema) {\n return schema.columns;\n } else {\n throw Error(\n ` no schema found for module ${this.#name} table ${tableName}`,\n );\n }\n }\n\n private openBulkEdits: ServiceHandler = async (rpcRequest) => {\n if (withParams(rpcRequest)) {\n const { namedParams, vpId } = rpcRequest;\n const selectedRowIds = namedParams.selectedRowIds as string[];\n const table = namedParams.table as VuuTable;\n\n if (selectedRowIds && table) {\n const dataTable = this.tables[table.table as T];\n if (dataTable) {\n const sessionTable = this.createSessionTableFromSelectedRows(\n dataTable,\n selectedRowIds,\n );\n const sessionTableName = `session-${uuid()}`;\n this.#sessionTableMap[sessionTableName] = sessionTable;\n\n return {\n action: {\n renderComponent: \"grid\",\n table: {\n module: table.module,\n table: sessionTableName,\n },\n tableSchema: dataTable.schema,\n type: \"OPEN_DIALOG_ACTION\",\n } as OpenDialogActionWithSchema,\n rpcName: \"VP_BULK_EDIT_BEGIN_RPC\",\n type: \"VIEW_PORT_MENU_RESP\",\n vpId,\n } as VuuRpcMenuResponse;\n } else {\n return {\n action: { type: \"NO_ACTION\" },\n clientViewportId: \"na\",\n error: \"No Table found\",\n rpcName: \"VP_BULK_EDIT_REJECT\",\n type: \"VIEW_PORT_MENU_REJ\",\n vpId,\n } as VuuRpcMenuResponse;\n }\n }\n }\n throw Error(\"openBulkEdits expects Table and selectedRowIds\");\n };\n\n private endEditSession: ServiceHandler = async (rpcRequest) => {\n if (isViewportRpcRequest(rpcRequest)) {\n const { vpId } = rpcRequest;\n delete this.#sessionTableMap[vpId];\n return {\n action: { type: \"VP_RPC_SUCCESS\" },\n method: \"???\",\n namedParams: {},\n params: [],\n type: \"VIEW_PORT_RPC_RESPONSE\",\n vpId,\n } as VuuRpcViewportResponse;\n } else {\n throw Error(\"endEditSession invalid request\");\n }\n };\n\n // Bulk-edit with input in session table\n private applyBulkEdits: ServiceHandler = async (rpcRequest) => {\n if (withParams(rpcRequest)) {\n const { vpId } = rpcRequest;\n const sessionTable = this.getSessionTable(vpId);\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(\n String(newRow[keyIndex]),\n column as string,\n value as VuuRowDataItemType,\n );\n }\n return {\n action: {\n type: \"NO_ACTION\",\n },\n rpcName: \"VP_BULK_EDIT_COLUMN_CELLS_RPC\",\n type: \"VIEW_PORT_MENU_RESP\",\n vpId,\n } as VuuRpcMenuResponse;\n }\n throw Error(\"applyBulkEdits expects column and value as namedParams\");\n };\n\n // Save session table data to main table\n private saveBulkEdits: ServiceHandler = async (rpcRequest) => {\n if (withParams(rpcRequest)) {\n const { vpId } = rpcRequest;\n const sessionTable = this.getSessionTable(vpId);\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 return {\n action: {\n type: \"VP_RPC_SUCCESS\",\n },\n requestId: \"request_id\",\n rpcName: \"VP_BULK_EDIT_SUBMIT_RPC\",\n type: \"VIEW_PORT_MENU_RESP\",\n vpId,\n } as unknown as VuuRpcViewportResponse;\n }\n }\n throw Error(\"saveBulkEdits base table not found\");\n };\n\n protected createSessionTableFromSelectedRows(\n { data, map, schema }: Table,\n selectedRowIds: string[],\n ) {\n const keyIndex = map[schema.key];\n const sessionData: VuuRowDataItemType[][] = [];\n for (let i = 0; i < selectedRowIds.length; i++) {\n for (let j = 0; j < data.length; j++) {\n if (data[j][keyIndex] === selectedRowIds[i]) {\n sessionData.push(data[j]);\n }\n }\n }\n return new Table(schema, sessionData, buildDataColumnMapFromSchema(schema));\n }\n\n /**\n * These services are available on any table. The client must configure the appropriate\n * menu item(s) on Table(s). The services to implement these RPC calls are built-in to\n * VuuModule\n */\n #moduleServices: RpcService[] = [\n {\n rpcName: \"VP_BULK_EDIT_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 rpcName: \"VP_BULK_EDIT_END_RPC\",\n service: this.endEditSession,\n },\n ];\n}\n"],"names":["RuntimeVisualLink","tableName","TickingArrayDataSource","uuid","isViewportRpcRequest","moduleContainer","Table","buildDataColumnMapFromSchema"],"mappings":"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"}
@@ -0,0 +1,138 @@
1
+ 'use strict';
2
+
3
+ var Table = require('../../Table.js');
4
+
5
+ var __defProp = Object.defineProperty;
6
+ var __typeError = (msg) => {
7
+ throw TypeError(msg);
8
+ };
9
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
10
+ var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
11
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
12
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
13
+ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
14
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
15
+ var _instance, _tables;
16
+ const _TableContainer = class _TableContainer {
17
+ constructor() {
18
+ __privateAdd(this, _tables, /* @__PURE__ */ new Map());
19
+ __publicField(this, "createTable", (schema, data, dataMap, updateGenerator) => {
20
+ const table = new Table.Table(schema, data, dataMap, updateGenerator);
21
+ this.addTable(table);
22
+ return table;
23
+ });
24
+ }
25
+ static get instance() {
26
+ if (!__privateGet(_TableContainer, _instance)) {
27
+ __privateSet(_TableContainer, _instance, new _TableContainer());
28
+ }
29
+ return __privateGet(_TableContainer, _instance);
30
+ }
31
+ // TODO this is problematic in that it assumes both tables are already created
32
+ // depends on the order in which modules are imnported
33
+ // Make this independent odf base table creation order
34
+ createJoinTable(joinTable, { table: t1 }, { table: t2 }, joinColumn) {
35
+ const table1 = this.getTable(t1);
36
+ const table2 = this.getTable(t2);
37
+ const { map: m1, schema: schema1 } = table1;
38
+ const { map: m2, schema: schema2 } = table2;
39
+ const k1 = m1[joinColumn];
40
+ const k2 = m2[joinColumn];
41
+ const combinedColumns = new Set(
42
+ [...schema1.columns, ...schema2.columns].map((col) => col.name).sort()
43
+ );
44
+ const combinedSchema = {
45
+ key: joinColumn,
46
+ table: joinTable,
47
+ columns: Array.from(combinedColumns).map((columnName) => ({
48
+ name: columnName,
49
+ serverDataType: getServerDataType(columnName, schema1, schema2)
50
+ }))
51
+ };
52
+ const data = [];
53
+ const combinedColumnMap = Table.buildDataColumnMapFromSchema(combinedSchema);
54
+ for (const row of table1.data) {
55
+ const row2 = table2.findByKey(String(row[k1]));
56
+ if (row2) {
57
+ const out = [];
58
+ for (const column of table1.schema.columns) {
59
+ const value = row[m1[column.name]];
60
+ out[combinedColumnMap[column.name]] = value;
61
+ }
62
+ for (const column of table2.schema.columns) {
63
+ const value = row2[m2[column.name]];
64
+ out[combinedColumnMap[column.name]] = value;
65
+ }
66
+ data.push(out);
67
+ }
68
+ }
69
+ const newTable = new Table.Table(combinedSchema, data, combinedColumnMap);
70
+ table1.on("insert", (row) => {
71
+ const row2 = table2.findByKey(String(row[k1]));
72
+ if (row2) {
73
+ const out = [];
74
+ for (const column of table1.schema.columns) {
75
+ const value = row[m1[column.name]];
76
+ out[combinedColumnMap[column.name]] = value;
77
+ }
78
+ for (const column of table2.schema.columns) {
79
+ const value = row2[m2[column.name]];
80
+ out[combinedColumnMap[column.name]] = value;
81
+ }
82
+ newTable.insert(out);
83
+ }
84
+ });
85
+ table2.on("update", (row) => {
86
+ const keyValue = row[k2];
87
+ const targetRow = newTable.findByKey(keyValue);
88
+ if (targetRow) {
89
+ const updatedRow = targetRow.slice();
90
+ for (const { name } of table2.schema.columns) {
91
+ if (row[m2[name]] !== updatedRow[combinedColumnMap[name]]) {
92
+ updatedRow[combinedColumnMap[name]] = row[m2[name]];
93
+ }
94
+ }
95
+ newTable.updateRow(updatedRow);
96
+ }
97
+ });
98
+ return newTable;
99
+ }
100
+ addTable(table) {
101
+ __privateGet(this, _tables).set(table.name, table);
102
+ }
103
+ getTable(tableName) {
104
+ const table = __privateGet(this, _tables).get(tableName);
105
+ if (table) {
106
+ return table;
107
+ } else {
108
+ throw Error(`[TableContainer] no table ${tableName}`);
109
+ }
110
+ }
111
+ };
112
+ _instance = new WeakMap();
113
+ _tables = new WeakMap();
114
+ __privateAdd(_TableContainer, _instance);
115
+ let TableContainer = _TableContainer;
116
+ var tableContainer = TableContainer.instance;
117
+ const getServerDataType = (columnName, { columns: cols1, table: t1 }, { columns: cols2, table: t2 }) => {
118
+ const col1 = cols1.find((col) => col.name === columnName);
119
+ const col2 = cols2.find((col) => col.name === columnName);
120
+ if (col1 && col2) {
121
+ if (col1.serverDataType === col2.serverDataType) {
122
+ return col1.serverDataType;
123
+ } else {
124
+ throw Error(
125
+ `both tables ${t1.table} and ${t2.table} implement column ${columnName}, but with types differ`
126
+ );
127
+ }
128
+ } else if (col1) {
129
+ return col1.serverDataType;
130
+ } else if (col2) {
131
+ return col2.serverDataType;
132
+ } else {
133
+ throw Error(`how is this possible`);
134
+ }
135
+ };
136
+
137
+ module.exports = tableContainer;
138
+ //# sourceMappingURL=TableContainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableContainer.js","sources":["../../../../../packages/vuu-data-test/src/core/table/TableContainer.ts"],"sourcesContent":["import { SchemaColumn, TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport { buildDataColumnMapFromSchema, Table } from \"../../Table\";\nimport { VuuRowDataItemType, VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap } from \"@vuu-ui/vuu-utils\";\nimport { UpdateGenerator } from \"../../rowUpdates\";\n\nclass TableContainer {\n private constructor() {\n // empty constructor is all we need\n }\n static #instance: TableContainer;\n\n public static get instance(): TableContainer {\n if (!TableContainer.#instance) {\n TableContainer.#instance = new TableContainer();\n }\n return TableContainer.#instance;\n }\n\n #tables = new Map<string, Table>();\n\n createTable = (\n schema: TableSchema,\n data: VuuRowDataItemType[][],\n dataMap: ColumnMap,\n updateGenerator?: UpdateGenerator,\n ) => {\n const table = new Table(schema, data, dataMap, updateGenerator);\n this.addTable(table);\n return table;\n };\n\n // TODO this is problematic in that it assumes both tables are already created\n // depends on the order in which modules are imnported\n // Make this independent odf base table creation order\n createJoinTable(\n joinTable: VuuTable,\n { table: t1 }: VuuTable,\n { table: t2 }: VuuTable,\n joinColumn: string,\n ) {\n const table1 = this.getTable(t1);\n const table2 = this.getTable(t2);\n\n // Just copies source tables, then registers update listeners.\n // Not terribly efficient, but good enough for showcase\n\n const { map: m1, schema: schema1 } = table1;\n const { map: m2, schema: schema2 } = table2;\n const k1 = m1[joinColumn];\n const k2 = m2[joinColumn];\n\n const combinedColumns = new Set(\n [...schema1.columns, ...schema2.columns].map((col) => col.name).sort(),\n );\n\n const combinedSchema: TableSchema = {\n key: joinColumn,\n table: joinTable,\n columns: Array.from(combinedColumns).map<SchemaColumn>((columnName) => ({\n name: columnName,\n serverDataType: getServerDataType(columnName, schema1, schema2),\n })),\n };\n\n const data: VuuRowDataItemType[][] = [];\n const combinedColumnMap = buildDataColumnMapFromSchema(combinedSchema);\n // const start = performance.now();\n for (const row of table1.data) {\n const row2 = table2.findByKey(String(row[k1]));\n if (row2) {\n const out = [];\n for (const column of table1.schema.columns) {\n const value = row[m1[column.name]];\n out[combinedColumnMap[column.name]] = value;\n }\n for (const column of table2.schema.columns) {\n const value = row2[m2[column.name]];\n out[combinedColumnMap[column.name]] = value;\n }\n data.push(out);\n }\n }\n // const end = performance.now();\n // console.log(`took ${end - start} ms to create join table ${joinTable.table}`);\n\n const newTable = new Table(combinedSchema, data, combinedColumnMap);\n\n table1.on(\"insert\", (row) => {\n const row2 = table2.findByKey(String(row[k1]));\n if (row2) {\n const out = [];\n for (const column of table1.schema.columns) {\n const value = row[m1[column.name]];\n out[combinedColumnMap[column.name]] = value;\n }\n for (const column of table2.schema.columns) {\n const value = row2[m2[column.name]];\n out[combinedColumnMap[column.name]] = value;\n }\n newTable.insert(out);\n }\n });\n\n table2.on(\"update\", (row) => {\n const keyValue = row[k2] as string;\n const targetRow = newTable.findByKey(keyValue);\n if (targetRow) {\n const updatedRow = targetRow.slice();\n for (const { name } of table2.schema.columns) {\n if (row[m2[name]] !== updatedRow[combinedColumnMap[name]]) {\n updatedRow[combinedColumnMap[name]] = row[m2[name]];\n }\n }\n newTable.updateRow(updatedRow);\n }\n });\n\n return newTable;\n }\n\n addTable(table: Table) {\n this.#tables.set(table.name, table);\n }\n getTable<T = Table>(tableName: string) {\n const table = this.#tables.get(tableName) as T;\n if (table) {\n return table;\n } else {\n throw Error(`[TableContainer] no table ${tableName}`);\n }\n }\n}\n\nexport default TableContainer.instance;\n\nconst getServerDataType = (\n columnName: string,\n { columns: cols1, table: t1 }: TableSchema,\n { columns: cols2, table: t2 }: TableSchema,\n) => {\n const col1 = cols1.find((col) => col.name === columnName);\n const col2 = cols2.find((col) => col.name === columnName);\n if (col1 && col2) {\n if (col1.serverDataType === col2.serverDataType) {\n return col1.serverDataType;\n } else {\n throw Error(\n `both tables ${t1.table} and ${t2.table} implement column ${columnName}, but with types differ`,\n );\n }\n } else if (col1) {\n return col1.serverDataType;\n } else if (col2) {\n return col2.serverDataType;\n } else {\n throw Error(`how is this possible`);\n }\n};\n"],"names":["Table","buildDataColumnMapFromSchema"],"mappings":";;;;;;;;;;;;;;AAAA,IAAA,SAAA,EAAA,OAAA;AAMA,MAAM,eAAA,GAAN,MAAM,eAAe,CAAA;AAAA,EACX,WAAc,GAAA;AAYtB,IAAA,YAAA,CAAA,IAAA,EAAA,OAAA,sBAAc,GAAmB,EAAA,CAAA;AAEjC,IAAA,aAAA,CAAA,IAAA,EAAA,aAAA,EAAc,CACZ,MAAA,EACA,IACA,EAAA,OAAA,EACA,eACG,KAAA;AACH,MAAA,MAAM,QAAQ,IAAIA,WAAA,CAAM,MAAQ,EAAA,IAAA,EAAM,SAAS,eAAe,CAAA;AAC9D,MAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AACnB,MAAO,OAAA,KAAA;AAAA,KACT,CAAA;AAAA;AArBA,EAGA,WAAkB,QAA2B,GAAA;AAC3C,IAAI,IAAA,CAAC,8BAAe,SAAW,CAAA,EAAA;AAC7B,MAAe,YAAA,CAAA,eAAA,EAAA,SAAA,EAAY,IAAI,eAAe,EAAA,CAAA;AAAA;AAEhD,IAAA,OAAO,YAAe,CAAA,eAAA,EAAA,SAAA,CAAA;AAAA;AACxB;AAAA;AAAA;AAAA,EAkBA,eAAA,CACE,SACA,EAAA,EAAE,KAAO,EAAA,EAAA,IACT,EAAE,KAAA,EAAO,EAAG,EAAA,EACZ,UACA,EAAA;AACA,IAAM,MAAA,MAAA,GAAS,IAAK,CAAA,QAAA,CAAS,EAAE,CAAA;AAC/B,IAAM,MAAA,MAAA,GAAS,IAAK,CAAA,QAAA,CAAS,EAAE,CAAA;AAK/B,IAAA,MAAM,EAAE,GAAA,EAAK,EAAI,EAAA,MAAA,EAAQ,SAAY,GAAA,MAAA;AACrC,IAAA,MAAM,EAAE,GAAA,EAAK,EAAI,EAAA,MAAA,EAAQ,SAAY,GAAA,MAAA;AACrC,IAAM,MAAA,EAAA,GAAK,GAAG,UAAU,CAAA;AACxB,IAAM,MAAA,EAAA,GAAK,GAAG,UAAU,CAAA;AAExB,IAAA,MAAM,kBAAkB,IAAI,GAAA;AAAA,MAC1B,CAAC,GAAG,OAAQ,CAAA,OAAA,EAAS,GAAG,OAAQ,CAAA,OAAO,CAAE,CAAA,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAI,CAAA,IAAI,EAAE,IAAK;AAAA,KACvE;AAEA,IAAA,MAAM,cAA8B,GAAA;AAAA,MAClC,GAAK,EAAA,UAAA;AAAA,MACL,KAAO,EAAA,SAAA;AAAA,MACP,SAAS,KAAM,CAAA,IAAA,CAAK,eAAe,CAAE,CAAA,GAAA,CAAkB,CAAC,UAAgB,MAAA;AAAA,QACtE,IAAM,EAAA,UAAA;AAAA,QACN,cAAgB,EAAA,iBAAA,CAAkB,UAAY,EAAA,OAAA,EAAS,OAAO;AAAA,OAC9D,CAAA;AAAA,KACJ;AAEA,IAAA,MAAM,OAA+B,EAAC;AACtC,IAAM,MAAA,iBAAA,GAAoBC,mCAA6B,cAAc,CAAA;AAErE,IAAW,KAAA,MAAA,GAAA,IAAO,OAAO,IAAM,EAAA;AAC7B,MAAA,MAAM,OAAO,MAAO,CAAA,SAAA,CAAU,OAAO,GAAI,CAAA,EAAE,CAAC,CAAC,CAAA;AAC7C,MAAA,IAAI,IAAM,EAAA;AACR,QAAA,MAAM,MAAM,EAAC;AACb,QAAW,KAAA,MAAA,MAAA,IAAU,MAAO,CAAA,MAAA,CAAO,OAAS,EAAA;AAC1C,UAAA,MAAM,KAAQ,GAAA,GAAA,CAAI,EAAG,CAAA,MAAA,CAAO,IAAI,CAAC,CAAA;AACjC,UAAA,GAAA,CAAI,iBAAkB,CAAA,MAAA,CAAO,IAAI,CAAC,CAAI,GAAA,KAAA;AAAA;AAExC,QAAW,KAAA,MAAA,MAAA,IAAU,MAAO,CAAA,MAAA,CAAO,OAAS,EAAA;AAC1C,UAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,EAAG,CAAA,MAAA,CAAO,IAAI,CAAC,CAAA;AAClC,UAAA,GAAA,CAAI,iBAAkB,CAAA,MAAA,CAAO,IAAI,CAAC,CAAI,GAAA,KAAA;AAAA;AAExC,QAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA;AACf;AAKF,IAAA,MAAM,QAAW,GAAA,IAAID,WAAM,CAAA,cAAA,EAAgB,MAAM,iBAAiB,CAAA;AAElE,IAAO,MAAA,CAAA,EAAA,CAAG,QAAU,EAAA,CAAC,GAAQ,KAAA;AAC3B,MAAA,MAAM,OAAO,MAAO,CAAA,SAAA,CAAU,OAAO,GAAI,CAAA,EAAE,CAAC,CAAC,CAAA;AAC7C,MAAA,IAAI,IAAM,EAAA;AACR,QAAA,MAAM,MAAM,EAAC;AACb,QAAW,KAAA,MAAA,MAAA,IAAU,MAAO,CAAA,MAAA,CAAO,OAAS,EAAA;AAC1C,UAAA,MAAM,KAAQ,GAAA,GAAA,CAAI,EAAG,CAAA,MAAA,CAAO,IAAI,CAAC,CAAA;AACjC,UAAA,GAAA,CAAI,iBAAkB,CAAA,MAAA,CAAO,IAAI,CAAC,CAAI,GAAA,KAAA;AAAA;AAExC,QAAW,KAAA,MAAA,MAAA,IAAU,MAAO,CAAA,MAAA,CAAO,OAAS,EAAA;AAC1C,UAAA,MAAM,KAAQ,GAAA,IAAA,CAAK,EAAG,CAAA,MAAA,CAAO,IAAI,CAAC,CAAA;AAClC,UAAA,GAAA,CAAI,iBAAkB,CAAA,MAAA,CAAO,IAAI,CAAC,CAAI,GAAA,KAAA;AAAA;AAExC,QAAA,QAAA,CAAS,OAAO,GAAG,CAAA;AAAA;AACrB,KACD,CAAA;AAED,IAAO,MAAA,CAAA,EAAA,CAAG,QAAU,EAAA,CAAC,GAAQ,KAAA;AAC3B,MAAM,MAAA,QAAA,GAAW,IAAI,EAAE,CAAA;AACvB,MAAM,MAAA,SAAA,GAAY,QAAS,CAAA,SAAA,CAAU,QAAQ,CAAA;AAC7C,MAAA,IAAI,SAAW,EAAA;AACb,QAAM,MAAA,UAAA,GAAa,UAAU,KAAM,EAAA;AACnC,QAAA,KAAA,MAAW,EAAE,IAAA,EAAU,IAAA,MAAA,CAAO,OAAO,OAAS,EAAA;AAC5C,UAAI,IAAA,GAAA,CAAI,GAAG,IAAI,CAAC,MAAM,UAAW,CAAA,iBAAA,CAAkB,IAAI,CAAC,CAAG,EAAA;AACzD,YAAA,UAAA,CAAW,kBAAkB,IAAI,CAAC,IAAI,GAAI,CAAA,EAAA,CAAG,IAAI,CAAC,CAAA;AAAA;AACpD;AAEF,QAAA,QAAA,CAAS,UAAU,UAAU,CAAA;AAAA;AAC/B,KACD,CAAA;AAED,IAAO,OAAA,QAAA;AAAA;AACT,EAEA,SAAS,KAAc,EAAA;AACrB,IAAA,YAAA,CAAA,IAAA,EAAK,OAAQ,CAAA,CAAA,GAAA,CAAI,KAAM,CAAA,IAAA,EAAM,KAAK,CAAA;AAAA;AACpC,EACA,SAAoB,SAAmB,EAAA;AACrC,IAAA,MAAM,KAAQ,GAAA,YAAA,CAAA,IAAA,EAAK,OAAQ,CAAA,CAAA,GAAA,CAAI,SAAS,CAAA;AACxC,IAAA,IAAI,KAAO,EAAA;AACT,MAAO,OAAA,KAAA;AAAA,KACF,MAAA;AACL,MAAM,MAAA,KAAA,CAAM,CAA6B,0BAAA,EAAA,SAAS,CAAE,CAAA,CAAA;AAAA;AACtD;AAEJ,CAAA;AA1HS,SAAA,GAAA,IAAA,OAAA,EAAA;AASP,OAAA,GAAA,IAAA,OAAA,EAAA;AATA,YAAA,CAJI,eAIG,EAAA,SAAA,CAAA;AAJT,IAAM,cAAN,GAAA,eAAA;AAgIA,qBAAe,cAAe,CAAA,QAAA;AAE9B,MAAM,iBAAoB,GAAA,CACxB,UACA,EAAA,EAAE,SAAS,KAAO,EAAA,KAAA,EAAO,EAAG,EAAA,EAC5B,EAAE,OAAA,EAAS,KAAO,EAAA,KAAA,EAAO,IACtB,KAAA;AACH,EAAA,MAAM,OAAO,KAAM,CAAA,IAAA,CAAK,CAAC,GAAQ,KAAA,GAAA,CAAI,SAAS,UAAU,CAAA;AACxD,EAAA,MAAM,OAAO,KAAM,CAAA,IAAA,CAAK,CAAC,GAAQ,KAAA,GAAA,CAAI,SAAS,UAAU,CAAA;AACxD,EAAA,IAAI,QAAQ,IAAM,EAAA;AAChB,IAAI,IAAA,IAAA,CAAK,cAAmB,KAAA,IAAA,CAAK,cAAgB,EAAA;AAC/C,MAAA,OAAO,IAAK,CAAA,cAAA;AAAA,KACP,MAAA;AACL,MAAM,MAAA,KAAA;AAAA,QACJ,eAAe,EAAG,CAAA,KAAK,QAAQ,EAAG,CAAA,KAAK,qBAAqB,UAAU,CAAA,uBAAA;AAAA,OACxE;AAAA;AACF,aACS,IAAM,EAAA;AACf,IAAA,OAAO,IAAK,CAAA,cAAA;AAAA,aACH,IAAM,EAAA;AACf,IAAA,OAAO,IAAK,CAAA,cAAA;AAAA,GACP,MAAA;AACL,IAAA,MAAM,MAAM,CAAsB,oBAAA,CAAA,CAAA;AAAA;AAEtC,CAAA;;;;"}