@vuu-ui/vuu-data-test 2.1.19-beta.1 → 2.1.19-beta.3
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 +73 -0
- package/cjs/RuntimeVisualLink.js.map +1 -0
- package/cjs/SessionTable.js +98 -0
- package/cjs/SessionTable.js.map +1 -0
- package/cjs/Table.js +128 -0
- package/cjs/Table.js.map +1 -0
- package/cjs/TickingArrayDataSource.js +397 -0
- package/cjs/TickingArrayDataSource.js.map +1 -0
- package/cjs/UpdateGenerator.js +94 -0
- package/cjs/UpdateGenerator.js.map +1 -0
- package/cjs/basket/BasketModule.js +282 -0
- package/cjs/basket/BasketModule.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/sp500.js +46 -0
- package/cjs/basket/reference-data/sp500.js.map +1 -0
- package/cjs/core/module/ModuleContainer.js +43 -0
- package/cjs/core/module/ModuleContainer.js.map +1 -0
- package/cjs/core/module/VuuModule.js +764 -0
- package/cjs/core/module/VuuModule.js.map +1 -0
- package/cjs/core/table/TableContainer.js +139 -0
- package/cjs/core/table/TableContainer.js.map +1 -0
- package/cjs/data-utils.js +55 -0
- package/cjs/data-utils.js.map +1 -0
- package/cjs/default-column-definitions.js +10 -0
- package/cjs/default-column-definitions.js.map +1 -0
- package/cjs/index.js +46 -0
- package/cjs/index.js.map +1 -0
- package/cjs/local-datasource-provider/LocalDatasourceProvider.js +70 -0
- package/cjs/local-datasource-provider/LocalDatasourceProvider.js.map +1 -0
- package/cjs/makeSuggestions.js +26 -0
- package/cjs/makeSuggestions.js.map +1 -0
- package/cjs/schemas.js +28 -0
- package/cjs/schemas.js.map +1 -0
- package/cjs/session-table-utils.js +12 -0
- package/cjs/session-table-utils.js.map +1 -0
- package/cjs/simul/SimulModule.js +187 -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 +19 -0
- package/cjs/simul/reference-data/instruments-extended.js.map +1 -0
- package/cjs/simul/reference-data/instruments.js +87 -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 +55 -0
- package/cjs/simul/reference-data/orders.js.map +1 -0
- package/cjs/simul/reference-data/parent-child-orders.js +146 -0
- package/cjs/simul/reference-data/parent-child-orders.js.map +1 -0
- package/cjs/simul/reference-data/prices.js +91 -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-schemas.js +148 -0
- package/cjs/simul/simul-schemas.js.map +1 -0
- package/cjs/test/TestModule.js +190 -0
- package/cjs/test/TestModule.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 +71 -0
- package/esm/RuntimeVisualLink.js.map +1 -0
- package/esm/SessionTable.js +95 -0
- package/esm/SessionTable.js.map +1 -0
- package/esm/Table.js +124 -0
- package/esm/Table.js.map +1 -0
- package/esm/TickingArrayDataSource.js +395 -0
- package/esm/TickingArrayDataSource.js.map +1 -0
- package/esm/UpdateGenerator.js +92 -0
- package/esm/UpdateGenerator.js.map +1 -0
- package/esm/basket/BasketModule.js +278 -0
- package/esm/basket/BasketModule.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/sp500.js +44 -0
- package/esm/basket/reference-data/sp500.js.map +1 -0
- package/esm/core/module/ModuleContainer.js +41 -0
- package/esm/core/module/ModuleContainer.js.map +1 -0
- package/esm/core/module/VuuModule.js +762 -0
- package/esm/core/module/VuuModule.js.map +1 -0
- package/esm/core/table/TableContainer.js +137 -0
- package/esm/core/table/TableContainer.js.map +1 -0
- package/esm/data-utils.js +50 -0
- package/esm/data-utils.js.map +1 -0
- package/esm/default-column-definitions.js +8 -0
- package/esm/default-column-definitions.js.map +1 -0
- package/esm/index.js +16 -0
- package/esm/index.js.map +1 -0
- package/esm/local-datasource-provider/LocalDatasourceProvider.js +68 -0
- package/esm/local-datasource-provider/LocalDatasourceProvider.js.map +1 -0
- package/esm/makeSuggestions.js +24 -0
- package/esm/makeSuggestions.js.map +1 -0
- package/esm/schemas.js +24 -0
- package/esm/schemas.js.map +1 -0
- package/esm/session-table-utils.js +10 -0
- package/esm/session-table-utils.js.map +1 -0
- package/esm/simul/SimulModule.js +184 -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 +17 -0
- package/esm/simul/reference-data/instruments-extended.js.map +1 -0
- package/esm/simul/reference-data/instruments.js +82 -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 +52 -0
- package/esm/simul/reference-data/orders.js.map +1 -0
- package/esm/simul/reference-data/parent-child-orders.js +141 -0
- package/esm/simul/reference-data/parent-child-orders.js.map +1 -0
- package/esm/simul/reference-data/prices.js +88 -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-schemas.js +145 -0
- package/esm/simul/simul-schemas.js.map +1 -0
- package/esm/test/TestModule.js +188 -0
- package/esm/test/TestModule.js.map +1 -0
- package/esm/vuu-row-generator.js +68 -0
- package/esm/vuu-row-generator.js.map +1 -0
- package/package.json +11 -9
- package/types/RuntimeVisualLink.d.ts +2 -2
- package/types/Table.d.ts +8 -8
- package/types/TickingArrayDataSource.d.ts +25 -6
- package/types/basket/BasketModule.d.ts +9 -9
- package/types/basket/reference-data/prices.d.ts +1 -1
- package/types/core/module/VuuModule.d.ts +13 -6
- package/types/core/table/TableContainer.d.ts +1 -1
- package/types/data-utils.d.ts +1 -0
- package/types/default-column-definitions.d.ts +2 -0
- package/types/makeSuggestions.d.ts +2 -1
- package/types/schemas.d.ts +1 -1
- package/types/simul/reference-data/instruments-extended.d.ts +1 -1
- package/types/simul/reference-data/instruments.d.ts +4 -2
- package/types/simul/reference-data/orders.d.ts +1 -1
- package/types/simul/reference-data/parent-child-orders.d.ts +2 -2
- package/types/simul/reference-data/prices.d.ts +4 -2
- package/types/test/TestModule.d.ts +3 -2
- package/types/test/index.d.ts +0 -1
- package/types/test/test-schemas.d.ts +0 -3
|
@@ -0,0 +1,395 @@
|
|
|
1
|
+
import { ArrayDataSource } from '@vuu-ui/vuu-data-local';
|
|
2
|
+
import { toRpcEditSessionMode, isRpcSuccess, isInlineEditingSession, isTypeaheadRequest, uuid } from '@vuu-ui/vuu-utils';
|
|
3
|
+
import { makeSuggestions } from './makeSuggestions.js';
|
|
4
|
+
|
|
5
|
+
var __defProp = Object.defineProperty;
|
|
6
|
+
var __typeError = (msg) => {
|
|
7
|
+
throw TypeError(msg);
|
|
8
|
+
};
|
|
9
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
10
|
+
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
11
|
+
var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
|
|
12
|
+
var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), member.get(obj));
|
|
13
|
+
var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
14
|
+
var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
|
|
15
|
+
var _menuRpcServices, _pendingVisualLink, _rpcMenuServices, _rpcServices, _sessionTables, _sessionDataSource, _table, _selectionLinkSubscribers, _visualLinkService, _getVisualLinks, _vuuModule;
|
|
16
|
+
class TickingArrayDataSource extends ArrayDataSource {
|
|
17
|
+
constructor({
|
|
18
|
+
data,
|
|
19
|
+
getVisualLinks,
|
|
20
|
+
rpcServices,
|
|
21
|
+
rpcMenuServices,
|
|
22
|
+
sessionTables,
|
|
23
|
+
table,
|
|
24
|
+
menu,
|
|
25
|
+
visualLink,
|
|
26
|
+
visualLinkService,
|
|
27
|
+
vuuModule,
|
|
28
|
+
...arrayDataSourceProps
|
|
29
|
+
}) {
|
|
30
|
+
if (data === void 0 && table === void 0) {
|
|
31
|
+
throw Error("TickingArrayDataSource must be constructed with data");
|
|
32
|
+
}
|
|
33
|
+
super({
|
|
34
|
+
...arrayDataSourceProps,
|
|
35
|
+
data: data ?? table?.data ?? [],
|
|
36
|
+
dataMap: table?.map
|
|
37
|
+
});
|
|
38
|
+
__privateAdd(this, _menuRpcServices);
|
|
39
|
+
__privateAdd(this, _pendingVisualLink);
|
|
40
|
+
__privateAdd(this, _rpcMenuServices);
|
|
41
|
+
__privateAdd(this, _rpcServices);
|
|
42
|
+
// A reference to session tables hosted within client side module
|
|
43
|
+
__privateAdd(this, _sessionTables);
|
|
44
|
+
__privateAdd(this, _sessionDataSource);
|
|
45
|
+
__privateAdd(this, _table);
|
|
46
|
+
__privateAdd(this, _selectionLinkSubscribers);
|
|
47
|
+
__privateAdd(this, _visualLinkService);
|
|
48
|
+
__privateAdd(this, _getVisualLinks);
|
|
49
|
+
__privateAdd(this, _vuuModule);
|
|
50
|
+
__publicField(this, "updateRowWithSessionCheck", (row, columnName, sessionId) => {
|
|
51
|
+
if (sessionId && sessionId === this.viewport) {
|
|
52
|
+
this.updateRow(row, columnName);
|
|
53
|
+
} else if (sessionId) {
|
|
54
|
+
console.warn("THIS IS NEVER EXPECTED TO HAPPEN");
|
|
55
|
+
} else if (__privateGet(this, _sessionDataSource)) ; else {
|
|
56
|
+
this.updateRow(row, columnName);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
__publicField(this, "handleSessionMessage", (msg) => {
|
|
60
|
+
if (msg.type === "subscribed") ; else if (msg.type === "viewport-update") {
|
|
61
|
+
if (msg.size !== void 0 && msg.size !== this.size) {
|
|
62
|
+
this.emit("resize", msg.size);
|
|
63
|
+
}
|
|
64
|
+
this.clientCallback?.(msg);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
__publicField(this, "addRow", async (rowData = {}) => {
|
|
68
|
+
const keyColumn = this.tableSchema.key;
|
|
69
|
+
const rowKey = rowData[keyColumn] ?? uuid();
|
|
70
|
+
const rowDataWithKey = {
|
|
71
|
+
...rowData,
|
|
72
|
+
[keyColumn]: rowKey
|
|
73
|
+
};
|
|
74
|
+
const response = await this.rpcRequest?.({
|
|
75
|
+
type: "RPC_REQUEST",
|
|
76
|
+
rpcName: "addRow",
|
|
77
|
+
params: { key: rowKey, data: rowDataWithKey }
|
|
78
|
+
});
|
|
79
|
+
if (isRpcSuccess(response)) {
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
return response?.errorMessage ?? "addRow failed";
|
|
83
|
+
});
|
|
84
|
+
__publicField(this, "deleteRow", async (key, mode = "hard") => {
|
|
85
|
+
const rpcHost = __privateGet(this, _sessionDataSource) ?? this;
|
|
86
|
+
const response = await rpcHost.rpcRequest?.({
|
|
87
|
+
type: "RPC_REQUEST",
|
|
88
|
+
rpcName: "deleteRow",
|
|
89
|
+
params: { key, mode }
|
|
90
|
+
});
|
|
91
|
+
if (isRpcSuccess(response)) {
|
|
92
|
+
return true;
|
|
93
|
+
}
|
|
94
|
+
return response?.errorMessage ?? "deleteRow failed";
|
|
95
|
+
});
|
|
96
|
+
__publicField(this, "deleteSelectedRows", async (mode = "soft") => {
|
|
97
|
+
const rpcHost = __privateGet(this, _sessionDataSource) ?? this;
|
|
98
|
+
const response = await rpcHost.rpcRequest?.({
|
|
99
|
+
type: "RPC_REQUEST",
|
|
100
|
+
rpcName: "deleteSelectedRows",
|
|
101
|
+
params: { mode }
|
|
102
|
+
});
|
|
103
|
+
return response ?? {
|
|
104
|
+
type: "ERROR_RESULT",
|
|
105
|
+
errorMessage: "deleteSelectedRows failed"
|
|
106
|
+
};
|
|
107
|
+
});
|
|
108
|
+
__publicField(this, "undoRowChange", async (key) => {
|
|
109
|
+
const rpcHost = __privateGet(this, _sessionDataSource) ?? this;
|
|
110
|
+
const response = await rpcHost.rpcRequest?.({
|
|
111
|
+
type: "RPC_REQUEST",
|
|
112
|
+
rpcName: "undoRowChange",
|
|
113
|
+
params: { key }
|
|
114
|
+
});
|
|
115
|
+
return response ?? { type: "ERROR_RESULT", errorMessage: "undoRowChange failed" };
|
|
116
|
+
});
|
|
117
|
+
this._menu = menu;
|
|
118
|
+
__privateSet(this, _rpcMenuServices, rpcMenuServices);
|
|
119
|
+
__privateSet(this, _pendingVisualLink, visualLink);
|
|
120
|
+
__privateSet(this, _rpcServices, rpcServices);
|
|
121
|
+
__privateSet(this, _sessionTables, sessionTables);
|
|
122
|
+
__privateSet(this, _table, table);
|
|
123
|
+
__privateSet(this, _visualLinkService, visualLinkService);
|
|
124
|
+
__privateSet(this, _getVisualLinks, getVisualLinks);
|
|
125
|
+
__privateSet(this, _vuuModule, vuuModule);
|
|
126
|
+
if (table) {
|
|
127
|
+
this.tableSchema = table.schema;
|
|
128
|
+
table.on("insert", this.insert);
|
|
129
|
+
table.on("update", this.updateRowWithSessionCheck);
|
|
130
|
+
table.on("delete", this.handleDeleteFromTable);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async subscribe(subscribeProps, callback) {
|
|
134
|
+
const subscription = super.subscribe(subscribeProps, callback);
|
|
135
|
+
if (__privateGet(this, _pendingVisualLink)) {
|
|
136
|
+
this.visualLink = __privateGet(this, _pendingVisualLink);
|
|
137
|
+
__privateSet(this, _pendingVisualLink, void 0);
|
|
138
|
+
}
|
|
139
|
+
return subscription;
|
|
140
|
+
}
|
|
141
|
+
unsubscribe() {
|
|
142
|
+
super.unsubscribe();
|
|
143
|
+
__privateSet(this, _table, void 0);
|
|
144
|
+
}
|
|
145
|
+
set range(range) {
|
|
146
|
+
super.range = range;
|
|
147
|
+
if (__privateGet(this, _sessionDataSource)) {
|
|
148
|
+
__privateGet(this, _sessionDataSource).range = range;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
get range() {
|
|
152
|
+
return super.range;
|
|
153
|
+
}
|
|
154
|
+
set links(links) {
|
|
155
|
+
super.links = links;
|
|
156
|
+
}
|
|
157
|
+
get links() {
|
|
158
|
+
var _a;
|
|
159
|
+
return (_a = __privateGet(this, _getVisualLinks)) == null ? void 0 : _a.call(this, this.table.table);
|
|
160
|
+
}
|
|
161
|
+
getSelectedRowIds() {
|
|
162
|
+
return Array.from(this.selectedRows);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Suppress row flushes from the source datasource while a session is active.
|
|
166
|
+
*
|
|
167
|
+
* `updateRowWithSessionCheck` already blocks individual row updates arriving
|
|
168
|
+
* via the table's "update" event. However, `sendRowsToClient` can also be
|
|
169
|
+
* reached through other paths that bypass that handler:
|
|
170
|
+
* - `setRange` (user scrolls the viewport)
|
|
171
|
+
* - config changes (filter / sort / group-by)
|
|
172
|
+
* - row inserts into the backing table
|
|
173
|
+
*
|
|
174
|
+
* Without this guard those paths would push source-table rows to the
|
|
175
|
+
* client and overwrite the edited session view.
|
|
176
|
+
*/
|
|
177
|
+
sendRowsToClient(forceFullRefresh = false, row) {
|
|
178
|
+
if (__privateGet(this, _sessionDataSource)) {
|
|
179
|
+
console.warn(
|
|
180
|
+
`[TickingArrayDataSource] sendRowsToClient suppressed during active edit session (forceFullRefresh=${forceFullRefresh}, ${row ? `rowKey=${row[6]}` : "full batch - likely setRange/scroll"})`
|
|
181
|
+
);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
super.sendRowsToClient(forceFullRefresh, row);
|
|
185
|
+
}
|
|
186
|
+
select(selectRequest) {
|
|
187
|
+
super.select(selectRequest);
|
|
188
|
+
if (__privateGet(this, _sessionDataSource)) {
|
|
189
|
+
__privateGet(this, _sessionDataSource).select(selectRequest);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
createSessionDataSource(sessionTable) {
|
|
193
|
+
if (__privateGet(this, _vuuModule)) {
|
|
194
|
+
return __privateGet(this, _vuuModule)?.createDataSource(
|
|
195
|
+
sessionTable.table,
|
|
196
|
+
sessionTable.table
|
|
197
|
+
);
|
|
198
|
+
} else {
|
|
199
|
+
throw Error(
|
|
200
|
+
`[TickingArrayDataSource] unable to createSessionDataSource, not constructed with VuuModule`
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
async beginEditSession(editSessionMode = "inline-all-rows") {
|
|
205
|
+
const rpcResponse = await this?.rpcRequest?.({
|
|
206
|
+
type: "RPC_REQUEST",
|
|
207
|
+
rpcName: "beginEditSession",
|
|
208
|
+
params: {
|
|
209
|
+
editSessionMode: toRpcEditSessionMode(editSessionMode)
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
if (isRpcSuccess(rpcResponse)) {
|
|
213
|
+
const { table: sessionTable } = rpcResponse.data;
|
|
214
|
+
if (isInlineEditingSession(editSessionMode)) {
|
|
215
|
+
__privateSet(this, _sessionDataSource, __privateGet(this, _vuuModule)?.createDataSource(
|
|
216
|
+
sessionTable.table,
|
|
217
|
+
sessionTable.table,
|
|
218
|
+
this.config
|
|
219
|
+
));
|
|
220
|
+
__privateGet(this, _sessionDataSource)?.subscribe(
|
|
221
|
+
{
|
|
222
|
+
range: this.range
|
|
223
|
+
},
|
|
224
|
+
this.handleSessionMessage
|
|
225
|
+
);
|
|
226
|
+
} else {
|
|
227
|
+
return __privateGet(this, _vuuModule)?.createDataSource(
|
|
228
|
+
sessionTable.table,
|
|
229
|
+
sessionTable.table,
|
|
230
|
+
this.config
|
|
231
|
+
);
|
|
232
|
+
}
|
|
233
|
+
} else {
|
|
234
|
+
throw Error(
|
|
235
|
+
`[VuuDataSource] beginEditSession ${rpcResponse.errorMessage}`
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
async editCell(key, column, data) {
|
|
240
|
+
console.log(
|
|
241
|
+
`[VuuDataSource] editCell ${__privateGet(this, _sessionDataSource)?.viewport} rowKey ${key}, column ${column}, value ${data}`
|
|
242
|
+
);
|
|
243
|
+
const rpcHost = __privateGet(this, _sessionDataSource) ?? this;
|
|
244
|
+
return rpcHost.rpcRequest?.({
|
|
245
|
+
type: "RPC_REQUEST",
|
|
246
|
+
rpcName: "editCell",
|
|
247
|
+
params: {
|
|
248
|
+
column,
|
|
249
|
+
data,
|
|
250
|
+
key
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
async endEditSession(saveChanges = false) {
|
|
255
|
+
const type = "RPC_REQUEST";
|
|
256
|
+
const rpcName = "endEditSession";
|
|
257
|
+
const sessionDataSource = __privateGet(this, _sessionDataSource);
|
|
258
|
+
const rpcHost = sessionDataSource ?? this;
|
|
259
|
+
if (sessionDataSource) {
|
|
260
|
+
__privateSet(this, _sessionDataSource, void 0);
|
|
261
|
+
}
|
|
262
|
+
const rpcResponse = await rpcHost.rpcRequest?.(
|
|
263
|
+
saveChanges ? { type, rpcName, params: { save: true } } : { type, rpcName, params: {} }
|
|
264
|
+
);
|
|
265
|
+
if (isRpcSuccess(rpcResponse)) {
|
|
266
|
+
sessionDataSource?.unsubscribe();
|
|
267
|
+
this.sendRowsToClient(true);
|
|
268
|
+
} else {
|
|
269
|
+
if (rpcResponse?.errorMessage === "stale update") {
|
|
270
|
+
sessionDataSource?.unsubscribe();
|
|
271
|
+
this.sendRowsToClient(true);
|
|
272
|
+
} else {
|
|
273
|
+
throw Error("unknown error");
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
async rpcRequest(rpcRequest) {
|
|
278
|
+
if (isTypeaheadRequest(rpcRequest)) {
|
|
279
|
+
const {
|
|
280
|
+
params: { column, starts }
|
|
281
|
+
} = rpcRequest;
|
|
282
|
+
const data = await this.getTypeaheadSuggestions(column, starts);
|
|
283
|
+
return {
|
|
284
|
+
type: "SUCCESS_RESULT",
|
|
285
|
+
data
|
|
286
|
+
};
|
|
287
|
+
} else {
|
|
288
|
+
const rpcService = __privateGet(this, _rpcServices)?.find(
|
|
289
|
+
(service) => service.rpcName === rpcRequest.rpcName
|
|
290
|
+
);
|
|
291
|
+
if (rpcService) {
|
|
292
|
+
return rpcService.service({
|
|
293
|
+
...rpcRequest,
|
|
294
|
+
context: {
|
|
295
|
+
type: "VIEWPORT_CONTEXT",
|
|
296
|
+
viewPortId: this.viewport
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
} else {
|
|
300
|
+
throw Error(
|
|
301
|
+
`[TickingArrayDataSource] no service to handle RPC request ${rpcRequest.rpcName}`
|
|
302
|
+
);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
async menuRpcCall(rpcRequest) {
|
|
307
|
+
const rpcService = __privateGet(this, _rpcMenuServices)?.find(
|
|
308
|
+
(service) => service.rpcName === rpcRequest.rpcName
|
|
309
|
+
);
|
|
310
|
+
if (rpcService) {
|
|
311
|
+
return rpcService.service({
|
|
312
|
+
...rpcRequest,
|
|
313
|
+
vpId: this.viewport
|
|
314
|
+
});
|
|
315
|
+
} else {
|
|
316
|
+
throw Error(
|
|
317
|
+
`[TickingArrayDataSource] menuRpcCall no service for ${rpcRequest.rpcName}`
|
|
318
|
+
);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
getTypeaheadSuggestions(column, pattern) {
|
|
322
|
+
if (__privateGet(this, _table)) {
|
|
323
|
+
const columnIndex = this.columnMap[column];
|
|
324
|
+
if (columnIndex === void 0) {
|
|
325
|
+
console.warn(
|
|
326
|
+
`[TickingArrayDataSource] getTypeaheadSuggestions. No column ${column}`
|
|
327
|
+
);
|
|
328
|
+
return Promise.resolve([]);
|
|
329
|
+
} else {
|
|
330
|
+
return makeSuggestions(this.currentData, columnIndex, pattern);
|
|
331
|
+
}
|
|
332
|
+
} else {
|
|
333
|
+
throw Error(
|
|
334
|
+
"cannot call getTypeaheadSuggestions on TickingDataSource if table has not been provided"
|
|
335
|
+
);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
get visualLink() {
|
|
339
|
+
return this._config.visualLink;
|
|
340
|
+
}
|
|
341
|
+
set visualLink(visualLink) {
|
|
342
|
+
var _a, _b;
|
|
343
|
+
this._config = {
|
|
344
|
+
...this._config,
|
|
345
|
+
visualLink
|
|
346
|
+
};
|
|
347
|
+
if (visualLink) {
|
|
348
|
+
const {
|
|
349
|
+
parentClientVpId,
|
|
350
|
+
link: { fromColumn, toColumn }
|
|
351
|
+
} = visualLink;
|
|
352
|
+
if (this.viewport) {
|
|
353
|
+
(_a = __privateGet(this, _visualLinkService)) == null ? void 0 : _a.call(this, {
|
|
354
|
+
childVpId: this.viewport,
|
|
355
|
+
childColumnName: fromColumn,
|
|
356
|
+
type: "CREATE_VISUAL_LINK",
|
|
357
|
+
parentVpId: parentClientVpId,
|
|
358
|
+
parentColumnName: toColumn
|
|
359
|
+
}).then((response) => {
|
|
360
|
+
this.emit(
|
|
361
|
+
"visual-link-created",
|
|
362
|
+
response
|
|
363
|
+
);
|
|
364
|
+
});
|
|
365
|
+
}
|
|
366
|
+
} else {
|
|
367
|
+
(_b = __privateGet(this, _visualLinkService)) == null ? void 0 : _b.call(this, {
|
|
368
|
+
childVpId: this.viewport,
|
|
369
|
+
type: "REMOVE_VISUAL_LINK"
|
|
370
|
+
}).then(() => {
|
|
371
|
+
this.emit("visual-link-removed");
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
freeze() {
|
|
376
|
+
super.freeze();
|
|
377
|
+
}
|
|
378
|
+
unfreeze() {
|
|
379
|
+
super.unfreeze();
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
_menuRpcServices = new WeakMap();
|
|
383
|
+
_pendingVisualLink = new WeakMap();
|
|
384
|
+
_rpcMenuServices = new WeakMap();
|
|
385
|
+
_rpcServices = new WeakMap();
|
|
386
|
+
_sessionTables = new WeakMap();
|
|
387
|
+
_sessionDataSource = new WeakMap();
|
|
388
|
+
_table = new WeakMap();
|
|
389
|
+
_selectionLinkSubscribers = new WeakMap();
|
|
390
|
+
_visualLinkService = new WeakMap();
|
|
391
|
+
_getVisualLinks = new WeakMap();
|
|
392
|
+
_vuuModule = new WeakMap();
|
|
393
|
+
|
|
394
|
+
export { TickingArrayDataSource };
|
|
395
|
+
//# sourceMappingURL=TickingArrayDataSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TickingArrayDataSource.js","sources":["../../../packages/vuu-data-test/src/TickingArrayDataSource.ts"],"sourcesContent":["import {\n ArrayDataSource,\n ArrayDataSourceConstructorProps,\n} from \"@vuu-ui/vuu-data-local\";\nimport type {\n DataSourceBase,\n DataSourceCallbackMessage,\n DataSourceRowWithBigint,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n DataSourceVisualLinkCreatedMessage,\n DeleteRowMode,\n EditSessionMode,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n LinkDescriptorWithLabel,\n RpcResultError,\n RpcResultSuccess,\n SelectRequest,\n VuuCreateVisualLink,\n VuuMenu,\n VuuRemoveVisualLink,\n VuuRowDataItemType,\n VuuRpcMenuRequest,\n VuuRpcMenuResponse,\n VuuRpcServiceRequest,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport {\n isInlineEditingSession,\n isRpcSuccess,\n isTypeaheadRequest,\n Range,\n toRpcEditSessionMode,\n uuid,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n IVuuModule,\n RpcMenuService,\n RpcService,\n SessionTableMap,\n} from \"./core/module/VuuModule\";\nimport { makeSuggestions } from \"./makeSuggestions\";\nimport { Table } from \"./Table\";\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 rpcMenuServices?: RpcMenuService[];\n rpcServices?: RpcService[];\n sessionTables?: SessionTableMap;\n table?: Table;\n visualLinkService?: VisualLinkHandler;\n vuuModule?: IVuuModule;\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 #rpcMenuServices: RpcMenuService[] | undefined;\n #rpcServices: RpcService[] | undefined;\n // A reference to session tables hosted within client side module\n #sessionTables: SessionTableMap | undefined;\n #sessionDataSource: DataSourceBase<DataSourceRowWithBigint> | undefined =\n undefined;\n #table?: Table;\n #selectionLinkSubscribers: Map<string, LinkSubscription> | undefined;\n #visualLinkService?: VisualLinkHandler;\n #getVisualLinks?: (\n tableName: string,\n ) => LinkDescriptorWithLabel[] | undefined;\n #vuuModule?: IVuuModule;\n\n constructor({\n data,\n getVisualLinks,\n rpcServices,\n rpcMenuServices,\n sessionTables,\n table,\n menu,\n visualLink,\n visualLinkService,\n vuuModule,\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 dataMap: table?.map,\n });\n this._menu = menu;\n\n this.#rpcMenuServices = rpcMenuServices;\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 this.#vuuModule = vuuModule;\n\n if (table) {\n this.tableSchema = table.schema;\n table.on(\"insert\", this.insert);\n table.on(\"update\", this.updateRowWithSessionCheck);\n // Use the base-class low-level handler so the overridden deleteRow\n // (which routes through rpcRequest)\n table.on(\"delete\", this.handleDeleteFromTable);\n }\n }\n\n updateRowWithSessionCheck = (\n row: Array<bigint | VuuRowDataItemType>,\n columnName?: string,\n sessionId?: string,\n ) => {\n if (sessionId && sessionId === this.viewport) {\n this.updateRow(row, columnName);\n } else if (sessionId) {\n // will never happen\n console.warn(\"THIS IS NEVER EXPECTED TO HAPPEN\");\n } else if (this.#sessionDataSource) {\n // queue updates for deferred application, issue warnings when edits in progress\n // this.emit(\"remote-update-during-local-edit\", row);\n } else {\n this.updateRow(row, columnName);\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 // Keep session datasource range in sync while editing.\n if (this.#sessionDataSource) {\n (this.#sessionDataSource as ArrayDataSource).range = range;\n }\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 getSelectedRowIds(): string[] {\n return Array.from(this.selectedRows);\n }\n\n /**\n * Suppress row flushes from the source datasource while a session is active.\n *\n * `updateRowWithSessionCheck` already blocks individual row updates arriving\n * via the table's \"update\" event. However, `sendRowsToClient` can also be\n * reached through other paths that bypass that handler:\n * - `setRange` (user scrolls the viewport)\n * - config changes (filter / sort / group-by)\n * - row inserts into the backing table\n *\n * Without this guard those paths would push source-table rows to the\n * client and overwrite the edited session view.\n */\n sendRowsToClient(forceFullRefresh = false, row?: DataSourceRowWithBigint) {\n if (this.#sessionDataSource) {\n console.warn(\n `[TickingArrayDataSource] sendRowsToClient suppressed during active edit session` +\n ` (forceFullRefresh=${forceFullRefresh}, ${row ? `rowKey=${row[6]}` : \"full batch - likely setRange/scroll\"})`,\n );\n return;\n }\n super.sendRowsToClient(forceFullRefresh, row);\n }\n\n select(selectRequest: Omit<SelectRequest, \"vpId\">) {\n // Forwarding the select request to the session\n // datasource causes it to update its own selectedRows\n // and re-send its rows\n super.select(selectRequest);\n if (this.#sessionDataSource) {\n (this.#sessionDataSource as ArrayDataSource).select(selectRequest);\n }\n }\n\n handleSessionMessage = (msg: DataSourceCallbackMessage) => {\n if (msg.type === \"subscribed\") {\n // console.log(`[VuuDataSource subscribed to session table]`);\n } else if (msg.type === \"viewport-update\") {\n if (msg.size !== undefined && msg.size !== this.size) {\n this.emit(\"resize\", msg.size);\n }\n this.clientCallback?.(msg);\n }\n };\n\n createSessionDataSource(sessionTable: VuuTable) {\n if (this.#vuuModule) {\n return this.#vuuModule?.createDataSource(\n sessionTable.table,\n sessionTable.table,\n );\n } else {\n throw Error(\n `[TickingArrayDataSource] unable to createSessionDataSource, not constructed with VuuModule`,\n );\n }\n }\n\n async beginEditSession(editSessionMode: EditSessionMode = \"inline-all-rows\") {\n const rpcResponse = await this?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"beginEditSession\",\n params: {\n editSessionMode: toRpcEditSessionMode(editSessionMode),\n },\n });\n\n if (isRpcSuccess(rpcResponse)) {\n const { table: sessionTable } = rpcResponse.data as { table: VuuTable };\n\n if (isInlineEditingSession(editSessionMode)) {\n this.#sessionDataSource = this.#vuuModule?.createDataSource(\n sessionTable.table,\n sessionTable.table,\n this.config,\n );\n\n this.#sessionDataSource?.subscribe(\n {\n range: this.range,\n },\n this.handleSessionMessage,\n );\n } else {\n return this.#vuuModule?.createDataSource(\n sessionTable.table,\n sessionTable.table,\n this.config,\n );\n }\n\n // we need to route messages from the session datasource to listening\n // client whilst still monitoring responses on the source table to which\n // we are currently subscribed.\n } else {\n throw Error(\n `[VuuDataSource] beginEditSession ${rpcResponse.errorMessage}`,\n );\n ///\n }\n }\n\n async editCell(key: string, column: string, data: VuuRowDataItemType) {\n console.log(\n `[VuuDataSource] editCell ${this.#sessionDataSource?.viewport} rowKey ${key}, column ${column}, value ${data}`,\n );\n\n const rpcHost = this.#sessionDataSource ?? this;\n\n return rpcHost.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"editCell\",\n params: {\n column,\n data,\n key,\n },\n });\n }\n\n addRow = async (\n rowData: Record<string, VuuRowDataItemType> = {},\n ): Promise<true | string> => {\n // Ensure each added row has a unique key.\n const keyColumn = this.tableSchema.key;\n const rowKey = (rowData[keyColumn] as string | undefined) ?? uuid();\n const rowDataWithKey: Record<string, VuuRowDataItemType> = {\n ...rowData,\n [keyColumn]: rowKey,\n };\n const response = await this.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"addRow\",\n params: { key: rowKey, data: rowDataWithKey },\n });\n if (isRpcSuccess(response)) {\n return true;\n }\n return response?.errorMessage ?? \"addRow failed\";\n };\n\n deleteRow = async (\n key: string,\n mode: DeleteRowMode = \"hard\",\n ): Promise<true | string> => {\n const rpcHost = this.#sessionDataSource ?? this;\n const response = await rpcHost.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"deleteRow\",\n params: { key, mode },\n });\n if (isRpcSuccess(response)) {\n return true;\n }\n return response?.errorMessage ?? \"deleteRow failed\";\n };\n\n deleteSelectedRows = async (\n mode: DeleteRowMode = \"soft\",\n ): Promise<RpcResultSuccess | RpcResultError> => {\n const rpcHost = this.#sessionDataSource ?? this;\n const response = await rpcHost.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"deleteSelectedRows\",\n params: { mode },\n });\n return (\n response ?? {\n type: \"ERROR_RESULT\",\n errorMessage: \"deleteSelectedRows failed\",\n }\n );\n };\n\n undoRowChange = async (\n key: string,\n ): Promise<RpcResultSuccess | RpcResultError> => {\n const rpcHost = this.#sessionDataSource ?? this;\n const response = await rpcHost.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"undoRowChange\",\n params: { key },\n });\n return (\n response ?? { type: \"ERROR_RESULT\", errorMessage: \"undoRowChange failed\" }\n );\n };\n\n async endEditSession(saveChanges = false) {\n const type = \"RPC_REQUEST\";\n const rpcName = \"endEditSession\";\n\n const sessionDataSource = this.#sessionDataSource;\n\n const rpcHost = sessionDataSource ?? this;\n\n if (sessionDataSource) {\n // timing is important here. By breaking this reference before\n // we send the endEdit RPC call, the application of session edits\n // to the source table will be handled correctly.\n this.#sessionDataSource = undefined;\n }\n\n const rpcResponse = await rpcHost.rpcRequest?.(\n saveChanges\n ? { type, rpcName, params: { save: true } }\n : { type, rpcName, params: {} },\n );\n\n if (isRpcSuccess(rpcResponse)) {\n sessionDataSource?.unsubscribe();\n this.sendRowsToClient(true);\n } else {\n // TODO do we reinstate the sessionDataSource ?\n if (rpcResponse?.errorMessage === \"stale update\") {\n sessionDataSource?.unsubscribe();\n this.sendRowsToClient(true);\n } else {\n throw Error(\"unknown error\");\n }\n }\n }\n\n async rpcRequest(\n rpcRequest: Omit<VuuRpcServiceRequest, \"context\">,\n ): Promise<RpcResultSuccess | RpcResultError> {\n if (isTypeaheadRequest(rpcRequest)) {\n const {\n params: { column, starts },\n } = rpcRequest;\n const data = await this.getTypeaheadSuggestions(column, starts);\n return {\n type: \"SUCCESS_RESULT\",\n data,\n } as RpcResultSuccess;\n } else {\n const rpcService = this.#rpcServices?.find(\n (service) => service.rpcName === rpcRequest.rpcName,\n );\n if (rpcService) {\n return rpcService.service({\n ...rpcRequest,\n context: {\n type: \"VIEWPORT_CONTEXT\",\n viewPortId: this.viewport,\n },\n });\n } else {\n throw Error(\n `[TickingArrayDataSource] no service to handle RPC request ${rpcRequest.rpcName}`,\n );\n }\n }\n }\n\n async menuRpcCall(\n rpcRequest: Omit<VuuRpcMenuRequest, \"vpId\">,\n ): Promise<VuuRpcMenuResponse> {\n const rpcService = this.#rpcMenuServices?.find(\n (service) => service.rpcName === rpcRequest.rpcName,\n );\n\n if (rpcService) {\n return rpcService.service({\n ...rpcRequest,\n vpId: this.viewport,\n } as VuuRpcMenuRequest);\n } else {\n throw Error(\n `[TickingArrayDataSource] menuRpcCall no service for ${rpcRequest.rpcName}`,\n );\n }\n }\n\n getTypeaheadSuggestions(column: string, pattern?: string): Promise<string[]> {\n if (this.#table) {\n const columnIndex = this.columnMap[column];\n if (columnIndex === undefined) {\n console.warn(\n `[TickingArrayDataSource] getTypeaheadSuggestions. No column ${column}`,\n );\n return Promise.resolve([]);\n } else {\n return makeSuggestions(this.currentData, columnIndex, pattern);\n }\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 freeze() {\n super.freeze();\n }\n\n unfreeze() {\n super.unfreeze();\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":["../../../packages/vuu-data-test/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":"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"}
|