@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,87 @@
1
+ import { buildColumnMap } from '@vuu-ui/vuu-utils';
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __typeError = (msg) => {
5
+ throw TypeError(msg);
6
+ };
7
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
8
+ var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
9
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
10
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), member.get(obj));
11
+ 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);
12
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
13
+ var _childColumnName, _childDataSource, _parentColumnName, _parentDataSource;
14
+ class RuntimeVisualLink {
15
+ constructor(childDataSource, parentDataSource, childColumnName, parentColumnName) {
16
+ __privateAdd(this, _childColumnName);
17
+ __privateAdd(this, _childDataSource);
18
+ __privateAdd(this, _parentColumnName);
19
+ __privateAdd(this, _parentDataSource);
20
+ __publicField(this, "handleParentSelectEvent", (selection) => {
21
+ if (__privateGet(this, _childDataSource)) {
22
+ const selectedValues = this.pickUniqueSelectedValues(selection);
23
+ if (selectedValues.length === 0) {
24
+ __privateGet(this, _childDataSource).baseFilter = void 0;
25
+ } else if (selectedValues.length === 1) {
26
+ __privateGet(this, _childDataSource).baseFilter = {
27
+ filter: `${__privateGet(this, _childColumnName)} = "${selectedValues[0]}"`
28
+ };
29
+ } else {
30
+ __privateGet(this, _childDataSource).baseFilter = {
31
+ filter: `${__privateGet(this, _childColumnName)} in ["${selectedValues.join('","')}"]`
32
+ };
33
+ }
34
+ }
35
+ });
36
+ __privateSet(this, _childColumnName, childColumnName);
37
+ __privateSet(this, _childDataSource, childDataSource);
38
+ __privateSet(this, _parentColumnName, parentColumnName);
39
+ __privateSet(this, _parentDataSource, parentDataSource);
40
+ parentDataSource.on("row-selection", this.handleParentSelectEvent);
41
+ }
42
+ destroy() {
43
+ }
44
+ remove() {
45
+ __privateGet(this, _parentDataSource)?.removeListener(
46
+ "row-selection",
47
+ this.handleParentSelectEvent
48
+ );
49
+ __privateGet(this, _childDataSource).baseFilter = { filter: "" };
50
+ }
51
+ pickUniqueSelectedValues(selection) {
52
+ const data = __privateGet(this, _parentDataSource).currentData;
53
+ const selectedRows = selection.reduce(
54
+ (rows, selected) => {
55
+ if (Array.isArray(selected)) {
56
+ for (let i = selected[0]; i <= selected[1]; i++) {
57
+ const row = data[i];
58
+ if (row) {
59
+ rows.push(row);
60
+ }
61
+ }
62
+ } else {
63
+ const row = data[selected];
64
+ if (row) {
65
+ rows.push(row);
66
+ }
67
+ }
68
+ return rows;
69
+ },
70
+ []
71
+ );
72
+ const map = buildColumnMap(__privateGet(this, _parentDataSource).columns);
73
+ const set = /* @__PURE__ */ new Set();
74
+ const colIndex = map[__privateGet(this, _parentColumnName)];
75
+ for (const row of selectedRows) {
76
+ set.add(row[colIndex]);
77
+ }
78
+ return Array.from(set);
79
+ }
80
+ }
81
+ _childColumnName = new WeakMap();
82
+ _childDataSource = new WeakMap();
83
+ _parentColumnName = new WeakMap();
84
+ _parentDataSource = new WeakMap();
85
+
86
+ export { RuntimeVisualLink };
87
+ //# sourceMappingURL=RuntimeVisualLink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RuntimeVisualLink.js","sources":["../src/RuntimeVisualLink.ts"],"sourcesContent":["import {\n DataSource,\n DataSourceRow,\n RowSelectionEventHandler,\n Selection,\n SelectionItem,\n} from \"@vuu-ui/vuu-data-types\";\nimport { buildColumnMap } from \"@vuu-ui/vuu-utils\";\nimport { TickingArrayDataSource } from \"./TickingArrayDataSource\";\n\nexport class RuntimeVisualLink {\n #childColumnName: string;\n #childDataSource: DataSource;\n #parentColumnName: string;\n #parentDataSource: DataSource;\n\n constructor(\n childDataSource: DataSource,\n parentDataSource: DataSource,\n childColumnName: string,\n parentColumnName: string,\n ) {\n this.#childColumnName = childColumnName;\n this.#childDataSource = childDataSource;\n this.#parentColumnName = parentColumnName;\n this.#parentDataSource = parentDataSource;\n\n parentDataSource.on(\"row-selection\", this.handleParentSelectEvent);\n }\n\n destroy() {\n // do we need to do anything\n }\n\n remove() {\n this.#parentDataSource?.removeListener(\n \"row-selection\",\n this.handleParentSelectEvent,\n );\n this.#childDataSource.baseFilter = { filter: \"\" };\n }\n\n handleParentSelectEvent: RowSelectionEventHandler = (selection) => {\n if (this.#childDataSource) {\n const selectedValues = this.pickUniqueSelectedValues(selection);\n if (selectedValues.length === 0) {\n this.#childDataSource.baseFilter = undefined;\n } else if (selectedValues.length === 1) {\n this.#childDataSource.baseFilter = {\n filter: `${this.#childColumnName} = \"${selectedValues[0]}\"`,\n };\n } else {\n this.#childDataSource.baseFilter = {\n filter: `${this.#childColumnName} in [\"${selectedValues.join('\",\"')}\"]`,\n };\n }\n }\n };\n\n private pickUniqueSelectedValues(selection: Selection) {\n const data = (this.#parentDataSource as TickingArrayDataSource).currentData;\n const selectedRows = selection.reduce<DataSourceRow[]>(\n (rows, selected: SelectionItem) => {\n if (Array.isArray(selected)) {\n for (let i = selected[0]; i <= selected[1]; i++) {\n const row = data[i];\n if (row) {\n rows.push(row);\n }\n }\n } else {\n const row = data[selected];\n if (row) {\n rows.push(row);\n }\n }\n return rows;\n },\n [],\n );\n\n const map = buildColumnMap(this.#parentDataSource.columns);\n const set = new Set();\n const colIndex = map[this.#parentColumnName];\n for (const row of selectedRows) {\n set.add(row[colIndex]);\n }\n return Array.from(set) as string[];\n }\n}\n"],"names":[],"mappings":"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"}
package/esm/Table.js ADDED
@@ -0,0 +1,179 @@
1
+ import { EventEmitter } from '@vuu-ui/vuu-utils';
2
+
3
+ var __typeError = (msg) => {
4
+ throw TypeError(msg);
5
+ };
6
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
7
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
8
+ 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);
9
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
10
+ var _data, _dataMap, _indexOfKey, _index, _schema;
11
+ class Table extends EventEmitter {
12
+ constructor(schema, data, dataMap, updateGenerator) {
13
+ super();
14
+ __privateAdd(this, _data);
15
+ __privateAdd(this, _dataMap);
16
+ __privateAdd(this, _indexOfKey);
17
+ __privateAdd(this, _index, /* @__PURE__ */ new Map());
18
+ __privateAdd(this, _schema);
19
+ __privateSet(this, _data, data);
20
+ __privateSet(this, _dataMap, dataMap);
21
+ __privateSet(this, _schema, schema);
22
+ __privateSet(this, _indexOfKey, dataMap[schema.key]);
23
+ this.buildIndex();
24
+ updateGenerator?.setTable(this);
25
+ updateGenerator?.setRange({ from: 0, to: 100 });
26
+ }
27
+ buildIndex() {
28
+ for (let i = 0; i < __privateGet(this, _data).length; i++) {
29
+ const key = __privateGet(this, _data)[i][__privateGet(this, _indexOfKey)];
30
+ __privateGet(this, _index).set(key, i);
31
+ }
32
+ }
33
+ get data() {
34
+ return __privateGet(this, _data);
35
+ }
36
+ get map() {
37
+ return __privateGet(this, _dataMap);
38
+ }
39
+ get schema() {
40
+ return __privateGet(this, _schema);
41
+ }
42
+ insert(row) {
43
+ const index = __privateGet(this, _data).length;
44
+ __privateGet(this, _data).push(row);
45
+ const key = row[__privateGet(this, _indexOfKey)];
46
+ __privateGet(this, _index).set(key, index);
47
+ this.emit("insert", row);
48
+ }
49
+ findByKey(key) {
50
+ const index = __privateGet(this, _index).get(key) ?? -1;
51
+ return __privateGet(this, _data)[index];
52
+ }
53
+ update(key, columnName, value) {
54
+ const rowIndex = __privateGet(this, _data).findIndex(
55
+ (row) => row[__privateGet(this, _indexOfKey)] === key
56
+ );
57
+ const colIndex = __privateGet(this, _dataMap)[columnName];
58
+ if (rowIndex !== -1) {
59
+ const row = __privateGet(this, _data)[rowIndex];
60
+ const newRow = row.slice();
61
+ newRow[colIndex] = value;
62
+ __privateGet(this, _data)[rowIndex] = newRow;
63
+ this.emit("update", newRow, columnName);
64
+ }
65
+ }
66
+ updateRow(row) {
67
+ const key = row[__privateGet(this, _indexOfKey)];
68
+ const rowIndex = __privateGet(this, _data).findIndex(
69
+ (row2) => row2[__privateGet(this, _indexOfKey)] === key
70
+ );
71
+ if (rowIndex !== -1) {
72
+ __privateGet(this, _data)[rowIndex] = row;
73
+ this.emit("update", row);
74
+ }
75
+ }
76
+ }
77
+ _data = new WeakMap();
78
+ _dataMap = new WeakMap();
79
+ _indexOfKey = new WeakMap();
80
+ _index = new WeakMap();
81
+ _schema = new WeakMap();
82
+ function buildDataColumnMapFromSchema(schema) {
83
+ return Object.values(schema.columns).reduce(
84
+ (map, col, index) => ({
85
+ ...map,
86
+ [col.name]: index
87
+ }),
88
+ {}
89
+ );
90
+ }
91
+ function buildDataColumnMap(schemas, tableName) {
92
+ return buildDataColumnMapFromSchema(schemas[tableName]);
93
+ }
94
+ const getServerDataType = (columnName, { columns: cols1, table: t1 }, { columns: cols2, table: t2 }) => {
95
+ const col1 = cols1.find((col) => col.name === columnName);
96
+ const col2 = cols2.find((col) => col.name === columnName);
97
+ if (col1 && col2) {
98
+ if (col1.serverDataType === col2.serverDataType) {
99
+ return col1.serverDataType;
100
+ } else {
101
+ throw Error(
102
+ `both tables ${t1.table} and ${t2.table} implement column ${columnName}, but with types differ`
103
+ );
104
+ }
105
+ } else if (col1) {
106
+ return col1.serverDataType;
107
+ } else if (col2) {
108
+ return col2.serverDataType;
109
+ } else {
110
+ throw Error(`WTF how is this possible`);
111
+ }
112
+ };
113
+ const joinTables = (joinTable, table1, table2, joinColumn) => {
114
+ const { map: m1, schema: schema1 } = table1;
115
+ const { map: m2, schema: schema2 } = table2;
116
+ const k1 = m1[joinColumn];
117
+ const k2 = m2[joinColumn];
118
+ const combinedColumns = new Set(
119
+ [...schema1.columns, ...schema2.columns].map((col) => col.name).sort()
120
+ );
121
+ const combinedSchema = {
122
+ key: joinColumn,
123
+ table: joinTable,
124
+ columns: Array.from(combinedColumns).map((columnName) => ({
125
+ name: columnName,
126
+ serverDataType: getServerDataType(columnName, schema1, schema2)
127
+ }))
128
+ };
129
+ const data = [];
130
+ const combinedColumnMap = buildDataColumnMapFromSchema(combinedSchema);
131
+ for (const row of table1.data) {
132
+ const row2 = table2.findByKey(String(row[k1]));
133
+ if (row2) {
134
+ const out = [];
135
+ for (const column of table1.schema.columns) {
136
+ const value = row[m1[column.name]];
137
+ out[combinedColumnMap[column.name]] = value;
138
+ }
139
+ for (const column of table2.schema.columns) {
140
+ const value = row2[m2[column.name]];
141
+ out[combinedColumnMap[column.name]] = value;
142
+ }
143
+ data.push(out);
144
+ }
145
+ }
146
+ const newTable = new Table(combinedSchema, data, combinedColumnMap);
147
+ table1.on("insert", (row) => {
148
+ const row2 = table2.findByKey(String(row[k1]));
149
+ if (row2) {
150
+ const out = [];
151
+ for (const column of table1.schema.columns) {
152
+ const value = row[m1[column.name]];
153
+ out[combinedColumnMap[column.name]] = value;
154
+ }
155
+ for (const column of table2.schema.columns) {
156
+ const value = row2[m2[column.name]];
157
+ out[combinedColumnMap[column.name]] = value;
158
+ }
159
+ newTable.insert(out);
160
+ }
161
+ });
162
+ table2.on("update", (row) => {
163
+ const keyValue = row[k2];
164
+ const targetRow = newTable.findByKey(keyValue);
165
+ if (targetRow) {
166
+ const updatedRow = targetRow.slice();
167
+ for (const { name } of table2.schema.columns) {
168
+ if (row[m2[name]] !== updatedRow[combinedColumnMap[name]]) {
169
+ updatedRow[combinedColumnMap[name]] = row[m2[name]];
170
+ }
171
+ }
172
+ newTable.updateRow(updatedRow);
173
+ }
174
+ });
175
+ return newTable;
176
+ };
177
+
178
+ export { Table, buildDataColumnMap, buildDataColumnMapFromSchema, joinTables };
179
+ //# sourceMappingURL=Table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Table.js","sources":["../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[]) {\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 this.emit(\"insert\", row);\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 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\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":["row"],"mappings":"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"}
@@ -0,0 +1,206 @@
1
+ import { ArrayDataSource } from '@vuu-ui/vuu-data-local';
2
+ import { isViewportRpcRequest, isVuuMenuRpcRequest, metadataKeys } from '@vuu-ui/vuu-utils';
3
+ import { makeSuggestions } from './makeSuggestions.js';
4
+
5
+ var __typeError = (msg) => {
6
+ throw TypeError(msg);
7
+ };
8
+ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
9
+ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), member.get(obj));
10
+ 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);
11
+ var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
12
+ var _menuRpcServices, _pendingVisualLink, _rpcServices, _sessionTables, _table, _selectionLinkSubscribers, _visualLinkService, _getVisualLinks;
13
+ const { KEY } = metadataKeys;
14
+ class TickingArrayDataSource extends ArrayDataSource {
15
+ constructor({
16
+ data,
17
+ getVisualLinks,
18
+ menuRpcServices,
19
+ rpcServices,
20
+ sessionTables,
21
+ table,
22
+ menu,
23
+ visualLink,
24
+ visualLinkService,
25
+ ...arrayDataSourceProps
26
+ }) {
27
+ if (data === void 0 && table === void 0) {
28
+ throw Error("TickingArrayDataSource must be constructed with data");
29
+ }
30
+ super({
31
+ ...arrayDataSourceProps,
32
+ data: data ?? table?.data ?? []
33
+ });
34
+ __privateAdd(this, _menuRpcServices);
35
+ __privateAdd(this, _pendingVisualLink);
36
+ __privateAdd(this, _rpcServices);
37
+ // A reference to session tables hosted within client side module
38
+ __privateAdd(this, _sessionTables);
39
+ __privateAdd(this, _table);
40
+ __privateAdd(this, _selectionLinkSubscribers);
41
+ __privateAdd(this, _visualLinkService);
42
+ __privateAdd(this, _getVisualLinks);
43
+ this._menu = menu;
44
+ __privateSet(this, _menuRpcServices, menuRpcServices);
45
+ __privateSet(this, _pendingVisualLink, visualLink);
46
+ __privateSet(this, _rpcServices, rpcServices);
47
+ __privateSet(this, _sessionTables, sessionTables);
48
+ __privateSet(this, _table, table);
49
+ __privateSet(this, _visualLinkService, visualLinkService);
50
+ __privateSet(this, _getVisualLinks, getVisualLinks);
51
+ if (table) {
52
+ this.tableSchema = table.schema;
53
+ table.on("insert", this.insert);
54
+ table.on("update", this.updateRow);
55
+ }
56
+ }
57
+ async subscribe(subscribeProps, callback) {
58
+ const subscription = super.subscribe(subscribeProps, callback);
59
+ if (__privateGet(this, _pendingVisualLink)) {
60
+ this.visualLink = __privateGet(this, _pendingVisualLink);
61
+ __privateSet(this, _pendingVisualLink, void 0);
62
+ }
63
+ return subscription;
64
+ }
65
+ unsubscribe() {
66
+ super.unsubscribe();
67
+ __privateSet(this, _table, void 0);
68
+ }
69
+ set range(range) {
70
+ super.range = range;
71
+ }
72
+ get range() {
73
+ return super.range;
74
+ }
75
+ set links(links) {
76
+ super.links = links;
77
+ }
78
+ get links() {
79
+ var _a;
80
+ return (_a = __privateGet(this, _getVisualLinks)) == null ? void 0 : _a.call(this, this.table.table);
81
+ }
82
+ getSelectedRowIds() {
83
+ return this.selectedRows.reduce(
84
+ (rowIds, selection) => {
85
+ if (Array.isArray(selection)) {
86
+ for (let i = selection[0]; i <= selection[1]; i++) {
87
+ const row = this.data[i];
88
+ if (row) {
89
+ rowIds.push(row[KEY]);
90
+ }
91
+ }
92
+ } else {
93
+ const row = this.data[selection];
94
+ if (row) {
95
+ rowIds.push(row[KEY]);
96
+ }
97
+ }
98
+ return rowIds;
99
+ },
100
+ []
101
+ );
102
+ }
103
+ applyEdit(rowKey, columnName, value) {
104
+ __privateGet(this, _table)?.update(rowKey, columnName, value);
105
+ return Promise.resolve(true);
106
+ }
107
+ async rpcCall(rpcRequest) {
108
+ if (isViewportRpcRequest(rpcRequest)) {
109
+ const rpcService = __privateGet(this, _rpcServices)?.find(
110
+ (service) => service.rpcName === rpcRequest.rpcName
111
+ );
112
+ if (rpcService && isViewportRpcRequest(rpcRequest)) {
113
+ switch (rpcRequest.rpcName) {
114
+ case "VP_BULK_EDIT_COLUMN_CELLS_RPC": {
115
+ return rpcService.service({
116
+ ...rpcRequest,
117
+ vpId: this.viewport
118
+ });
119
+ }
120
+ }
121
+ return rpcService.service({
122
+ ...rpcRequest,
123
+ namedParams: {
124
+ selectedRowIds: this.getSelectedRowIds(),
125
+ table: this.tableSchema.table
126
+ },
127
+ vpId: this.viewport
128
+ });
129
+ }
130
+ }
131
+ throw Error(`no implementation for PRC service ${rpcRequest.type}`);
132
+ }
133
+ async menuRpcCall(rpcRequest) {
134
+ const rpcService = __privateGet(this, _rpcServices)?.find(
135
+ (service) => service.rpcName === rpcRequest.rpcName
136
+ );
137
+ if (isVuuMenuRpcRequest(rpcRequest)) {
138
+ return rpcService?.service({
139
+ ...rpcRequest,
140
+ namedParams: {
141
+ selectedRowIds: this.getSelectedRowIds(),
142
+ table: this.tableSchema.table
143
+ },
144
+ vpId: this.viewport
145
+ });
146
+ }
147
+ return super.menuRpcCall(rpcRequest);
148
+ }
149
+ getTypeaheadSuggestions(column, pattern) {
150
+ if (__privateGet(this, _table)) {
151
+ return makeSuggestions(__privateGet(this, _table), column, pattern);
152
+ } else {
153
+ throw Error(
154
+ "cannot call getTypeaheadSuggestions on TickingDataSource if table has not been provided"
155
+ );
156
+ }
157
+ }
158
+ get visualLink() {
159
+ return this._config.visualLink;
160
+ }
161
+ set visualLink(visualLink) {
162
+ var _a, _b;
163
+ this._config = {
164
+ ...this._config,
165
+ visualLink
166
+ };
167
+ if (visualLink) {
168
+ const {
169
+ parentClientVpId,
170
+ link: { fromColumn, toColumn }
171
+ } = visualLink;
172
+ if (this.viewport) {
173
+ (_a = __privateGet(this, _visualLinkService)) == null ? void 0 : _a.call(this, {
174
+ childVpId: this.viewport,
175
+ childColumnName: fromColumn,
176
+ type: "CREATE_VISUAL_LINK",
177
+ parentVpId: parentClientVpId,
178
+ parentColumnName: toColumn
179
+ }).then((response) => {
180
+ this.emit(
181
+ "visual-link-created",
182
+ response
183
+ );
184
+ });
185
+ }
186
+ } else {
187
+ (_b = __privateGet(this, _visualLinkService)) == null ? void 0 : _b.call(this, {
188
+ childVpId: this.viewport,
189
+ type: "REMOVE_VISUAL_LINK"
190
+ }).then(() => {
191
+ this.emit("visual-link-removed");
192
+ });
193
+ }
194
+ }
195
+ }
196
+ _menuRpcServices = new WeakMap();
197
+ _pendingVisualLink = new WeakMap();
198
+ _rpcServices = new WeakMap();
199
+ _sessionTables = new WeakMap();
200
+ _table = new WeakMap();
201
+ _selectionLinkSubscribers = new WeakMap();
202
+ _visualLinkService = new WeakMap();
203
+ _getVisualLinks = new WeakMap();
204
+
205
+ export { TickingArrayDataSource };
206
+ //# sourceMappingURL=TickingArrayDataSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TickingArrayDataSource.js","sources":["../src/TickingArrayDataSource.ts"],"sourcesContent":["import {\n ArrayDataSource,\n ArrayDataSourceConstructorProps,\n} from \"@vuu-ui/vuu-data-local\";\nimport type {\n DataSourceVisualLinkCreatedMessage,\n SelectionItem,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n VuuRpcMenuRequest,\n LinkDescriptorWithLabel,\n RpcNamedParams,\n VuuMenu,\n VuuRowDataItemType,\n VuuRpcResponse,\n VuuRpcMenuResponse,\n VuuRpcRequest,\n VuuCreateVisualLink,\n VuuRemoveVisualLink,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n isViewportRpcRequest,\n isVuuMenuRpcRequest,\n metadataKeys,\n Range,\n} from \"@vuu-ui/vuu-utils\";\nimport { makeSuggestions } from \"./makeSuggestions\";\nimport { Table } from \"./Table\";\nimport { RpcService, SessionTableMap } from \"./VuuModule\";\n\nconst { KEY } = metadataKeys;\n\nexport type VisualLinkHandler = (\n message: VuuCreateVisualLink | VuuRemoveVisualLink,\n) => Promise<DataSourceVisualLinkCreatedMessage | void>;\n\nexport interface TickingArrayDataSourceConstructorProps\n extends Omit<ArrayDataSourceConstructorProps, \"data\"> {\n data?: Array<VuuRowDataItemType[]>;\n getVisualLinks?: (tableName: string) => LinkDescriptorWithLabel[] | undefined;\n menu?: VuuMenu;\n menuRpcServices?: RpcService[];\n rpcServices?: RpcService[];\n sessionTables?: SessionTableMap;\n table?: Table;\n visualLinkService?: VisualLinkHandler;\n}\n\ntype LinkSubscription = {\n sourceColumnName?: string;\n columnName: string;\n linkType: \"subscribe-link-filter\" | \"subscribe-link-select\";\n};\n\nexport class TickingArrayDataSource extends ArrayDataSource {\n #menuRpcServices: RpcService[] | undefined;\n #pendingVisualLink?: LinkDescriptorWithLabel;\n #rpcServices: RpcService[] | undefined;\n // A reference to session tables hosted within client side module\n #sessionTables: SessionTableMap | undefined;\n #table?: Table;\n #selectionLinkSubscribers: Map<string, LinkSubscription> | undefined;\n #visualLinkService?: VisualLinkHandler;\n #getVisualLinks?: (\n tableName: string,\n ) => LinkDescriptorWithLabel[] | undefined;\n\n constructor({\n data,\n getVisualLinks,\n menuRpcServices,\n rpcServices,\n sessionTables,\n table,\n menu,\n visualLink,\n visualLinkService,\n ...arrayDataSourceProps\n }: TickingArrayDataSourceConstructorProps) {\n if (data === undefined && table === undefined) {\n throw Error(\"TickingArrayDataSource must be constructed with data\");\n }\n super({\n ...arrayDataSourceProps,\n data: data ?? table?.data ?? [],\n });\n this._menu = menu;\n\n this.#menuRpcServices = menuRpcServices;\n this.#pendingVisualLink = visualLink;\n this.#rpcServices = rpcServices;\n this.#sessionTables = sessionTables;\n this.#table = table;\n this.#visualLinkService = visualLinkService;\n this.#getVisualLinks = getVisualLinks;\n\n if (table) {\n this.tableSchema = table.schema;\n table.on(\"insert\", this.insert);\n table.on(\"update\", this.updateRow);\n }\n }\n\n async subscribe(\n subscribeProps: DataSourceSubscribeProps,\n callback: DataSourceSubscribeCallback,\n ) {\n const subscription = super.subscribe(subscribeProps, callback);\n // if (subscribeProps.range) {\n // this.#updateGenerator?.setRange(subscribeProps.range);\n // }\n if (this.#pendingVisualLink) {\n this.visualLink = this.#pendingVisualLink;\n this.#pendingVisualLink = undefined;\n }\n\n return subscription;\n }\n\n unsubscribe() {\n super.unsubscribe();\n this.#table = undefined;\n }\n\n set range(range: Range) {\n super.range = range;\n // this.#updateGenerator?.setRange(range);\n }\n get range() {\n return super.range;\n }\n\n set links(links: LinkDescriptorWithLabel[] | undefined) {\n super.links = links;\n }\n\n get links() {\n return this.#getVisualLinks?.(this.table.table);\n }\n\n private getSelectedRowIds() {\n return this.selectedRows.reduce<string[]>(\n (rowIds: string[], selection: SelectionItem) => {\n if (Array.isArray(selection)) {\n for (let i = selection[0]; i <= selection[1]; i++) {\n const row = this.data[i];\n if (row) {\n rowIds.push(row[KEY]);\n }\n }\n } else {\n const row = this.data[selection];\n if (row) {\n rowIds.push(row[KEY]);\n }\n }\n return rowIds;\n },\n [],\n );\n }\n\n applyEdit(\n rowKey: string,\n columnName: string,\n value: VuuRowDataItemType,\n ): Promise<true> {\n this.#table?.update(rowKey, columnName, value);\n return Promise.resolve(true);\n }\n\n async rpcCall<T extends VuuRpcResponse = VuuRpcResponse>(\n rpcRequest: Omit<VuuRpcRequest, \"vpId\">,\n ): Promise<T> {\n if (isViewportRpcRequest(rpcRequest)) {\n const rpcService = this.#rpcServices?.find(\n (service) => service.rpcName === rpcRequest.rpcName,\n );\n if (rpcService && isViewportRpcRequest(rpcRequest)) {\n switch (rpcRequest.rpcName) {\n case \"VP_BULK_EDIT_COLUMN_CELLS_RPC\": {\n return rpcService.service({\n ...rpcRequest,\n vpId: this.viewport,\n }) as Promise<T>;\n }\n }\n return rpcService.service({\n ...rpcRequest,\n namedParams: {\n selectedRowIds: this.getSelectedRowIds(),\n table: this.tableSchema.table,\n },\n vpId: this.viewport,\n }) as Promise<T>;\n }\n }\n throw Error(`no implementation for PRC service ${rpcRequest.type}`);\n }\n\n async menuRpcCall(\n rpcRequest: Omit<VuuRpcRequest, \"vpId\"> & {\n namedParams?: RpcNamedParams;\n },\n ): Promise<VuuRpcResponse> {\n const rpcService = this.#rpcServices?.find(\n (service) =>\n service.rpcName === (rpcRequest as VuuRpcMenuRequest).rpcName,\n );\n\n if (isVuuMenuRpcRequest(rpcRequest)) {\n return rpcService?.service({\n ...rpcRequest,\n namedParams: {\n selectedRowIds: this.getSelectedRowIds(),\n table: this.tableSchema.table,\n },\n vpId: this.viewport,\n }) as Promise<VuuRpcMenuResponse>;\n }\n\n return super.menuRpcCall(rpcRequest);\n }\n\n getTypeaheadSuggestions(column: string, pattern?: string): Promise<string[]> {\n if (this.#table) {\n return makeSuggestions(this.#table, column, pattern);\n } else {\n throw Error(\n \"cannot call getTypeaheadSuggestions on TickingDataSource if table has not been provided\",\n );\n }\n }\n\n get visualLink() {\n return this._config.visualLink;\n }\n\n set visualLink(visualLink: LinkDescriptorWithLabel | undefined) {\n this._config = {\n ...this._config,\n visualLink,\n };\n\n if (visualLink) {\n const {\n parentClientVpId,\n link: { fromColumn, toColumn },\n } = visualLink;\n\n if (this.viewport) {\n this.#visualLinkService?.({\n childVpId: this.viewport,\n childColumnName: fromColumn,\n type: \"CREATE_VISUAL_LINK\",\n parentVpId: parentClientVpId,\n parentColumnName: toColumn,\n }).then((response) => {\n this.emit(\n \"visual-link-created\",\n response as DataSourceVisualLinkCreatedMessage,\n );\n });\n }\n } else {\n this.#visualLinkService?.({\n childVpId: this.viewport,\n type: \"REMOVE_VISUAL_LINK\",\n }).then((/* response */) => {\n this.emit(\"visual-link-removed\");\n });\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ import { random, generateNextBidAsk, nextRandomDouble } from './data-utils.js';
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
5
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
6
+ const getNewValue = (value) => {
7
+ const multiplier = random(0, 100) / 1e3;
8
+ const direction = random(0, 10) >= 5 ? 1 : -1;
9
+ return value + value * multiplier * direction;
10
+ };
11
+ class BaseUpdateGenerator {
12
+ constructor(tickingColumns) {
13
+ __publicField(this, "table");
14
+ __publicField(this, "range");
15
+ __publicField(this, "updating", false);
16
+ __publicField(this, "timer");
17
+ __publicField(this, "tickingColumns");
18
+ __publicField(this, "update", () => {
19
+ if (this.range && this.table) {
20
+ const data = this.table?.data;
21
+ const { bid, ask, last, ...rest } = this.tickingColumns;
22
+ if (data && data?.length > 0) {
23
+ const maxRange = Math.min(this.range.to, data.length);
24
+ for (let rowIndex = this.range.from; rowIndex < maxRange; rowIndex++) {
25
+ let updateCount = 0;
26
+ const shallUpdateRow = random(0, 10) < 2;
27
+ if (shallUpdateRow) {
28
+ const rowUpdates = this.table.data[rowIndex];
29
+ const row = data[rowIndex];
30
+ if (bid !== void 0 && ask !== void 0) {
31
+ const { [bid]: currentBid, [ask]: currentAsk } = row;
32
+ const [newBid, newAsk] = generateNextBidAsk(
33
+ currentBid,
34
+ currentAsk,
35
+ 10,
36
+ 5,
37
+ nextRandomDouble
38
+ );
39
+ rowUpdates[ask] = newAsk;
40
+ rowUpdates[bid] = newBid;
41
+ if (last !== void 0) {
42
+ const newLast = Math.round((currentAsk + (newAsk - currentAsk) / 2) * 100) / 100;
43
+ rowUpdates[last] = newLast;
44
+ }
45
+ }
46
+ for (const colIdx of Object.values(rest)) {
47
+ const shallUpdateColumn = random(0, 10) < 5;
48
+ if (shallUpdateColumn) {
49
+ updateCount += 1;
50
+ const newValue = getNewValue(row[colIdx]);
51
+ if (this.table) {
52
+ rowUpdates[colIdx] = newValue;
53
+ }
54
+ }
55
+ }
56
+ if (this.table && updateCount > 0) {
57
+ this.table.updateRow(rowUpdates);
58
+ }
59
+ }
60
+ }
61
+ }
62
+ }
63
+ if (this.updating) {
64
+ this.timer = window.setTimeout(this.update, 500);
65
+ }
66
+ });
67
+ this.tickingColumns = tickingColumns;
68
+ }
69
+ setRange(range) {
70
+ this.range = range;
71
+ if (!this.updating && this.table) {
72
+ this.startUpdating();
73
+ }
74
+ }
75
+ setTable(table) {
76
+ this.table = table;
77
+ }
78
+ startUpdating() {
79
+ this.updating = true;
80
+ this.update();
81
+ }
82
+ stopUpdating() {
83
+ this.updating = false;
84
+ if (this.timer) {
85
+ window.clearTimeout(this.timer);
86
+ this.timer = void 0;
87
+ }
88
+ }
89
+ }
90
+
91
+ export { BaseUpdateGenerator };
92
+ //# 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":[],"mappings":";;;;;AAKA,MAAM,WAAA,GAAc,CAAC,KAAkB,KAAA;AACrC,EAAA,MAAM,UAAa,GAAA,MAAA,CAAO,CAAG,EAAA,GAAG,CAAI,GAAA,GAAA;AACpC,EAAA,MAAM,YAAY,MAAO,CAAA,CAAA,EAAG,EAAE,CAAA,IAAK,IAAI,CAAI,GAAA,CAAA,CAAA;AAC3C,EAAO,OAAA,KAAA,GAAQ,QAAQ,UAAa,GAAA,SAAA;AACtC,CAAA;AAEO,MAAM,mBAA+C,CAAA;AAAA,EAO1D,YAAY,cAA2C,EAAA;AANvD,IAAQ,aAAA,CAAA,IAAA,EAAA,OAAA,CAAA;AACR,IAAQ,aAAA,CAAA,IAAA,EAAA,OAAA,CAAA;AACR,IAAA,aAAA,CAAA,IAAA,EAAQ,UAAW,EAAA,KAAA,CAAA;AACnB,IAAQ,aAAA,CAAA,IAAA,EAAA,OAAA,CAAA;AACR,IAAQ,aAAA,CAAA,IAAA,EAAA,gBAAA,CAAA;AA8BR,IAAA,aAAA,CAAA,IAAA,EAAA,QAAA,EAAS,MAAM;AACb,MAAI,IAAA,IAAA,CAAK,KAAS,IAAA,IAAA,CAAK,KAAO,EAAA;AAC5B,QAAM,MAAA,IAAA,GAAO,KAAK,KAAO,EAAA,IAAA;AACzB,QAAA,MAAM,EAAE,GAAK,EAAA,GAAA,EAAK,MAAM,GAAG,IAAA,KAAS,IAAK,CAAA,cAAA;AACzC,QAAI,IAAA,IAAA,IAAQ,IAAM,EAAA,MAAA,GAAS,CAAG,EAAA;AAC5B,UAAA,MAAM,WAAW,IAAK,CAAA,GAAA,CAAI,KAAK,KAAM,CAAA,EAAA,EAAI,KAAK,MAAM,CAAA;AACpD,UAAA,KAAA,IAAS,WAAW,IAAK,CAAA,KAAA,CAAM,IAAM,EAAA,QAAA,GAAW,UAAU,QAAY,EAAA,EAAA;AACpE,YAAA,IAAI,WAAc,GAAA,CAAA;AAClB,YAAA,MAAM,cAAiB,GAAA,MAAA,CAAO,CAAG,EAAA,EAAE,CAAI,GAAA,CAAA;AACvC,YAAA,IAAI,cAAgB,EAAA;AAGlB,cAAA,MAAM,UAAa,GAAA,IAAA,CAAK,KAAM,CAAA,IAAA,CAAK,QAAQ,CAAA;AAC3C,cAAM,MAAA,GAAA,GAAM,KAAK,QAAQ,CAAA;AAEzB,cAAI,IAAA,GAAA,KAAQ,KAAa,CAAA,IAAA,GAAA,KAAQ,KAAW,CAAA,EAAA;AAC1C,gBAAM,MAAA,EAAE,CAAC,GAAG,GAAG,YAAY,CAAC,GAAG,GAAG,UAAA,EAAe,GAAA,GAAA;AACjD,gBAAM,MAAA,CAAC,MAAQ,EAAA,MAAM,CAAI,GAAA,kBAAA;AAAA,kBACvB,UAAA;AAAA,kBACA,UAAA;AAAA,kBACA,EAAA;AAAA,kBACA,CAAA;AAAA,kBACA;AAAA,iBACF;AACA,gBAAA,UAAA,CAAW,GAAG,CAAI,GAAA,MAAA;AAClB,gBAAA,UAAA,CAAW,GAAG,CAAI,GAAA,MAAA;AAClB,gBAAA,IAAI,SAAS,KAAW,CAAA,EAAA;AACtB,kBAAM,MAAA,OAAA,GACJ,KAAK,KAAO,CAAA,CAAA,UAAA,GAAA,CAAc,SAAS,UAAc,IAAA,CAAA,IAAK,GAAG,CACzD,GAAA,GAAA;AACF,kBAAA,UAAA,CAAW,IAAI,CAAI,GAAA,OAAA;AAAA;AACrB;AAGF,cAAA,KAAA,MAAW,MAAU,IAAA,MAAA,CAAO,MAAO,CAAA,IAAI,CAAG,EAAA;AACxC,gBAAA,MAAM,iBAAoB,GAAA,MAAA,CAAO,CAAG,EAAA,EAAE,CAAI,GAAA,CAAA;AAC1C,gBAAA,IAAI,iBAAmB,EAAA;AACrB,kBAAe,WAAA,IAAA,CAAA;AACf,kBAAA,MAAM,QAAW,GAAA,WAAA,CAAY,GAAI,CAAA,MAAM,CAAW,CAAA;AAClD,kBAAA,IAAI,KAAK,KAAO,EAAA;AACd,oBAAA,UAAA,CAAW,MAAM,CAAI,GAAA,QAAA;AAAA;AACvB;AACF;AAEF,cAAI,IAAA,IAAA,CAAK,KAAS,IAAA,WAAA,GAAc,CAAG,EAAA;AACjC,gBAAK,IAAA,CAAA,KAAA,CAAM,UAAU,UAAU,CAAA;AAAA;AACjC;AACF;AACF;AACF;AAGF,MAAA,IAAI,KAAK,QAAU,EAAA;AACjB,QAAA,IAAA,CAAK,KAAQ,GAAA,MAAA,CAAO,UAAW,CAAA,IAAA,CAAK,QAAQ,GAAG,CAAA;AAAA;AACjD,KACF,CAAA;AAlFE,IAAA,IAAA,CAAK,cAAiB,GAAA,cAAA;AAAA;AACxB,EAEA,SAAS,KAAiB,EAAA;AACxB,IAAA,IAAA,CAAK,KAAQ,GAAA,KAAA;AACb,IAAA,IAAI,CAAC,IAAA,CAAK,QAAY,IAAA,IAAA,CAAK,KAAO,EAAA;AAChC,MAAA,IAAA,CAAK,aAAc,EAAA;AAAA;AACrB;AACF,EAEA,SAAS,KAAc,EAAA;AACrB,IAAA,IAAA,CAAK,KAAQ,GAAA,KAAA;AAAA;AACf,EAEQ,aAAgB,GAAA;AACtB,IAAA,IAAA,CAAK,QAAW,GAAA,IAAA;AAChB,IAAA,IAAA,CAAK,MAAO,EAAA;AAAA;AACd,EAEQ,YAAe,GAAA;AACrB,IAAA,IAAA,CAAK,QAAW,GAAA,KAAA;AAChB,IAAA,IAAI,KAAK,KAAO,EAAA;AACd,MAAO,MAAA,CAAA,YAAA,CAAa,KAAK,KAAK,CAAA;AAC9B,MAAA,IAAA,CAAK,KAAQ,GAAA,KAAA,CAAA;AAAA;AACf;AA2DJ;;;;"}