@vuu-ui/vuu-data-test 0.13.8 → 0.13.10

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 (205) hide show
  1. package/cjs/ArrayProxy.js +72 -0
  2. package/cjs/ArrayProxy.js.map +1 -0
  3. package/cjs/RuntimeVisualLink.js +89 -0
  4. package/cjs/RuntimeVisualLink.js.map +1 -0
  5. package/cjs/Table.js +184 -0
  6. package/cjs/Table.js.map +1 -0
  7. package/cjs/TickingArrayDataSource.js +208 -0
  8. package/cjs/TickingArrayDataSource.js.map +1 -0
  9. package/cjs/UpdateGenerator.js +94 -0
  10. package/cjs/UpdateGenerator.js.map +1 -0
  11. package/cjs/VuuModule.js +370 -0
  12. package/cjs/VuuModule.js.map +1 -0
  13. package/cjs/basket/basket-module.js +255 -0
  14. package/cjs/basket/basket-module.js.map +1 -0
  15. package/cjs/basket/basket-schemas.js +123 -0
  16. package/cjs/basket/basket-schemas.js.map +1 -0
  17. package/cjs/basket/reference-data/constituents.js +40 -0
  18. package/cjs/basket/reference-data/constituents.js.map +1 -0
  19. package/cjs/basket/reference-data/ftse100.js +105 -0
  20. package/cjs/basket/reference-data/ftse100.js.map +1 -0
  21. package/cjs/basket/reference-data/hsi.js +87 -0
  22. package/cjs/basket/reference-data/hsi.js.map +1 -0
  23. package/cjs/basket/reference-data/nasdaq100.js +108 -0
  24. package/cjs/basket/reference-data/nasdaq100.js.map +1 -0
  25. package/cjs/basket/reference-data/prices.js +54 -0
  26. package/cjs/basket/reference-data/prices.js.map +1 -0
  27. package/cjs/basket/reference-data/sp500.js +46 -0
  28. package/cjs/basket/reference-data/sp500.js.map +1 -0
  29. package/cjs/data-utils.js +57 -0
  30. package/cjs/data-utils.js.map +1 -0
  31. package/cjs/index.js +46 -3047
  32. package/cjs/index.js.map +1 -1
  33. package/cjs/local-datasource-provider/LocalDatasourceProvider.js +84 -0
  34. package/cjs/local-datasource-provider/LocalDatasourceProvider.js.map +1 -0
  35. package/cjs/makeSuggestions.js +43 -0
  36. package/cjs/makeSuggestions.js.map +1 -0
  37. package/cjs/schemas.js +28 -0
  38. package/cjs/schemas.js.map +1 -0
  39. package/cjs/simul/SimulModule.js +24 -0
  40. package/cjs/simul/SimulModule.js.map +1 -0
  41. package/cjs/simul/reference-data/accounts.js +27 -0
  42. package/cjs/simul/reference-data/accounts.js.map +1 -0
  43. package/cjs/simul/reference-data/algos.js +6 -0
  44. package/cjs/simul/reference-data/algos.js.map +1 -0
  45. package/cjs/simul/reference-data/currencies.js +6 -0
  46. package/cjs/simul/reference-data/currencies.js.map +1 -0
  47. package/cjs/simul/reference-data/instruments-extended.js +18 -0
  48. package/cjs/simul/reference-data/instruments-extended.js.map +1 -0
  49. package/cjs/simul/reference-data/instruments.js +77 -0
  50. package/cjs/simul/reference-data/instruments.js.map +1 -0
  51. package/cjs/simul/reference-data/isin-generator/convert-string-to-base-ten-number.js +6 -0
  52. package/cjs/simul/reference-data/isin-generator/convert-string-to-base-ten-number.js.map +1 -0
  53. package/cjs/simul/reference-data/isin-generator/fixtures/alphabet.js +31 -0
  54. package/cjs/simul/reference-data/isin-generator/fixtures/alphabet.js.map +1 -0
  55. package/cjs/simul/reference-data/isin-generator/fixtures/alphanumeric-values.js +9 -0
  56. package/cjs/simul/reference-data/isin-generator/fixtures/alphanumeric-values.js.map +1 -0
  57. package/cjs/simul/reference-data/isin-generator/fixtures/base-ten-numbers.js +17 -0
  58. package/cjs/simul/reference-data/isin-generator/fixtures/base-ten-numbers.js.map +1 -0
  59. package/cjs/simul/reference-data/isin-generator/generate-cusip-check-code.js +24 -0
  60. package/cjs/simul/reference-data/isin-generator/generate-cusip-check-code.js.map +1 -0
  61. package/cjs/simul/reference-data/isin-generator/generate-cusip-without-check-code.js +13 -0
  62. package/cjs/simul/reference-data/isin-generator/generate-cusip-without-check-code.js.map +1 -0
  63. package/cjs/simul/reference-data/isin-generator/generate-cusip.js +13 -0
  64. package/cjs/simul/reference-data/isin-generator/generate-cusip.js.map +1 -0
  65. package/cjs/simul/reference-data/isin-generator/generate-random-alphanumeric.js +8 -0
  66. package/cjs/simul/reference-data/isin-generator/generate-random-alphanumeric.js.map +1 -0
  67. package/cjs/simul/reference-data/isin-generator/generate-random-base-ten-number.js +6 -0
  68. package/cjs/simul/reference-data/isin-generator/generate-random-base-ten-number.js.map +1 -0
  69. package/cjs/simul/reference-data/isin-generator/generate-random-string-of-alphanumeric-chars.js +14 -0
  70. package/cjs/simul/reference-data/isin-generator/generate-random-string-of-alphanumeric-chars.js.map +1 -0
  71. package/cjs/simul/reference-data/isin-generator/generate-random-string-of-base-ten-chars.js +14 -0
  72. package/cjs/simul/reference-data/isin-generator/generate-random-string-of-base-ten-chars.js.map +1 -0
  73. package/cjs/simul/reference-data/isin-generator/index.js +295 -0
  74. package/cjs/simul/reference-data/isin-generator/index.js.map +1 -0
  75. package/cjs/simul/reference-data/isin-generator/is-odd.js +6 -0
  76. package/cjs/simul/reference-data/isin-generator/is-odd.js.map +1 -0
  77. package/cjs/simul/reference-data/locations.js +17 -0
  78. package/cjs/simul/reference-data/locations.js.map +1 -0
  79. package/cjs/simul/reference-data/lotsizes.js +28 -0
  80. package/cjs/simul/reference-data/lotsizes.js.map +1 -0
  81. package/cjs/simul/reference-data/orderStatus.js +6 -0
  82. package/cjs/simul/reference-data/orderStatus.js.map +1 -0
  83. package/cjs/simul/reference-data/orders.js +54 -0
  84. package/cjs/simul/reference-data/orders.js.map +1 -0
  85. package/cjs/simul/reference-data/parent-child-orders.js +122 -0
  86. package/cjs/simul/reference-data/parent-child-orders.js.map +1 -0
  87. package/cjs/simul/reference-data/prices.js +71 -0
  88. package/cjs/simul/reference-data/prices.js.map +1 -0
  89. package/cjs/simul/reference-data/sides.js +6 -0
  90. package/cjs/simul/reference-data/sides.js.map +1 -0
  91. package/cjs/simul/simul-module.js +126 -0
  92. package/cjs/simul/simul-module.js.map +1 -0
  93. package/cjs/simul/simul-schemas.js +142 -0
  94. package/cjs/simul/simul-schemas.js.map +1 -0
  95. package/cjs/test/test-module.js +26 -0
  96. package/cjs/test/test-module.js.map +1 -0
  97. package/cjs/test/test-schemas.js +17 -0
  98. package/cjs/test/test-schemas.js.map +1 -0
  99. package/cjs/vuu-modules.js +15 -0
  100. package/cjs/vuu-modules.js.map +1 -0
  101. package/cjs/vuu-row-generator.js +74 -0
  102. package/cjs/vuu-row-generator.js.map +1 -0
  103. package/esm/ArrayProxy.js +70 -0
  104. package/esm/ArrayProxy.js.map +1 -0
  105. package/esm/RuntimeVisualLink.js +87 -0
  106. package/esm/RuntimeVisualLink.js.map +1 -0
  107. package/esm/Table.js +179 -0
  108. package/esm/Table.js.map +1 -0
  109. package/esm/TickingArrayDataSource.js +206 -0
  110. package/esm/TickingArrayDataSource.js.map +1 -0
  111. package/esm/UpdateGenerator.js +92 -0
  112. package/esm/UpdateGenerator.js.map +1 -0
  113. package/esm/VuuModule.js +366 -0
  114. package/esm/VuuModule.js.map +1 -0
  115. package/esm/basket/basket-module.js +251 -0
  116. package/esm/basket/basket-module.js.map +1 -0
  117. package/esm/basket/basket-schemas.js +120 -0
  118. package/esm/basket/basket-schemas.js.map +1 -0
  119. package/esm/basket/reference-data/constituents.js +38 -0
  120. package/esm/basket/reference-data/constituents.js.map +1 -0
  121. package/esm/basket/reference-data/ftse100.js +103 -0
  122. package/esm/basket/reference-data/ftse100.js.map +1 -0
  123. package/esm/basket/reference-data/hsi.js +85 -0
  124. package/esm/basket/reference-data/hsi.js.map +1 -0
  125. package/esm/basket/reference-data/nasdaq100.js +106 -0
  126. package/esm/basket/reference-data/nasdaq100.js.map +1 -0
  127. package/esm/basket/reference-data/prices.js +52 -0
  128. package/esm/basket/reference-data/prices.js.map +1 -0
  129. package/esm/basket/reference-data/sp500.js +44 -0
  130. package/esm/basket/reference-data/sp500.js.map +1 -0
  131. package/esm/data-utils.js +52 -0
  132. package/esm/data-utils.js.map +1 -0
  133. package/esm/index.js +14 -3019
  134. package/esm/index.js.map +1 -1
  135. package/esm/local-datasource-provider/LocalDatasourceProvider.js +82 -0
  136. package/esm/local-datasource-provider/LocalDatasourceProvider.js.map +1 -0
  137. package/esm/makeSuggestions.js +41 -0
  138. package/esm/makeSuggestions.js.map +1 -0
  139. package/esm/schemas.js +24 -0
  140. package/esm/schemas.js.map +1 -0
  141. package/esm/simul/SimulModule.js +22 -0
  142. package/esm/simul/SimulModule.js.map +1 -0
  143. package/esm/simul/reference-data/accounts.js +25 -0
  144. package/esm/simul/reference-data/accounts.js.map +1 -0
  145. package/esm/simul/reference-data/algos.js +4 -0
  146. package/esm/simul/reference-data/algos.js.map +1 -0
  147. package/esm/simul/reference-data/currencies.js +4 -0
  148. package/esm/simul/reference-data/currencies.js.map +1 -0
  149. package/esm/simul/reference-data/instruments-extended.js +16 -0
  150. package/esm/simul/reference-data/instruments-extended.js.map +1 -0
  151. package/esm/simul/reference-data/instruments.js +72 -0
  152. package/esm/simul/reference-data/instruments.js.map +1 -0
  153. package/esm/simul/reference-data/isin-generator/convert-string-to-base-ten-number.js +4 -0
  154. package/esm/simul/reference-data/isin-generator/convert-string-to-base-ten-number.js.map +1 -0
  155. package/esm/simul/reference-data/isin-generator/fixtures/alphabet.js +29 -0
  156. package/esm/simul/reference-data/isin-generator/fixtures/alphabet.js.map +1 -0
  157. package/esm/simul/reference-data/isin-generator/fixtures/alphanumeric-values.js +7 -0
  158. package/esm/simul/reference-data/isin-generator/fixtures/alphanumeric-values.js.map +1 -0
  159. package/esm/simul/reference-data/isin-generator/fixtures/base-ten-numbers.js +15 -0
  160. package/esm/simul/reference-data/isin-generator/fixtures/base-ten-numbers.js.map +1 -0
  161. package/esm/simul/reference-data/isin-generator/generate-cusip-check-code.js +22 -0
  162. package/esm/simul/reference-data/isin-generator/generate-cusip-check-code.js.map +1 -0
  163. package/esm/simul/reference-data/isin-generator/generate-cusip-without-check-code.js +11 -0
  164. package/esm/simul/reference-data/isin-generator/generate-cusip-without-check-code.js.map +1 -0
  165. package/esm/simul/reference-data/isin-generator/generate-cusip.js +11 -0
  166. package/esm/simul/reference-data/isin-generator/generate-cusip.js.map +1 -0
  167. package/esm/simul/reference-data/isin-generator/generate-random-alphanumeric.js +6 -0
  168. package/esm/simul/reference-data/isin-generator/generate-random-alphanumeric.js.map +1 -0
  169. package/esm/simul/reference-data/isin-generator/generate-random-base-ten-number.js +4 -0
  170. package/esm/simul/reference-data/isin-generator/generate-random-base-ten-number.js.map +1 -0
  171. package/esm/simul/reference-data/isin-generator/generate-random-string-of-alphanumeric-chars.js +12 -0
  172. package/esm/simul/reference-data/isin-generator/generate-random-string-of-alphanumeric-chars.js.map +1 -0
  173. package/esm/simul/reference-data/isin-generator/generate-random-string-of-base-ten-chars.js +12 -0
  174. package/esm/simul/reference-data/isin-generator/generate-random-string-of-base-ten-chars.js.map +1 -0
  175. package/esm/simul/reference-data/isin-generator/index.js +293 -0
  176. package/esm/simul/reference-data/isin-generator/index.js.map +1 -0
  177. package/esm/simul/reference-data/isin-generator/is-odd.js +4 -0
  178. package/esm/simul/reference-data/isin-generator/is-odd.js.map +1 -0
  179. package/esm/simul/reference-data/locations.js +14 -0
  180. package/esm/simul/reference-data/locations.js.map +1 -0
  181. package/esm/simul/reference-data/lotsizes.js +26 -0
  182. package/esm/simul/reference-data/lotsizes.js.map +1 -0
  183. package/esm/simul/reference-data/orderStatus.js +4 -0
  184. package/esm/simul/reference-data/orderStatus.js.map +1 -0
  185. package/esm/simul/reference-data/orders.js +51 -0
  186. package/esm/simul/reference-data/orders.js.map +1 -0
  187. package/esm/simul/reference-data/parent-child-orders.js +117 -0
  188. package/esm/simul/reference-data/parent-child-orders.js.map +1 -0
  189. package/esm/simul/reference-data/prices.js +68 -0
  190. package/esm/simul/reference-data/prices.js.map +1 -0
  191. package/esm/simul/reference-data/sides.js +4 -0
  192. package/esm/simul/reference-data/sides.js.map +1 -0
  193. package/esm/simul/simul-module.js +124 -0
  194. package/esm/simul/simul-module.js.map +1 -0
  195. package/esm/simul/simul-schemas.js +139 -0
  196. package/esm/simul/simul-schemas.js.map +1 -0
  197. package/esm/test/test-module.js +24 -0
  198. package/esm/test/test-module.js.map +1 -0
  199. package/esm/test/test-schemas.js +15 -0
  200. package/esm/test/test-schemas.js.map +1 -0
  201. package/esm/vuu-modules.js +13 -0
  202. package/esm/vuu-modules.js.map +1 -0
  203. package/esm/vuu-row-generator.js +68 -0
  204. package/esm/vuu-row-generator.js.map +1 -0
  205. package/package.json +6 -6
@@ -0,0 +1,94 @@
1
+ 'use strict';
2
+
3
+ var dataUtils = require('./data-utils.js');
4
+
5
+ var __defProp = Object.defineProperty;
6
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
8
+ const getNewValue = (value) => {
9
+ const multiplier = dataUtils.random(0, 100) / 1e3;
10
+ const direction = dataUtils.random(0, 10) >= 5 ? 1 : -1;
11
+ return value + value * multiplier * direction;
12
+ };
13
+ class BaseUpdateGenerator {
14
+ constructor(tickingColumns) {
15
+ __publicField(this, "table");
16
+ __publicField(this, "range");
17
+ __publicField(this, "updating", false);
18
+ __publicField(this, "timer");
19
+ __publicField(this, "tickingColumns");
20
+ __publicField(this, "update", () => {
21
+ if (this.range && this.table) {
22
+ const data = this.table?.data;
23
+ const { bid, ask, last, ...rest } = this.tickingColumns;
24
+ if (data && data?.length > 0) {
25
+ const maxRange = Math.min(this.range.to, data.length);
26
+ for (let rowIndex = this.range.from; rowIndex < maxRange; rowIndex++) {
27
+ let updateCount = 0;
28
+ const shallUpdateRow = dataUtils.random(0, 10) < 2;
29
+ if (shallUpdateRow) {
30
+ const rowUpdates = this.table.data[rowIndex];
31
+ const row = data[rowIndex];
32
+ if (bid !== void 0 && ask !== void 0) {
33
+ const { [bid]: currentBid, [ask]: currentAsk } = row;
34
+ const [newBid, newAsk] = dataUtils.generateNextBidAsk(
35
+ currentBid,
36
+ currentAsk,
37
+ 10,
38
+ 5,
39
+ dataUtils.nextRandomDouble
40
+ );
41
+ rowUpdates[ask] = newAsk;
42
+ rowUpdates[bid] = newBid;
43
+ if (last !== void 0) {
44
+ const newLast = Math.round((currentAsk + (newAsk - currentAsk) / 2) * 100) / 100;
45
+ rowUpdates[last] = newLast;
46
+ }
47
+ }
48
+ for (const colIdx of Object.values(rest)) {
49
+ const shallUpdateColumn = dataUtils.random(0, 10) < 5;
50
+ if (shallUpdateColumn) {
51
+ updateCount += 1;
52
+ const newValue = getNewValue(row[colIdx]);
53
+ if (this.table) {
54
+ rowUpdates[colIdx] = newValue;
55
+ }
56
+ }
57
+ }
58
+ if (this.table && updateCount > 0) {
59
+ this.table.updateRow(rowUpdates);
60
+ }
61
+ }
62
+ }
63
+ }
64
+ }
65
+ if (this.updating) {
66
+ this.timer = window.setTimeout(this.update, 500);
67
+ }
68
+ });
69
+ this.tickingColumns = tickingColumns;
70
+ }
71
+ setRange(range) {
72
+ this.range = range;
73
+ if (!this.updating && this.table) {
74
+ this.startUpdating();
75
+ }
76
+ }
77
+ setTable(table) {
78
+ this.table = table;
79
+ }
80
+ startUpdating() {
81
+ this.updating = true;
82
+ this.update();
83
+ }
84
+ stopUpdating() {
85
+ this.updating = false;
86
+ if (this.timer) {
87
+ window.clearTimeout(this.timer);
88
+ this.timer = void 0;
89
+ }
90
+ }
91
+ }
92
+
93
+ exports.BaseUpdateGenerator = BaseUpdateGenerator;
94
+ //# sourceMappingURL=UpdateGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UpdateGenerator.js","sources":["../src/UpdateGenerator.ts"],"sourcesContent":["import { VuuRange } from \"@vuu-ui/vuu-protocol-types\";\nimport { generateNextBidAsk, nextRandomDouble, random } from \"./data-utils\";\nimport type { UpdateGenerator } from \"./rowUpdates\";\nimport { Table } from \"./Table\";\n\nconst getNewValue = (value: number) => {\n const multiplier = random(0, 100) / 1000;\n const direction = random(0, 10) >= 5 ? 1 : -1;\n return value + value * multiplier * direction;\n};\n\nexport class BaseUpdateGenerator implements UpdateGenerator {\n private table: Table | undefined;\n private range: VuuRange | undefined;\n private updating = false;\n private timer: number | undefined;\n private tickingColumns: { [key: string]: number };\n\n constructor(tickingColumns: { [key: string]: number }) {\n this.tickingColumns = tickingColumns;\n }\n\n setRange(range: VuuRange) {\n this.range = range;\n if (!this.updating && this.table) {\n this.startUpdating();\n }\n }\n\n setTable(table: Table) {\n this.table = table;\n }\n\n private startUpdating() {\n this.updating = true;\n this.update();\n }\n\n private stopUpdating() {\n this.updating = false;\n if (this.timer) {\n window.clearTimeout(this.timer);\n this.timer = undefined;\n }\n }\n\n update = () => {\n if (this.range && this.table) {\n const data = this.table?.data;\n const { bid, ask, last, ...rest } = this.tickingColumns;\n if (data && data?.length > 0) {\n const maxRange = Math.min(this.range.to, data.length);\n for (let rowIndex = this.range.from; rowIndex < maxRange; rowIndex++) {\n let updateCount = 0;\n const shallUpdateRow = random(0, 10) < 2;\n if (shallUpdateRow) {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const rowUpdates = this.table.data[rowIndex];\n const row = data[rowIndex];\n\n if (bid !== undefined && ask !== undefined) {\n const { [bid]: currentBid, [ask]: currentAsk } = row as number[];\n const [newBid, newAsk] = generateNextBidAsk(\n currentBid,\n currentAsk,\n 10,\n 5,\n nextRandomDouble,\n );\n rowUpdates[ask] = newAsk;\n rowUpdates[bid] = newBid;\n if (last !== undefined) {\n const newLast =\n Math.round((currentAsk + (newAsk - currentAsk) / 2) * 100) /\n 100.0;\n rowUpdates[last] = newLast;\n }\n }\n\n for (const colIdx of Object.values(rest)) {\n const shallUpdateColumn = random(0, 10) < 5;\n if (shallUpdateColumn) {\n updateCount += 1;\n const newValue = getNewValue(row[colIdx] as number);\n if (this.table) {\n rowUpdates[colIdx] = newValue;\n }\n }\n }\n if (this.table && updateCount > 0) {\n this.table.updateRow(rowUpdates);\n }\n }\n }\n }\n }\n\n if (this.updating) {\n this.timer = window.setTimeout(this.update, 500);\n }\n };\n}\n"],"names":["random","generateNextBidAsk","nextRandomDouble"],"mappings":"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"}
@@ -0,0 +1,370 @@
1
+ 'use strict';
2
+
3
+ var vuuUtils = require('@vuu-ui/vuu-utils');
4
+ var Table = require('./Table.js');
5
+ var TickingArrayDataSource = require('./TickingArrayDataSource.js');
6
+ var makeSuggestions = require('./makeSuggestions.js');
7
+ var RuntimeVisualLink = require('./RuntimeVisualLink.js');
8
+
9
+ var __defProp = Object.defineProperty;
10
+ var __typeError = (msg) => {
11
+ throw TypeError(msg);
12
+ };
13
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
14
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
15
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
16
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
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);
18
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
19
+ var _menus, _name, _runtimeVisualLinks, _schemas, _sessionTableMap, _tables, _tableServices, _visualLinks, _subscriptionMap, _moduleServices;
20
+ const withParams = (rpcRequest) => "namedParams" in rpcRequest;
21
+ const withNamedParams = (rpcRequest) => "namedParams" in rpcRequest;
22
+ class VuuModule {
23
+ constructor({
24
+ menus,
25
+ name,
26
+ schemas,
27
+ services,
28
+ tables,
29
+ vuuLinks: visualLinks
30
+ }) {
31
+ __privateAdd(this, _menus);
32
+ __privateAdd(this, _name);
33
+ __privateAdd(this, _runtimeVisualLinks, /* @__PURE__ */ new Map());
34
+ __privateAdd(this, _schemas);
35
+ __privateAdd(this, _sessionTableMap, {});
36
+ __privateAdd(this, _tables);
37
+ __privateAdd(this, _tableServices);
38
+ __privateAdd(this, _visualLinks);
39
+ __privateAdd(this, _subscriptionMap, /* @__PURE__ */ new Map());
40
+ __publicField(this, "unregisterViewport", (viewportId) => {
41
+ for (const [tableName, subscriptions] of __privateGet(this, _subscriptionMap)) {
42
+ if (subscriptions[0].viewportId.toString() === viewportId) {
43
+ __privateGet(this, _subscriptionMap).delete(tableName);
44
+ } else {
45
+ const links = subscriptions[0].dataSource.links;
46
+ if (links) {
47
+ for (let i = 0; i < links?.length; i++) {
48
+ if (links[i].parentClientVpId === viewportId) {
49
+ links.splice(i);
50
+ }
51
+ }
52
+ }
53
+ subscriptions[0].dataSource.links = links;
54
+ }
55
+ }
56
+ });
57
+ __publicField(this, "getLinks", (subscriptionMap, vuuLinks) => {
58
+ const visualLinks = [];
59
+ for (let i = 0; i < vuuLinks.length; i++) {
60
+ const subscriptions = subscriptionMap.get(vuuLinks[i].toTable);
61
+ if (subscriptions) {
62
+ subscriptions.forEach(({ viewportId, dataSource: { status } }) => {
63
+ if (status !== "suspended") {
64
+ const newLink = {
65
+ parentClientVpId: viewportId,
66
+ parentVpId: viewportId,
67
+ link: vuuLinks[i]
68
+ };
69
+ visualLinks.push(newLink);
70
+ }
71
+ });
72
+ }
73
+ }
74
+ return visualLinks;
75
+ });
76
+ __publicField(this, "visualLinkService", (message) => new Promise((resolve) => {
77
+ if (message.type === "CREATE_VISUAL_LINK") {
78
+ const { childColumnName, childVpId, parentColumnName, parentVpId } = message;
79
+ const childDataSource = this.getSubscribedDataSource(childVpId);
80
+ const parentDataSource = this.getSubscribedDataSource(parentVpId);
81
+ const runtimeVisualLink = new RuntimeVisualLink.RuntimeVisualLink(
82
+ childDataSource,
83
+ parentDataSource,
84
+ childColumnName,
85
+ parentColumnName
86
+ );
87
+ __privateGet(this, _runtimeVisualLinks).set(childVpId, runtimeVisualLink);
88
+ resolve({
89
+ clientViewportId: childVpId,
90
+ colName: childColumnName,
91
+ parentColName: parentColumnName,
92
+ parentViewportId: parentVpId,
93
+ type: "vuu-link-created"
94
+ });
95
+ } else {
96
+ const runtimeVisualLink = __privateGet(this, _runtimeVisualLinks).get(
97
+ message.childVpId
98
+ );
99
+ if (runtimeVisualLink) {
100
+ runtimeVisualLink.remove();
101
+ __privateGet(this, _runtimeVisualLinks).delete(message.childVpId);
102
+ } else {
103
+ throw Error(
104
+ `visualLinkService no visual link found for viewport #${message.childVpId}`
105
+ );
106
+ }
107
+ resolve();
108
+ }
109
+ }));
110
+ __publicField(this, "createDataSource", (tableName, viewport, config) => {
111
+ const getVisualLinks = (tableName2) => {
112
+ const linksForTable = __privateGet(this, _visualLinks)?.[tableName2];
113
+ return linksForTable === void 0 ? void 0 : this.getLinks(__privateGet(this, _subscriptionMap), linksForTable);
114
+ };
115
+ const columnDescriptors = this.getColumnDescriptors(tableName);
116
+ const table = __privateGet(this, _tables)[tableName];
117
+ const sessionTable = __privateGet(this, _sessionTableMap)[tableName];
118
+ const dataSource = new TickingArrayDataSource.TickingArrayDataSource({
119
+ ...config,
120
+ columnDescriptors,
121
+ getVisualLinks,
122
+ keyColumn: __privateGet(this, _schemas)[tableName] === void 0 ? __privateGet(this, _sessionTableMap)[tableName].schema.key : __privateGet(this, _schemas)[tableName].key,
123
+ table: table || sessionTable,
124
+ menu: __privateGet(this, _menus)?.[tableName],
125
+ rpcServices: this.getServices(tableName),
126
+ sessionTables: __privateGet(this, _sessionTableMap),
127
+ viewport,
128
+ visualLinkService: this.visualLinkService
129
+ });
130
+ dataSource.on("unsubscribed", this.unregisterViewport);
131
+ const existingSubscriptions = __privateGet(this, _subscriptionMap).get(tableName);
132
+ const subscription = {
133
+ viewportId: dataSource.viewport,
134
+ dataSource
135
+ };
136
+ if (existingSubscriptions) {
137
+ existingSubscriptions.push(subscription);
138
+ } else {
139
+ __privateGet(this, _subscriptionMap).set(tableName, [subscription]);
140
+ }
141
+ return dataSource;
142
+ });
143
+ __publicField(this, "suggestionFetcher", ([
144
+ vuuTable,
145
+ column,
146
+ pattern
147
+ ]) => {
148
+ const table = __privateGet(this, _tables)[vuuTable.table];
149
+ if (table) {
150
+ return makeSuggestions.makeSuggestions(table, column, pattern);
151
+ } else {
152
+ throw Error(
153
+ `${__privateGet(this, _name)} suggestionFetcher, unknown table ${vuuTable.module} ${vuuTable.table}`
154
+ );
155
+ }
156
+ });
157
+ __publicField(this, "openBulkEdits", async (rpcRequest) => {
158
+ if (withParams(rpcRequest)) {
159
+ const { namedParams, vpId } = rpcRequest;
160
+ const selectedRowIds = namedParams.selectedRowIds;
161
+ const table = namedParams.table;
162
+ if (selectedRowIds && table) {
163
+ const dataTable = __privateGet(this, _tables)[table.table];
164
+ if (dataTable) {
165
+ const sessionTable = this.createSessionTableFromSelectedRows(
166
+ dataTable,
167
+ selectedRowIds
168
+ );
169
+ const sessionTableName = `session-${vuuUtils.uuid()}`;
170
+ __privateGet(this, _sessionTableMap)[sessionTableName] = sessionTable;
171
+ return {
172
+ action: {
173
+ renderComponent: "grid",
174
+ table: {
175
+ module: table.module,
176
+ table: sessionTableName
177
+ },
178
+ tableSchema: dataTable.schema,
179
+ type: "OPEN_DIALOG_ACTION"
180
+ },
181
+ rpcName: "VP_BULK_EDIT_BEGIN_RPC",
182
+ type: "VIEW_PORT_MENU_RESP",
183
+ vpId
184
+ };
185
+ } else {
186
+ return {
187
+ action: { type: "NO_ACTION" },
188
+ clientViewportId: "na",
189
+ error: "No Table found",
190
+ rpcName: "VP_BULK_EDIT_REJECT",
191
+ type: "VIEW_PORT_MENU_REJ",
192
+ vpId
193
+ };
194
+ }
195
+ }
196
+ }
197
+ throw Error("openBulkEdits expects Table and selectedRowIds");
198
+ });
199
+ __publicField(this, "endEditSession", async (rpcRequest) => {
200
+ if (vuuUtils.isViewportRpcRequest(rpcRequest)) {
201
+ const { vpId } = rpcRequest;
202
+ delete __privateGet(this, _sessionTableMap)[vpId];
203
+ return {
204
+ action: { type: "VP_RPC_SUCCESS" },
205
+ method: "???",
206
+ namedParams: {},
207
+ params: [],
208
+ type: "VIEW_PORT_RPC_REPONSE",
209
+ vpId
210
+ };
211
+ } else {
212
+ throw Error("endEditSession invalid request");
213
+ }
214
+ });
215
+ // Bulk-edit with input in session table
216
+ __publicField(this, "applyBulkEdits", async (rpcRequest) => {
217
+ if (withParams(rpcRequest)) {
218
+ const { vpId } = rpcRequest;
219
+ const sessionTable = this.getSessionTable(vpId);
220
+ for (let i = 0; i < sessionTable.data.length; i++) {
221
+ const newRow = sessionTable.data[i];
222
+ const { column, value } = rpcRequest.namedParams;
223
+ const keyIndex = sessionTable.map[sessionTable.schema.key];
224
+ sessionTable.update(
225
+ String(newRow[keyIndex]),
226
+ column,
227
+ value
228
+ );
229
+ }
230
+ return {
231
+ action: {
232
+ type: "NO_ACTION"
233
+ },
234
+ rpcName: "VP_BULK_EDIT_COLUMN_CELLS_RPC",
235
+ type: "VIEW_PORT_MENU_RESP",
236
+ vpId
237
+ };
238
+ }
239
+ throw Error("applyBulkEdits expects column and value as namedParams");
240
+ });
241
+ // Save session table data to main table
242
+ __publicField(this, "saveBulkEdits", async (rpcRequest) => {
243
+ if (withParams(rpcRequest)) {
244
+ const { vpId } = rpcRequest;
245
+ const sessionTable = this.getSessionTable(vpId);
246
+ const { table } = sessionTable.schema.table;
247
+ const baseTable = __privateGet(this, _tables)[table];
248
+ if (baseTable) {
249
+ for (let i = 0; i < sessionTable.data.length; i++) {
250
+ const newRow = sessionTable.data[i];
251
+ baseTable.updateRow(newRow);
252
+ }
253
+ return {
254
+ action: {
255
+ type: "VP_RPC_SUCCESS"
256
+ },
257
+ requestId: "request_id",
258
+ rpcName: "VP_BULK_EDIT_SUBMIT_RPC",
259
+ type: "VIEW_PORT_MENU_RESP",
260
+ vpId
261
+ };
262
+ }
263
+ }
264
+ throw Error("saveBulkEdits base table not found");
265
+ });
266
+ /**
267
+ * These services are available on any table. The client must configure the appropriate
268
+ * menu item(s) on Table(s). The services to implement these RPC calls are built-in to
269
+ * VuuModule
270
+ */
271
+ __privateAdd(this, _moduleServices, [
272
+ {
273
+ rpcName: "VP_BULK_EDIT_BEGIN_RPC",
274
+ service: this.openBulkEdits
275
+ },
276
+ {
277
+ rpcName: "VP_BULK_EDIT_COLUMN_CELLS_RPC",
278
+ service: this.applyBulkEdits
279
+ },
280
+ {
281
+ rpcName: "VP_BULK_EDIT_SUBMIT_RPC",
282
+ service: this.saveBulkEdits
283
+ },
284
+ {
285
+ rpcName: "VP_BULK_EDIT_END_RPC",
286
+ service: this.endEditSession
287
+ }
288
+ ]);
289
+ __privateSet(this, _menus, menus);
290
+ __privateSet(this, _name, name);
291
+ __privateSet(this, _schemas, schemas);
292
+ __privateSet(this, _tableServices, services);
293
+ __privateSet(this, _tables, tables);
294
+ __privateSet(this, _visualLinks, visualLinks);
295
+ }
296
+ getSubscribedDataSource(vpId) {
297
+ for (const subscriptions of __privateGet(this, _subscriptionMap).values()) {
298
+ for (const { viewportId, dataSource } of subscriptions) {
299
+ if (viewportId === vpId) {
300
+ return dataSource;
301
+ }
302
+ }
303
+ }
304
+ throw Error(`getSubscribedDataSource #${vpId} not in subscriptionMap`);
305
+ }
306
+ getServices(tableName) {
307
+ const tableServices = __privateGet(this, _tableServices)?.[tableName];
308
+ if (Array.isArray(tableServices)) {
309
+ return __privateGet(this, _moduleServices).concat(tableServices);
310
+ } else {
311
+ return __privateGet(this, _moduleServices);
312
+ }
313
+ }
314
+ get typeaheadHook() {
315
+ return () => this.suggestionFetcher;
316
+ }
317
+ get sessionTableMap() {
318
+ return __privateGet(this, _sessionTableMap);
319
+ }
320
+ get tables() {
321
+ return __privateGet(this, _tables);
322
+ }
323
+ getSessionTable(sessionTableName) {
324
+ const sessionTable = __privateGet(this, _sessionTableMap)[sessionTableName];
325
+ if (sessionTable) {
326
+ return sessionTable;
327
+ } else {
328
+ throw Error(
329
+ `getSessionTable: no session table with name ${sessionTableName}`
330
+ );
331
+ }
332
+ }
333
+ getColumnDescriptors(tableName) {
334
+ const schema = __privateGet(this, _schemas)[tableName] || this.getSessionTable(tableName)?.schema;
335
+ if (schema) {
336
+ return schema.columns;
337
+ } else {
338
+ throw Error(
339
+ ` no schema found for module ${__privateGet(this, _name)} table ${tableName}`
340
+ );
341
+ }
342
+ }
343
+ createSessionTableFromSelectedRows({ data, map, schema }, selectedRowIds) {
344
+ const keyIndex = map[schema.key];
345
+ const sessionData = [];
346
+ for (let i = 0; i < selectedRowIds.length; i++) {
347
+ for (let j = 0; j < data.length; j++) {
348
+ if (data[j][keyIndex] === selectedRowIds[i]) {
349
+ sessionData.push(data[j]);
350
+ }
351
+ }
352
+ }
353
+ return new Table.Table(schema, sessionData, Table.buildDataColumnMapFromSchema(schema));
354
+ }
355
+ }
356
+ _menus = new WeakMap();
357
+ _name = new WeakMap();
358
+ _runtimeVisualLinks = new WeakMap();
359
+ _schemas = new WeakMap();
360
+ _sessionTableMap = new WeakMap();
361
+ _tables = new WeakMap();
362
+ _tableServices = new WeakMap();
363
+ _visualLinks = new WeakMap();
364
+ _subscriptionMap = new WeakMap();
365
+ _moduleServices = new WeakMap();
366
+
367
+ exports.VuuModule = VuuModule;
368
+ exports.withNamedParams = withNamedParams;
369
+ exports.withParams = withParams;
370
+ //# sourceMappingURL=VuuModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VuuModule.js","sources":["../src/VuuModule.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceConfig,\n DataSourceVisualLinkCreatedMessage,\n OpenDialogActionWithSchema,\n SuggestionFetcher,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuRpcMenuRequest,\n VuuRpcViewportRequest,\n TypeaheadParams,\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 { makeSuggestions } from \"./makeSuggestions\";\nimport { RuntimeVisualLink } from \"./RuntimeVisualLink\";\n\nexport interface IVuuModule<T extends string = string> {\n createDataSource: (tableName: T) => DataSource;\n typeaheadHook: () => SuggestionFetcher;\n}\n\nexport interface VuuModuleConstructorProps<T extends string = string> {\n menus?: Record<T, VuuMenu | undefined>;\n name: string;\n schemas: Record<T, Readonly<TableSchema>>;\n services?: Record<T, RpcService[] | undefined>;\n tables: Record<T, Table>;\n vuuLinks?: Record<T, VuuLink[] | undefined>;\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 class VuuModule<T extends string = string> implements IVuuModule<T> {\n #menus: Record<T, VuuMenu | undefined> | undefined;\n #name: string;\n #runtimeVisualLinks = new Map<string, RuntimeVisualLink>();\n #schemas: Record<T, Readonly<TableSchema>>;\n #sessionTableMap: SessionTableMap = {};\n #tables: Record<T, Table>;\n #tableServices: Record<T, RpcService[] | undefined> | undefined;\n #visualLinks: Record<T, VuuLink[] | undefined> | undefined;\n #subscriptionMap: Map<string, Subscription[]> = new Map();\n\n constructor({\n menus,\n name,\n schemas,\n services,\n tables,\n vuuLinks: visualLinks,\n }: VuuModuleConstructorProps<T>) {\n this.#menus = menus;\n this.#name = name;\n this.#schemas = schemas;\n this.#tableServices = services;\n this.#tables = tables;\n this.#visualLinks = visualLinks;\n }\n\n private 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 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.#tableServices?.[tableName];\n if (Array.isArray(tableServices)) {\n return this.#moduleServices.concat(tableServices);\n } else {\n return this.#moduleServices;\n }\n }\n\n get typeaheadHook() {\n return () => this.suggestionFetcher;\n }\n\n protected get sessionTableMap() {\n return this.#sessionTableMap;\n }\n\n protected get tables() {\n return this.#tables;\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 suggestionFetcher: SuggestionFetcher = ([\n vuuTable,\n column,\n pattern,\n ]: TypeaheadParams) => {\n const table = this.#tables[vuuTable.table as T];\n if (table) {\n return makeSuggestions(table, column, pattern);\n } else {\n throw Error(\n `${this.#name} suggestionFetcher, unknown table ${vuuTable.module} ${\n vuuTable.table\n }`,\n );\n }\n };\n\n private openBulkEdits: 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_REPONSE\",\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","makeSuggestions","uuid","isViewportRpcRequest","Table","buildDataColumnMapFromSchema"],"mappings":"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"}