@vuu-ui/vuu-data-test 0.13.9 → 0.13.11
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.
- package/cjs/ArrayProxy.js +72 -0
- package/cjs/ArrayProxy.js.map +1 -0
- package/cjs/RuntimeVisualLink.js +89 -0
- package/cjs/RuntimeVisualLink.js.map +1 -0
- package/cjs/Table.js +184 -0
- package/cjs/Table.js.map +1 -0
- package/cjs/TickingArrayDataSource.js +208 -0
- package/cjs/TickingArrayDataSource.js.map +1 -0
- package/cjs/UpdateGenerator.js +94 -0
- package/cjs/UpdateGenerator.js.map +1 -0
- package/cjs/VuuModule.js +370 -0
- package/cjs/VuuModule.js.map +1 -0
- package/cjs/basket/basket-module.js +255 -0
- package/cjs/basket/basket-module.js.map +1 -0
- package/cjs/basket/basket-schemas.js +123 -0
- package/cjs/basket/basket-schemas.js.map +1 -0
- package/cjs/basket/reference-data/constituents.js +40 -0
- package/cjs/basket/reference-data/constituents.js.map +1 -0
- package/cjs/basket/reference-data/ftse100.js +105 -0
- package/cjs/basket/reference-data/ftse100.js.map +1 -0
- package/cjs/basket/reference-data/hsi.js +87 -0
- package/cjs/basket/reference-data/hsi.js.map +1 -0
- package/cjs/basket/reference-data/nasdaq100.js +108 -0
- package/cjs/basket/reference-data/nasdaq100.js.map +1 -0
- package/cjs/basket/reference-data/prices.js +54 -0
- package/cjs/basket/reference-data/prices.js.map +1 -0
- package/cjs/basket/reference-data/sp500.js +46 -0
- package/cjs/basket/reference-data/sp500.js.map +1 -0
- package/cjs/data-utils.js +57 -0
- package/cjs/data-utils.js.map +1 -0
- package/cjs/index.js +46 -3047
- package/cjs/index.js.map +1 -1
- package/cjs/local-datasource-provider/LocalDatasourceProvider.js +84 -0
- package/cjs/local-datasource-provider/LocalDatasourceProvider.js.map +1 -0
- package/cjs/makeSuggestions.js +43 -0
- package/cjs/makeSuggestions.js.map +1 -0
- package/cjs/schemas.js +28 -0
- package/cjs/schemas.js.map +1 -0
- package/cjs/simul/SimulModule.js +24 -0
- package/cjs/simul/SimulModule.js.map +1 -0
- package/cjs/simul/reference-data/accounts.js +27 -0
- package/cjs/simul/reference-data/accounts.js.map +1 -0
- package/cjs/simul/reference-data/algos.js +6 -0
- package/cjs/simul/reference-data/algos.js.map +1 -0
- package/cjs/simul/reference-data/currencies.js +6 -0
- package/cjs/simul/reference-data/currencies.js.map +1 -0
- package/cjs/simul/reference-data/instruments-extended.js +18 -0
- package/cjs/simul/reference-data/instruments-extended.js.map +1 -0
- package/cjs/simul/reference-data/instruments.js +77 -0
- package/cjs/simul/reference-data/instruments.js.map +1 -0
- package/cjs/simul/reference-data/isin-generator/convert-string-to-base-ten-number.js +6 -0
- package/cjs/simul/reference-data/isin-generator/convert-string-to-base-ten-number.js.map +1 -0
- package/cjs/simul/reference-data/isin-generator/fixtures/alphabet.js +31 -0
- package/cjs/simul/reference-data/isin-generator/fixtures/alphabet.js.map +1 -0
- package/cjs/simul/reference-data/isin-generator/fixtures/alphanumeric-values.js +9 -0
- package/cjs/simul/reference-data/isin-generator/fixtures/alphanumeric-values.js.map +1 -0
- package/cjs/simul/reference-data/isin-generator/fixtures/base-ten-numbers.js +17 -0
- package/cjs/simul/reference-data/isin-generator/fixtures/base-ten-numbers.js.map +1 -0
- package/cjs/simul/reference-data/isin-generator/generate-cusip-check-code.js +24 -0
- package/cjs/simul/reference-data/isin-generator/generate-cusip-check-code.js.map +1 -0
- package/cjs/simul/reference-data/isin-generator/generate-cusip-without-check-code.js +13 -0
- package/cjs/simul/reference-data/isin-generator/generate-cusip-without-check-code.js.map +1 -0
- package/cjs/simul/reference-data/isin-generator/generate-cusip.js +13 -0
- package/cjs/simul/reference-data/isin-generator/generate-cusip.js.map +1 -0
- package/cjs/simul/reference-data/isin-generator/generate-random-alphanumeric.js +8 -0
- package/cjs/simul/reference-data/isin-generator/generate-random-alphanumeric.js.map +1 -0
- package/cjs/simul/reference-data/isin-generator/generate-random-base-ten-number.js +6 -0
- package/cjs/simul/reference-data/isin-generator/generate-random-base-ten-number.js.map +1 -0
- package/cjs/simul/reference-data/isin-generator/generate-random-string-of-alphanumeric-chars.js +14 -0
- package/cjs/simul/reference-data/isin-generator/generate-random-string-of-alphanumeric-chars.js.map +1 -0
- package/cjs/simul/reference-data/isin-generator/generate-random-string-of-base-ten-chars.js +14 -0
- package/cjs/simul/reference-data/isin-generator/generate-random-string-of-base-ten-chars.js.map +1 -0
- package/cjs/simul/reference-data/isin-generator/index.js +295 -0
- package/cjs/simul/reference-data/isin-generator/index.js.map +1 -0
- package/cjs/simul/reference-data/isin-generator/is-odd.js +6 -0
- package/cjs/simul/reference-data/isin-generator/is-odd.js.map +1 -0
- package/cjs/simul/reference-data/locations.js +17 -0
- package/cjs/simul/reference-data/locations.js.map +1 -0
- package/cjs/simul/reference-data/lotsizes.js +28 -0
- package/cjs/simul/reference-data/lotsizes.js.map +1 -0
- package/cjs/simul/reference-data/orderStatus.js +6 -0
- package/cjs/simul/reference-data/orderStatus.js.map +1 -0
- package/cjs/simul/reference-data/orders.js +54 -0
- package/cjs/simul/reference-data/orders.js.map +1 -0
- package/cjs/simul/reference-data/parent-child-orders.js +122 -0
- package/cjs/simul/reference-data/parent-child-orders.js.map +1 -0
- package/cjs/simul/reference-data/prices.js +71 -0
- package/cjs/simul/reference-data/prices.js.map +1 -0
- package/cjs/simul/reference-data/sides.js +6 -0
- package/cjs/simul/reference-data/sides.js.map +1 -0
- package/cjs/simul/simul-module.js +126 -0
- package/cjs/simul/simul-module.js.map +1 -0
- package/cjs/simul/simul-schemas.js +142 -0
- package/cjs/simul/simul-schemas.js.map +1 -0
- package/cjs/test/test-module.js +26 -0
- package/cjs/test/test-module.js.map +1 -0
- package/cjs/test/test-schemas.js +17 -0
- package/cjs/test/test-schemas.js.map +1 -0
- package/cjs/vuu-modules.js +15 -0
- package/cjs/vuu-modules.js.map +1 -0
- package/cjs/vuu-row-generator.js +74 -0
- package/cjs/vuu-row-generator.js.map +1 -0
- package/esm/ArrayProxy.js +70 -0
- package/esm/ArrayProxy.js.map +1 -0
- package/esm/RuntimeVisualLink.js +87 -0
- package/esm/RuntimeVisualLink.js.map +1 -0
- package/esm/Table.js +179 -0
- package/esm/Table.js.map +1 -0
- package/esm/TickingArrayDataSource.js +206 -0
- package/esm/TickingArrayDataSource.js.map +1 -0
- package/esm/UpdateGenerator.js +92 -0
- package/esm/UpdateGenerator.js.map +1 -0
- package/esm/VuuModule.js +366 -0
- package/esm/VuuModule.js.map +1 -0
- package/esm/basket/basket-module.js +251 -0
- package/esm/basket/basket-module.js.map +1 -0
- package/esm/basket/basket-schemas.js +120 -0
- package/esm/basket/basket-schemas.js.map +1 -0
- package/esm/basket/reference-data/constituents.js +38 -0
- package/esm/basket/reference-data/constituents.js.map +1 -0
- package/esm/basket/reference-data/ftse100.js +103 -0
- package/esm/basket/reference-data/ftse100.js.map +1 -0
- package/esm/basket/reference-data/hsi.js +85 -0
- package/esm/basket/reference-data/hsi.js.map +1 -0
- package/esm/basket/reference-data/nasdaq100.js +106 -0
- package/esm/basket/reference-data/nasdaq100.js.map +1 -0
- package/esm/basket/reference-data/prices.js +52 -0
- package/esm/basket/reference-data/prices.js.map +1 -0
- package/esm/basket/reference-data/sp500.js +44 -0
- package/esm/basket/reference-data/sp500.js.map +1 -0
- package/esm/data-utils.js +52 -0
- package/esm/data-utils.js.map +1 -0
- package/esm/index.js +14 -3019
- package/esm/index.js.map +1 -1
- package/esm/local-datasource-provider/LocalDatasourceProvider.js +82 -0
- package/esm/local-datasource-provider/LocalDatasourceProvider.js.map +1 -0
- package/esm/makeSuggestions.js +41 -0
- package/esm/makeSuggestions.js.map +1 -0
- package/esm/schemas.js +24 -0
- package/esm/schemas.js.map +1 -0
- package/esm/simul/SimulModule.js +22 -0
- package/esm/simul/SimulModule.js.map +1 -0
- package/esm/simul/reference-data/accounts.js +25 -0
- package/esm/simul/reference-data/accounts.js.map +1 -0
- package/esm/simul/reference-data/algos.js +4 -0
- package/esm/simul/reference-data/algos.js.map +1 -0
- package/esm/simul/reference-data/currencies.js +4 -0
- package/esm/simul/reference-data/currencies.js.map +1 -0
- package/esm/simul/reference-data/instruments-extended.js +16 -0
- package/esm/simul/reference-data/instruments-extended.js.map +1 -0
- package/esm/simul/reference-data/instruments.js +72 -0
- package/esm/simul/reference-data/instruments.js.map +1 -0
- package/esm/simul/reference-data/isin-generator/convert-string-to-base-ten-number.js +4 -0
- package/esm/simul/reference-data/isin-generator/convert-string-to-base-ten-number.js.map +1 -0
- package/esm/simul/reference-data/isin-generator/fixtures/alphabet.js +29 -0
- package/esm/simul/reference-data/isin-generator/fixtures/alphabet.js.map +1 -0
- package/esm/simul/reference-data/isin-generator/fixtures/alphanumeric-values.js +7 -0
- package/esm/simul/reference-data/isin-generator/fixtures/alphanumeric-values.js.map +1 -0
- package/esm/simul/reference-data/isin-generator/fixtures/base-ten-numbers.js +15 -0
- package/esm/simul/reference-data/isin-generator/fixtures/base-ten-numbers.js.map +1 -0
- package/esm/simul/reference-data/isin-generator/generate-cusip-check-code.js +22 -0
- package/esm/simul/reference-data/isin-generator/generate-cusip-check-code.js.map +1 -0
- package/esm/simul/reference-data/isin-generator/generate-cusip-without-check-code.js +11 -0
- package/esm/simul/reference-data/isin-generator/generate-cusip-without-check-code.js.map +1 -0
- package/esm/simul/reference-data/isin-generator/generate-cusip.js +11 -0
- package/esm/simul/reference-data/isin-generator/generate-cusip.js.map +1 -0
- package/esm/simul/reference-data/isin-generator/generate-random-alphanumeric.js +6 -0
- package/esm/simul/reference-data/isin-generator/generate-random-alphanumeric.js.map +1 -0
- package/esm/simul/reference-data/isin-generator/generate-random-base-ten-number.js +4 -0
- package/esm/simul/reference-data/isin-generator/generate-random-base-ten-number.js.map +1 -0
- package/esm/simul/reference-data/isin-generator/generate-random-string-of-alphanumeric-chars.js +12 -0
- package/esm/simul/reference-data/isin-generator/generate-random-string-of-alphanumeric-chars.js.map +1 -0
- package/esm/simul/reference-data/isin-generator/generate-random-string-of-base-ten-chars.js +12 -0
- package/esm/simul/reference-data/isin-generator/generate-random-string-of-base-ten-chars.js.map +1 -0
- package/esm/simul/reference-data/isin-generator/index.js +293 -0
- package/esm/simul/reference-data/isin-generator/index.js.map +1 -0
- package/esm/simul/reference-data/isin-generator/is-odd.js +4 -0
- package/esm/simul/reference-data/isin-generator/is-odd.js.map +1 -0
- package/esm/simul/reference-data/locations.js +14 -0
- package/esm/simul/reference-data/locations.js.map +1 -0
- package/esm/simul/reference-data/lotsizes.js +26 -0
- package/esm/simul/reference-data/lotsizes.js.map +1 -0
- package/esm/simul/reference-data/orderStatus.js +4 -0
- package/esm/simul/reference-data/orderStatus.js.map +1 -0
- package/esm/simul/reference-data/orders.js +51 -0
- package/esm/simul/reference-data/orders.js.map +1 -0
- package/esm/simul/reference-data/parent-child-orders.js +117 -0
- package/esm/simul/reference-data/parent-child-orders.js.map +1 -0
- package/esm/simul/reference-data/prices.js +68 -0
- package/esm/simul/reference-data/prices.js.map +1 -0
- package/esm/simul/reference-data/sides.js +4 -0
- package/esm/simul/reference-data/sides.js.map +1 -0
- package/esm/simul/simul-module.js +124 -0
- package/esm/simul/simul-module.js.map +1 -0
- package/esm/simul/simul-schemas.js +139 -0
- package/esm/simul/simul-schemas.js.map +1 -0
- package/esm/test/test-module.js +24 -0
- package/esm/test/test-module.js.map +1 -0
- package/esm/test/test-schemas.js +15 -0
- package/esm/test/test-schemas.js.map +1 -0
- package/esm/vuu-modules.js +13 -0
- package/esm/vuu-modules.js.map +1 -0
- package/esm/vuu-row-generator.js +68 -0
- package/esm/vuu-row-generator.js.map +1 -0
- package/package.json +6 -6
package/esm/VuuModule.js
ADDED
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import { uuid, isViewportRpcRequest } from '@vuu-ui/vuu-utils';
|
|
2
|
+
import { Table, buildDataColumnMapFromSchema } from './Table.js';
|
|
3
|
+
import { TickingArrayDataSource } from './TickingArrayDataSource.js';
|
|
4
|
+
import { makeSuggestions } from './makeSuggestions.js';
|
|
5
|
+
import { RuntimeVisualLink } from './RuntimeVisualLink.js';
|
|
6
|
+
|
|
7
|
+
var __defProp = Object.defineProperty;
|
|
8
|
+
var __typeError = (msg) => {
|
|
9
|
+
throw TypeError(msg);
|
|
10
|
+
};
|
|
11
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
12
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
13
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
14
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
|
|
15
|
+
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);
|
|
16
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
|
|
17
|
+
var _menus, _name, _runtimeVisualLinks, _schemas, _sessionTableMap, _tables, _tableServices, _visualLinks, _subscriptionMap, _moduleServices;
|
|
18
|
+
const withParams = (rpcRequest) => "namedParams" in rpcRequest;
|
|
19
|
+
const withNamedParams = (rpcRequest) => "namedParams" in rpcRequest;
|
|
20
|
+
class VuuModule {
|
|
21
|
+
constructor({
|
|
22
|
+
menus,
|
|
23
|
+
name,
|
|
24
|
+
schemas,
|
|
25
|
+
services,
|
|
26
|
+
tables,
|
|
27
|
+
vuuLinks: visualLinks
|
|
28
|
+
}) {
|
|
29
|
+
__privateAdd(this, _menus);
|
|
30
|
+
__privateAdd(this, _name);
|
|
31
|
+
__privateAdd(this, _runtimeVisualLinks, /* @__PURE__ */ new Map());
|
|
32
|
+
__privateAdd(this, _schemas);
|
|
33
|
+
__privateAdd(this, _sessionTableMap, {});
|
|
34
|
+
__privateAdd(this, _tables);
|
|
35
|
+
__privateAdd(this, _tableServices);
|
|
36
|
+
__privateAdd(this, _visualLinks);
|
|
37
|
+
__privateAdd(this, _subscriptionMap, /* @__PURE__ */ new Map());
|
|
38
|
+
__publicField(this, "unregisterViewport", (viewportId) => {
|
|
39
|
+
for (const [tableName, subscriptions] of __privateGet(this, _subscriptionMap)) {
|
|
40
|
+
if (subscriptions[0].viewportId.toString() === viewportId) {
|
|
41
|
+
__privateGet(this, _subscriptionMap).delete(tableName);
|
|
42
|
+
} else {
|
|
43
|
+
const links = subscriptions[0].dataSource.links;
|
|
44
|
+
if (links) {
|
|
45
|
+
for (let i = 0; i < links?.length; i++) {
|
|
46
|
+
if (links[i].parentClientVpId === viewportId) {
|
|
47
|
+
links.splice(i);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
subscriptions[0].dataSource.links = links;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
__publicField(this, "getLinks", (subscriptionMap, vuuLinks) => {
|
|
56
|
+
const visualLinks = [];
|
|
57
|
+
for (let i = 0; i < vuuLinks.length; i++) {
|
|
58
|
+
const subscriptions = subscriptionMap.get(vuuLinks[i].toTable);
|
|
59
|
+
if (subscriptions) {
|
|
60
|
+
subscriptions.forEach(({ viewportId, dataSource: { status } }) => {
|
|
61
|
+
if (status !== "suspended") {
|
|
62
|
+
const newLink = {
|
|
63
|
+
parentClientVpId: viewportId,
|
|
64
|
+
parentVpId: viewportId,
|
|
65
|
+
link: vuuLinks[i]
|
|
66
|
+
};
|
|
67
|
+
visualLinks.push(newLink);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return visualLinks;
|
|
73
|
+
});
|
|
74
|
+
__publicField(this, "visualLinkService", (message) => new Promise((resolve) => {
|
|
75
|
+
if (message.type === "CREATE_VISUAL_LINK") {
|
|
76
|
+
const { childColumnName, childVpId, parentColumnName, parentVpId } = message;
|
|
77
|
+
const childDataSource = this.getSubscribedDataSource(childVpId);
|
|
78
|
+
const parentDataSource = this.getSubscribedDataSource(parentVpId);
|
|
79
|
+
const runtimeVisualLink = new RuntimeVisualLink(
|
|
80
|
+
childDataSource,
|
|
81
|
+
parentDataSource,
|
|
82
|
+
childColumnName,
|
|
83
|
+
parentColumnName
|
|
84
|
+
);
|
|
85
|
+
__privateGet(this, _runtimeVisualLinks).set(childVpId, runtimeVisualLink);
|
|
86
|
+
resolve({
|
|
87
|
+
clientViewportId: childVpId,
|
|
88
|
+
colName: childColumnName,
|
|
89
|
+
parentColName: parentColumnName,
|
|
90
|
+
parentViewportId: parentVpId,
|
|
91
|
+
type: "vuu-link-created"
|
|
92
|
+
});
|
|
93
|
+
} else {
|
|
94
|
+
const runtimeVisualLink = __privateGet(this, _runtimeVisualLinks).get(
|
|
95
|
+
message.childVpId
|
|
96
|
+
);
|
|
97
|
+
if (runtimeVisualLink) {
|
|
98
|
+
runtimeVisualLink.remove();
|
|
99
|
+
__privateGet(this, _runtimeVisualLinks).delete(message.childVpId);
|
|
100
|
+
} else {
|
|
101
|
+
throw Error(
|
|
102
|
+
`visualLinkService no visual link found for viewport #${message.childVpId}`
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
resolve();
|
|
106
|
+
}
|
|
107
|
+
}));
|
|
108
|
+
__publicField(this, "createDataSource", (tableName, viewport, config) => {
|
|
109
|
+
const getVisualLinks = (tableName2) => {
|
|
110
|
+
const linksForTable = __privateGet(this, _visualLinks)?.[tableName2];
|
|
111
|
+
return linksForTable === void 0 ? void 0 : this.getLinks(__privateGet(this, _subscriptionMap), linksForTable);
|
|
112
|
+
};
|
|
113
|
+
const columnDescriptors = this.getColumnDescriptors(tableName);
|
|
114
|
+
const table = __privateGet(this, _tables)[tableName];
|
|
115
|
+
const sessionTable = __privateGet(this, _sessionTableMap)[tableName];
|
|
116
|
+
const dataSource = new TickingArrayDataSource({
|
|
117
|
+
...config,
|
|
118
|
+
columnDescriptors,
|
|
119
|
+
getVisualLinks,
|
|
120
|
+
keyColumn: __privateGet(this, _schemas)[tableName] === void 0 ? __privateGet(this, _sessionTableMap)[tableName].schema.key : __privateGet(this, _schemas)[tableName].key,
|
|
121
|
+
table: table || sessionTable,
|
|
122
|
+
menu: __privateGet(this, _menus)?.[tableName],
|
|
123
|
+
rpcServices: this.getServices(tableName),
|
|
124
|
+
sessionTables: __privateGet(this, _sessionTableMap),
|
|
125
|
+
viewport,
|
|
126
|
+
visualLinkService: this.visualLinkService
|
|
127
|
+
});
|
|
128
|
+
dataSource.on("unsubscribed", this.unregisterViewport);
|
|
129
|
+
const existingSubscriptions = __privateGet(this, _subscriptionMap).get(tableName);
|
|
130
|
+
const subscription = {
|
|
131
|
+
viewportId: dataSource.viewport,
|
|
132
|
+
dataSource
|
|
133
|
+
};
|
|
134
|
+
if (existingSubscriptions) {
|
|
135
|
+
existingSubscriptions.push(subscription);
|
|
136
|
+
} else {
|
|
137
|
+
__privateGet(this, _subscriptionMap).set(tableName, [subscription]);
|
|
138
|
+
}
|
|
139
|
+
return dataSource;
|
|
140
|
+
});
|
|
141
|
+
__publicField(this, "suggestionFetcher", ([
|
|
142
|
+
vuuTable,
|
|
143
|
+
column,
|
|
144
|
+
pattern
|
|
145
|
+
]) => {
|
|
146
|
+
const table = __privateGet(this, _tables)[vuuTable.table];
|
|
147
|
+
if (table) {
|
|
148
|
+
return makeSuggestions(table, column, pattern);
|
|
149
|
+
} else {
|
|
150
|
+
throw Error(
|
|
151
|
+
`${__privateGet(this, _name)} suggestionFetcher, unknown table ${vuuTable.module} ${vuuTable.table}`
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
__publicField(this, "openBulkEdits", async (rpcRequest) => {
|
|
156
|
+
if (withParams(rpcRequest)) {
|
|
157
|
+
const { namedParams, vpId } = rpcRequest;
|
|
158
|
+
const selectedRowIds = namedParams.selectedRowIds;
|
|
159
|
+
const table = namedParams.table;
|
|
160
|
+
if (selectedRowIds && table) {
|
|
161
|
+
const dataTable = __privateGet(this, _tables)[table.table];
|
|
162
|
+
if (dataTable) {
|
|
163
|
+
const sessionTable = this.createSessionTableFromSelectedRows(
|
|
164
|
+
dataTable,
|
|
165
|
+
selectedRowIds
|
|
166
|
+
);
|
|
167
|
+
const sessionTableName = `session-${uuid()}`;
|
|
168
|
+
__privateGet(this, _sessionTableMap)[sessionTableName] = sessionTable;
|
|
169
|
+
return {
|
|
170
|
+
action: {
|
|
171
|
+
renderComponent: "grid",
|
|
172
|
+
table: {
|
|
173
|
+
module: table.module,
|
|
174
|
+
table: sessionTableName
|
|
175
|
+
},
|
|
176
|
+
tableSchema: dataTable.schema,
|
|
177
|
+
type: "OPEN_DIALOG_ACTION"
|
|
178
|
+
},
|
|
179
|
+
rpcName: "VP_BULK_EDIT_BEGIN_RPC",
|
|
180
|
+
type: "VIEW_PORT_MENU_RESP",
|
|
181
|
+
vpId
|
|
182
|
+
};
|
|
183
|
+
} else {
|
|
184
|
+
return {
|
|
185
|
+
action: { type: "NO_ACTION" },
|
|
186
|
+
clientViewportId: "na",
|
|
187
|
+
error: "No Table found",
|
|
188
|
+
rpcName: "VP_BULK_EDIT_REJECT",
|
|
189
|
+
type: "VIEW_PORT_MENU_REJ",
|
|
190
|
+
vpId
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
throw Error("openBulkEdits expects Table and selectedRowIds");
|
|
196
|
+
});
|
|
197
|
+
__publicField(this, "endEditSession", async (rpcRequest) => {
|
|
198
|
+
if (isViewportRpcRequest(rpcRequest)) {
|
|
199
|
+
const { vpId } = rpcRequest;
|
|
200
|
+
delete __privateGet(this, _sessionTableMap)[vpId];
|
|
201
|
+
return {
|
|
202
|
+
action: { type: "VP_RPC_SUCCESS" },
|
|
203
|
+
method: "???",
|
|
204
|
+
namedParams: {},
|
|
205
|
+
params: [],
|
|
206
|
+
type: "VIEW_PORT_RPC_REPONSE",
|
|
207
|
+
vpId
|
|
208
|
+
};
|
|
209
|
+
} else {
|
|
210
|
+
throw Error("endEditSession invalid request");
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
// Bulk-edit with input in session table
|
|
214
|
+
__publicField(this, "applyBulkEdits", async (rpcRequest) => {
|
|
215
|
+
if (withParams(rpcRequest)) {
|
|
216
|
+
const { vpId } = rpcRequest;
|
|
217
|
+
const sessionTable = this.getSessionTable(vpId);
|
|
218
|
+
for (let i = 0; i < sessionTable.data.length; i++) {
|
|
219
|
+
const newRow = sessionTable.data[i];
|
|
220
|
+
const { column, value } = rpcRequest.namedParams;
|
|
221
|
+
const keyIndex = sessionTable.map[sessionTable.schema.key];
|
|
222
|
+
sessionTable.update(
|
|
223
|
+
String(newRow[keyIndex]),
|
|
224
|
+
column,
|
|
225
|
+
value
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
return {
|
|
229
|
+
action: {
|
|
230
|
+
type: "NO_ACTION"
|
|
231
|
+
},
|
|
232
|
+
rpcName: "VP_BULK_EDIT_COLUMN_CELLS_RPC",
|
|
233
|
+
type: "VIEW_PORT_MENU_RESP",
|
|
234
|
+
vpId
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
throw Error("applyBulkEdits expects column and value as namedParams");
|
|
238
|
+
});
|
|
239
|
+
// Save session table data to main table
|
|
240
|
+
__publicField(this, "saveBulkEdits", async (rpcRequest) => {
|
|
241
|
+
if (withParams(rpcRequest)) {
|
|
242
|
+
const { vpId } = rpcRequest;
|
|
243
|
+
const sessionTable = this.getSessionTable(vpId);
|
|
244
|
+
const { table } = sessionTable.schema.table;
|
|
245
|
+
const baseTable = __privateGet(this, _tables)[table];
|
|
246
|
+
if (baseTable) {
|
|
247
|
+
for (let i = 0; i < sessionTable.data.length; i++) {
|
|
248
|
+
const newRow = sessionTable.data[i];
|
|
249
|
+
baseTable.updateRow(newRow);
|
|
250
|
+
}
|
|
251
|
+
return {
|
|
252
|
+
action: {
|
|
253
|
+
type: "VP_RPC_SUCCESS"
|
|
254
|
+
},
|
|
255
|
+
requestId: "request_id",
|
|
256
|
+
rpcName: "VP_BULK_EDIT_SUBMIT_RPC",
|
|
257
|
+
type: "VIEW_PORT_MENU_RESP",
|
|
258
|
+
vpId
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
throw Error("saveBulkEdits base table not found");
|
|
263
|
+
});
|
|
264
|
+
/**
|
|
265
|
+
* These services are available on any table. The client must configure the appropriate
|
|
266
|
+
* menu item(s) on Table(s). The services to implement these RPC calls are built-in to
|
|
267
|
+
* VuuModule
|
|
268
|
+
*/
|
|
269
|
+
__privateAdd(this, _moduleServices, [
|
|
270
|
+
{
|
|
271
|
+
rpcName: "VP_BULK_EDIT_BEGIN_RPC",
|
|
272
|
+
service: this.openBulkEdits
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
rpcName: "VP_BULK_EDIT_COLUMN_CELLS_RPC",
|
|
276
|
+
service: this.applyBulkEdits
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
rpcName: "VP_BULK_EDIT_SUBMIT_RPC",
|
|
280
|
+
service: this.saveBulkEdits
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
rpcName: "VP_BULK_EDIT_END_RPC",
|
|
284
|
+
service: this.endEditSession
|
|
285
|
+
}
|
|
286
|
+
]);
|
|
287
|
+
__privateSet(this, _menus, menus);
|
|
288
|
+
__privateSet(this, _name, name);
|
|
289
|
+
__privateSet(this, _schemas, schemas);
|
|
290
|
+
__privateSet(this, _tableServices, services);
|
|
291
|
+
__privateSet(this, _tables, tables);
|
|
292
|
+
__privateSet(this, _visualLinks, visualLinks);
|
|
293
|
+
}
|
|
294
|
+
getSubscribedDataSource(vpId) {
|
|
295
|
+
for (const subscriptions of __privateGet(this, _subscriptionMap).values()) {
|
|
296
|
+
for (const { viewportId, dataSource } of subscriptions) {
|
|
297
|
+
if (viewportId === vpId) {
|
|
298
|
+
return dataSource;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
throw Error(`getSubscribedDataSource #${vpId} not in subscriptionMap`);
|
|
303
|
+
}
|
|
304
|
+
getServices(tableName) {
|
|
305
|
+
const tableServices = __privateGet(this, _tableServices)?.[tableName];
|
|
306
|
+
if (Array.isArray(tableServices)) {
|
|
307
|
+
return __privateGet(this, _moduleServices).concat(tableServices);
|
|
308
|
+
} else {
|
|
309
|
+
return __privateGet(this, _moduleServices);
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
get typeaheadHook() {
|
|
313
|
+
return () => this.suggestionFetcher;
|
|
314
|
+
}
|
|
315
|
+
get sessionTableMap() {
|
|
316
|
+
return __privateGet(this, _sessionTableMap);
|
|
317
|
+
}
|
|
318
|
+
get tables() {
|
|
319
|
+
return __privateGet(this, _tables);
|
|
320
|
+
}
|
|
321
|
+
getSessionTable(sessionTableName) {
|
|
322
|
+
const sessionTable = __privateGet(this, _sessionTableMap)[sessionTableName];
|
|
323
|
+
if (sessionTable) {
|
|
324
|
+
return sessionTable;
|
|
325
|
+
} else {
|
|
326
|
+
throw Error(
|
|
327
|
+
`getSessionTable: no session table with name ${sessionTableName}`
|
|
328
|
+
);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
getColumnDescriptors(tableName) {
|
|
332
|
+
const schema = __privateGet(this, _schemas)[tableName] || this.getSessionTable(tableName)?.schema;
|
|
333
|
+
if (schema) {
|
|
334
|
+
return schema.columns;
|
|
335
|
+
} else {
|
|
336
|
+
throw Error(
|
|
337
|
+
` no schema found for module ${__privateGet(this, _name)} table ${tableName}`
|
|
338
|
+
);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
createSessionTableFromSelectedRows({ data, map, schema }, selectedRowIds) {
|
|
342
|
+
const keyIndex = map[schema.key];
|
|
343
|
+
const sessionData = [];
|
|
344
|
+
for (let i = 0; i < selectedRowIds.length; i++) {
|
|
345
|
+
for (let j = 0; j < data.length; j++) {
|
|
346
|
+
if (data[j][keyIndex] === selectedRowIds[i]) {
|
|
347
|
+
sessionData.push(data[j]);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return new Table(schema, sessionData, buildDataColumnMapFromSchema(schema));
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
_menus = new WeakMap();
|
|
355
|
+
_name = new WeakMap();
|
|
356
|
+
_runtimeVisualLinks = new WeakMap();
|
|
357
|
+
_schemas = new WeakMap();
|
|
358
|
+
_sessionTableMap = new WeakMap();
|
|
359
|
+
_tables = new WeakMap();
|
|
360
|
+
_tableServices = new WeakMap();
|
|
361
|
+
_visualLinks = new WeakMap();
|
|
362
|
+
_subscriptionMap = new WeakMap();
|
|
363
|
+
_moduleServices = new WeakMap();
|
|
364
|
+
|
|
365
|
+
export { VuuModule, withNamedParams, withParams };
|
|
366
|
+
//# 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":["tableName"],"mappings":"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"}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
import { isViewportRpcRequest } from '@vuu-ui/vuu-utils';
|
|
2
|
+
import pricesTable from './reference-data/prices.js';
|
|
3
|
+
import { Table, joinTables } from '../Table.js';
|
|
4
|
+
import { schemas } from './basket-schemas.js';
|
|
5
|
+
import basketConstituentData from './reference-data/constituents.js';
|
|
6
|
+
import { VuuModule } from '../VuuModule.js';
|
|
7
|
+
|
|
8
|
+
const undefinedTables = {
|
|
9
|
+
algoType: void 0,
|
|
10
|
+
basket: void 0,
|
|
11
|
+
basketTrading: void 0,
|
|
12
|
+
basketTradingConstituent: void 0,
|
|
13
|
+
basketConstituent: void 0,
|
|
14
|
+
basketTradingConstituentJoin: void 0,
|
|
15
|
+
priceStrategyType: void 0
|
|
16
|
+
};
|
|
17
|
+
const buildDataColumnMap = (tableName) => Object.values(schemas[tableName].columns).reduce(
|
|
18
|
+
(map, col, index) => {
|
|
19
|
+
map[col.name] = index;
|
|
20
|
+
return map;
|
|
21
|
+
},
|
|
22
|
+
{}
|
|
23
|
+
);
|
|
24
|
+
const tableMaps = {
|
|
25
|
+
algoType: buildDataColumnMap("algoType"),
|
|
26
|
+
basket: buildDataColumnMap("basket"),
|
|
27
|
+
basketTrading: buildDataColumnMap("basketTrading"),
|
|
28
|
+
basketTradingConstituent: buildDataColumnMap("basketTradingConstituent"),
|
|
29
|
+
basketConstituent: buildDataColumnMap("basketConstituent"),
|
|
30
|
+
basketTradingConstituentJoin: buildDataColumnMap(
|
|
31
|
+
"basketTradingConstituentJoin"
|
|
32
|
+
),
|
|
33
|
+
priceStrategyType: buildDataColumnMap("priceStrategyType")
|
|
34
|
+
};
|
|
35
|
+
const basketConstituent = new Table(
|
|
36
|
+
schemas.basketConstituent,
|
|
37
|
+
basketConstituentData,
|
|
38
|
+
tableMaps.basketConstituent
|
|
39
|
+
);
|
|
40
|
+
const basketTrading = new Table(
|
|
41
|
+
schemas.basketTrading,
|
|
42
|
+
[],
|
|
43
|
+
tableMaps.basketTrading
|
|
44
|
+
);
|
|
45
|
+
let basketIncrement = 1;
|
|
46
|
+
const basketTradingConstituent = new Table(
|
|
47
|
+
schemas.basketTradingConstituent,
|
|
48
|
+
[],
|
|
49
|
+
tableMaps.basketTradingConstituent
|
|
50
|
+
);
|
|
51
|
+
const createBasketTradingRow = (basketId, basketName, side = "BUY", status = "OFF MARKET") => [
|
|
52
|
+
basketId,
|
|
53
|
+
basketName,
|
|
54
|
+
0,
|
|
55
|
+
1.25,
|
|
56
|
+
`steve-${basketIncrement++}`,
|
|
57
|
+
side,
|
|
58
|
+
status,
|
|
59
|
+
1e6,
|
|
60
|
+
125e4,
|
|
61
|
+
100
|
|
62
|
+
];
|
|
63
|
+
function createTradingBasket(basketId, basketName) {
|
|
64
|
+
const basketTradingRow = createBasketTradingRow(basketId, basketName);
|
|
65
|
+
basketTrading.insert(basketTradingRow);
|
|
66
|
+
const { basketId: key } = buildDataColumnMap("basketConstituent");
|
|
67
|
+
const constituents = basketConstituent.data.filter(
|
|
68
|
+
(c) => c[key] === basketId
|
|
69
|
+
);
|
|
70
|
+
const { instanceId } = tableMaps.basketTrading;
|
|
71
|
+
constituents.forEach(([, , description, , ric, , , quantity, weighting]) => {
|
|
72
|
+
const algo = "";
|
|
73
|
+
const algoParams = "";
|
|
74
|
+
const limitPrice = 95;
|
|
75
|
+
const notionalLocal = 0;
|
|
76
|
+
const notionalUsd = 0;
|
|
77
|
+
const pctFilled = 0;
|
|
78
|
+
const priceSpread = 0;
|
|
79
|
+
const priceStrategyId = "";
|
|
80
|
+
const side = "BUY";
|
|
81
|
+
const venue = "venue";
|
|
82
|
+
const basketInstanceId = basketTradingRow[instanceId];
|
|
83
|
+
const basketTradingConstituentRow = [
|
|
84
|
+
algo,
|
|
85
|
+
algoParams,
|
|
86
|
+
basketId,
|
|
87
|
+
description,
|
|
88
|
+
basketInstanceId,
|
|
89
|
+
`${basketInstanceId}-${ric}`,
|
|
90
|
+
limitPrice,
|
|
91
|
+
notionalLocal,
|
|
92
|
+
notionalUsd,
|
|
93
|
+
pctFilled,
|
|
94
|
+
priceSpread,
|
|
95
|
+
priceStrategyId,
|
|
96
|
+
quantity,
|
|
97
|
+
ric,
|
|
98
|
+
side,
|
|
99
|
+
venue,
|
|
100
|
+
weighting
|
|
101
|
+
];
|
|
102
|
+
basketTradingConstituent.insert(basketTradingConstituentRow);
|
|
103
|
+
});
|
|
104
|
+
return basketTradingRow[instanceId];
|
|
105
|
+
}
|
|
106
|
+
const addConstituent = async (rpcRequest) => {
|
|
107
|
+
if (isViewportRpcRequest(rpcRequest)) {
|
|
108
|
+
throw Error(`addConstituent not implemented`);
|
|
109
|
+
} else {
|
|
110
|
+
throw Error(`addConstituent invalid rpcRequest`);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
const viewportRpcResponse = (params, vpId, action) => ({
|
|
114
|
+
type: "VIEW_PORT_RPC_REPONSE",
|
|
115
|
+
action: {
|
|
116
|
+
type: "VP_RPC_SUCCESS",
|
|
117
|
+
...action
|
|
118
|
+
},
|
|
119
|
+
method: "???",
|
|
120
|
+
namedParams: {},
|
|
121
|
+
params,
|
|
122
|
+
vpId
|
|
123
|
+
});
|
|
124
|
+
const sendToMarket = async (rpcRequest) => {
|
|
125
|
+
if (isViewportRpcRequest(rpcRequest)) {
|
|
126
|
+
const { params, vpId } = rpcRequest;
|
|
127
|
+
const [basketInstanceId] = params;
|
|
128
|
+
basketTrading.update(basketInstanceId, "status", "ON_MARKET");
|
|
129
|
+
return viewportRpcResponse(params, vpId);
|
|
130
|
+
} else {
|
|
131
|
+
throw Error(`sendToMarket invalid rpcRequest`);
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
const takeOffMarket = async (rpcRequest) => {
|
|
135
|
+
if (isViewportRpcRequest(rpcRequest)) {
|
|
136
|
+
const { params, vpId } = rpcRequest;
|
|
137
|
+
const [basketInstanceId] = params;
|
|
138
|
+
basketTrading.update(basketInstanceId, "status", "OFF-MARKET");
|
|
139
|
+
return viewportRpcResponse(params, vpId);
|
|
140
|
+
} else {
|
|
141
|
+
throw Error(`takeOffMarket invalid rpcRequest`);
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
const createNewBasket = async (rpcRequest) => {
|
|
145
|
+
if (isViewportRpcRequest(rpcRequest)) {
|
|
146
|
+
const { params, vpId } = rpcRequest;
|
|
147
|
+
const [basketId, basketName] = params;
|
|
148
|
+
const key = createTradingBasket(basketId, basketName);
|
|
149
|
+
return viewportRpcResponse(params, vpId, { key });
|
|
150
|
+
} else {
|
|
151
|
+
throw Error(`createNewBasket invalid rpcRequest`);
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
const tables = {
|
|
155
|
+
algoType: new Table(
|
|
156
|
+
schemas.algoType,
|
|
157
|
+
[
|
|
158
|
+
["Sniper", 0],
|
|
159
|
+
["Dark Liquidity", 1],
|
|
160
|
+
["VWAP", 2],
|
|
161
|
+
["POV", 3],
|
|
162
|
+
["Dynamic Close", 4]
|
|
163
|
+
],
|
|
164
|
+
tableMaps.algoType
|
|
165
|
+
),
|
|
166
|
+
basket: new Table(
|
|
167
|
+
schemas.basket,
|
|
168
|
+
[
|
|
169
|
+
[".NASDAQ100", ".NASDAQ100", 0, 0],
|
|
170
|
+
[".HSI", ".HSI", 0, 0],
|
|
171
|
+
[".FTSE100", ".FTSE100", 0, 0],
|
|
172
|
+
[".SP500", ".SP500", 0, 0]
|
|
173
|
+
],
|
|
174
|
+
tableMaps.basket
|
|
175
|
+
),
|
|
176
|
+
basketConstituent,
|
|
177
|
+
basketTrading,
|
|
178
|
+
basketTradingConstituent,
|
|
179
|
+
basketTradingConstituentJoin: joinTables(
|
|
180
|
+
{ module: "BASKET", table: "basketTradingConstituentJoin" },
|
|
181
|
+
basketTradingConstituent,
|
|
182
|
+
pricesTable,
|
|
183
|
+
"ric"
|
|
184
|
+
),
|
|
185
|
+
priceStrategyType: new Table(
|
|
186
|
+
schemas.priceStrategyType,
|
|
187
|
+
[
|
|
188
|
+
["Peg to Near Touch", 0],
|
|
189
|
+
["Far Touch", 1],
|
|
190
|
+
["Limit", 2],
|
|
191
|
+
["Algo", 3]
|
|
192
|
+
],
|
|
193
|
+
tableMaps.priceStrategyType
|
|
194
|
+
)
|
|
195
|
+
};
|
|
196
|
+
const vuuLinks = {
|
|
197
|
+
...undefinedTables,
|
|
198
|
+
basketConstituent: [
|
|
199
|
+
{ fromColumn: "basketId", toColumn: "id", toTable: "basket" }
|
|
200
|
+
]
|
|
201
|
+
};
|
|
202
|
+
const menus = {
|
|
203
|
+
...undefinedTables,
|
|
204
|
+
basket: {
|
|
205
|
+
name: "ROOT",
|
|
206
|
+
menus: [
|
|
207
|
+
{
|
|
208
|
+
context: "selected-rows",
|
|
209
|
+
filter: "",
|
|
210
|
+
name: "Add Basket",
|
|
211
|
+
rpcName: "CREATE_NEW_BASKET"
|
|
212
|
+
}
|
|
213
|
+
]
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
const services = {
|
|
217
|
+
...undefinedTables,
|
|
218
|
+
basket: [
|
|
219
|
+
{
|
|
220
|
+
rpcName: "createBasket",
|
|
221
|
+
service: createNewBasket
|
|
222
|
+
}
|
|
223
|
+
],
|
|
224
|
+
basketTrading: [
|
|
225
|
+
{
|
|
226
|
+
rpcName: "sendToMarket",
|
|
227
|
+
service: sendToMarket
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
rpcName: "takeOffMarket",
|
|
231
|
+
service: takeOffMarket
|
|
232
|
+
}
|
|
233
|
+
],
|
|
234
|
+
basketTradingConstituentJoin: [
|
|
235
|
+
{
|
|
236
|
+
rpcName: "addConstituent",
|
|
237
|
+
service: addConstituent
|
|
238
|
+
}
|
|
239
|
+
]
|
|
240
|
+
};
|
|
241
|
+
const basketModule = new VuuModule({
|
|
242
|
+
menus,
|
|
243
|
+
name: "BASKET",
|
|
244
|
+
schemas,
|
|
245
|
+
services,
|
|
246
|
+
tables,
|
|
247
|
+
vuuLinks
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
export { basketModule, createBasketTradingRow, tables };
|
|
251
|
+
//# sourceMappingURL=basket-module.js.map
|