@vuu-ui/vuu-data-test 2.1.4 → 2.1.6

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.
@@ -2,6 +2,8 @@
2
2
 
3
3
  var vuuUtils = require('@vuu-ui/vuu-utils');
4
4
 
5
+ const isProxy = /* @__PURE__ */ Symbol("proxy-session-table");
6
+ const isProxySessionTable = (table) => table[isProxy];
5
7
  const SessionTable = (table, sessionId) => {
6
8
  const updates = /* @__PURE__ */ new Map();
7
9
  const eventEmitter = new vuuUtils.EventEmitter();
@@ -39,6 +41,9 @@ const SessionTable = (table, sessionId) => {
39
41
  return new Proxy(table, {
40
42
  get(_obj, prop) {
41
43
  if (typeof prop === "symbol") {
44
+ if (prop === isProxy) {
45
+ return true;
46
+ }
42
47
  return void 0;
43
48
  }
44
49
  if (prop === "getSessionUpdates") {
@@ -47,6 +52,8 @@ const SessionTable = (table, sessionId) => {
47
52
  return addEventListener;
48
53
  } else if (prop === "update") {
49
54
  return update;
55
+ } else if (prop === "isProxy") {
56
+ return true;
50
57
  }
51
58
  return table[prop];
52
59
  },
@@ -57,4 +64,5 @@ const SessionTable = (table, sessionId) => {
57
64
  };
58
65
 
59
66
  exports.SessionTable = SessionTable;
67
+ exports.isProxySessionTable = isProxySessionTable;
60
68
  //# sourceMappingURL=SessionTable.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SessionTable.js","sources":["../../../packages/vuu-data-test/src/SessionTable.ts"],"sourcesContent":["import { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { Table, TableEvents } from \"./Table\";\nimport { EventEmitter } from \"@vuu-ui/vuu-utils\";\n\ntype RowUpdates = {\n cellUpdates: Record<string, VuuRowDataItemType>;\n lastUpdateTimestamp?: number;\n};\n\nexport type SessionTable = Table & {\n getSessionUpdates: () => Map<string, RowUpdates>;\n};\n\n// This doesn't really work because the session table is still connected to the base table data.\n// This means edits applied at the end of an edit session are then posted to other active sessions.\n\n// How can we ignore these ?\nexport const SessionTable = (table: Table, sessionId: string): SessionTable => {\n const updates = new Map<string, RowUpdates>();\n const eventEmitter = new EventEmitter<TableEvents>();\n\n const getSessionUpdates = () => {\n return updates;\n };\n\n // we need to intercept this as addEventListener accesses a private\n // member, so has to be invoked by table itself.\n const addEventListener = (event: string, handler: unknown) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n //table.on(event, handler);\n eventEmitter.on(event, handler);\n };\n\n const update = (\n key: string,\n columnName: string,\n value: VuuRowDataItemType,\n ) => {\n // we don't actually apply the update to the table, but we emit the updated event, so the bound\n // dataSource will update its own cache\n const row = table.findByKey(key);\n if (row) {\n const tsIndex = table.map.vuuUpdatedTimestamp;\n\n let updatesForRow = updates.get(key);\n if (updatesForRow === undefined) {\n updatesForRow = {\n lastUpdateTimestamp: row[tsIndex] as number | undefined,\n cellUpdates: {},\n };\n updates.set(key, updatesForRow);\n }\n updatesForRow.cellUpdates[columnName] = value;\n\n const newRow = row.slice();\n\n for (const [columnName, value] of Object.entries(\n updatesForRow.cellUpdates,\n )) {\n const colIndex = table.map[columnName];\n newRow[colIndex] = value;\n }\n\n eventEmitter.emit(\"update\", newRow, columnName, sessionId);\n } else {\n console.warn(`SessionTable update row ${key} not found`);\n }\n };\n\n return new Proxy(table, {\n get(_obj, prop: string | symbol) {\n if (typeof prop === \"symbol\") {\n return undefined;\n }\n\n if (prop === \"getSessionUpdates\") {\n return getSessionUpdates;\n } else if (prop === \"on\" || prop === \"addEventListener\") {\n return addEventListener;\n } else if (prop === \"update\") {\n return update;\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return table[prop];\n },\n\n set() {\n throw new TypeError(\"SessionTable is readonly\");\n },\n }) as SessionTable;\n};\n"],"names":["EventEmitter","columnName","value"],"mappings":";;;;AAiBa,MAAA,YAAA,GAAe,CAAC,KAAA,EAAc,SAAoC,KAAA;AAC7E,EAAM,MAAA,OAAA,uBAAc,GAAwB,EAAA;AAC5C,EAAM,MAAA,YAAA,GAAe,IAAIA,qBAA0B,EAAA;AAEnD,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAO,OAAA,OAAA;AAAA,GACT;AAIA,EAAM,MAAA,gBAAA,GAAmB,CAAC,KAAA,EAAe,OAAqB,KAAA;AAI5D,IAAa,YAAA,CAAA,EAAA,CAAG,OAAO,OAAO,CAAA;AAAA,GAChC;AAEA,EAAA,MAAM,MAAS,GAAA,CACb,GACA,EAAA,UAAA,EACA,KACG,KAAA;AAGH,IAAM,MAAA,GAAA,GAAM,KAAM,CAAA,SAAA,CAAU,GAAG,CAAA;AAC/B,IAAA,IAAI,GAAK,EAAA;AACP,MAAM,MAAA,OAAA,GAAU,MAAM,GAAI,CAAA,mBAAA;AAE1B,MAAI,IAAA,aAAA,GAAgB,OAAQ,CAAA,GAAA,CAAI,GAAG,CAAA;AACnC,MAAA,IAAI,kBAAkB,KAAW,CAAA,EAAA;AAC/B,QAAgB,aAAA,GAAA;AAAA,UACd,mBAAA,EAAqB,IAAI,OAAO,CAAA;AAAA,UAChC,aAAa;AAAC,SAChB;AACA,QAAQ,OAAA,CAAA,GAAA,CAAI,KAAK,aAAa,CAAA;AAAA;AAEhC,MAAc,aAAA,CAAA,WAAA,CAAY,UAAU,CAAI,GAAA,KAAA;AAExC,MAAM,MAAA,MAAA,GAAS,IAAI,KAAM,EAAA;AAEzB,MAAA,KAAA,MAAW,CAACC,WAAAA,EAAYC,MAAK,CAAA,IAAK,MAAO,CAAA,OAAA;AAAA,QACvC,aAAc,CAAA;AAAA,OACb,EAAA;AACD,QAAM,MAAA,QAAA,GAAW,KAAM,CAAA,GAAA,CAAID,WAAU,CAAA;AACrC,QAAA,MAAA,CAAO,QAAQ,CAAIC,GAAAA,MAAAA;AAAA;AAGrB,MAAA,YAAA,CAAa,IAAK,CAAA,QAAA,EAAU,MAAQ,EAAA,UAAA,EAAY,SAAS,CAAA;AAAA,KACpD,MAAA;AACL,MAAQ,OAAA,CAAA,IAAA,CAAK,CAA2B,wBAAA,EAAA,GAAG,CAAY,UAAA,CAAA,CAAA;AAAA;AACzD,GACF;AAEA,EAAO,OAAA,IAAI,MAAM,KAAO,EAAA;AAAA,IACtB,GAAA,CAAI,MAAM,IAAuB,EAAA;AAC/B,MAAI,IAAA,OAAO,SAAS,QAAU,EAAA;AAC5B,QAAO,OAAA,KAAA,CAAA;AAAA;AAGT,MAAA,IAAI,SAAS,mBAAqB,EAAA;AAChC,QAAO,OAAA,iBAAA;AAAA,OACE,MAAA,IAAA,IAAA,KAAS,IAAQ,IAAA,IAAA,KAAS,kBAAoB,EAAA;AACvD,QAAO,OAAA,gBAAA;AAAA,OACT,MAAA,IAAW,SAAS,QAAU,EAAA;AAC5B,QAAO,OAAA,MAAA;AAAA;AAKT,MAAA,OAAO,MAAM,IAAI,CAAA;AAAA,KACnB;AAAA,IAEA,GAAM,GAAA;AACJ,MAAM,MAAA,IAAI,UAAU,0BAA0B,CAAA;AAAA;AAChD,GACD,CAAA;AACH;;;;"}
1
+ {"version":3,"file":"SessionTable.js","sources":["../../../packages/vuu-data-test/src/SessionTable.ts"],"sourcesContent":["import { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { Table, TableEvents } from \"./Table\";\nimport { EventEmitter } from \"@vuu-ui/vuu-utils\";\n\ntype RowUpdates = {\n cellUpdates: Record<string, VuuRowDataItemType>;\n lastUpdateTimestamp?: number;\n};\n\nexport type SessionTable = Table & {\n getSessionUpdates: () => Map<string, RowUpdates>;\n};\n\nconst isProxy = Symbol(\"proxy-session-table\");\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const isProxySessionTable = (table: any): table is SessionTable =>\n table[isProxy];\n\n// This doesn't really work because the session table is still connected to the base table data.\n// This means edits applied at the end of an edit session are then posted to other active sessions.\n\n// How can we ignore these ?\nexport const SessionTable = (table: Table, sessionId: string): SessionTable => {\n const updates = new Map<string, RowUpdates>();\n const eventEmitter = new EventEmitter<TableEvents>();\n\n const getSessionUpdates = () => {\n return updates;\n };\n\n // we need to intercept this as addEventListener accesses a private\n // member, so has to be invoked by table itself.\n const addEventListener = (event: string, handler: unknown) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n //table.on(event, handler);\n eventEmitter.on(event, handler);\n };\n\n const update = (\n key: string,\n columnName: string,\n value: VuuRowDataItemType,\n ) => {\n // we don't actually apply the update to the table, but we emit the updated event, so the bound\n // dataSource will update its own cache\n const row = table.findByKey(key);\n if (row) {\n const tsIndex = table.map.vuuUpdatedTimestamp;\n\n let updatesForRow = updates.get(key);\n if (updatesForRow === undefined) {\n updatesForRow = {\n lastUpdateTimestamp: row[tsIndex] as number | undefined,\n cellUpdates: {},\n };\n updates.set(key, updatesForRow);\n }\n updatesForRow.cellUpdates[columnName] = value;\n\n const newRow = row.slice();\n\n for (const [columnName, value] of Object.entries(\n updatesForRow.cellUpdates,\n )) {\n const colIndex = table.map[columnName];\n newRow[colIndex] = value;\n }\n\n eventEmitter.emit(\"update\", newRow, columnName, sessionId);\n } else {\n console.warn(`SessionTable update row ${key} not found`);\n }\n };\n\n return new Proxy(table, {\n get(_obj, prop: string | symbol) {\n if (typeof prop === \"symbol\") {\n if (prop === isProxy) {\n return true;\n }\n return undefined;\n }\n\n if (prop === \"getSessionUpdates\") {\n return getSessionUpdates;\n } else if (prop === \"on\" || prop === \"addEventListener\") {\n return addEventListener;\n } else if (prop === \"update\") {\n return update;\n } else if (prop === \"isProxy\") {\n return true;\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n return table[prop];\n },\n\n set() {\n throw new TypeError(\"SessionTable is readonly\");\n },\n }) as SessionTable;\n};\n"],"names":["EventEmitter","columnName","value"],"mappings":";;;;AAaA,MAAM,OAAA,0BAAiB,qBAAqB,CAAA;AAGrC,MAAM,mBAAsB,GAAA,CAAC,KAClC,KAAA,KAAA,CAAM,OAAO;AAMF,MAAA,YAAA,GAAe,CAAC,KAAA,EAAc,SAAoC,KAAA;AAC7E,EAAM,MAAA,OAAA,uBAAc,GAAwB,EAAA;AAC5C,EAAM,MAAA,YAAA,GAAe,IAAIA,qBAA0B,EAAA;AAEnD,EAAA,MAAM,oBAAoB,MAAM;AAC9B,IAAO,OAAA,OAAA;AAAA,GACT;AAIA,EAAM,MAAA,gBAAA,GAAmB,CAAC,KAAA,EAAe,OAAqB,KAAA;AAI5D,IAAa,YAAA,CAAA,EAAA,CAAG,OAAO,OAAO,CAAA;AAAA,GAChC;AAEA,EAAA,MAAM,MAAS,GAAA,CACb,GACA,EAAA,UAAA,EACA,KACG,KAAA;AAGH,IAAM,MAAA,GAAA,GAAM,KAAM,CAAA,SAAA,CAAU,GAAG,CAAA;AAC/B,IAAA,IAAI,GAAK,EAAA;AACP,MAAM,MAAA,OAAA,GAAU,MAAM,GAAI,CAAA,mBAAA;AAE1B,MAAI,IAAA,aAAA,GAAgB,OAAQ,CAAA,GAAA,CAAI,GAAG,CAAA;AACnC,MAAA,IAAI,kBAAkB,KAAW,CAAA,EAAA;AAC/B,QAAgB,aAAA,GAAA;AAAA,UACd,mBAAA,EAAqB,IAAI,OAAO,CAAA;AAAA,UAChC,aAAa;AAAC,SAChB;AACA,QAAQ,OAAA,CAAA,GAAA,CAAI,KAAK,aAAa,CAAA;AAAA;AAEhC,MAAc,aAAA,CAAA,WAAA,CAAY,UAAU,CAAI,GAAA,KAAA;AAExC,MAAM,MAAA,MAAA,GAAS,IAAI,KAAM,EAAA;AAEzB,MAAA,KAAA,MAAW,CAACC,WAAAA,EAAYC,MAAK,CAAA,IAAK,MAAO,CAAA,OAAA;AAAA,QACvC,aAAc,CAAA;AAAA,OACb,EAAA;AACD,QAAM,MAAA,QAAA,GAAW,KAAM,CAAA,GAAA,CAAID,WAAU,CAAA;AACrC,QAAA,MAAA,CAAO,QAAQ,CAAIC,GAAAA,MAAAA;AAAA;AAGrB,MAAA,YAAA,CAAa,IAAK,CAAA,QAAA,EAAU,MAAQ,EAAA,UAAA,EAAY,SAAS,CAAA;AAAA,KACpD,MAAA;AACL,MAAQ,OAAA,CAAA,IAAA,CAAK,CAA2B,wBAAA,EAAA,GAAG,CAAY,UAAA,CAAA,CAAA;AAAA;AACzD,GACF;AAEA,EAAO,OAAA,IAAI,MAAM,KAAO,EAAA;AAAA,IACtB,GAAA,CAAI,MAAM,IAAuB,EAAA;AAC/B,MAAI,IAAA,OAAO,SAAS,QAAU,EAAA;AAC5B,QAAA,IAAI,SAAS,OAAS,EAAA;AACpB,UAAO,OAAA,IAAA;AAAA;AAET,QAAO,OAAA,KAAA,CAAA;AAAA;AAGT,MAAA,IAAI,SAAS,mBAAqB,EAAA;AAChC,QAAO,OAAA,iBAAA;AAAA,OACE,MAAA,IAAA,IAAA,KAAS,IAAQ,IAAA,IAAA,KAAS,kBAAoB,EAAA;AACvD,QAAO,OAAA,gBAAA;AAAA,OACT,MAAA,IAAW,SAAS,QAAU,EAAA;AAC5B,QAAO,OAAA,MAAA;AAAA,OACT,MAAA,IAAW,SAAS,SAAW,EAAA;AAC7B,QAAO,OAAA,IAAA;AAAA;AAKT,MAAA,OAAO,MAAM,IAAI,CAAA;AAAA,KACnB;AAAA,IAEA,GAAM,GAAA;AACJ,MAAM,MAAA,IAAI,UAAU,0BAA0B,CAAA;AAAA;AAChD,GACD,CAAA;AACH;;;;;"}
@@ -9,12 +9,12 @@ var __typeError = (msg) => {
9
9
  throw TypeError(msg);
10
10
  };
11
11
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12
- var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
12
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
13
13
  var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg);
14
14
  var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), member.get(obj));
15
15
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
16
16
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
17
- var _menuRpcServices, _pendingVisualLink, _rpcMenuServices, _rpcServices, _sessionTables, _table, _selectionLinkSubscribers, _visualLinkService, _getVisualLinks;
17
+ var _menuRpcServices, _pendingVisualLink, _rpcMenuServices, _rpcServices, _sessionTables, _sessionDataSource, _table, _selectionLinkSubscribers, _visualLinkService, _getVisualLinks, _vuuModule;
18
18
  class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
19
19
  constructor({
20
20
  data,
@@ -26,6 +26,7 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
26
26
  menu,
27
27
  visualLink,
28
28
  visualLinkService,
29
+ vuuModule,
29
30
  ...arrayDataSourceProps
30
31
  }) {
31
32
  if (data === void 0 && table === void 0) {
@@ -42,10 +43,12 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
42
43
  __privateAdd(this, _rpcServices);
43
44
  // A reference to session tables hosted within client side module
44
45
  __privateAdd(this, _sessionTables);
46
+ __privateAdd(this, _sessionDataSource);
45
47
  __privateAdd(this, _table);
46
48
  __privateAdd(this, _selectionLinkSubscribers);
47
49
  __privateAdd(this, _visualLinkService);
48
50
  __privateAdd(this, _getVisualLinks);
51
+ __privateAdd(this, _vuuModule);
49
52
  __publicField(this, "updateRowWithSessionCheck", (row, columnName, sessionId) => {
50
53
  if (sessionId && sessionId === this.viewport) {
51
54
  this.updateRow(row, columnName);
@@ -55,6 +58,17 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
55
58
  this.updateRow(row, columnName);
56
59
  }
57
60
  });
61
+ __publicField(this, "handleSessionMessage", (msg) => {
62
+ if (msg.type === "subscribed") {
63
+ console.log(`[VuuDataSource subscribed to session table]`);
64
+ } else if (msg.type === "viewport-update") {
65
+ if (msg.size !== void 0 && msg.size !== this.size) {
66
+ this.emit("resize", msg.size);
67
+ }
68
+ console.log(`[VuuDataSource] clientCallback with ${msg.type}`);
69
+ this.clientCallback?.(msg);
70
+ }
71
+ });
58
72
  this._menu = menu;
59
73
  __privateSet(this, _rpcMenuServices, rpcMenuServices);
60
74
  __privateSet(this, _pendingVisualLink, visualLink);
@@ -63,6 +77,7 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
63
77
  __privateSet(this, _table, table);
64
78
  __privateSet(this, _visualLinkService, visualLinkService);
65
79
  __privateSet(this, _getVisualLinks, getVisualLinks);
80
+ __privateSet(this, _vuuModule, vuuModule);
66
81
  if (table) {
67
82
  this.tableSchema = table.schema;
68
83
  table.on("insert", this.insert);
@@ -98,6 +113,86 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
98
113
  getSelectedRowIds() {
99
114
  return Array.from(this.selectedRows);
100
115
  }
116
+ createSessionDataSource(sessionTable) {
117
+ if (__privateGet(this, _vuuModule)) {
118
+ return __privateGet(this, _vuuModule)?.createDataSource(
119
+ sessionTable.table,
120
+ sessionTable.table
121
+ );
122
+ } else {
123
+ throw Error(
124
+ `[TickingArrayDataSource] unable to createSessionDataSource, not constructed with VuuModule`
125
+ );
126
+ }
127
+ }
128
+ async beginEditSession(editSessionMode = "inline-all-rows") {
129
+ const rpcResponse = await this?.rpcRequest?.({
130
+ type: "RPC_REQUEST",
131
+ rpcName: "beginEditSession",
132
+ params: {
133
+ editSessionMode
134
+ }
135
+ });
136
+ if (vuuUtils.isRpcSuccess(rpcResponse)) {
137
+ const { table: sessionTable } = rpcResponse.data;
138
+ if (vuuUtils.isInlineEditingSession(editSessionMode)) {
139
+ __privateSet(this, _sessionDataSource, __privateGet(this, _vuuModule)?.createDataSource(
140
+ sessionTable.table,
141
+ sessionTable.table
142
+ ));
143
+ __privateGet(this, _sessionDataSource)?.subscribe(
144
+ {
145
+ range: this.range
146
+ },
147
+ this.handleSessionMessage
148
+ );
149
+ } else {
150
+ return __privateGet(this, _vuuModule)?.createDataSource(
151
+ sessionTable.table,
152
+ sessionTable.table
153
+ );
154
+ }
155
+ } else {
156
+ throw Error(
157
+ `[VuuDataSource] beginEditSession ${rpcResponse.errorMessage}`
158
+ );
159
+ }
160
+ }
161
+ async editCell(key, column, data) {
162
+ console.log(
163
+ `[VuuDataSource] editCell ${__privateGet(this, _sessionDataSource)?.viewport} rowKey ${key}, column ${column}, value ${data}`
164
+ );
165
+ const rpcHost = __privateGet(this, _sessionDataSource) ?? this;
166
+ const rpcResponse = await rpcHost.rpcRequest?.({
167
+ type: "RPC_REQUEST",
168
+ rpcName: "editCell",
169
+ params: {
170
+ column,
171
+ data,
172
+ key
173
+ }
174
+ });
175
+ if (vuuUtils.isRpcSuccess(rpcResponse)) {
176
+ console.log("edit succeeded");
177
+ } else {
178
+ throw Error("oh oh");
179
+ }
180
+ }
181
+ async endEditSession(saveChanges = false) {
182
+ console.log(`[VuuDataSource] endEditSession saveChanges ${saveChanges}`);
183
+ const type = "RPC_REQUEST";
184
+ const rpcName = "endEditSession";
185
+ const rpcHost = __privateGet(this, _sessionDataSource) ?? this;
186
+ const rpcResponse = await rpcHost.rpcRequest?.(
187
+ saveChanges ? { type, rpcName, params: { save: true } } : { type, rpcName, params: {} }
188
+ );
189
+ if (vuuUtils.isRpcSuccess(rpcResponse)) {
190
+ __privateGet(this, _sessionDataSource)?.unsubscribe();
191
+ this.sendRowsToClient(true);
192
+ } else {
193
+ throw Error("oh oh");
194
+ }
195
+ }
101
196
  async rpcRequest(rpcRequest) {
102
197
  if (vuuUtils.isTypeaheadRequest(rpcRequest)) {
103
198
  const {
@@ -113,17 +208,6 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
113
208
  (service) => service.rpcName === rpcRequest.rpcName
114
209
  );
115
210
  if (rpcService) {
116
- switch (rpcRequest.rpcName) {
117
- case "VP_BULK_EDIT_COLUMN_CELLS_RPC": {
118
- return rpcService.service({
119
- ...rpcRequest,
120
- context: {
121
- type: "VIEWPORT_CONTEXT",
122
- viewPortId: this.viewport
123
- }
124
- });
125
- }
126
- }
127
211
  return rpcService.service({
128
212
  ...rpcRequest,
129
213
  context: {
@@ -145,11 +229,7 @@ class TickingArrayDataSource extends vuuDataLocal.ArrayDataSource {
145
229
  if (rpcService) {
146
230
  return rpcService.service({
147
231
  ...rpcRequest,
148
- vpId: this.viewport,
149
- localDataParameters: {
150
- selectedRowIds: this.getSelectedRowIds(),
151
- table: this.tableSchema.table
152
- }
232
+ vpId: this.viewport
153
233
  });
154
234
  } else {
155
235
  throw Error(
@@ -223,10 +303,12 @@ _pendingVisualLink = new WeakMap();
223
303
  _rpcMenuServices = new WeakMap();
224
304
  _rpcServices = new WeakMap();
225
305
  _sessionTables = new WeakMap();
306
+ _sessionDataSource = new WeakMap();
226
307
  _table = new WeakMap();
227
308
  _selectionLinkSubscribers = new WeakMap();
228
309
  _visualLinkService = new WeakMap();
229
310
  _getVisualLinks = new WeakMap();
311
+ _vuuModule = new WeakMap();
230
312
 
231
313
  exports.TickingArrayDataSource = TickingArrayDataSource;
232
314
  //# sourceMappingURL=TickingArrayDataSource.js.map
@@ -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 DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n DataSourceVisualLinkCreatedMessage,\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} from \"@vuu-ui/vuu-protocol-types\";\nimport { isTypeaheadRequest, Range } from \"@vuu-ui/vuu-utils\";\nimport {\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}\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 #table?: Table;\n #selectionLinkSubscribers: Map<string, LinkSubscription> | undefined;\n #visualLinkService?: VisualLinkHandler;\n #getVisualLinks?: (\n tableName: string,\n ) => LinkDescriptorWithLabel[] | undefined;\n\n constructor({\n data,\n getVisualLinks,\n rpcServices,\n rpcMenuServices,\n sessionTables,\n table,\n menu,\n visualLink,\n visualLinkService,\n ...arrayDataSourceProps\n }: TickingArrayDataSourceConstructorProps) {\n if (data === undefined && table === undefined) {\n throw Error(\"TickingArrayDataSource must be constructed with data\");\n }\n super({\n ...arrayDataSourceProps,\n data: data ?? table?.data ?? [],\n 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\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 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 switch (rpcRequest.rpcName) {\n case \"VP_BULK_EDIT_COLUMN_CELLS_RPC\": {\n return rpcService.service({\n ...rpcRequest,\n context: {\n type: \"VIEWPORT_CONTEXT\",\n viewPortId: this.viewport,\n },\n });\n }\n }\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 localDataParameters: {\n selectedRowIds: this.getSelectedRowIds(),\n table: this.tableSchema.table,\n },\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","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 // 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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"}