@vuu-ui/vuu-data-test 2.1.8 → 2.1.9
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/Table.js +3 -0
- package/cjs/Table.js.map +1 -1
- package/cjs/TickingArrayDataSource.js +21 -15
- package/cjs/TickingArrayDataSource.js.map +1 -1
- package/cjs/basket/BasketModule.js.map +1 -1
- package/cjs/core/module/VuuModule.js +49 -19
- package/cjs/core/module/VuuModule.js.map +1 -1
- package/cjs/session-table-utils.js +12 -0
- package/cjs/session-table-utils.js.map +1 -0
- package/esm/Table.js +3 -0
- package/esm/Table.js.map +1 -1
- package/esm/TickingArrayDataSource.js +21 -15
- package/esm/TickingArrayDataSource.js.map +1 -1
- package/esm/basket/BasketModule.js.map +1 -1
- package/esm/core/module/VuuModule.js +50 -20
- package/esm/core/module/VuuModule.js.map +1 -1
- package/esm/session-table-utils.js +10 -0
- package/esm/session-table-utils.js.map +1 -0
- package/package.json +6 -6
- package/types/TickingArrayDataSource.d.ts +1 -1
- package/types/core/module/VuuModule.d.ts +1 -1
- package/types/session-table-utils.d.ts +2 -0
package/cjs/Table.js
CHANGED
|
@@ -96,6 +96,9 @@ class Table extends vuuUtils.EventEmitter {
|
|
|
96
96
|
(row2) => row2[__privateGet(this, _indexOfKey)] === key
|
|
97
97
|
);
|
|
98
98
|
if (rowIndex !== -1) {
|
|
99
|
+
const tsIndex = __privateGet(this, _dataMap).vuuUpdatedTimestamp;
|
|
100
|
+
const lastUpdated = Date.now();
|
|
101
|
+
row[tsIndex] = lastUpdated;
|
|
99
102
|
__privateGet(this, _data)[rowIndex] = row;
|
|
100
103
|
this.emit("update", row);
|
|
101
104
|
}
|
package/cjs/Table.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Table.js","sources":["../../../packages/vuu-data-test/src/Table.ts"],"sourcesContent":["import { TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap, EventEmitter } from \"@vuu-ui/vuu-utils\";\nimport { UpdateGenerator } from \"./rowUpdates\";\n\nexport type TableEvents = {\n delete: (key: string) => void;\n insert: (row: VuuRowDataItemType[]) => void;\n update: (\n row: VuuRowDataItemType[],\n columnName?: string,\n sessionId?: string,\n ) => void;\n};\n\nexport class Table extends EventEmitter<TableEvents> {\n #data: VuuRowDataItemType[][];\n #dataMap: ColumnMap;\n #indexOfKey: number;\n #index = new Map<string, number>();\n #schema: TableSchema;\n\n constructor(\n schema: TableSchema,\n data: VuuRowDataItemType[][],\n dataMap: ColumnMap,\n updateGenerator?: UpdateGenerator,\n ) {\n super();\n this.#data = data;\n this.#dataMap = dataMap;\n this.#schema = schema;\n this.#indexOfKey = dataMap[schema.key];\n this.buildIndex();\n updateGenerator?.setTable(this);\n updateGenerator?.setRange({ from: 0, to: 100 });\n }\n\n private buildIndex() {\n for (let i = 0; i < this.#data.length; i++) {\n const key = this.#data[i][this.#indexOfKey] as string;\n this.#index.set(key, i);\n }\n }\n\n get data() {\n return this.#data;\n }\n\n get map() {\n return this.#dataMap;\n }\n\n get schema() {\n return this.#schema;\n }\n\n get name() {\n return this.#schema.table.table;\n }\n\n delete(key: string, emitEvent = true) {\n const index = this.#index.get(key) ?? -1;\n if (index !== -1) {\n this.#index.delete(key);\n this.#data.splice(index, 1);\n\n for (let i = index; i < this.#data.length; i++) {\n this.#index.set(this.#data[i][this.#indexOfKey] as string, i);\n }\n\n if (emitEvent) {\n this.emit(\"delete\", key);\n }\n } else {\n throw Error(`[Table] delete key ${key} not found`);\n }\n }\n\n insert(row: VuuRowDataItemType[], emitEvent = true) {\n const index = this.#data.length;\n this.#data.push(row);\n const key = row[this.#indexOfKey] as string;\n this.#index.set(key, index);\n if (emitEvent) {\n this.emit(\"insert\", row);\n }\n }\n\n findByKey(key: string) {\n const index = this.#index.get(key) ?? -1;\n return this.#data[index];\n }\n\n update(key: string, columnName: string, value: VuuRowDataItemType) {\n const rowIndex = this.#data.findIndex(\n (row) => row[this.#indexOfKey] === key,\n );\n const colIndex = this.#dataMap[columnName];\n if (rowIndex !== -1) {\n const row = this.#data[rowIndex];\n const newRow = row.slice();\n newRow[colIndex] = value;\n\n const tsIndex = this.#dataMap.vuuUpdatedTimestamp;\n if (typeof tsIndex === \"number\") {\n const lastUpdated = Date.now();\n newRow[tsIndex] = lastUpdated;\n }\n\n this.#data[rowIndex] = newRow;\n this.emit(\"update\", newRow, columnName);\n }\n }\n updateRow(row: VuuRowDataItemType[]) {\n const key = row[this.#indexOfKey];\n const rowIndex = this.#data.findIndex(\n (row) => row[this.#indexOfKey] === key,\n );\n if (rowIndex !== -1) {\n this.#data[rowIndex] = row;\n this.emit(\"update\", row);\n }\n }\n}\n\nexport function buildDataColumnMapFromSchema(schema: Readonly<TableSchema>) {\n return Object.values(schema.columns).reduce<ColumnMap>(\n (map, col, index) => ({\n ...map,\n [col.name]: index,\n }),\n {},\n );\n}\n\n/**\n * Build a data ColumnMap for a table in the provided schema.\n * A data ColumnMap is a mapping from a raw data array to a map, keyed\n * by column name with no additional metadata.\n *\n * @param schemas\n * @param tableName\n * @returns\n */\nexport function buildDataColumnMap<TableName extends string = string>(\n schemas: Readonly<Record<TableName, Readonly<TableSchema>>>,\n tableName: TableName,\n) {\n return buildDataColumnMapFromSchema(schemas[tableName]);\n}\n"],"names":["EventEmitter","row"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Table.js","sources":["../../../packages/vuu-data-test/src/Table.ts"],"sourcesContent":["import { TableSchema } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap, EventEmitter } from \"@vuu-ui/vuu-utils\";\nimport { UpdateGenerator } from \"./rowUpdates\";\n\nexport type TableEvents = {\n delete: (key: string) => void;\n insert: (row: VuuRowDataItemType[]) => void;\n update: (\n row: VuuRowDataItemType[],\n columnName?: string,\n sessionId?: string,\n ) => void;\n};\n\nexport class Table extends EventEmitter<TableEvents> {\n #data: VuuRowDataItemType[][];\n #dataMap: ColumnMap;\n #indexOfKey: number;\n #index = new Map<string, number>();\n #schema: TableSchema;\n\n constructor(\n schema: TableSchema,\n data: VuuRowDataItemType[][],\n dataMap: ColumnMap,\n updateGenerator?: UpdateGenerator,\n ) {\n super();\n this.#data = data;\n this.#dataMap = dataMap;\n this.#schema = schema;\n this.#indexOfKey = dataMap[schema.key];\n this.buildIndex();\n updateGenerator?.setTable(this);\n updateGenerator?.setRange({ from: 0, to: 100 });\n }\n\n private buildIndex() {\n for (let i = 0; i < this.#data.length; i++) {\n const key = this.#data[i][this.#indexOfKey] as string;\n this.#index.set(key, i);\n }\n }\n\n get data() {\n return this.#data;\n }\n\n get map() {\n return this.#dataMap;\n }\n\n get schema() {\n return this.#schema;\n }\n\n get name() {\n return this.#schema.table.table;\n }\n\n delete(key: string, emitEvent = true) {\n const index = this.#index.get(key) ?? -1;\n if (index !== -1) {\n this.#index.delete(key);\n this.#data.splice(index, 1);\n\n for (let i = index; i < this.#data.length; i++) {\n this.#index.set(this.#data[i][this.#indexOfKey] as string, i);\n }\n\n if (emitEvent) {\n this.emit(\"delete\", key);\n }\n } else {\n throw Error(`[Table] delete key ${key} not found`);\n }\n }\n\n insert(row: VuuRowDataItemType[], emitEvent = true) {\n const index = this.#data.length;\n this.#data.push(row);\n const key = row[this.#indexOfKey] as string;\n this.#index.set(key, index);\n if (emitEvent) {\n this.emit(\"insert\", row);\n }\n }\n\n findByKey(key: string) {\n const index = this.#index.get(key) ?? -1;\n return this.#data[index];\n }\n\n update(key: string, columnName: string, value: VuuRowDataItemType) {\n const rowIndex = this.#data.findIndex(\n (row) => row[this.#indexOfKey] === key,\n );\n const colIndex = this.#dataMap[columnName];\n if (rowIndex !== -1) {\n const row = this.#data[rowIndex];\n const newRow = row.slice();\n newRow[colIndex] = value;\n\n const tsIndex = this.#dataMap.vuuUpdatedTimestamp;\n if (typeof tsIndex === \"number\") {\n const lastUpdated = Date.now();\n newRow[tsIndex] = lastUpdated;\n }\n\n this.#data[rowIndex] = newRow;\n this.emit(\"update\", newRow, columnName);\n }\n }\n updateRow(row: VuuRowDataItemType[]) {\n const key = row[this.#indexOfKey];\n const rowIndex = this.#data.findIndex(\n (row) => row[this.#indexOfKey] === key,\n );\n if (rowIndex !== -1) {\n const tsIndex = this.#dataMap.vuuUpdatedTimestamp;\n const lastUpdated = Date.now();\n row[tsIndex] = lastUpdated;\n this.#data[rowIndex] = row;\n this.emit(\"update\", row);\n }\n }\n}\n\nexport function buildDataColumnMapFromSchema(schema: Readonly<TableSchema>) {\n return Object.values(schema.columns).reduce<ColumnMap>(\n (map, col, index) => ({\n ...map,\n [col.name]: index,\n }),\n {},\n );\n}\n\n/**\n * Build a data ColumnMap for a table in the provided schema.\n * A data ColumnMap is a mapping from a raw data array to a map, keyed\n * by column name with no additional metadata.\n *\n * @param schemas\n * @param tableName\n * @returns\n */\nexport function buildDataColumnMap<TableName extends string = string>(\n schemas: Readonly<Record<TableName, Readonly<TableSchema>>>,\n tableName: TableName,\n) {\n return buildDataColumnMapFromSchema(schemas[tableName]);\n}\n"],"names":["EventEmitter","row"],"mappings":"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"}
|
|
@@ -52,9 +52,10 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
|
|
|
52
52
|
__publicField(this, "updateRowWithSessionCheck", (row, columnName, sessionId) => {
|
|
53
53
|
if (sessionId && sessionId === this.viewport) {
|
|
54
54
|
this.updateRow(row, columnName);
|
|
55
|
-
} else if (sessionId)
|
|
56
|
-
console.
|
|
57
|
-
} else {
|
|
55
|
+
} else if (sessionId) {
|
|
56
|
+
console.warn("THIS IS NEVER EXPECTED TO HAPPEN");
|
|
57
|
+
} else if (__privateGet(this, _sessionDataSource)) ; else {
|
|
58
|
+
console.log("go ahead and update row");
|
|
58
59
|
this.updateRow(row, columnName);
|
|
59
60
|
}
|
|
60
61
|
});
|
|
@@ -138,7 +139,8 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
|
|
|
138
139
|
if (vuuUtils.isInlineEditingSession(editSessionMode)) {
|
|
139
140
|
__privateSet(this, _sessionDataSource, __privateGet(this, _vuuModule)?.createDataSource(
|
|
140
141
|
sessionTable.table,
|
|
141
|
-
sessionTable.table
|
|
142
|
+
sessionTable.table,
|
|
143
|
+
this.config
|
|
142
144
|
));
|
|
143
145
|
__privateGet(this, _sessionDataSource)?.subscribe(
|
|
144
146
|
{
|
|
@@ -149,7 +151,8 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
|
|
|
149
151
|
} else {
|
|
150
152
|
return __privateGet(this, _vuuModule)?.createDataSource(
|
|
151
153
|
sessionTable.table,
|
|
152
|
-
sessionTable.table
|
|
154
|
+
sessionTable.table,
|
|
155
|
+
this.config
|
|
153
156
|
);
|
|
154
157
|
}
|
|
155
158
|
} else {
|
|
@@ -163,7 +166,7 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
|
|
|
163
166
|
`[VuuDataSource] editCell ${__privateGet(this, _sessionDataSource)?.viewport} rowKey ${key}, column ${column}, value ${data}`
|
|
164
167
|
);
|
|
165
168
|
const rpcHost = __privateGet(this, _sessionDataSource) ?? this;
|
|
166
|
-
|
|
169
|
+
return rpcHost.rpcRequest?.({
|
|
167
170
|
type: "RPC_REQUEST",
|
|
168
171
|
rpcName: "editCell",
|
|
169
172
|
params: {
|
|
@@ -172,25 +175,28 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
|
|
|
172
175
|
key
|
|
173
176
|
}
|
|
174
177
|
});
|
|
175
|
-
if (vuuUtils.isRpcSuccess(rpcResponse)) {
|
|
176
|
-
console.log("edit succeeded");
|
|
177
|
-
} else {
|
|
178
|
-
throw Error("oh oh");
|
|
179
|
-
}
|
|
180
178
|
}
|
|
181
179
|
async endEditSession(saveChanges = false) {
|
|
182
|
-
console.log(`[VuuDataSource] endEditSession saveChanges ${saveChanges}`);
|
|
183
180
|
const type = "RPC_REQUEST";
|
|
184
181
|
const rpcName = "endEditSession";
|
|
185
|
-
const
|
|
182
|
+
const sessionDataSource = __privateGet(this, _sessionDataSource);
|
|
183
|
+
const rpcHost = sessionDataSource ?? this;
|
|
184
|
+
if (sessionDataSource) {
|
|
185
|
+
__privateSet(this, _sessionDataSource, void 0);
|
|
186
|
+
}
|
|
186
187
|
const rpcResponse = await rpcHost.rpcRequest?.(
|
|
187
188
|
saveChanges ? { type, rpcName, params: { save: true } } : { type, rpcName, params: {} }
|
|
188
189
|
);
|
|
189
190
|
if (vuuUtils.isRpcSuccess(rpcResponse)) {
|
|
190
|
-
|
|
191
|
+
sessionDataSource?.unsubscribe();
|
|
191
192
|
this.sendRowsToClient(true);
|
|
192
193
|
} else {
|
|
193
|
-
|
|
194
|
+
if (rpcResponse?.errorMessage === "stale update") {
|
|
195
|
+
sessionDataSource?.unsubscribe();
|
|
196
|
+
this.sendRowsToClient(true);
|
|
197
|
+
} else {
|
|
198
|
+
throw Error("unknown error");
|
|
199
|
+
}
|
|
194
200
|
}
|
|
195
201
|
}
|
|
196
202
|
async rpcRequest(rpcRequest) {
|
|
@@ -1 +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 DataSource,\n DataSourceCallbackMessage,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n DataSourceVisualLinkCreatedMessage,\n EditSessionMode,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n LinkDescriptorWithLabel,\n RpcResultError,\n RpcResultSuccess,\n VuuCreateVisualLink,\n VuuMenu,\n VuuRemoveVisualLink,\n VuuRowDataItemType,\n VuuRpcMenuRequest,\n VuuRpcMenuResponse,\n VuuRpcServiceRequest,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { isRpcSuccess, isTypeaheadRequest, Range } 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\";\nimport { isInlineEditingSession } from \"@vuu-ui/vuu-utils\";\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: DataSource | undefined = 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 table.on(\"delete\", this.deleteRow);\n }\n }\n\n updateRowWithSessionCheck = (\n row: VuuRowDataItemType[],\n columnName?: string,\n sessionId?: string,\n ) => {\n if (sessionId && sessionId === this.viewport) {\n this.updateRow(row, columnName);\n } else if (sessionId) {\n // ignore, its not for me\n } else if (this.status === \"suspended\") {\n // queue updates for deferred application, issue warnings when edits in progress\n console.log(\"updates incoming from differenrt edit session\");\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 // 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() {\n return Array.from(this.selectedRows);\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 console.log(`[VuuDataSource] clientCallback with ${msg.type}`);\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,\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 );\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 );\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 const rpcResponse = await rpcHost.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"editCell\",\n params: {\n column,\n data,\n key,\n },\n });\n\n if (isRpcSuccess(rpcResponse)) {\n console.log(\"edit succeeded\");\n } else {\n throw Error(\"oh oh\");\n }\n }\n\n async endEditSession(saveChanges = false) {\n console.log(`[VuuDataSource] endEditSession saveChanges ${saveChanges}`);\n\n const type = \"RPC_REQUEST\";\n const rpcName = \"endEditSession\";\n\n const rpcHost = this.#sessionDataSource ?? this;\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 this.#sessionDataSource?.unsubscribe();\n this.sendRowsToClient(true);\n } else {\n throw Error(\"oh oh\");\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":["ArrayDataSource","isRpcSuccess","isInlineEditingSession","isTypeaheadRequest","makeSuggestions"],"mappings":"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"}
|
|
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 DataSource,\n DataSourceCallbackMessage,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n DataSourceVisualLinkCreatedMessage,\n EditSessionMode,\n} from \"@vuu-ui/vuu-data-types\";\nimport type {\n LinkDescriptorWithLabel,\n RpcResultError,\n RpcResultSuccess,\n VuuCreateVisualLink,\n VuuMenu,\n VuuRemoveVisualLink,\n VuuRowDataItemType,\n VuuRpcMenuRequest,\n VuuRpcMenuResponse,\n VuuRpcServiceRequest,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { isRpcSuccess, isTypeaheadRequest, Range } 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\";\nimport { isInlineEditingSession } from \"@vuu-ui/vuu-utils\";\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: DataSource | undefined = 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 table.on(\"delete\", this.deleteRow);\n }\n }\n\n updateRowWithSessionCheck = (\n row: 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 console.log(\"go ahead and update row\");\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 // 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() {\n return Array.from(this.selectedRows);\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 console.log(`[VuuDataSource] clientCallback with ${msg.type}`);\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,\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 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":["ArrayDataSource","isRpcSuccess","isInlineEditingSession","isTypeaheadRequest","makeSuggestions"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BasketModule.js","sources":["../../../../packages/vuu-data-test/src/basket/BasketModule.ts"],"sourcesContent":["import { VuuMenu, VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap } from \"@vuu-ui/vuu-utils\";\nimport {\n RpcMenuService,\n ServiceHandler,\n VuuModule,\n} from \"../core/module/VuuModule\";\nimport tableContainer from \"../core/table/TableContainer\";\nimport { BasketsTableName, schemas } from \"./basket-schemas\";\nimport basketConstituentData from \"./reference-data/constituents\";\nimport { type Table } from \"../Table\";\n\nconst { createTable } = tableContainer;\n\nlet basketIncrement = 1;\n\n// export as convenience for showcase examples\nexport const createBasketTradingRow = (\n basketId: string,\n basketName: string,\n side = \"BUY\",\n status = \"OFF MARKET\",\n) => [\n basketId,\n basketName,\n 0,\n 1.25,\n `steve-${basketIncrement++}`,\n side,\n status,\n 1_000_000,\n 1_250_000,\n 100,\n];\n\nconst undefinedTables = {\n algoType: undefined,\n basket: undefined,\n basketTrading: undefined,\n basketTradingConstituent: undefined,\n basketConstituent: undefined,\n basketTradingConstituentJoin: undefined,\n priceStrategyType: undefined,\n};\n\n// This is a 'local' columnMap\nconst buildDataColumnMap = (tableName: BasketsTableName) =>\n Object.values(schemas[tableName].columns).reduce<ColumnMap>(\n (map, col, index) => {\n map[col.name] = index;\n return map;\n },\n {},\n );\n\nconst tableMaps: Record<BasketsTableName, ColumnMap> = {\n algoType: buildDataColumnMap(\"algoType\"),\n basket: buildDataColumnMap(\"basket\"),\n basketTrading: buildDataColumnMap(\"basketTrading\"),\n basketTradingConstituent: buildDataColumnMap(\"basketTradingConstituent\"),\n basketConstituent: buildDataColumnMap(\"basketConstituent\"),\n basketTradingConstituentJoin: buildDataColumnMap(\n \"basketTradingConstituentJoin\",\n ),\n priceStrategyType: buildDataColumnMap(\"priceStrategyType\"),\n};\n\nconst basketTradingConstituent = tableContainer.createTable(\n schemas.basketTradingConstituent,\n [],\n tableMaps.basketTradingConstituent,\n);\n\n/**\n * This is an example of how we might extend the built-in VuuModule to\n * implement a module-specific service in such a way that it can invoke\n * methods on the VuuModule.\n */\nexport class BasketModule extends VuuModule<BasketsTableName> {\n #tables: Record<BasketsTableName, Table> = {\n algoType: createTable(\n schemas.algoType,\n [\n [\"Sniper\", 0],\n [\"Dark Liquidity\", 1],\n [\"VWAP\", 2],\n [\"POV\", 3],\n [\"Dynamic Close\", 4],\n ],\n tableMaps.algoType,\n ),\n basket: createTable(\n schemas.basket,\n [\n [\".NASDAQ100\", \".NASDAQ100\", 0, 0],\n [\".HSI\", \".HSI\", 0, 0],\n [\".FTSE100\", \".FTSE100\", 0, 0],\n [\".SP500\", \".SP500\", 0, 0],\n ],\n tableMaps.basket,\n ),\n basketConstituent: createTable(\n schemas.basketConstituent,\n basketConstituentData,\n tableMaps.basketConstituent,\n ),\n basketTrading: createTable(\n schemas.basketTrading,\n [],\n tableMaps.basketTrading,\n ),\n basketTradingConstituent,\n basketTradingConstituentJoin: tableContainer.createJoinTable(\n { module: \"BASKET\", table: \"basketTradingConstituentJoin\" },\n { module: \"BASKET\", table: \"basketTradingConstituent\" },\n { module: \"SIMUL\", table: \"prices\" },\n \"ric\",\n ),\n priceStrategyType: createTable(\n schemas.priceStrategyType,\n [\n [\"Peg to Near Touch\", 0],\n [\"Far Touch\", 1],\n [\"Limit\", 2],\n [\"Algo\", 3],\n ],\n tableMaps.priceStrategyType,\n ),\n };\n\n constructor() {\n super(\"BASKET\");\n }\n\n get menus(): Record<BasketsTableName, VuuMenu | undefined> {\n return {\n ...undefinedTables,\n basket: {\n name: \"ROOT\",\n menus: [\n {\n context: \"selected-rows\",\n filter: \"\",\n name: \"Add Basket\",\n rpcName: \"CREATE_NEW_BASKET\",\n },\n ],\n },\n };\n }\n\n get schemas() {\n return schemas;\n }\n\n get services() {\n return {\n ...undefinedTables,\n basket: [\n {\n rpcName: \"createBasket\",\n service: this.createNewBasket,\n },\n ],\n basketTrading: [\n {\n rpcName: \"sendToMarket\",\n service: this.sendToMarket,\n },\n {\n rpcName: \"takeOffMarket\",\n service: this.takeOffMarket,\n },\n ],\n basketTradingConstituentJoin: [\n {\n rpcName: \"addConstituent\",\n service: this.addConstituent,\n },\n ],\n };\n }\n\n get menuServices():\n | Record<BasketsTableName, RpcMenuService[] | undefined>\n | undefined {\n return {\n ...undefinedTables,\n };\n }\n\n get tables() {\n return this.#tables;\n }\n\n get visualLinks() {\n return {\n ...undefinedTables,\n basketConstituent: [\n { fromColumn: \"basketId\", toColumn: \"id\", toTable: \"basket\" },\n ],\n };\n }\n\n private createTradingBasket(basketId: string, basketName: string) {\n const basketTradingRow = createBasketTradingRow(basketId, basketName);\n\n this.tables.basketTrading.insert(basketTradingRow);\n\n const { basketId: key } = buildDataColumnMap(\"basketConstituent\");\n const constituents = this.tables.basketConstituent.data.filter(\n (c) => c[key] === basketId,\n );\n\n const { instanceId } = tableMaps.basketTrading;\n\n constituents.forEach(\n ([, , description, , ric, , , quantity, weighting]) => {\n const algo = \"\";\n const algoParams = \"\";\n const limitPrice = 95;\n const notionalLocal = 0;\n const notionalUsd = 0;\n const pctFilled = 0;\n const priceSpread = 0;\n const priceStrategyId = \"\";\n const side = \"BUY\";\n const venue = \"venue\";\n\n const basketInstanceId = basketTradingRow[instanceId];\n const basketTradingConstituentRow: VuuRowDataItemType[] = [\n algo,\n algoParams,\n basketId,\n description,\n basketInstanceId,\n `${basketInstanceId}-${ric}`,\n limitPrice,\n notionalLocal,\n notionalUsd,\n pctFilled,\n priceSpread,\n priceStrategyId,\n quantity,\n ric,\n side,\n venue,\n weighting,\n ];\n basketTradingConstituent.insert(basketTradingConstituentRow);\n },\n );\n\n // return the key\n return basketTradingRow[instanceId] as string;\n }\n\n private createNewBasket: ServiceHandler = async (rpcRequest) => {\n if (rpcRequest.context.type === \"VIEWPORT_CONTEXT\") {\n const { sourceBasketId, tradeBasketName } = rpcRequest.params;\n const key = this.createTradingBasket(\n sourceBasketId as string,\n tradeBasketName as string,\n );\n return {\n type: \"SUCCESS_RESULT\",\n data: key,\n };\n } else {\n throw Error(\"[BasketModule] createNewBasket invalid request type\");\n }\n };\n\n private sendToMarket: ServiceHandler = async (rpcRequest) => {\n if (rpcRequest.context.type === \"VIEWPORT_CONTEXT\") {\n const { basketInstanceId } = rpcRequest.params;\n this.tables.basketTrading.update(\n basketInstanceId as string,\n \"status\",\n \"ON_MARKET\",\n );\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n } else {\n throw Error(\"[BasketModule] createNewBasket invalid request type\");\n }\n };\n private takeOffMarket: ServiceHandler = async (rpcRequest) => {\n if (rpcRequest.context.type === \"VIEWPORT_CONTEXT\") {\n const { basketInstanceId } = rpcRequest.params;\n this.tables.basketTrading.update(\n basketInstanceId as string,\n \"status\",\n \"OFF-MARKET\",\n );\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n } else {\n throw Error(\"[BasketModule] createNewBasket invalid request type\");\n }\n };\n\n private addConstituent: ServiceHandler = async () => {\n throw Error(`addConstituent not implemented`);\n };\n}\n\nexport const basketModule = new BasketModule();\n"],"names":["tableContainer","schemas","VuuModule","basketConstituentData"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"BasketModule.js","sources":["../../../../packages/vuu-data-test/src/basket/BasketModule.ts"],"sourcesContent":["import { VuuMenu, VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { ColumnMap } from \"@vuu-ui/vuu-utils\";\nimport {\n RpcMenuService,\n ServiceHandler,\n VuuModule,\n} from \"../core/module/VuuModule\";\nimport tableContainer from \"../core/table/TableContainer\";\nimport { BasketsTableName, schemas } from \"./basket-schemas\";\nimport basketConstituentData from \"./reference-data/constituents\";\nimport { type Table } from \"../Table\";\n\nconst { createTable } = tableContainer;\n\nlet basketIncrement = 1;\n\n// export as convenience for showcase examples\nexport const createBasketTradingRow = (\n basketId: string,\n basketName: string,\n side = \"BUY\",\n status = \"OFF MARKET\",\n) => [\n basketId,\n basketName,\n 0,\n 1.25,\n `steve-${basketIncrement++}`,\n side,\n status,\n 1_000_000,\n 1_250_000,\n 100,\n];\n\nconst undefinedTables = {\n algoType: undefined,\n basket: undefined,\n basketTrading: undefined,\n basketTradingConstituent: undefined,\n basketConstituent: undefined,\n basketTradingConstituentJoin: undefined,\n priceStrategyType: undefined,\n};\n\n// This is a 'local' columnMap\nconst buildDataColumnMap = (tableName: BasketsTableName) =>\n Object.values(schemas[tableName].columns).reduce<ColumnMap>(\n (map, col, index) => {\n map[col.name] = index;\n return map;\n },\n {},\n );\n\nconst tableMaps: Record<BasketsTableName, ColumnMap> = {\n algoType: buildDataColumnMap(\"algoType\"),\n basket: buildDataColumnMap(\"basket\"),\n basketTrading: buildDataColumnMap(\"basketTrading\"),\n basketTradingConstituent: buildDataColumnMap(\"basketTradingConstituent\"),\n basketConstituent: buildDataColumnMap(\"basketConstituent\"),\n basketTradingConstituentJoin: buildDataColumnMap(\n \"basketTradingConstituentJoin\",\n ),\n priceStrategyType: buildDataColumnMap(\"priceStrategyType\"),\n};\n\nconst basketTradingConstituent = tableContainer.createTable(\n schemas.basketTradingConstituent,\n [],\n tableMaps.basketTradingConstituent,\n);\n\n/**\n * This is an example of how we might extend the built-in VuuModule to\n * implement a module-specific service in such a way that it can invoke\n * methods on the VuuModule.\n */\nexport class BasketModule extends VuuModule<BasketsTableName> {\n #tables: Record<BasketsTableName, Table> = {\n algoType: createTable(\n schemas.algoType,\n [\n [\"Sniper\", 0],\n [\"Dark Liquidity\", 1],\n [\"VWAP\", 2],\n [\"POV\", 3],\n [\"Dynamic Close\", 4],\n ],\n tableMaps.algoType,\n ),\n basket: createTable(\n schemas.basket,\n [\n [\".NASDAQ100\", \".NASDAQ100\", 0, 0],\n [\".HSI\", \".HSI\", 0, 0],\n [\".FTSE100\", \".FTSE100\", 0, 0],\n [\".SP500\", \".SP500\", 0, 0],\n ],\n tableMaps.basket,\n ),\n basketConstituent: createTable(\n schemas.basketConstituent,\n basketConstituentData,\n tableMaps.basketConstituent,\n ),\n basketTrading: createTable(\n schemas.basketTrading,\n [],\n tableMaps.basketTrading,\n ),\n basketTradingConstituent,\n basketTradingConstituentJoin: tableContainer.createJoinTable(\n { module: \"BASKET\", table: \"basketTradingConstituentJoin\" },\n { module: \"BASKET\", table: \"basketTradingConstituent\" },\n { module: \"SIMUL\", table: \"prices\" },\n \"ric\",\n ),\n priceStrategyType: createTable(\n schemas.priceStrategyType,\n [\n [\"Peg to Near Touch\", 0],\n [\"Far Touch\", 1],\n [\"Limit\", 2],\n [\"Algo\", 3],\n ],\n tableMaps.priceStrategyType,\n ),\n };\n\n constructor() {\n super(\"BASKET\");\n }\n\n get menus(): Record<BasketsTableName, VuuMenu | undefined> {\n return {\n ...undefinedTables,\n basket: {\n name: \"ROOT\",\n menus: [\n {\n context: \"selected-rows\",\n filter: \"\",\n name: \"Add Basket\",\n rpcName: \"CREATE_NEW_BASKET\",\n },\n ],\n },\n };\n }\n\n get schemas() {\n return schemas;\n }\n\n get services() {\n return {\n ...undefinedTables,\n basket: [\n {\n rpcName: \"createBasket\",\n service: this.createNewBasket,\n },\n ],\n basketTrading: [\n {\n rpcName: \"sendToMarket\",\n service: this.sendToMarket,\n },\n {\n rpcName: \"takeOffMarket\",\n service: this.takeOffMarket,\n },\n ],\n basketTradingConstituentJoin: [\n {\n rpcName: \"addConstituent\",\n service: this.addConstituent,\n },\n ],\n };\n }\n\n get menuServices():\n | Record<BasketsTableName, RpcMenuService[] | undefined>\n | undefined {\n return {\n ...undefinedTables,\n };\n }\n\n get tables() {\n return this.#tables;\n }\n\n get visualLinks() {\n return {\n ...undefinedTables,\n basketConstituent: [\n { fromColumn: \"basketId\", toColumn: \"id\", toTable: \"basket\" },\n ],\n };\n }\n\n private createTradingBasket(basketId: string, basketName: string) {\n const basketTradingRow = createBasketTradingRow(basketId, basketName);\n\n this.tables.basketTrading.insert(basketTradingRow);\n\n const { basketId: key } = buildDataColumnMap(\"basketConstituent\");\n const constituents = this.tables.basketConstituent.data.filter(\n (c) => c[key] === basketId,\n );\n\n const { instanceId } = tableMaps.basketTrading;\n\n constituents.forEach(\n ([, , description, , ric, , , quantity, weighting]) => {\n const algo = \"\";\n const algoParams = \"\";\n const limitPrice = 95;\n const notionalLocal = 0;\n const notionalUsd = 0;\n const pctFilled = 0;\n const priceSpread = 0;\n const priceStrategyId = \"\";\n const side = \"BUY\";\n const venue = \"venue\";\n\n const basketInstanceId = basketTradingRow[instanceId];\n const basketTradingConstituentRow: VuuRowDataItemType[] = [\n algo,\n algoParams,\n basketId,\n description,\n basketInstanceId,\n `${basketInstanceId}-${ric}`,\n limitPrice,\n notionalLocal,\n notionalUsd,\n pctFilled,\n priceSpread,\n priceStrategyId,\n quantity,\n ric,\n side,\n venue,\n weighting,\n ];\n basketTradingConstituent.insert(basketTradingConstituentRow);\n },\n );\n\n // return the key\n return basketTradingRow[instanceId] as string;\n }\n\n private createNewBasket: ServiceHandler = async (rpcRequest) => {\n if (rpcRequest.context.type === \"VIEWPORT_CONTEXT\") {\n const { sourceBasketId, tradeBasketName } = rpcRequest.params as {\n sourceBasketId: string;\n tradeBasketName: string;\n };\n const key = this.createTradingBasket(\n sourceBasketId as string,\n tradeBasketName as string,\n );\n return {\n type: \"SUCCESS_RESULT\",\n data: key,\n };\n } else {\n throw Error(\"[BasketModule] createNewBasket invalid request type\");\n }\n };\n\n private sendToMarket: ServiceHandler = async (rpcRequest) => {\n if (rpcRequest.context.type === \"VIEWPORT_CONTEXT\") {\n const { basketInstanceId } = rpcRequest.params as {\n basketInstanceId: string;\n };\n this.tables.basketTrading.update(\n basketInstanceId as string,\n \"status\",\n \"ON_MARKET\",\n );\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n } else {\n throw Error(\"[BasketModule] createNewBasket invalid request type\");\n }\n };\n private takeOffMarket: ServiceHandler = async (rpcRequest) => {\n if (rpcRequest.context.type === \"VIEWPORT_CONTEXT\") {\n const { basketInstanceId } = rpcRequest.params as {\n basketInstanceId: string;\n };\n this.tables.basketTrading.update(\n basketInstanceId as string,\n \"status\",\n \"OFF-MARKET\",\n );\n return {\n type: \"SUCCESS_RESULT\",\n data: undefined,\n };\n } else {\n throw Error(\"[BasketModule] createNewBasket invalid request type\");\n }\n };\n\n private addConstituent: ServiceHandler = async () => {\n throw Error(`addConstituent not implemented`);\n };\n}\n\nexport const basketModule = new BasketModule();\n"],"names":["tableContainer","schemas","VuuModule","basketConstituentData"],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ var SessionTable = require('../../SessionTable.js');
|
|
|
6
6
|
var TickingArrayDataSource = require('../../TickingArrayDataSource.js');
|
|
7
7
|
var RuntimeVisualLink = require('../../RuntimeVisualLink.js');
|
|
8
8
|
var ModuleContainer = require('./ModuleContainer.js');
|
|
9
|
+
var sessionTableUtils = require('../../session-table-utils.js');
|
|
9
10
|
|
|
10
11
|
var __defProp = Object.defineProperty;
|
|
11
12
|
var __typeError = (msg) => {
|
|
@@ -172,7 +173,7 @@ class VuuModule {
|
|
|
172
173
|
};
|
|
173
174
|
});
|
|
174
175
|
__publicField(this, "editCell", async (rpcRequest) => {
|
|
175
|
-
if (rpcRequest
|
|
176
|
+
if (vuuUtils.isEditCellRpcRequest(rpcRequest)) {
|
|
176
177
|
const { viewPortId } = rpcRequest.context;
|
|
177
178
|
const { column, data, key } = rpcRequest.params;
|
|
178
179
|
let targetTable = __privateGet(this, _sessionTableMap)[viewPortId];
|
|
@@ -252,9 +253,9 @@ class VuuModule {
|
|
|
252
253
|
}
|
|
253
254
|
});
|
|
254
255
|
__publicField(this, "beginEditSession", async (rpcRequest) => {
|
|
255
|
-
if (rpcRequest
|
|
256
|
+
if (vuuUtils.isBeginEditSessionRpcRequest(rpcRequest)) {
|
|
256
257
|
const { viewPortId } = rpcRequest.context;
|
|
257
|
-
const { editSessionMode = "all-rows" } = rpcRequest.params;
|
|
258
|
+
const { editSessionMode = "inline-all-rows" } = rpcRequest.params;
|
|
258
259
|
const subscription = this.getSubscriptionByViewport(viewPortId);
|
|
259
260
|
const { dataSource } = subscription;
|
|
260
261
|
const { table: vuuTable } = dataSource;
|
|
@@ -300,7 +301,7 @@ class VuuModule {
|
|
|
300
301
|
};
|
|
301
302
|
});
|
|
302
303
|
__publicField(this, "addRow", async (rpcRequest) => {
|
|
303
|
-
if (rpcRequest
|
|
304
|
+
if (vuuUtils.isAddRowRpcRequest(rpcRequest)) {
|
|
304
305
|
const { viewPortId } = rpcRequest.context;
|
|
305
306
|
const subscription = this.getSubscriptionByViewport(viewPortId);
|
|
306
307
|
const sessionTable = subscription.sessionTableName ? __privateGet(this, _sessionTableMap)[subscription.sessionTableName] : void 0;
|
|
@@ -310,13 +311,13 @@ class VuuModule {
|
|
|
310
311
|
errorMessage: `addRow: no active session table for viewport ${viewPortId}`
|
|
311
312
|
};
|
|
312
313
|
}
|
|
313
|
-
const {
|
|
314
|
+
const { data } = rpcRequest.params;
|
|
314
315
|
const columnMap = sessionTable.map;
|
|
315
316
|
const columnCount = Object.keys(columnMap).length;
|
|
316
317
|
const row = new Array(columnCount).fill("");
|
|
317
318
|
for (const [col, idx] of Object.entries(columnMap)) {
|
|
318
|
-
if (
|
|
319
|
-
row[idx] =
|
|
319
|
+
if (data[col] !== void 0) {
|
|
320
|
+
row[idx] = data[col];
|
|
320
321
|
}
|
|
321
322
|
}
|
|
322
323
|
sessionTable.insert(row);
|
|
@@ -328,7 +329,7 @@ class VuuModule {
|
|
|
328
329
|
};
|
|
329
330
|
});
|
|
330
331
|
__publicField(this, "endEditSession", async (rpcRequest) => {
|
|
331
|
-
if (rpcRequest
|
|
332
|
+
if (vuuUtils.isEndEditSessionRpcRequest(rpcRequest)) {
|
|
332
333
|
const { viewPortId } = rpcRequest.context;
|
|
333
334
|
const sessionTable = __privateGet(this, _sessionTableMap)[viewPortId];
|
|
334
335
|
delete __privateGet(this, _sessionTableMap)[viewPortId];
|
|
@@ -336,6 +337,7 @@ class VuuModule {
|
|
|
336
337
|
if (dataSource.table) {
|
|
337
338
|
const sourceTable = this.tables[dataSource.table.table];
|
|
338
339
|
if (rpcRequest.params.save === true) {
|
|
340
|
+
let rejectedCount = 0;
|
|
339
341
|
if (SessionTable.isProxySessionTable(sessionTable)) {
|
|
340
342
|
const updates = sessionTable.getSessionUpdates();
|
|
341
343
|
updates.forEach((rowUpdates, key) => {
|
|
@@ -343,11 +345,22 @@ class VuuModule {
|
|
|
343
345
|
const currentRow = sourceTable.findByKey(key);
|
|
344
346
|
const lastUpdateTimestampOnTable = currentRow[sourceTable.map.vuuUpdatedTimestamp];
|
|
345
347
|
if (lastUpdateTimestamp !== lastUpdateTimestampOnTable) {
|
|
346
|
-
|
|
348
|
+
rejectedCount += 1;
|
|
349
|
+
const sessionTableRow = sessionTable.findByKey(key);
|
|
350
|
+
const newRow = sessionTableRow.slice();
|
|
351
|
+
const messages = [];
|
|
352
|
+
Object.entries(cellUpdates).forEach(([column, value]) => {
|
|
353
|
+
messages.push(`${column}:${value}`);
|
|
354
|
+
});
|
|
355
|
+
newRow[sessionTable.map.vuuMsg] = messages.join(",");
|
|
356
|
+
sessionTable.updateRow(newRow);
|
|
357
|
+
} else {
|
|
358
|
+
const newRow = currentRow.slice();
|
|
359
|
+
Object.entries(cellUpdates).forEach(([column, value]) => {
|
|
360
|
+
newRow[sourceTable.map[column]] = value;
|
|
361
|
+
});
|
|
362
|
+
sourceTable.updateRow(newRow);
|
|
347
363
|
}
|
|
348
|
-
Object.entries(cellUpdates).forEach(([column, value]) => {
|
|
349
|
-
sourceTable.update(key, column, value);
|
|
350
|
-
});
|
|
351
364
|
});
|
|
352
365
|
updates.clear();
|
|
353
366
|
} else {
|
|
@@ -356,11 +369,23 @@ class VuuModule {
|
|
|
356
369
|
sourceTable.updateRow(newRow);
|
|
357
370
|
}
|
|
358
371
|
}
|
|
372
|
+
if (rejectedCount > 0) {
|
|
373
|
+
return {
|
|
374
|
+
errorMessage: "stale update",
|
|
375
|
+
type: "ERROR_RESULT"
|
|
376
|
+
};
|
|
377
|
+
} else {
|
|
378
|
+
return {
|
|
379
|
+
type: "SUCCESS_RESULT",
|
|
380
|
+
data: void 0
|
|
381
|
+
};
|
|
382
|
+
}
|
|
383
|
+
} else {
|
|
384
|
+
return {
|
|
385
|
+
type: "SUCCESS_RESULT",
|
|
386
|
+
data: void 0
|
|
387
|
+
};
|
|
359
388
|
}
|
|
360
|
-
return {
|
|
361
|
-
type: "SUCCESS_RESULT",
|
|
362
|
-
data: void 0
|
|
363
|
-
};
|
|
364
389
|
} else {
|
|
365
390
|
throw Error("[VuuModule], exitEditMode");
|
|
366
391
|
}
|
|
@@ -502,8 +527,8 @@ class VuuModule {
|
|
|
502
527
|
);
|
|
503
528
|
}
|
|
504
529
|
}
|
|
505
|
-
createSessionTable(sourceTable, sessionTableName, editSessionMode = "all-rows", dataSource) {
|
|
506
|
-
if (editSessionMode
|
|
530
|
+
createSessionTable(sourceTable, sessionTableName, editSessionMode = "inline-all-rows", dataSource) {
|
|
531
|
+
if (editSessionMode.endsWith("all-rows")) {
|
|
507
532
|
return this.createSessionTableWithAllRows(sourceTable, sessionTableName);
|
|
508
533
|
} else if (editSessionMode === "selected-rows") {
|
|
509
534
|
return this.createSessionTableFromSelectedRows(
|
|
@@ -536,7 +561,12 @@ class VuuModule {
|
|
|
536
561
|
}
|
|
537
562
|
}
|
|
538
563
|
}
|
|
539
|
-
|
|
564
|
+
const sessionSchema = sessionTableUtils.sessionTableSchema(schema);
|
|
565
|
+
return new Table.Table(
|
|
566
|
+
sessionSchema,
|
|
567
|
+
sessionData,
|
|
568
|
+
Table.buildDataColumnMapFromSchema(sessionSchema)
|
|
569
|
+
);
|
|
540
570
|
}
|
|
541
571
|
}
|
|
542
572
|
_name = new WeakMap();
|