@vuu-ui/vuu-utils 2.1.0-alpha.12 → 2.1.0-alpha.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (28) hide show
  1. package/cjs/packages/vuu-utils/src/data-editing/DataEditingProvider.js +10 -6
  2. package/cjs/packages/vuu-utils/src/data-editing/DataEditingProvider.js.map +1 -1
  3. package/cjs/packages/vuu-utils/src/data-editing/EditTracker.js +8 -1
  4. package/cjs/packages/vuu-utils/src/data-editing/EditTracker.js.map +1 -1
  5. package/cjs/packages/vuu-utils/src/data-editing/useEditableTable.js +19 -5
  6. package/cjs/packages/vuu-utils/src/data-editing/useEditableTable.js.map +1 -1
  7. package/cjs/packages/vuu-utils/src/data-utils.js +15 -0
  8. package/cjs/packages/vuu-utils/src/data-utils.js.map +1 -1
  9. package/cjs/packages/vuu-utils/src/datasource/BaseDataSource.js +1 -0
  10. package/cjs/packages/vuu-utils/src/datasource/BaseDataSource.js.map +1 -1
  11. package/cjs/packages/vuu-utils/src/index.js +1 -0
  12. package/cjs/packages/vuu-utils/src/index.js.map +1 -1
  13. package/esm/packages/vuu-utils/src/data-editing/DataEditingProvider.js +10 -6
  14. package/esm/packages/vuu-utils/src/data-editing/DataEditingProvider.js.map +1 -1
  15. package/esm/packages/vuu-utils/src/data-editing/EditTracker.js +8 -1
  16. package/esm/packages/vuu-utils/src/data-editing/EditTracker.js.map +1 -1
  17. package/esm/packages/vuu-utils/src/data-editing/useEditableTable.js +20 -6
  18. package/esm/packages/vuu-utils/src/data-editing/useEditableTable.js.map +1 -1
  19. package/esm/packages/vuu-utils/src/data-utils.js +15 -1
  20. package/esm/packages/vuu-utils/src/data-utils.js.map +1 -1
  21. package/esm/packages/vuu-utils/src/datasource/BaseDataSource.js +1 -0
  22. package/esm/packages/vuu-utils/src/datasource/BaseDataSource.js.map +1 -1
  23. package/esm/packages/vuu-utils/src/index.js +1 -1
  24. package/package.json +6 -6
  25. package/types/data-editing/DataEditingProvider.d.ts +2 -1
  26. package/types/data-editing/EditTracker.d.ts +4 -4
  27. package/types/data-editing/useEditableTable.d.ts +1 -1
  28. package/types/data-utils.d.ts +2 -0
@@ -10,15 +10,19 @@ const DataEditingProvider = ({
10
10
  }) => {
11
11
  return /* @__PURE__ */ jsxRuntime.jsx(DataEditingContext.Provider, { value: editTracker, children });
12
12
  };
13
- const useEditTracker = () => {
13
+ function useEditTracker(throwIfUnavailable = false) {
14
14
  const editTracker = React.useContext(DataEditingContext);
15
15
  if (editTracker === void 0) {
16
- console.warn(
17
- "[useEditTracker] no DataEditingContext in scope. You need to enclose editable component(s) with DataEditingProvider"
18
- );
16
+ const message = "[useEditTracker] no DataEditingContext in scope. You need to enclose editable component(s) with DataEditingProvider";
17
+ if (throwIfUnavailable) {
18
+ throw Error(message);
19
+ } else {
20
+ console.warn(message);
21
+ }
22
+ } else {
23
+ return editTracker;
19
24
  }
20
- return editTracker;
21
- };
25
+ }
22
26
 
23
27
  exports.DataEditingProvider = DataEditingProvider;
24
28
  exports.useEditTracker = useEditTracker;
@@ -1 +1 @@
1
- {"version":3,"file":"DataEditingProvider.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/DataEditingProvider.tsx"],"sourcesContent":["import { createContext, ReactNode, useContext } from \"react\";\nimport { EditTracker } from \"./EditTracker\";\n\nconst DataEditingContext = createContext<EditTracker | undefined>(undefined);\n\nexport const DataEditingProvider = ({\n children,\n editTracker,\n}: {\n children: ReactNode;\n editTracker: EditTracker;\n}) => {\n return (\n <DataEditingContext.Provider value={editTracker}>\n {children}\n </DataEditingContext.Provider>\n );\n};\n\nexport const useEditTracker = () => {\n const editTracker = useContext(DataEditingContext);\n if (editTracker === undefined) {\n console.warn(\n \"[useEditTracker] no DataEditingContext in scope. You need to enclose editable component(s) with DataEditingProvider\",\n );\n }\n return editTracker;\n};\n"],"names":["createContext","useContext"],"mappings":";;;;;AAGA,MAAM,kBAAA,GAAqBA,oBAAuC,KAAS,CAAA,CAAA;AAEpE,MAAM,sBAAsB,CAAC;AAAA,EAClC,QAAA;AAAA,EACA;AACF,CAGM,KAAA;AACJ,EAAA,sCACG,kBAAmB,CAAA,QAAA,EAAnB,EAA4B,KAAA,EAAO,aACjC,QACH,EAAA,CAAA;AAEJ;AAEO,MAAM,iBAAiB,MAAM;AAClC,EAAM,MAAA,WAAA,GAAcC,iBAAW,kBAAkB,CAAA;AACjD,EAAA,IAAI,gBAAgB,KAAW,CAAA,EAAA;AAC7B,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN;AAAA,KACF;AAAA;AAEF,EAAO,OAAA,WAAA;AACT;;;;;"}
1
+ {"version":3,"file":"DataEditingProvider.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/DataEditingProvider.tsx"],"sourcesContent":["import { createContext, ReactNode, useContext } from \"react\";\nimport { EditTracker } from \"./EditTracker\";\n\nconst DataEditingContext = createContext<EditTracker | undefined>(undefined);\n\nexport const DataEditingProvider = ({\n children,\n editTracker,\n}: {\n children: ReactNode;\n editTracker: EditTracker;\n}) => {\n return (\n <DataEditingContext.Provider value={editTracker}>\n {children}\n </DataEditingContext.Provider>\n );\n};\n\nexport function useEditTracker(\n throwIfUnavailable?: false,\n): EditTracker | undefined;\nexport function useEditTracker(throwIfUnavailable: true): EditTracker;\nexport function useEditTracker(throwIfUnavailable = false) {\n const editTracker = useContext(DataEditingContext);\n if (editTracker === undefined) {\n const message =\n \"[useEditTracker] no DataEditingContext in scope. You need to enclose editable component(s) with DataEditingProvider\";\n if (throwIfUnavailable) {\n throw Error(message);\n } else {\n console.warn(message);\n }\n } else {\n return editTracker;\n }\n}\n"],"names":["createContext","useContext"],"mappings":";;;;;AAGA,MAAM,kBAAA,GAAqBA,oBAAuC,KAAS,CAAA,CAAA;AAEpE,MAAM,sBAAsB,CAAC;AAAA,EAClC,QAAA;AAAA,EACA;AACF,CAGM,KAAA;AACJ,EAAA,sCACG,kBAAmB,CAAA,QAAA,EAAnB,EAA4B,KAAA,EAAO,aACjC,QACH,EAAA,CAAA;AAEJ;AAMgB,SAAA,cAAA,CAAe,qBAAqB,KAAO,EAAA;AACzD,EAAM,MAAA,WAAA,GAAcC,iBAAW,kBAAkB,CAAA;AACjD,EAAA,IAAI,gBAAgB,KAAW,CAAA,EAAA;AAC7B,IAAA,MAAM,OACJ,GAAA,qHAAA;AACF,IAAA,IAAI,kBAAoB,EAAA;AACtB,MAAA,MAAM,MAAM,OAAO,CAAA;AAAA,KACd,MAAA;AACL,MAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA;AACtB,GACK,MAAA;AACL,IAAO,OAAA,WAAA;AAAA;AAEX;;;;;"}
@@ -44,6 +44,7 @@ class EditTracker extends eventEmitter.EventEmitter {
44
44
  }
45
45
  }
46
46
  set dataSource(ds) {
47
+ console.log(`[EditTracker] set datasource ${ds.viewport}`);
47
48
  __privateSet(this, _dataSource, ds);
48
49
  }
49
50
  clear() {
@@ -52,6 +53,9 @@ class EditTracker extends eventEmitter.EventEmitter {
52
53
  }
53
54
  async enterEditMode() {
54
55
  __privateSet(this, _inEditMode, true);
56
+ console.log(
57
+ `[EditTracker] enterEditMode datasource ${__privateGet(this, _dataSource)?.viewport}`
58
+ );
55
59
  const rpcResponse = await __privateGet(this, _dataSource)?.rpcRequest?.({
56
60
  type: "RPC_REQUEST",
57
61
  rpcName: "ENTER_EDIT_MODE",
@@ -143,7 +147,10 @@ class EditTracker extends eventEmitter.EventEmitter {
143
147
  return rpcResponse;
144
148
  }
145
149
  } else {
146
- throw Error(`[EditTracker] commit, key ${key} not found `);
150
+ return {
151
+ errorMessage: "CHANGE_REVERTED",
152
+ type: "ERROR_RESULT"
153
+ };
147
154
  }
148
155
  }
149
156
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EditTracker.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/EditTracker.tsx"],"sourcesContent":["import { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuRowDataItemType, VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { isRpcSuccess } from \"../protocol-message-utils\";\n\nexport type EditState = \"clean\" | \"dirty\";\n\ntype CellEdit = {\n originalValue: VuuRowDataItemType;\n editedValue: VuuRowDataItemType;\n};\n\ntype RowEditDetails = {\n /**\n * Column name => cell edit details\n */\n cellEdits: Map<string, CellEdit>;\n};\n\ntype EditTrackerEvents = {\n editState: (editState: EditState) => void;\n};\n\nexport class EditTracker extends EventEmitter<EditTrackerEvents> {\n #active = false;\n /**\n * Row key => row edits\n */\n #rowEdits = new Map<string, RowEditDetails>();\n #editCount = 0;\n #dataSource?: DataSource;\n #inEditMode = false;\n\n get active() {\n return this.#active;\n }\n set active(isActive: boolean) {\n this.#active = isActive;\n }\n get editCount() {\n return this.#editCount;\n }\n\n set editCount(val: number) {\n if (val !== this.#editCount) {\n const oldCount = this.#editCount;\n this.#editCount = val;\n if (val === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n set dataSource(ds: DataSource) {\n this.#dataSource = ds;\n }\n\n clear() {\n this.#rowEdits.clear();\n this.#editCount = 0;\n }\n\n async enterEditMode() {\n this.#inEditMode = true;\n\n const rpcResponse = await this.#dataSource?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"ENTER_EDIT_MODE\",\n params: {},\n });\n\n if (isRpcSuccess(rpcResponse)) {\n const { table: sessionTable } = rpcResponse.data as { table: VuuTable };\n return sessionTable;\n } else {\n console.log(\"fail\");\n }\n }\n\n get inEditMode() {\n return this.#inEditMode;\n }\n\n get editState(): EditState {\n return this.editCount === 0 ? \"clean\" : \"dirty\";\n }\n\n async cancelChanges() {\n const rpcResponse = await this.#dataSource?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"EXIT_EDIT_MODE\",\n params: {},\n });\n this.clear();\n return rpcResponse;\n }\n\n async saveChanges() {\n const rpcResponse = await this.#dataSource?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"EXIT_EDIT_MODE\",\n params: { save: true },\n });\n this.clear();\n return rpcResponse;\n }\n\n // TODO how do we deal with the '_edited' pattern\n edit(\n key: string,\n columnName: string,\n originalValue: VuuRowDataItemType,\n newValue: VuuRowDataItemType,\n ) {\n const rowEditDetails = this.#rowEdits.get(key);\n if (rowEditDetails) {\n const { cellEdits } = rowEditDetails;\n const cellEdit = cellEdits.get(columnName);\n if (cellEdit) {\n if (newValue === cellEdit.originalValue) {\n if (cellEdits.size === 1) {\n this.#rowEdits.delete(key);\n } else {\n // re-editing a cell had removed the edit\n cellEdits.delete(columnName);\n }\n this.editCount = this.#editCount - 1;\n } else {\n cellEdit.editedValue = newValue;\n }\n } else {\n // row has already been edited, but this column has not\n cellEdits.set(columnName, {\n originalValue,\n editedValue: newValue,\n });\n this.editCount = this.#editCount + 1;\n }\n } else {\n this.#rowEdits.set(key, {\n cellEdits: new Map([\n [columnName, { originalValue, editedValue: newValue }],\n ]),\n });\n this.editCount = this.#editCount + 1;\n }\n }\n\n //TODO alow a shortcut commit that allows a value, bypassing need\n // for edit. Thids caters for boolean values, dropdown list etc\n // that have no intermediate edit phase\n async commit(key: string, columnName: string) {\n const rowEditDetails = this.#rowEdits.get(key);\n if (rowEditDetails) {\n const { cellEdits } = rowEditDetails;\n const cellEditValues = cellEdits.get(columnName);\n if (cellEditValues) {\n const { editedValue } = cellEditValues;\n const rpcResponse = await this.#dataSource?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"editCell\",\n params: {\n column: columnName,\n data: editedValue,\n key,\n },\n });\n\n return rpcResponse;\n }\n } else {\n throw Error(`[EditTracker] commit, key ${key} not found `);\n }\n }\n}\n"],"names":["EventEmitter","isRpcSuccess"],"mappings":"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"}
1
+ {"version":3,"file":"EditTracker.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/EditTracker.tsx"],"sourcesContent":["import { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport type {\n RpcResultError,\n VuuRowDataItemType,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { isRpcSuccess } from \"../protocol-message-utils\";\n\nexport type EditState = \"clean\" | \"dirty\";\n\ntype CellEdit = {\n originalValue: VuuRowDataItemType;\n editedValue: VuuRowDataItemType;\n};\n\ntype RowEditDetails = {\n /**\n * Column name => cell edit details\n */\n cellEdits: Map<string, CellEdit>;\n};\n\ntype EditTrackerEvents = {\n editState: (editState: EditState) => void;\n};\n\nexport class EditTracker extends EventEmitter<EditTrackerEvents> {\n #active = false;\n /**\n * Row key => row edits\n */\n #rowEdits = new Map<string, RowEditDetails>();\n #editCount = 0;\n #dataSource?: DataSource;\n #inEditMode = false;\n\n get active() {\n return this.#active;\n }\n set active(isActive: boolean) {\n this.#active = isActive;\n }\n get editCount() {\n return this.#editCount;\n }\n\n set editCount(val: number) {\n if (val !== this.#editCount) {\n const oldCount = this.#editCount;\n this.#editCount = val;\n if (val === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n set dataSource(ds: DataSource) {\n console.log(`[EditTracker] set datasource ${ds.viewport}`);\n\n this.#dataSource = ds;\n }\n\n clear() {\n this.#rowEdits.clear();\n this.#editCount = 0;\n }\n\n async enterEditMode() {\n this.#inEditMode = true;\n\n console.log(\n `[EditTracker] enterEditMode datasource ${this.#dataSource?.viewport}`,\n );\n\n const rpcResponse = await this.#dataSource?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"ENTER_EDIT_MODE\",\n params: {},\n });\n\n if (isRpcSuccess(rpcResponse)) {\n const { table: sessionTable } = rpcResponse.data as { table: VuuTable };\n return sessionTable;\n } else {\n console.log(\"fail\");\n }\n }\n\n get inEditMode() {\n return this.#inEditMode;\n }\n\n get editState(): EditState {\n return this.editCount === 0 ? \"clean\" : \"dirty\";\n }\n\n async cancelChanges() {\n const rpcResponse = await this.#dataSource?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"EXIT_EDIT_MODE\",\n params: {},\n });\n this.clear();\n return rpcResponse;\n }\n\n async saveChanges() {\n const rpcResponse = await this.#dataSource?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"EXIT_EDIT_MODE\",\n params: { save: true },\n });\n this.clear();\n return rpcResponse;\n }\n\n // TODO how do we deal with the '_edited' pattern\n edit(\n key: string,\n columnName: string,\n originalValue: VuuRowDataItemType,\n newValue: VuuRowDataItemType,\n ) {\n const rowEditDetails = this.#rowEdits.get(key);\n if (rowEditDetails) {\n const { cellEdits } = rowEditDetails;\n const cellEdit = cellEdits.get(columnName);\n if (cellEdit) {\n if (newValue === cellEdit.originalValue) {\n if (cellEdits.size === 1) {\n this.#rowEdits.delete(key);\n } else {\n // re-editing a cell had removed the edit\n cellEdits.delete(columnName);\n }\n this.editCount = this.#editCount - 1;\n } else {\n cellEdit.editedValue = newValue;\n }\n } else {\n // row has already been edited, but this column has not\n cellEdits.set(columnName, {\n originalValue,\n editedValue: newValue,\n });\n this.editCount = this.#editCount + 1;\n }\n } else {\n this.#rowEdits.set(key, {\n cellEdits: new Map([\n [columnName, { originalValue, editedValue: newValue }],\n ]),\n });\n this.editCount = this.#editCount + 1;\n }\n }\n\n //TODO alow a shortcut commit that allows a value, bypassing need\n // for edit. Thids caters for boolean values, dropdown list etc\n // that have no intermediate edit phase\n async commit(key: string, columnName: string) {\n const rowEditDetails = this.#rowEdits.get(key);\n if (rowEditDetails) {\n const { cellEdits } = rowEditDetails;\n const cellEditValues = cellEdits.get(columnName);\n if (cellEditValues) {\n const { editedValue } = cellEditValues;\n const rpcResponse = await this.#dataSource?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"editCell\",\n params: {\n column: columnName,\n data: editedValue,\n key,\n },\n });\n\n return rpcResponse;\n }\n } else {\n return {\n errorMessage: \"CHANGE_REVERTED\",\n type: \"ERROR_RESULT\",\n } as RpcResultError;\n }\n }\n}\n"],"names":["EventEmitter","isRpcSuccess"],"mappings":"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"}
@@ -4,6 +4,7 @@ var React = require('react');
4
4
  var EditTracker = require('./EditTracker.js');
5
5
  var DataProvider = require('../context-definitions/DataProvider.js');
6
6
  var protocolMessageUtils = require('../protocol-message-utils.js');
7
+ var useLayoutEffectSkipFirst = require('../useLayoutEffectSkipFirst.js');
7
8
 
8
9
  const useEditableTable = ({
9
10
  columns,
@@ -15,7 +16,18 @@ const useEditableTable = ({
15
16
  }) => {
16
17
  const { VuuDataSource } = DataProvider.useData();
17
18
  const [sessionDataSource, setSessionDataSource] = React.useState(void 0);
19
+ console.log(`[usEditableTable] ${dataSourceProp?.viewport}`);
20
+ const clearSessionDataSource = React.useCallback(() => {
21
+ setSessionDataSource((dataSource2) => {
22
+ dataSource2?.unsubscribe();
23
+ return void 0;
24
+ });
25
+ }, []);
26
+ useLayoutEffectSkipFirst.useLayoutEffectSkipFirst(() => {
27
+ console.warn(`[useEditableTable] columns and or table changed`);
28
+ }, [columns, table]);
18
29
  const dataSource = React.useMemo(() => {
30
+ console.log(`[useEditableTable] create new dataSource`);
19
31
  return dataSourceProp ?? new VuuDataSource({ columns, table });
20
32
  }, [VuuDataSource, columns, dataSourceProp, table]);
21
33
  const editTracker = React.useMemo(() => new EditTracker.EditTracker(), []);
@@ -27,17 +39,17 @@ const useEditableTable = ({
27
39
  const handleCancel = React.useCallback(() => {
28
40
  editTracker.cancelChanges();
29
41
  onCancel();
30
- setSessionDataSource(void 0);
42
+ clearSessionDataSource();
31
43
  dataSource.resume?.();
32
- }, [dataSource, editTracker, onCancel]);
44
+ }, [clearSessionDataSource, dataSource, editTracker, onCancel]);
33
45
  const handleSave = React.useCallback(async () => {
46
+ dataSource.resume?.();
34
47
  const response = await editTracker.saveChanges();
35
48
  if (protocolMessageUtils.isRpcSuccess(response)) {
36
49
  onSave();
37
- setSessionDataSource(void 0);
38
- dataSource.resume?.();
50
+ clearSessionDataSource();
39
51
  }
40
- }, [dataSource, editTracker, onSave]);
52
+ }, [clearSessionDataSource, dataSource, editTracker, onSave]);
41
53
  React.useMemo(async () => {
42
54
  if (isEditMode) {
43
55
  const sessionTable = await editTracker.enterEditMode();
@@ -53,7 +65,9 @@ const useEditableTable = ({
53
65
  }
54
66
  }
55
67
  }, [VuuDataSource, dataSource, editTracker, isEditMode]);
68
+ console.log(`[usEditableTable] ${dataSource.viewport}`);
56
69
  return {
70
+ // DO we need to reset the dataSource or could useDataSOurce detect the sessiondataSOurce from the editSession ?
57
71
  dataSource: sessionDataSource ?? dataSource,
58
72
  editTracker,
59
73
  onCancel: handleCancel,
@@ -1 +1 @@
1
- {"version":3,"file":"useEditableTable.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/useEditableTable.ts"],"sourcesContent":["import { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { EditTracker } from \"./EditTracker\";\nimport { useData } from \"../context-definitions/DataProvider\";\nimport { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport { isRpcSuccess } from \"../protocol-message-utils\";\n\nexport type EditMode = \"edit\" | \"view\";\n\nexport interface EditableTableHookProps {\n /**\n * columns to be included in subscription. If not provided,\n * default will be '*'. Ignored if dataSource prop present.\n */\n columns?: string[];\n dataSource?: DataSource;\n isEditMode: boolean;\n onCancel: () => void;\n onSave: () => void;\n /**\n * If dataSource nor provided, new DataSource\n * will be created using table and columns\n */\n table: VuuTable;\n}\n\nexport const useEditableTable = ({\n columns,\n dataSource: dataSourceProp,\n isEditMode,\n onCancel,\n onSave,\n table,\n}: EditableTableHookProps) => {\n const { VuuDataSource } = useData();\n const [sessionDataSource, setSessionDataSource] = useState<\n DataSource | undefined\n >(undefined);\n\n const dataSource = useMemo(() => {\n return dataSourceProp ?? new VuuDataSource({ columns, table });\n }, [VuuDataSource, columns, dataSourceProp, table]);\n\n const editTracker = useMemo(() => new EditTracker(), []);\n\n useMemo(() => {\n if (dataSource) {\n editTracker.dataSource = dataSource;\n }\n }, [dataSource, editTracker]);\n\n const handleCancel = useCallback(() => {\n // editTracker.dataSource = dataSource;\n editTracker.cancelChanges();\n onCancel();\n setSessionDataSource(undefined);\n dataSource.resume?.();\n }, [dataSource, editTracker, onCancel]);\n\n const handleSave = useCallback(async () => {\n // editTracker.dataSource = dataSource;\n const response = await editTracker.saveChanges();\n if (isRpcSuccess(response)) {\n onSave();\n setSessionDataSource(undefined);\n dataSource.resume?.();\n }\n }, [dataSource, editTracker, onSave]);\n\n useMemo(async () => {\n if (isEditMode) {\n const sessionTable = await editTracker.enterEditMode();\n if (sessionTable && dataSource.tableSchema) {\n dataSource.suspend?.(false);\n const sessionDataSource = new VuuDataSource({\n columns: dataSource.columns,\n table: sessionTable,\n viewport: sessionTable.table,\n });\n setSessionDataSource(sessionDataSource);\n editTracker.dataSource = sessionDataSource;\n }\n }\n }, [VuuDataSource, dataSource, editTracker, isEditMode]);\n\n return {\n dataSource: sessionDataSource ?? dataSource,\n editTracker,\n onCancel: handleCancel,\n onSave: handleSave,\n };\n};\n"],"names":["useData","useState","useMemo","EditTracker","useCallback","isRpcSuccess","sessionDataSource"],"mappings":";;;;;;;AA0BO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,OAAA;AAAA,EACA,UAAY,EAAA,cAAA;AAAA,EACZ,UAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAA8B,KAAA;AAC5B,EAAM,MAAA,EAAE,aAAc,EAAA,GAAIA,oBAAQ,EAAA;AAClC,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAIC,eAEhD,KAAS,CAAA,CAAA;AAEX,EAAM,MAAA,UAAA,GAAaC,cAAQ,MAAM;AAC/B,IAAA,OAAO,kBAAkB,IAAI,aAAA,CAAc,EAAE,OAAA,EAAS,OAAO,CAAA;AAAA,KAC5D,CAAC,aAAA,EAAe,OAAS,EAAA,cAAA,EAAgB,KAAK,CAAC,CAAA;AAElD,EAAA,MAAM,cAAcA,aAAQ,CAAA,MAAM,IAAIC,uBAAY,EAAA,EAAG,EAAE,CAAA;AAEvD,EAAAD,aAAA,CAAQ,MAAM;AACZ,IAAA,IAAI,UAAY,EAAA;AACd,MAAA,WAAA,CAAY,UAAa,GAAA,UAAA;AAAA;AAC3B,GACC,EAAA,CAAC,UAAY,EAAA,WAAW,CAAC,CAAA;AAE5B,EAAM,MAAA,YAAA,GAAeE,kBAAY,MAAM;AAErC,IAAA,WAAA,CAAY,aAAc,EAAA;AAC1B,IAAS,QAAA,EAAA;AACT,IAAA,oBAAA,CAAqB,KAAS,CAAA,CAAA;AAC9B,IAAA,UAAA,CAAW,MAAS,IAAA;AAAA,GACnB,EAAA,CAAC,UAAY,EAAA,WAAA,EAAa,QAAQ,CAAC,CAAA;AAEtC,EAAM,MAAA,UAAA,GAAaA,kBAAY,YAAY;AAEzC,IAAM,MAAA,QAAA,GAAW,MAAM,WAAA,CAAY,WAAY,EAAA;AAC/C,IAAI,IAAAC,iCAAA,CAAa,QAAQ,CAAG,EAAA;AAC1B,MAAO,MAAA,EAAA;AACP,MAAA,oBAAA,CAAqB,KAAS,CAAA,CAAA;AAC9B,MAAA,UAAA,CAAW,MAAS,IAAA;AAAA;AACtB,GACC,EAAA,CAAC,UAAY,EAAA,WAAA,EAAa,MAAM,CAAC,CAAA;AAEpC,EAAAH,aAAA,CAAQ,YAAY;AAClB,IAAA,IAAI,UAAY,EAAA;AACd,MAAM,MAAA,YAAA,GAAe,MAAM,WAAA,CAAY,aAAc,EAAA;AACrD,MAAI,IAAA,YAAA,IAAgB,WAAW,WAAa,EAAA;AAC1C,QAAA,UAAA,CAAW,UAAU,KAAK,CAAA;AAC1B,QAAMI,MAAAA,kBAAAA,GAAoB,IAAI,aAAc,CAAA;AAAA,UAC1C,SAAS,UAAW,CAAA,OAAA;AAAA,UACpB,KAAO,EAAA,YAAA;AAAA,UACP,UAAU,YAAa,CAAA;AAAA,SACxB,CAAA;AACD,QAAA,oBAAA,CAAqBA,kBAAiB,CAAA;AACtC,QAAA,WAAA,CAAY,UAAaA,GAAAA,kBAAAA;AAAA;AAC3B;AACF,KACC,CAAC,aAAA,EAAe,UAAY,EAAA,WAAA,EAAa,UAAU,CAAC,CAAA;AAEvD,EAAO,OAAA;AAAA,IACL,YAAY,iBAAqB,IAAA,UAAA;AAAA,IACjC,WAAA;AAAA,IACA,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AACF;;;;"}
1
+ {"version":3,"file":"useEditableTable.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/useEditableTable.ts"],"sourcesContent":["import { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { EditTracker } from \"./EditTracker\";\nimport { useData } from \"../context-definitions/DataProvider\";\nimport { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport { isRpcSuccess } from \"../protocol-message-utils\";\nimport { useLayoutEffectSkipFirst } from \"../useLayoutEffectSkipFirst\";\n\nexport type EditMode = \"edit\" | \"view\";\n\nexport interface EditableTableHookProps {\n /**\n * columns to be included in subscription. If not provided,\n * default will be '*'. Ignored if dataSource prop present.\n */\n columns?: string[];\n dataSource?: DataSource;\n isEditMode: boolean;\n onCancel: () => void;\n onSave: () => void;\n /**\n * If dataSource not provided, new DataSource\n * will be created using table and columns\n */\n table: VuuTable;\n}\n\nexport const useEditableTable = ({\n columns,\n dataSource: dataSourceProp,\n isEditMode,\n onCancel,\n onSave,\n table,\n}: EditableTableHookProps) => {\n const { VuuDataSource } = useData();\n const [sessionDataSource, setSessionDataSource] = useState<\n DataSource | undefined\n >(undefined);\n\n console.log(`[usEditableTable] ${dataSourceProp?.viewport}`);\n\n const clearSessionDataSource = useCallback(() => {\n setSessionDataSource((dataSource) => {\n dataSource?.unsubscribe();\n return undefined;\n });\n }, []);\n\n useLayoutEffectSkipFirst(() => {\n console.warn(`[useEditableTable] columns and or table changed`);\n }, [columns, table]);\n\n const dataSource = useMemo(() => {\n console.log(`[useEditableTable] create new dataSource`);\n return dataSourceProp ?? new VuuDataSource({ columns, table });\n }, [VuuDataSource, columns, dataSourceProp, table]);\n\n const editTracker = useMemo(() => new EditTracker(), []);\n\n useMemo(() => {\n if (dataSource) {\n editTracker.dataSource = dataSource;\n }\n }, [dataSource, editTracker]);\n\n const handleCancel = useCallback(() => {\n // editTracker.dataSource = dataSource;\n editTracker.cancelChanges();\n onCancel();\n clearSessionDataSource();\n dataSource.resume?.();\n }, [clearSessionDataSource, dataSource, editTracker, onCancel]);\n\n const handleSave = useCallback(async () => {\n dataSource.resume?.();\n const response = await editTracker.saveChanges();\n if (isRpcSuccess(response)) {\n onSave();\n clearSessionDataSource();\n }\n }, [clearSessionDataSource, dataSource, editTracker, onSave]);\n\n useMemo(async () => {\n if (isEditMode) {\n const sessionTable = await editTracker.enterEditMode();\n if (sessionTable && dataSource.tableSchema) {\n dataSource.suspend?.(false);\n const sessionDataSource = new VuuDataSource({\n columns: dataSource.columns,\n table: sessionTable,\n viewport: sessionTable.table,\n });\n setSessionDataSource(sessionDataSource);\n editTracker.dataSource = sessionDataSource;\n }\n }\n }, [VuuDataSource, dataSource, editTracker, isEditMode]);\n\n console.log(`[usEditableTable] ${dataSource.viewport}`);\n\n return {\n // DO we need to reset the dataSource or could useDataSOurce detect the sessiondataSOurce from the editSession ?\n dataSource: sessionDataSource ?? dataSource,\n editTracker,\n onCancel: handleCancel,\n onSave: handleSave,\n };\n};\n"],"names":["useData","useState","useCallback","dataSource","useLayoutEffectSkipFirst","useMemo","EditTracker","isRpcSuccess","sessionDataSource"],"mappings":"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"}
@@ -65,12 +65,27 @@ function asInteger(index, defaultValue) {
65
65
  throw Error(`parseIndex invalid value ${index}`);
66
66
  }
67
67
  }
68
+ const dataDescriptorTypeToVuuRowDataItemType = ({
69
+ serverDataType = "string"
70
+ }) => {
71
+ switch (serverDataType) {
72
+ case "double":
73
+ case "int":
74
+ case "long":
75
+ return "number";
76
+ case "boolean":
77
+ return "boolean";
78
+ default:
79
+ return "string";
80
+ }
81
+ };
68
82
 
69
83
  exports.DOWN1 = DOWN1;
70
84
  exports.DOWN2 = DOWN2;
71
85
  exports.UP1 = UP1;
72
86
  exports.UP2 = UP2;
73
87
  exports.asInteger = asInteger;
88
+ exports.dataDescriptorTypeToVuuRowDataItemType = dataDescriptorTypeToVuuRowDataItemType;
74
89
  exports.getMovingValueDirection = getMovingValueDirection;
75
90
  exports.isValidNumber = isValidNumber;
76
91
  exports.numericTypeOfStringValue = numericTypeOfStringValue;
@@ -1 +1 @@
1
- {"version":3,"file":"data-utils.js","sources":["../../../../../../packages/vuu-utils/src/data-utils.ts"],"sourcesContent":["export type valueChangeDirection = \"up1\" | \"up2\" | \"down1\" | \"down2\" | \"\";\n\nexport const UP1 = \"up1\";\nexport const UP2 = \"up2\";\nexport const DOWN1 = \"down1\";\nexport const DOWN2 = \"down2\";\n\nconst decimalPattern = /^-?[0-9]*\\.[0-9]+$/;\n\nexport const stringIsValidInt = (val: string) =>\n parseInt(val, 10).toString() === val;\n\nexport const stringIsValidDecimal = (val: string) =>\n stringIsValidInt(val) || decimalPattern.test(val);\n\nexport const stringIsValidNumber = (val: string) =>\n stringIsValidInt(val) || stringIsValidDecimal(val);\n\nexport const numericTypeOfStringValue = (val: string) =>\n stringIsValidInt(val) ? \"int\" : stringIsValidDecimal(val) ? \"double\" : \"NaN\";\n\nexport const isValidNumber = (n: unknown): n is number =>\n typeof n === \"number\" && isFinite(n);\n\nconst EMPTY = {};\nexport const shallowEquals = (\n o1: { [key: string]: unknown } = EMPTY,\n o2: { [key: string]: unknown } = EMPTY,\n) => {\n const props1 = Object.keys(o1);\n const props2 = Object.keys(o2);\n return (\n props1.length === props2.length &&\n props1.every((key) => o1[key] === o2[key])\n );\n};\n\nexport function getMovingValueDirection(\n newValue?: number,\n direction?: valueChangeDirection,\n prevValue?: number,\n /** the number of decimal places to take into account when highlighting a change */\n decimalPlaces?: number,\n): valueChangeDirection {\n if (newValue === undefined) {\n return \"\";\n }\n if (\n !isFinite(newValue) ||\n prevValue === undefined ||\n direction === undefined\n ) {\n return \"\";\n } else {\n let diff = newValue - prevValue;\n if (diff) {\n // make sure there is still a diff when reduced to number of decimals to be displayed\n if (typeof decimalPlaces === \"number\") {\n diff =\n +newValue.toFixed(decimalPlaces) - +prevValue.toFixed(decimalPlaces);\n }\n }\n\n if (diff) {\n if (direction === \"\") {\n if (diff < 0) {\n return DOWN1;\n } else {\n return UP1;\n }\n } else if (diff > 0) {\n if (direction === DOWN1 || direction === DOWN2 || direction === UP2) {\n return UP1;\n } else {\n return UP2;\n }\n } else if (\n direction === UP1 ||\n direction === UP2 ||\n direction === DOWN2\n ) {\n return DOWN1;\n } else {\n return DOWN2;\n }\n } else {\n return \"\";\n }\n }\n}\n\nexport function asInteger(\n index: number | string | undefined,\n defaultValue?: number,\n) {\n if (typeof index === \"number\") {\n return index;\n } else {\n const numIdx = parseInt(index ?? \"\");\n if (!isNaN(numIdx)) {\n return numIdx;\n } else if (typeof defaultValue === \"number\") {\n return defaultValue;\n }\n throw Error(`parseIndex invalid value ${index}`);\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-utils.js","sources":["../../../../../../packages/vuu-utils/src/data-utils.ts"],"sourcesContent":["import { DataValueDescriptor } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\n\nexport type valueChangeDirection = \"up1\" | \"up2\" | \"down1\" | \"down2\" | \"\";\n\nexport const UP1 = \"up1\";\nexport const UP2 = \"up2\";\nexport const DOWN1 = \"down1\";\nexport const DOWN2 = \"down2\";\n\nconst decimalPattern = /^-?[0-9]*\\.[0-9]+$/;\n\nexport const stringIsValidInt = (val: string) =>\n parseInt(val, 10).toString() === val;\n\nexport const stringIsValidDecimal = (val: string) =>\n stringIsValidInt(val) || decimalPattern.test(val);\n\nexport const stringIsValidNumber = (val: string) =>\n stringIsValidInt(val) || stringIsValidDecimal(val);\n\nexport const numericTypeOfStringValue = (val: string) =>\n stringIsValidInt(val) ? \"int\" : stringIsValidDecimal(val) ? \"double\" : \"NaN\";\n\nexport const isValidNumber = (n: unknown): n is number =>\n typeof n === \"number\" && isFinite(n);\n\nconst EMPTY = {};\nexport const shallowEquals = (\n o1: { [key: string]: unknown } = EMPTY,\n o2: { [key: string]: unknown } = EMPTY,\n) => {\n const props1 = Object.keys(o1);\n const props2 = Object.keys(o2);\n return (\n props1.length === props2.length &&\n props1.every((key) => o1[key] === o2[key])\n );\n};\n\nexport function getMovingValueDirection(\n newValue?: number,\n direction?: valueChangeDirection,\n prevValue?: number,\n /** the number of decimal places to take into account when highlighting a change */\n decimalPlaces?: number,\n): valueChangeDirection {\n if (newValue === undefined) {\n return \"\";\n }\n if (\n !isFinite(newValue) ||\n prevValue === undefined ||\n direction === undefined\n ) {\n return \"\";\n } else {\n let diff = newValue - prevValue;\n if (diff) {\n // make sure there is still a diff when reduced to number of decimals to be displayed\n if (typeof decimalPlaces === \"number\") {\n diff =\n +newValue.toFixed(decimalPlaces) - +prevValue.toFixed(decimalPlaces);\n }\n }\n\n if (diff) {\n if (direction === \"\") {\n if (diff < 0) {\n return DOWN1;\n } else {\n return UP1;\n }\n } else if (diff > 0) {\n if (direction === DOWN1 || direction === DOWN2 || direction === UP2) {\n return UP1;\n } else {\n return UP2;\n }\n } else if (\n direction === UP1 ||\n direction === UP2 ||\n direction === DOWN2\n ) {\n return DOWN1;\n } else {\n return DOWN2;\n }\n } else {\n return \"\";\n }\n }\n}\n\nexport function asInteger(\n index: number | string | undefined,\n defaultValue?: number,\n) {\n if (typeof index === \"number\") {\n return index;\n } else {\n const numIdx = parseInt(index ?? \"\");\n if (!isNaN(numIdx)) {\n return numIdx;\n } else if (typeof defaultValue === \"number\") {\n return defaultValue;\n }\n throw Error(`parseIndex invalid value ${index}`);\n }\n}\n\nexport const dataDescriptorTypeToVuuRowDataItemType = ({\n serverDataType = \"string\",\n}: DataValueDescriptor): \"string\" | \"number\" | \"boolean\" => {\n switch (serverDataType) {\n case \"double\":\n case \"int\":\n case \"long\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n default:\n return \"string\";\n }\n};\n"],"names":[],"mappings":"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"}
@@ -69,6 +69,7 @@ class BaseDataSource extends eventEmitter.EventEmitter {
69
69
  filterSpec,
70
70
  viewport = this.viewport || (this.viewport = index.uuid())
71
71
  }, callback) {
72
+ console.log(`[BaseDataSource] subscribe to ${this.viewport}`);
72
73
  this._clientCallback = callback;
73
74
  this.viewport = viewport;
74
75
  if (aggregations || baseFilterSpec || columns || filterSpec || groupBy || sort) {
@@ -1 +1 @@
1
- {"version":3,"file":"BaseDataSource.js","sources":["../../../../../../../packages/vuu-utils/src/datasource/BaseDataSource.ts"],"sourcesContent":["import type {\n DataSource,\n DataSourceConfig,\n DataSourceConstructorProps,\n DataSourceEvents,\n DataSourceFilter,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n DataSourceSuspenseProps,\n WithBaseFilter,\n WithFullConfig,\n} from \"@vuu-ui/vuu-data-types\";\nimport { parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n LinkDescriptorWithLabel,\n VuuAggregation,\n VuuRange,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { uuid } from \"../nanoid\";\nimport {\n DataSourceConfigChanges,\n isConfigChanged,\n stripVisualLink,\n vanillaConfig,\n withConfigDefaults,\n} from \"./datasource-utils\";\nimport { Range } from \"../range-utils\";\nimport { filterAsQuery } from \"../filters\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\n\nexport type ConfigWithVisualLink = WithBaseFilter<WithFullConfig> & {\n visualLink?: LinkDescriptorWithLabel;\n};\n\nexport const defaultSuspenseProps: DataSourceSuspenseProps = {\n escalateToDisable: true,\n};\n\nexport abstract class BaseDataSource\n extends EventEmitter<DataSourceEvents>\n implements Pick<DataSource, \"config\">\n{\n // This should simply be id\n public viewport: string;\n\n protected _clientCallback: DataSourceSubscribeCallback | undefined;\n protected _configWithVisualLink: ConfigWithVisualLink = vanillaConfig;\n protected _impendingConfigWithVisualLink: ConfigWithVisualLink | undefined =\n undefined;\n protected _range = Range(0, 0);\n protected _size = 0;\n protected _title: string | undefined;\n protected _defaultSuspenseProps: DataSourceSuspenseProps;\n\n #freezeTimestamp: number | undefined = undefined;\n #pageCount = 0;\n\n private awaitingConfirmationOfConfigChanges = false;\n\n constructor({\n aggregations,\n baseFilterSpec,\n columns,\n filterSpec,\n groupBy,\n sort,\n suspenseProps = defaultSuspenseProps,\n title,\n viewport,\n }: Omit<DataSourceConstructorProps, \"table\">) {\n super();\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n aggregations: aggregations || this._configWithVisualLink.aggregations,\n baseFilterSpec:\n baseFilterSpec || this._configWithVisualLink.baseFilterSpec,\n columns: columns || this._configWithVisualLink.columns,\n filterSpec: filterSpec || this._configWithVisualLink.filterSpec,\n groupBy: groupBy || this._configWithVisualLink.groupBy,\n sort: sort || this._configWithVisualLink.sort,\n };\n this._defaultSuspenseProps = suspenseProps;\n this._title = title;\n this.viewport = viewport ?? \"\";\n }\n\n subscribe(\n {\n baseFilterSpec,\n columns,\n aggregations,\n range,\n sort,\n groupBy,\n filterSpec,\n viewport = this.viewport || (this.viewport = uuid()),\n }: DataSourceSubscribeProps,\n callback: DataSourceSubscribeCallback,\n ) {\n this._clientCallback = callback;\n this.viewport = viewport;\n\n if (\n aggregations ||\n baseFilterSpec ||\n columns ||\n filterSpec ||\n groupBy ||\n sort\n ) {\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n aggregations: aggregations || this._configWithVisualLink.aggregations,\n baseFilterSpec:\n baseFilterSpec || this._configWithVisualLink.baseFilterSpec,\n columns: columns || this._configWithVisualLink.columns,\n filterSpec: filterSpec || this._configWithVisualLink.filterSpec,\n groupBy: groupBy || this._configWithVisualLink.groupBy,\n sort: sort || this._configWithVisualLink.sort,\n };\n }\n\n // store the range before we await the server. It's is possible the\n // range will be updated from the client before we have been able to\n // subscribe. This ensures we will subscribe with latest value.\n if (range) {\n this._range = range;\n this.emit(\"range\", range);\n }\n }\n\n get aggregations() {\n return this._configWithVisualLink.aggregations;\n }\n\n set aggregations(aggregations: VuuAggregation[]) {\n this.config = {\n ...this._configWithVisualLink,\n aggregations,\n };\n this.emit(\"config\", this._configWithVisualLink, this.range);\n }\n\n get baseFilter() {\n return this._configWithVisualLink.baseFilterSpec;\n }\n\n set baseFilter(baseFilter: DataSourceFilter | undefined) {\n this.config = {\n ...this._configWithVisualLink,\n baseFilterSpec: baseFilter,\n };\n }\n\n get columns() {\n return this._configWithVisualLink.columns;\n }\n\n set columns(columns: string[]) {\n this.config = {\n ...this._configWithVisualLink,\n columns,\n };\n }\n\n get filter() {\n return this._configWithVisualLink.filterSpec;\n }\n\n set filter(filter: DataSourceFilter) {\n this.config = {\n ...this._configWithVisualLink,\n filterSpec: filter,\n };\n }\n\n setFilter(filter: Filter) {\n const dataSourceFilter: DataSourceFilter = {\n filter: filterAsQuery(filter),\n filterStruct: filter,\n };\n this.filter = dataSourceFilter;\n }\n\n clearFilter() {\n this.filter = { filter: \"\" };\n }\n\n get isAwaitingConfirmationOfConfigChange() {\n return this._impendingConfigWithVisualLink !== undefined;\n }\n\n protected confirmConfigChange() {\n if (this._impendingConfigWithVisualLink) {\n this._configWithVisualLink = this._impendingConfigWithVisualLink;\n this._impendingConfigWithVisualLink = undefined;\n this.emit(\"config\", this._configWithVisualLink, this.range, true);\n } else {\n throw Error(\n `[BaseDataSource], unexpected call to confirmConfigChange, no changes pending`,\n );\n }\n }\n\n get config() {\n return stripVisualLink(\n this._impendingConfigWithVisualLink ?? this._configWithVisualLink,\n );\n }\n\n set config(config: WithBaseFilter<WithFullConfig>) {\n const confirmed = this.awaitingConfirmationOfConfigChanges\n ? true\n : undefined;\n // TODO what happens if config is set and we still have an unconfirmed change ?\n this.awaitingConfirmationOfConfigChanges = false;\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n requestAnimationFrame(() => {\n this.emit(\n \"config\",\n this._configWithVisualLink,\n this.range,\n confirmed,\n configChanges,\n );\n });\n }\n }\n\n get impendingConfig() {\n return this._impendingConfigWithVisualLink;\n }\n /**\n * This can be set by subclass in cases where we want to await ACK of async request\n * before we go ahead and apply change to config.\n * It is set in place of 'config' itself and it is then the responsibility of the client\n * to call 'confirmConfigChange' once confirmation of the change is received.\n * Client can check 'isAwaitingConfirmationOfConfigChange' to see if a change is pending\n * confirmation.\n */\n set impendingConfig(config: undefined | WithBaseFilter<WithFullConfig>) {\n if (config) {\n this.awaitingConfirmationOfConfigChanges = true;\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n this.emit(\"config\", this.config, this.range, false, configChanges);\n }\n } else {\n throw Error(\n `[BaseDataSource] ''unsetting impendingConfig is not currently supported`,\n );\n }\n }\n\n get pageCount() {\n return this.#pageCount;\n }\n\n set pageCount(pageCount: number) {\n if (pageCount !== this.#pageCount) {\n this.#pageCount = pageCount;\n this.emit(\"page-count\", pageCount);\n }\n }\n\n get range() {\n return this._range;\n }\n\n set range(range: Range) {\n if (range.from !== this._range.from || range.to !== this._range.to) {\n this._range = range;\n this.pageCount = Math.ceil(this._size / (range.to - range.from));\n this.rangeRequest(range.withBuffer);\n requestAnimationFrame(() => {\n this.emit(\"range\", range);\n });\n }\n }\n\n get size() {\n return this._size;\n }\n\n set size(size: number) {\n this._size = size;\n if (this.range.to !== 0) {\n const pageCount = Math.ceil(size / (this.range.to - this.range.from));\n this.pageCount = pageCount;\n }\n }\n\n get sort() {\n return this._configWithVisualLink.sort;\n }\n\n set sort(sort: VuuSort) {\n this.config = {\n ...this._configWithVisualLink,\n sort,\n };\n this.emit(\"config\", this._configWithVisualLink, this.range);\n }\n\n get title() {\n return this._title ?? \"\";\n }\n\n set title(title: string) {\n this._title = title;\n this.emit(\"title-changed\", this.viewport ?? \"\", title);\n }\n\n private applyConfig(\n config: WithBaseFilter<DataSourceConfig>,\n preserveExistingConfigAttributes = false,\n ): DataSourceConfigChanges | undefined {\n const { noChanges, ...otherChanges } = isConfigChanged(\n this._configWithVisualLink,\n config,\n );\n if (noChanges !== true) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filterSpec?.filter &&\n config?.filterSpec.filterStruct === undefined\n ? {\n ...config,\n filterSpec: {\n filter: config.filterSpec.filter,\n filterStruct: parseFilter(config.filterSpec.filter),\n },\n }\n : config;\n if (preserveExistingConfigAttributes) {\n if (this.awaitingConfirmationOfConfigChanges) {\n this._impendingConfigWithVisualLink = {\n ...this._configWithVisualLink,\n ...config,\n };\n } else {\n this._impendingConfigWithVisualLink = undefined;\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n ...config,\n };\n }\n } else {\n if (this.awaitingConfirmationOfConfigChanges) {\n this._impendingConfigWithVisualLink = withConfigDefaults(newConfig);\n } else {\n this._impendingConfigWithVisualLink = undefined;\n this._configWithVisualLink = withConfigDefaults(newConfig);\n }\n }\n return otherChanges;\n }\n }\n }\n\n freeze() {\n if (!this.isFrozen) {\n this.#freezeTimestamp = new Date().getTime();\n this.emit(\"freeze\", true, this.#freezeTimestamp);\n } else {\n throw Error(\n \"[BaseDataSource] cannot freeze, dataSource is already frozen\",\n );\n }\n }\n unfreeze() {\n if (this.isFrozen) {\n const freezeTimestamp = this.#freezeTimestamp as number;\n this.#freezeTimestamp = undefined;\n this.emit(\"freeze\", false, freezeTimestamp);\n } else {\n throw Error(\n \"[BaseDataSource] cannot freeze, dataSource is already frozen\",\n );\n }\n }\n get freezeTimestamp() {\n return this.#freezeTimestamp;\n }\n\n get isFrozen() {\n return typeof this.#freezeTimestamp === \"number\";\n }\n\n abstract rangeRequest(range: VuuRange): void;\n}\n"],"names":["EventEmitter","vanillaConfig","Range","uuid","filterAsQuery","stripVisualLink","isConfigChanged","parseFilter","withConfigDefaults"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,IAAA,gBAAA,EAAA,UAAA;AAoCO,MAAM,oBAAgD,GAAA;AAAA,EAC3D,iBAAmB,EAAA;AACrB;AAEO,MAAe,uBACZA,yBAEV,CAAA;AAAA,EAkBE,WAAY,CAAA;AAAA,IACV,YAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,aAAgB,GAAA,oBAAA;AAAA,IAChB,KAAA;AAAA,IACA;AAAA,GAC4C,EAAA;AAC5C,IAAM,KAAA,EAAA;AA3BR;AAAA,IAAO,aAAA,CAAA,IAAA,EAAA,UAAA,CAAA;AAEP,IAAU,aAAA,CAAA,IAAA,EAAA,iBAAA,CAAA;AACV,IAAA,aAAA,CAAA,IAAA,EAAU,uBAA8C,EAAAC,6BAAA,CAAA;AACxD,IAAU,aAAA,CAAA,IAAA,EAAA,gCAAA,CAAA;AAEV,IAAU,aAAA,CAAA,IAAA,EAAA,QAAA,EAASC,gBAAM,CAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AAC7B,IAAA,aAAA,CAAA,IAAA,EAAU,OAAQ,EAAA,CAAA,CAAA;AAClB,IAAU,aAAA,CAAA,IAAA,EAAA,QAAA,CAAA;AACV,IAAU,aAAA,CAAA,IAAA,EAAA,uBAAA,CAAA;AAEV,IAAA,YAAA,CAAA,IAAA,EAAA,gBAAA,CAAA;AACA,IAAa,YAAA,CAAA,IAAA,EAAA,UAAA,EAAA,CAAA,CAAA;AAEb,IAAA,aAAA,CAAA,IAAA,EAAQ,qCAAsC,EAAA,KAAA,CAAA;AAc5C,IAAA,IAAA,CAAK,qBAAwB,GAAA;AAAA,MAC3B,GAAG,IAAK,CAAA,qBAAA;AAAA,MACR,YAAA,EAAc,YAAgB,IAAA,IAAA,CAAK,qBAAsB,CAAA,YAAA;AAAA,MACzD,cAAA,EACE,cAAkB,IAAA,IAAA,CAAK,qBAAsB,CAAA,cAAA;AAAA,MAC/C,OAAA,EAAS,OAAW,IAAA,IAAA,CAAK,qBAAsB,CAAA,OAAA;AAAA,MAC/C,UAAA,EAAY,UAAc,IAAA,IAAA,CAAK,qBAAsB,CAAA,UAAA;AAAA,MACrD,OAAA,EAAS,OAAW,IAAA,IAAA,CAAK,qBAAsB,CAAA,OAAA;AAAA,MAC/C,IAAA,EAAM,IAAQ,IAAA,IAAA,CAAK,qBAAsB,CAAA;AAAA,KAC3C;AACA,IAAA,IAAA,CAAK,qBAAwB,GAAA,aAAA;AAC7B,IAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AACd,IAAA,IAAA,CAAK,WAAW,QAAY,IAAA,EAAA;AAAA;AAC9B,EAEA,SACE,CAAA;AAAA,IACE,cAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAW,GAAA,IAAA,CAAK,QAAa,KAAA,IAAA,CAAK,WAAWC,UAAK,EAAA;AAAA,KAEpD,QACA,EAAA;AACA,IAAA,IAAA,CAAK,eAAkB,GAAA,QAAA;AACvB,IAAA,IAAA,CAAK,QAAW,GAAA,QAAA;AAEhB,IAAA,IACE,YACA,IAAA,cAAA,IACA,OACA,IAAA,UAAA,IACA,WACA,IACA,EAAA;AACA,MAAA,IAAA,CAAK,qBAAwB,GAAA;AAAA,QAC3B,GAAG,IAAK,CAAA,qBAAA;AAAA,QACR,YAAA,EAAc,YAAgB,IAAA,IAAA,CAAK,qBAAsB,CAAA,YAAA;AAAA,QACzD,cAAA,EACE,cAAkB,IAAA,IAAA,CAAK,qBAAsB,CAAA,cAAA;AAAA,QAC/C,OAAA,EAAS,OAAW,IAAA,IAAA,CAAK,qBAAsB,CAAA,OAAA;AAAA,QAC/C,UAAA,EAAY,UAAc,IAAA,IAAA,CAAK,qBAAsB,CAAA,UAAA;AAAA,QACrD,OAAA,EAAS,OAAW,IAAA,IAAA,CAAK,qBAAsB,CAAA,OAAA;AAAA,QAC/C,IAAA,EAAM,IAAQ,IAAA,IAAA,CAAK,qBAAsB,CAAA;AAAA,OAC3C;AAAA;AAMF,IAAA,IAAI,KAAO,EAAA;AACT,MAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AACd,MAAK,IAAA,CAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA;AAC1B;AACF,EAEA,IAAI,YAAe,GAAA;AACjB,IAAA,OAAO,KAAK,qBAAsB,CAAA,YAAA;AAAA;AACpC,EAEA,IAAI,aAAa,YAAgC,EAAA;AAC/C,IAAA,IAAA,CAAK,MAAS,GAAA;AAAA,MACZ,GAAG,IAAK,CAAA,qBAAA;AAAA,MACR;AAAA,KACF;AACA,IAAA,IAAA,CAAK,IAAK,CAAA,QAAA,EAAU,IAAK,CAAA,qBAAA,EAAuB,KAAK,KAAK,CAAA;AAAA;AAC5D,EAEA,IAAI,UAAa,GAAA;AACf,IAAA,OAAO,KAAK,qBAAsB,CAAA,cAAA;AAAA;AACpC,EAEA,IAAI,WAAW,UAA0C,EAAA;AACvD,IAAA,IAAA,CAAK,MAAS,GAAA;AAAA,MACZ,GAAG,IAAK,CAAA,qBAAA;AAAA,MACR,cAAgB,EAAA;AAAA,KAClB;AAAA;AACF,EAEA,IAAI,OAAU,GAAA;AACZ,IAAA,OAAO,KAAK,qBAAsB,CAAA,OAAA;AAAA;AACpC,EAEA,IAAI,QAAQ,OAAmB,EAAA;AAC7B,IAAA,IAAA,CAAK,MAAS,GAAA;AAAA,MACZ,GAAG,IAAK,CAAA,qBAAA;AAAA,MACR;AAAA,KACF;AAAA;AACF,EAEA,IAAI,MAAS,GAAA;AACX,IAAA,OAAO,KAAK,qBAAsB,CAAA,UAAA;AAAA;AACpC,EAEA,IAAI,OAAO,MAA0B,EAAA;AACnC,IAAA,IAAA,CAAK,MAAS,GAAA;AAAA,MACZ,GAAG,IAAK,CAAA,qBAAA;AAAA,MACR,UAAY,EAAA;AAAA,KACd;AAAA;AACF,EAEA,UAAU,MAAgB,EAAA;AACxB,IAAA,MAAM,gBAAqC,GAAA;AAAA,MACzC,MAAA,EAAQC,4BAAc,MAAM,CAAA;AAAA,MAC5B,YAAc,EAAA;AAAA,KAChB;AACA,IAAA,IAAA,CAAK,MAAS,GAAA,gBAAA;AAAA;AAChB,EAEA,WAAc,GAAA;AACZ,IAAK,IAAA,CAAA,MAAA,GAAS,EAAE,MAAA,EAAQ,EAAG,EAAA;AAAA;AAC7B,EAEA,IAAI,oCAAuC,GAAA;AACzC,IAAA,OAAO,KAAK,8BAAmC,KAAA,KAAA,CAAA;AAAA;AACjD,EAEU,mBAAsB,GAAA;AAC9B,IAAA,IAAI,KAAK,8BAAgC,EAAA;AACvC,MAAA,IAAA,CAAK,wBAAwB,IAAK,CAAA,8BAAA;AAClC,MAAA,IAAA,CAAK,8BAAiC,GAAA,KAAA,CAAA;AACtC,MAAA,IAAA,CAAK,KAAK,QAAU,EAAA,IAAA,CAAK,qBAAuB,EAAA,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,KAC3D,MAAA;AACL,MAAM,MAAA,KAAA;AAAA,QACJ,CAAA,4EAAA;AAAA,OACF;AAAA;AACF;AACF,EAEA,IAAI,MAAS,GAAA;AACX,IAAO,OAAAC,+BAAA;AAAA,MACL,IAAA,CAAK,kCAAkC,IAAK,CAAA;AAAA,KAC9C;AAAA;AACF,EAEA,IAAI,OAAO,MAAwC,EAAA;AACjD,IAAM,MAAA,SAAA,GAAY,IAAK,CAAA,mCAAA,GACnB,IACA,GAAA,KAAA,CAAA;AAEJ,IAAA,IAAA,CAAK,mCAAsC,GAAA,KAAA;AAC3C,IAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,WAAA,CAAY,MAAM,CAAA;AAC7C,IAAA,IAAI,aAAe,EAAA;AACjB,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAK,IAAA,CAAA,IAAA;AAAA,UACH,QAAA;AAAA,UACA,IAAK,CAAA,qBAAA;AAAA,UACL,IAAK,CAAA,KAAA;AAAA,UACL,SAAA;AAAA,UACA;AAAA,SACF;AAAA,OACD,CAAA;AAAA;AACH;AACF,EAEA,IAAI,eAAkB,GAAA;AACpB,IAAA,OAAO,IAAK,CAAA,8BAAA;AAAA;AACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,gBAAgB,MAAoD,EAAA;AACtE,IAAA,IAAI,MAAQ,EAAA;AACV,MAAA,IAAA,CAAK,mCAAsC,GAAA,IAAA;AAC3C,MAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,WAAA,CAAY,MAAM,CAAA;AAC7C,MAAA,IAAI,aAAe,EAAA;AACjB,QAAA,IAAA,CAAK,KAAK,QAAU,EAAA,IAAA,CAAK,QAAQ,IAAK,CAAA,KAAA,EAAO,OAAO,aAAa,CAAA;AAAA;AACnE,KACK,MAAA;AACL,MAAM,MAAA,KAAA;AAAA,QACJ,CAAA,uEAAA;AAAA,OACF;AAAA;AACF;AACF,EAEA,IAAI,SAAY,GAAA;AACd,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA;AAAA;AACd,EAEA,IAAI,UAAU,SAAmB,EAAA;AAC/B,IAAI,IAAA,SAAA,KAAc,mBAAK,UAAY,CAAA,EAAA;AACjC,MAAA,YAAA,CAAA,IAAA,EAAK,UAAa,EAAA,SAAA,CAAA;AAClB,MAAK,IAAA,CAAA,IAAA,CAAK,cAAc,SAAS,CAAA;AAAA;AACnC;AACF,EAEA,IAAI,KAAQ,GAAA;AACV,IAAA,OAAO,IAAK,CAAA,MAAA;AAAA;AACd,EAEA,IAAI,MAAM,KAAc,EAAA;AACtB,IAAI,IAAA,KAAA,CAAM,SAAS,IAAK,CAAA,MAAA,CAAO,QAAQ,KAAM,CAAA,EAAA,KAAO,IAAK,CAAA,MAAA,CAAO,EAAI,EAAA;AAClE,MAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AACd,MAAK,IAAA,CAAA,SAAA,GAAY,KAAK,IAAK,CAAA,IAAA,CAAK,SAAS,KAAM,CAAA,EAAA,GAAK,MAAM,IAAK,CAAA,CAAA;AAC/D,MAAK,IAAA,CAAA,YAAA,CAAa,MAAM,UAAU,CAAA;AAClC,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAK,IAAA,CAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,OACzB,CAAA;AAAA;AACH;AACF,EAEA,IAAI,IAAO,GAAA;AACT,IAAA,OAAO,IAAK,CAAA,KAAA;AAAA;AACd,EAEA,IAAI,KAAK,IAAc,EAAA;AACrB,IAAA,IAAA,CAAK,KAAQ,GAAA,IAAA;AACb,IAAI,IAAA,IAAA,CAAK,KAAM,CAAA,EAAA,KAAO,CAAG,EAAA;AACvB,MAAM,MAAA,SAAA,GAAY,KAAK,IAAK,CAAA,IAAA,IAAQ,KAAK,KAAM,CAAA,EAAA,GAAK,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,CAAA;AACpE,MAAA,IAAA,CAAK,SAAY,GAAA,SAAA;AAAA;AACnB;AACF,EAEA,IAAI,IAAO,GAAA;AACT,IAAA,OAAO,KAAK,qBAAsB,CAAA,IAAA;AAAA;AACpC,EAEA,IAAI,KAAK,IAAe,EAAA;AACtB,IAAA,IAAA,CAAK,MAAS,GAAA;AAAA,MACZ,GAAG,IAAK,CAAA,qBAAA;AAAA,MACR;AAAA,KACF;AACA,IAAA,IAAA,CAAK,IAAK,CAAA,QAAA,EAAU,IAAK,CAAA,qBAAA,EAAuB,KAAK,KAAK,CAAA;AAAA;AAC5D,EAEA,IAAI,KAAQ,GAAA;AACV,IAAA,OAAO,KAAK,MAAU,IAAA,EAAA;AAAA;AACxB,EAEA,IAAI,MAAM,KAAe,EAAA;AACvB,IAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AACd,IAAA,IAAA,CAAK,IAAK,CAAA,eAAA,EAAiB,IAAK,CAAA,QAAA,IAAY,IAAI,KAAK,CAAA;AAAA;AACvD,EAEQ,WAAA,CACN,MACA,EAAA,gCAAA,GAAmC,KACE,EAAA;AACrC,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,YAAA,EAAiB,GAAAC,+BAAA;AAAA,MACrC,IAAK,CAAA,qBAAA;AAAA,MACL;AAAA,KACF;AACA,IAAA,IAAI,cAAc,IAAM,EAAA;AACtB,MAAA,IAAI,MAAQ,EAAA;AACV,QAAA,MAAM,YACJ,MAAQ,EAAA,UAAA,EAAY,UACpB,MAAQ,EAAA,UAAA,CAAW,iBAAiB,KAChC,CAAA,GAAA;AAAA,UACE,GAAG,MAAA;AAAA,UACH,UAAY,EAAA;AAAA,YACV,MAAA,EAAQ,OAAO,UAAW,CAAA,MAAA;AAAA,YAC1B,YAAc,EAAAC,2BAAA,CAAY,MAAO,CAAA,UAAA,CAAW,MAAM;AAAA;AACpD,SAEF,GAAA,MAAA;AACN,QAAA,IAAI,gCAAkC,EAAA;AACpC,UAAA,IAAI,KAAK,mCAAqC,EAAA;AAC5C,YAAA,IAAA,CAAK,8BAAiC,GAAA;AAAA,cACpC,GAAG,IAAK,CAAA,qBAAA;AAAA,cACR,GAAG;AAAA,aACL;AAAA,WACK,MAAA;AACL,YAAA,IAAA,CAAK,8BAAiC,GAAA,KAAA,CAAA;AACtC,YAAA,IAAA,CAAK,qBAAwB,GAAA;AAAA,cAC3B,GAAG,IAAK,CAAA,qBAAA;AAAA,cACR,GAAG;AAAA,aACL;AAAA;AACF,SACK,MAAA;AACL,UAAA,IAAI,KAAK,mCAAqC,EAAA;AAC5C,YAAK,IAAA,CAAA,8BAAA,GAAiCC,mCAAmB,SAAS,CAAA;AAAA,WAC7D,MAAA;AACL,YAAA,IAAA,CAAK,8BAAiC,GAAA,KAAA,CAAA;AACtC,YAAK,IAAA,CAAA,qBAAA,GAAwBA,mCAAmB,SAAS,CAAA;AAAA;AAC3D;AAEF,QAAO,OAAA,YAAA;AAAA;AACT;AACF;AACF,EAEA,MAAS,GAAA;AACP,IAAI,IAAA,CAAC,KAAK,QAAU,EAAA;AAClB,MAAA,YAAA,CAAA,IAAA,EAAK,gBAAmB,EAAA,iBAAA,IAAI,IAAK,EAAA,EAAE,OAAQ,EAAA,CAAA;AAC3C,MAAA,IAAA,CAAK,IAAK,CAAA,QAAA,EAAU,IAAM,EAAA,YAAA,CAAA,IAAA,EAAK,gBAAgB,CAAA,CAAA;AAAA,KAC1C,MAAA;AACL,MAAM,MAAA,KAAA;AAAA,QACJ;AAAA,OACF;AAAA;AACF;AACF,EACA,QAAW,GAAA;AACT,IAAA,IAAI,KAAK,QAAU,EAAA;AACjB,MAAA,MAAM,kBAAkB,YAAK,CAAA,IAAA,EAAA,gBAAA,CAAA;AAC7B,MAAA,YAAA,CAAA,IAAA,EAAK,gBAAmB,EAAA,KAAA,CAAA,CAAA;AACxB,MAAK,IAAA,CAAA,IAAA,CAAK,QAAU,EAAA,KAAA,EAAO,eAAe,CAAA;AAAA,KACrC,MAAA;AACL,MAAM,MAAA,KAAA;AAAA,QACJ;AAAA,OACF;AAAA;AACF;AACF,EACA,IAAI,eAAkB,GAAA;AACpB,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,gBAAA,CAAA;AAAA;AACd,EAEA,IAAI,QAAW,GAAA;AACb,IAAO,OAAA,OAAO,mBAAK,gBAAqB,CAAA,KAAA,QAAA;AAAA;AAI5C;AAjVE,gBAAA,GAAA,IAAA,OAAA,EAAA;AACA,UAAA,GAAA,IAAA,OAAA,EAAA;;;;;"}
1
+ {"version":3,"file":"BaseDataSource.js","sources":["../../../../../../../packages/vuu-utils/src/datasource/BaseDataSource.ts"],"sourcesContent":["import type {\n DataSource,\n DataSourceConfig,\n DataSourceConstructorProps,\n DataSourceEvents,\n DataSourceFilter,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n DataSourceSuspenseProps,\n WithBaseFilter,\n WithFullConfig,\n} from \"@vuu-ui/vuu-data-types\";\nimport { parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n LinkDescriptorWithLabel,\n VuuAggregation,\n VuuRange,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { uuid } from \"../nanoid\";\nimport {\n DataSourceConfigChanges,\n isConfigChanged,\n stripVisualLink,\n vanillaConfig,\n withConfigDefaults,\n} from \"./datasource-utils\";\nimport { Range } from \"../range-utils\";\nimport { filterAsQuery } from \"../filters\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\n\nexport type ConfigWithVisualLink = WithBaseFilter<WithFullConfig> & {\n visualLink?: LinkDescriptorWithLabel;\n};\n\nexport const defaultSuspenseProps: DataSourceSuspenseProps = {\n escalateToDisable: true,\n};\n\nexport abstract class BaseDataSource\n extends EventEmitter<DataSourceEvents>\n implements Pick<DataSource, \"config\">\n{\n // This should simply be id\n public viewport: string;\n\n protected _clientCallback: DataSourceSubscribeCallback | undefined;\n protected _configWithVisualLink: ConfigWithVisualLink = vanillaConfig;\n protected _impendingConfigWithVisualLink: ConfigWithVisualLink | undefined =\n undefined;\n protected _range = Range(0, 0);\n protected _size = 0;\n protected _title: string | undefined;\n protected _defaultSuspenseProps: DataSourceSuspenseProps;\n\n #freezeTimestamp: number | undefined = undefined;\n #pageCount = 0;\n\n private awaitingConfirmationOfConfigChanges = false;\n\n constructor({\n aggregations,\n baseFilterSpec,\n columns,\n filterSpec,\n groupBy,\n sort,\n suspenseProps = defaultSuspenseProps,\n title,\n viewport,\n }: Omit<DataSourceConstructorProps, \"table\">) {\n super();\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n aggregations: aggregations || this._configWithVisualLink.aggregations,\n baseFilterSpec:\n baseFilterSpec || this._configWithVisualLink.baseFilterSpec,\n columns: columns || this._configWithVisualLink.columns,\n filterSpec: filterSpec || this._configWithVisualLink.filterSpec,\n groupBy: groupBy || this._configWithVisualLink.groupBy,\n sort: sort || this._configWithVisualLink.sort,\n };\n this._defaultSuspenseProps = suspenseProps;\n this._title = title;\n this.viewport = viewport ?? \"\";\n }\n\n subscribe(\n {\n baseFilterSpec,\n columns,\n aggregations,\n range,\n sort,\n groupBy,\n filterSpec,\n viewport = this.viewport || (this.viewport = uuid()),\n }: DataSourceSubscribeProps,\n callback: DataSourceSubscribeCallback,\n ) {\n console.log(`[BaseDataSource] subscribe to ${this.viewport}`);\n this._clientCallback = callback;\n this.viewport = viewport;\n\n if (\n aggregations ||\n baseFilterSpec ||\n columns ||\n filterSpec ||\n groupBy ||\n sort\n ) {\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n aggregations: aggregations || this._configWithVisualLink.aggregations,\n baseFilterSpec:\n baseFilterSpec || this._configWithVisualLink.baseFilterSpec,\n columns: columns || this._configWithVisualLink.columns,\n filterSpec: filterSpec || this._configWithVisualLink.filterSpec,\n groupBy: groupBy || this._configWithVisualLink.groupBy,\n sort: sort || this._configWithVisualLink.sort,\n };\n }\n\n // store the range before we await the server. It's is possible the\n // range will be updated from the client before we have been able to\n // subscribe. This ensures we will subscribe with latest value.\n if (range) {\n this._range = range;\n this.emit(\"range\", range);\n }\n }\n\n get aggregations() {\n return this._configWithVisualLink.aggregations;\n }\n\n set aggregations(aggregations: VuuAggregation[]) {\n this.config = {\n ...this._configWithVisualLink,\n aggregations,\n };\n this.emit(\"config\", this._configWithVisualLink, this.range);\n }\n\n get baseFilter() {\n return this._configWithVisualLink.baseFilterSpec;\n }\n\n set baseFilter(baseFilter: DataSourceFilter | undefined) {\n this.config = {\n ...this._configWithVisualLink,\n baseFilterSpec: baseFilter,\n };\n }\n\n get columns() {\n return this._configWithVisualLink.columns;\n }\n\n set columns(columns: string[]) {\n this.config = {\n ...this._configWithVisualLink,\n columns,\n };\n }\n\n get filter() {\n return this._configWithVisualLink.filterSpec;\n }\n\n set filter(filter: DataSourceFilter) {\n this.config = {\n ...this._configWithVisualLink,\n filterSpec: filter,\n };\n }\n\n setFilter(filter: Filter) {\n const dataSourceFilter: DataSourceFilter = {\n filter: filterAsQuery(filter),\n filterStruct: filter,\n };\n this.filter = dataSourceFilter;\n }\n\n clearFilter() {\n this.filter = { filter: \"\" };\n }\n\n get isAwaitingConfirmationOfConfigChange() {\n return this._impendingConfigWithVisualLink !== undefined;\n }\n\n protected confirmConfigChange() {\n if (this._impendingConfigWithVisualLink) {\n this._configWithVisualLink = this._impendingConfigWithVisualLink;\n this._impendingConfigWithVisualLink = undefined;\n this.emit(\"config\", this._configWithVisualLink, this.range, true);\n } else {\n throw Error(\n `[BaseDataSource], unexpected call to confirmConfigChange, no changes pending`,\n );\n }\n }\n\n get config() {\n return stripVisualLink(\n this._impendingConfigWithVisualLink ?? this._configWithVisualLink,\n );\n }\n\n set config(config: WithBaseFilter<WithFullConfig>) {\n const confirmed = this.awaitingConfirmationOfConfigChanges\n ? true\n : undefined;\n // TODO what happens if config is set and we still have an unconfirmed change ?\n this.awaitingConfirmationOfConfigChanges = false;\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n requestAnimationFrame(() => {\n this.emit(\n \"config\",\n this._configWithVisualLink,\n this.range,\n confirmed,\n configChanges,\n );\n });\n }\n }\n\n get impendingConfig() {\n return this._impendingConfigWithVisualLink;\n }\n /**\n * This can be set by subclass in cases where we want to await ACK of async request\n * before we go ahead and apply change to config.\n * It is set in place of 'config' itself and it is then the responsibility of the client\n * to call 'confirmConfigChange' once confirmation of the change is received.\n * Client can check 'isAwaitingConfirmationOfConfigChange' to see if a change is pending\n * confirmation.\n */\n set impendingConfig(config: undefined | WithBaseFilter<WithFullConfig>) {\n if (config) {\n this.awaitingConfirmationOfConfigChanges = true;\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n this.emit(\"config\", this.config, this.range, false, configChanges);\n }\n } else {\n throw Error(\n `[BaseDataSource] ''unsetting impendingConfig is not currently supported`,\n );\n }\n }\n\n get pageCount() {\n return this.#pageCount;\n }\n\n set pageCount(pageCount: number) {\n if (pageCount !== this.#pageCount) {\n this.#pageCount = pageCount;\n this.emit(\"page-count\", pageCount);\n }\n }\n\n get range() {\n return this._range;\n }\n\n set range(range: Range) {\n if (range.from !== this._range.from || range.to !== this._range.to) {\n this._range = range;\n this.pageCount = Math.ceil(this._size / (range.to - range.from));\n this.rangeRequest(range.withBuffer);\n requestAnimationFrame(() => {\n this.emit(\"range\", range);\n });\n }\n }\n\n get size() {\n return this._size;\n }\n\n set size(size: number) {\n this._size = size;\n if (this.range.to !== 0) {\n const pageCount = Math.ceil(size / (this.range.to - this.range.from));\n this.pageCount = pageCount;\n }\n }\n\n get sort() {\n return this._configWithVisualLink.sort;\n }\n\n set sort(sort: VuuSort) {\n this.config = {\n ...this._configWithVisualLink,\n sort,\n };\n this.emit(\"config\", this._configWithVisualLink, this.range);\n }\n\n get title() {\n return this._title ?? \"\";\n }\n\n set title(title: string) {\n this._title = title;\n this.emit(\"title-changed\", this.viewport ?? \"\", title);\n }\n\n private applyConfig(\n config: WithBaseFilter<DataSourceConfig>,\n preserveExistingConfigAttributes = false,\n ): DataSourceConfigChanges | undefined {\n const { noChanges, ...otherChanges } = isConfigChanged(\n this._configWithVisualLink,\n config,\n );\n if (noChanges !== true) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filterSpec?.filter &&\n config?.filterSpec.filterStruct === undefined\n ? {\n ...config,\n filterSpec: {\n filter: config.filterSpec.filter,\n filterStruct: parseFilter(config.filterSpec.filter),\n },\n }\n : config;\n if (preserveExistingConfigAttributes) {\n if (this.awaitingConfirmationOfConfigChanges) {\n this._impendingConfigWithVisualLink = {\n ...this._configWithVisualLink,\n ...config,\n };\n } else {\n this._impendingConfigWithVisualLink = undefined;\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n ...config,\n };\n }\n } else {\n if (this.awaitingConfirmationOfConfigChanges) {\n this._impendingConfigWithVisualLink = withConfigDefaults(newConfig);\n } else {\n this._impendingConfigWithVisualLink = undefined;\n this._configWithVisualLink = withConfigDefaults(newConfig);\n }\n }\n return otherChanges;\n }\n }\n }\n\n freeze() {\n if (!this.isFrozen) {\n this.#freezeTimestamp = new Date().getTime();\n this.emit(\"freeze\", true, this.#freezeTimestamp);\n } else {\n throw Error(\n \"[BaseDataSource] cannot freeze, dataSource is already frozen\",\n );\n }\n }\n unfreeze() {\n if (this.isFrozen) {\n const freezeTimestamp = this.#freezeTimestamp as number;\n this.#freezeTimestamp = undefined;\n this.emit(\"freeze\", false, freezeTimestamp);\n } else {\n throw Error(\n \"[BaseDataSource] cannot freeze, dataSource is already frozen\",\n );\n }\n }\n get freezeTimestamp() {\n return this.#freezeTimestamp;\n }\n\n get isFrozen() {\n return typeof this.#freezeTimestamp === \"number\";\n }\n\n abstract rangeRequest(range: VuuRange): void;\n}\n"],"names":["EventEmitter","vanillaConfig","Range","uuid","filterAsQuery","stripVisualLink","isConfigChanged","parseFilter","withConfigDefaults"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,IAAA,gBAAA,EAAA,UAAA;AAoCO,MAAM,oBAAgD,GAAA;AAAA,EAC3D,iBAAmB,EAAA;AACrB;AAEO,MAAe,uBACZA,yBAEV,CAAA;AAAA,EAkBE,WAAY,CAAA;AAAA,IACV,YAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,aAAgB,GAAA,oBAAA;AAAA,IAChB,KAAA;AAAA,IACA;AAAA,GAC4C,EAAA;AAC5C,IAAM,KAAA,EAAA;AA3BR;AAAA,IAAO,aAAA,CAAA,IAAA,EAAA,UAAA,CAAA;AAEP,IAAU,aAAA,CAAA,IAAA,EAAA,iBAAA,CAAA;AACV,IAAA,aAAA,CAAA,IAAA,EAAU,uBAA8C,EAAAC,6BAAA,CAAA;AACxD,IAAU,aAAA,CAAA,IAAA,EAAA,gCAAA,CAAA;AAEV,IAAU,aAAA,CAAA,IAAA,EAAA,QAAA,EAASC,gBAAM,CAAA,CAAA,EAAG,CAAC,CAAA,CAAA;AAC7B,IAAA,aAAA,CAAA,IAAA,EAAU,OAAQ,EAAA,CAAA,CAAA;AAClB,IAAU,aAAA,CAAA,IAAA,EAAA,QAAA,CAAA;AACV,IAAU,aAAA,CAAA,IAAA,EAAA,uBAAA,CAAA;AAEV,IAAA,YAAA,CAAA,IAAA,EAAA,gBAAA,CAAA;AACA,IAAa,YAAA,CAAA,IAAA,EAAA,UAAA,EAAA,CAAA,CAAA;AAEb,IAAA,aAAA,CAAA,IAAA,EAAQ,qCAAsC,EAAA,KAAA,CAAA;AAc5C,IAAA,IAAA,CAAK,qBAAwB,GAAA;AAAA,MAC3B,GAAG,IAAK,CAAA,qBAAA;AAAA,MACR,YAAA,EAAc,YAAgB,IAAA,IAAA,CAAK,qBAAsB,CAAA,YAAA;AAAA,MACzD,cAAA,EACE,cAAkB,IAAA,IAAA,CAAK,qBAAsB,CAAA,cAAA;AAAA,MAC/C,OAAA,EAAS,OAAW,IAAA,IAAA,CAAK,qBAAsB,CAAA,OAAA;AAAA,MAC/C,UAAA,EAAY,UAAc,IAAA,IAAA,CAAK,qBAAsB,CAAA,UAAA;AAAA,MACrD,OAAA,EAAS,OAAW,IAAA,IAAA,CAAK,qBAAsB,CAAA,OAAA;AAAA,MAC/C,IAAA,EAAM,IAAQ,IAAA,IAAA,CAAK,qBAAsB,CAAA;AAAA,KAC3C;AACA,IAAA,IAAA,CAAK,qBAAwB,GAAA,aAAA;AAC7B,IAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AACd,IAAA,IAAA,CAAK,WAAW,QAAY,IAAA,EAAA;AAAA;AAC9B,EAEA,SACE,CAAA;AAAA,IACE,cAAA;AAAA,IACA,OAAA;AAAA,IACA,YAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAW,GAAA,IAAA,CAAK,QAAa,KAAA,IAAA,CAAK,WAAWC,UAAK,EAAA;AAAA,KAEpD,QACA,EAAA;AACA,IAAA,OAAA,CAAQ,GAAI,CAAA,CAAA,8BAAA,EAAiC,IAAK,CAAA,QAAQ,CAAE,CAAA,CAAA;AAC5D,IAAA,IAAA,CAAK,eAAkB,GAAA,QAAA;AACvB,IAAA,IAAA,CAAK,QAAW,GAAA,QAAA;AAEhB,IAAA,IACE,YACA,IAAA,cAAA,IACA,OACA,IAAA,UAAA,IACA,WACA,IACA,EAAA;AACA,MAAA,IAAA,CAAK,qBAAwB,GAAA;AAAA,QAC3B,GAAG,IAAK,CAAA,qBAAA;AAAA,QACR,YAAA,EAAc,YAAgB,IAAA,IAAA,CAAK,qBAAsB,CAAA,YAAA;AAAA,QACzD,cAAA,EACE,cAAkB,IAAA,IAAA,CAAK,qBAAsB,CAAA,cAAA;AAAA,QAC/C,OAAA,EAAS,OAAW,IAAA,IAAA,CAAK,qBAAsB,CAAA,OAAA;AAAA,QAC/C,UAAA,EAAY,UAAc,IAAA,IAAA,CAAK,qBAAsB,CAAA,UAAA;AAAA,QACrD,OAAA,EAAS,OAAW,IAAA,IAAA,CAAK,qBAAsB,CAAA,OAAA;AAAA,QAC/C,IAAA,EAAM,IAAQ,IAAA,IAAA,CAAK,qBAAsB,CAAA;AAAA,OAC3C;AAAA;AAMF,IAAA,IAAI,KAAO,EAAA;AACT,MAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AACd,MAAK,IAAA,CAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA;AAC1B;AACF,EAEA,IAAI,YAAe,GAAA;AACjB,IAAA,OAAO,KAAK,qBAAsB,CAAA,YAAA;AAAA;AACpC,EAEA,IAAI,aAAa,YAAgC,EAAA;AAC/C,IAAA,IAAA,CAAK,MAAS,GAAA;AAAA,MACZ,GAAG,IAAK,CAAA,qBAAA;AAAA,MACR;AAAA,KACF;AACA,IAAA,IAAA,CAAK,IAAK,CAAA,QAAA,EAAU,IAAK,CAAA,qBAAA,EAAuB,KAAK,KAAK,CAAA;AAAA;AAC5D,EAEA,IAAI,UAAa,GAAA;AACf,IAAA,OAAO,KAAK,qBAAsB,CAAA,cAAA;AAAA;AACpC,EAEA,IAAI,WAAW,UAA0C,EAAA;AACvD,IAAA,IAAA,CAAK,MAAS,GAAA;AAAA,MACZ,GAAG,IAAK,CAAA,qBAAA;AAAA,MACR,cAAgB,EAAA;AAAA,KAClB;AAAA;AACF,EAEA,IAAI,OAAU,GAAA;AACZ,IAAA,OAAO,KAAK,qBAAsB,CAAA,OAAA;AAAA;AACpC,EAEA,IAAI,QAAQ,OAAmB,EAAA;AAC7B,IAAA,IAAA,CAAK,MAAS,GAAA;AAAA,MACZ,GAAG,IAAK,CAAA,qBAAA;AAAA,MACR;AAAA,KACF;AAAA;AACF,EAEA,IAAI,MAAS,GAAA;AACX,IAAA,OAAO,KAAK,qBAAsB,CAAA,UAAA;AAAA;AACpC,EAEA,IAAI,OAAO,MAA0B,EAAA;AACnC,IAAA,IAAA,CAAK,MAAS,GAAA;AAAA,MACZ,GAAG,IAAK,CAAA,qBAAA;AAAA,MACR,UAAY,EAAA;AAAA,KACd;AAAA;AACF,EAEA,UAAU,MAAgB,EAAA;AACxB,IAAA,MAAM,gBAAqC,GAAA;AAAA,MACzC,MAAA,EAAQC,4BAAc,MAAM,CAAA;AAAA,MAC5B,YAAc,EAAA;AAAA,KAChB;AACA,IAAA,IAAA,CAAK,MAAS,GAAA,gBAAA;AAAA;AAChB,EAEA,WAAc,GAAA;AACZ,IAAK,IAAA,CAAA,MAAA,GAAS,EAAE,MAAA,EAAQ,EAAG,EAAA;AAAA;AAC7B,EAEA,IAAI,oCAAuC,GAAA;AACzC,IAAA,OAAO,KAAK,8BAAmC,KAAA,KAAA,CAAA;AAAA;AACjD,EAEU,mBAAsB,GAAA;AAC9B,IAAA,IAAI,KAAK,8BAAgC,EAAA;AACvC,MAAA,IAAA,CAAK,wBAAwB,IAAK,CAAA,8BAAA;AAClC,MAAA,IAAA,CAAK,8BAAiC,GAAA,KAAA,CAAA;AACtC,MAAA,IAAA,CAAK,KAAK,QAAU,EAAA,IAAA,CAAK,qBAAuB,EAAA,IAAA,CAAK,OAAO,IAAI,CAAA;AAAA,KAC3D,MAAA;AACL,MAAM,MAAA,KAAA;AAAA,QACJ,CAAA,4EAAA;AAAA,OACF;AAAA;AACF;AACF,EAEA,IAAI,MAAS,GAAA;AACX,IAAO,OAAAC,+BAAA;AAAA,MACL,IAAA,CAAK,kCAAkC,IAAK,CAAA;AAAA,KAC9C;AAAA;AACF,EAEA,IAAI,OAAO,MAAwC,EAAA;AACjD,IAAM,MAAA,SAAA,GAAY,IAAK,CAAA,mCAAA,GACnB,IACA,GAAA,KAAA,CAAA;AAEJ,IAAA,IAAA,CAAK,mCAAsC,GAAA,KAAA;AAC3C,IAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,WAAA,CAAY,MAAM,CAAA;AAC7C,IAAA,IAAI,aAAe,EAAA;AACjB,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAK,IAAA,CAAA,IAAA;AAAA,UACH,QAAA;AAAA,UACA,IAAK,CAAA,qBAAA;AAAA,UACL,IAAK,CAAA,KAAA;AAAA,UACL,SAAA;AAAA,UACA;AAAA,SACF;AAAA,OACD,CAAA;AAAA;AACH;AACF,EAEA,IAAI,eAAkB,GAAA;AACpB,IAAA,OAAO,IAAK,CAAA,8BAAA;AAAA;AACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,gBAAgB,MAAoD,EAAA;AACtE,IAAA,IAAI,MAAQ,EAAA;AACV,MAAA,IAAA,CAAK,mCAAsC,GAAA,IAAA;AAC3C,MAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,WAAA,CAAY,MAAM,CAAA;AAC7C,MAAA,IAAI,aAAe,EAAA;AACjB,QAAA,IAAA,CAAK,KAAK,QAAU,EAAA,IAAA,CAAK,QAAQ,IAAK,CAAA,KAAA,EAAO,OAAO,aAAa,CAAA;AAAA;AACnE,KACK,MAAA;AACL,MAAM,MAAA,KAAA;AAAA,QACJ,CAAA,uEAAA;AAAA,OACF;AAAA;AACF;AACF,EAEA,IAAI,SAAY,GAAA;AACd,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA;AAAA;AACd,EAEA,IAAI,UAAU,SAAmB,EAAA;AAC/B,IAAI,IAAA,SAAA,KAAc,mBAAK,UAAY,CAAA,EAAA;AACjC,MAAA,YAAA,CAAA,IAAA,EAAK,UAAa,EAAA,SAAA,CAAA;AAClB,MAAK,IAAA,CAAA,IAAA,CAAK,cAAc,SAAS,CAAA;AAAA;AACnC;AACF,EAEA,IAAI,KAAQ,GAAA;AACV,IAAA,OAAO,IAAK,CAAA,MAAA;AAAA;AACd,EAEA,IAAI,MAAM,KAAc,EAAA;AACtB,IAAI,IAAA,KAAA,CAAM,SAAS,IAAK,CAAA,MAAA,CAAO,QAAQ,KAAM,CAAA,EAAA,KAAO,IAAK,CAAA,MAAA,CAAO,EAAI,EAAA;AAClE,MAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AACd,MAAK,IAAA,CAAA,SAAA,GAAY,KAAK,IAAK,CAAA,IAAA,CAAK,SAAS,KAAM,CAAA,EAAA,GAAK,MAAM,IAAK,CAAA,CAAA;AAC/D,MAAK,IAAA,CAAA,YAAA,CAAa,MAAM,UAAU,CAAA;AAClC,MAAA,qBAAA,CAAsB,MAAM;AAC1B,QAAK,IAAA,CAAA,IAAA,CAAK,SAAS,KAAK,CAAA;AAAA,OACzB,CAAA;AAAA;AACH;AACF,EAEA,IAAI,IAAO,GAAA;AACT,IAAA,OAAO,IAAK,CAAA,KAAA;AAAA;AACd,EAEA,IAAI,KAAK,IAAc,EAAA;AACrB,IAAA,IAAA,CAAK,KAAQ,GAAA,IAAA;AACb,IAAI,IAAA,IAAA,CAAK,KAAM,CAAA,EAAA,KAAO,CAAG,EAAA;AACvB,MAAM,MAAA,SAAA,GAAY,KAAK,IAAK,CAAA,IAAA,IAAQ,KAAK,KAAM,CAAA,EAAA,GAAK,IAAK,CAAA,KAAA,CAAM,IAAK,CAAA,CAAA;AACpE,MAAA,IAAA,CAAK,SAAY,GAAA,SAAA;AAAA;AACnB;AACF,EAEA,IAAI,IAAO,GAAA;AACT,IAAA,OAAO,KAAK,qBAAsB,CAAA,IAAA;AAAA;AACpC,EAEA,IAAI,KAAK,IAAe,EAAA;AACtB,IAAA,IAAA,CAAK,MAAS,GAAA;AAAA,MACZ,GAAG,IAAK,CAAA,qBAAA;AAAA,MACR;AAAA,KACF;AACA,IAAA,IAAA,CAAK,IAAK,CAAA,QAAA,EAAU,IAAK,CAAA,qBAAA,EAAuB,KAAK,KAAK,CAAA;AAAA;AAC5D,EAEA,IAAI,KAAQ,GAAA;AACV,IAAA,OAAO,KAAK,MAAU,IAAA,EAAA;AAAA;AACxB,EAEA,IAAI,MAAM,KAAe,EAAA;AACvB,IAAA,IAAA,CAAK,MAAS,GAAA,KAAA;AACd,IAAA,IAAA,CAAK,IAAK,CAAA,eAAA,EAAiB,IAAK,CAAA,QAAA,IAAY,IAAI,KAAK,CAAA;AAAA;AACvD,EAEQ,WAAA,CACN,MACA,EAAA,gCAAA,GAAmC,KACE,EAAA;AACrC,IAAA,MAAM,EAAE,SAAA,EAAW,GAAG,YAAA,EAAiB,GAAAC,+BAAA;AAAA,MACrC,IAAK,CAAA,qBAAA;AAAA,MACL;AAAA,KACF;AACA,IAAA,IAAI,cAAc,IAAM,EAAA;AACtB,MAAA,IAAI,MAAQ,EAAA;AACV,QAAA,MAAM,YACJ,MAAQ,EAAA,UAAA,EAAY,UACpB,MAAQ,EAAA,UAAA,CAAW,iBAAiB,KAChC,CAAA,GAAA;AAAA,UACE,GAAG,MAAA;AAAA,UACH,UAAY,EAAA;AAAA,YACV,MAAA,EAAQ,OAAO,UAAW,CAAA,MAAA;AAAA,YAC1B,YAAc,EAAAC,2BAAA,CAAY,MAAO,CAAA,UAAA,CAAW,MAAM;AAAA;AACpD,SAEF,GAAA,MAAA;AACN,QAAA,IAAI,gCAAkC,EAAA;AACpC,UAAA,IAAI,KAAK,mCAAqC,EAAA;AAC5C,YAAA,IAAA,CAAK,8BAAiC,GAAA;AAAA,cACpC,GAAG,IAAK,CAAA,qBAAA;AAAA,cACR,GAAG;AAAA,aACL;AAAA,WACK,MAAA;AACL,YAAA,IAAA,CAAK,8BAAiC,GAAA,KAAA,CAAA;AACtC,YAAA,IAAA,CAAK,qBAAwB,GAAA;AAAA,cAC3B,GAAG,IAAK,CAAA,qBAAA;AAAA,cACR,GAAG;AAAA,aACL;AAAA;AACF,SACK,MAAA;AACL,UAAA,IAAI,KAAK,mCAAqC,EAAA;AAC5C,YAAK,IAAA,CAAA,8BAAA,GAAiCC,mCAAmB,SAAS,CAAA;AAAA,WAC7D,MAAA;AACL,YAAA,IAAA,CAAK,8BAAiC,GAAA,KAAA,CAAA;AACtC,YAAK,IAAA,CAAA,qBAAA,GAAwBA,mCAAmB,SAAS,CAAA;AAAA;AAC3D;AAEF,QAAO,OAAA,YAAA;AAAA;AACT;AACF;AACF,EAEA,MAAS,GAAA;AACP,IAAI,IAAA,CAAC,KAAK,QAAU,EAAA;AAClB,MAAA,YAAA,CAAA,IAAA,EAAK,gBAAmB,EAAA,iBAAA,IAAI,IAAK,EAAA,EAAE,OAAQ,EAAA,CAAA;AAC3C,MAAA,IAAA,CAAK,IAAK,CAAA,QAAA,EAAU,IAAM,EAAA,YAAA,CAAA,IAAA,EAAK,gBAAgB,CAAA,CAAA;AAAA,KAC1C,MAAA;AACL,MAAM,MAAA,KAAA;AAAA,QACJ;AAAA,OACF;AAAA;AACF;AACF,EACA,QAAW,GAAA;AACT,IAAA,IAAI,KAAK,QAAU,EAAA;AACjB,MAAA,MAAM,kBAAkB,YAAK,CAAA,IAAA,EAAA,gBAAA,CAAA;AAC7B,MAAA,YAAA,CAAA,IAAA,EAAK,gBAAmB,EAAA,KAAA,CAAA,CAAA;AACxB,MAAK,IAAA,CAAA,IAAA,CAAK,QAAU,EAAA,KAAA,EAAO,eAAe,CAAA;AAAA,KACrC,MAAA;AACL,MAAM,MAAA,KAAA;AAAA,QACJ;AAAA,OACF;AAAA;AACF;AACF,EACA,IAAI,eAAkB,GAAA;AACpB,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,gBAAA,CAAA;AAAA;AACd,EAEA,IAAI,QAAW,GAAA;AACb,IAAO,OAAA,OAAO,mBAAK,gBAAqB,CAAA,KAAA,QAAA;AAAA;AAI5C;AAlVE,gBAAA,GAAA,IAAA,OAAA,EAAA;AACA,UAAA,GAAA,IAAA,OAAA,EAAA;;;;;"}
@@ -213,6 +213,7 @@ exports.DOWN2 = dataUtils.DOWN2;
213
213
  exports.UP1 = dataUtils.UP1;
214
214
  exports.UP2 = dataUtils.UP2;
215
215
  exports.asInteger = dataUtils.asInteger;
216
+ exports.dataDescriptorTypeToVuuRowDataItemType = dataUtils.dataDescriptorTypeToVuuRowDataItemType;
216
217
  exports.getMovingValueDirection = dataUtils.getMovingValueDirection;
217
218
  exports.isValidNumber = dataUtils.isValidNumber;
218
219
  exports.numericTypeOfStringValue = dataUtils.numericTypeOfStringValue;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -8,15 +8,19 @@ const DataEditingProvider = ({
8
8
  }) => {
9
9
  return /* @__PURE__ */ jsx(DataEditingContext.Provider, { value: editTracker, children });
10
10
  };
11
- const useEditTracker = () => {
11
+ function useEditTracker(throwIfUnavailable = false) {
12
12
  const editTracker = useContext(DataEditingContext);
13
13
  if (editTracker === void 0) {
14
- console.warn(
15
- "[useEditTracker] no DataEditingContext in scope. You need to enclose editable component(s) with DataEditingProvider"
16
- );
14
+ const message = "[useEditTracker] no DataEditingContext in scope. You need to enclose editable component(s) with DataEditingProvider";
15
+ if (throwIfUnavailable) {
16
+ throw Error(message);
17
+ } else {
18
+ console.warn(message);
19
+ }
20
+ } else {
21
+ return editTracker;
17
22
  }
18
- return editTracker;
19
- };
23
+ }
20
24
 
21
25
  export { DataEditingProvider, useEditTracker };
22
26
  //# sourceMappingURL=DataEditingProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataEditingProvider.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/DataEditingProvider.tsx"],"sourcesContent":["import { createContext, ReactNode, useContext } from \"react\";\nimport { EditTracker } from \"./EditTracker\";\n\nconst DataEditingContext = createContext<EditTracker | undefined>(undefined);\n\nexport const DataEditingProvider = ({\n children,\n editTracker,\n}: {\n children: ReactNode;\n editTracker: EditTracker;\n}) => {\n return (\n <DataEditingContext.Provider value={editTracker}>\n {children}\n </DataEditingContext.Provider>\n );\n};\n\nexport const useEditTracker = () => {\n const editTracker = useContext(DataEditingContext);\n if (editTracker === undefined) {\n console.warn(\n \"[useEditTracker] no DataEditingContext in scope. You need to enclose editable component(s) with DataEditingProvider\",\n );\n }\n return editTracker;\n};\n"],"names":[],"mappings":";;;AAGA,MAAM,kBAAA,GAAqB,cAAuC,KAAS,CAAA,CAAA;AAEpE,MAAM,sBAAsB,CAAC;AAAA,EAClC,QAAA;AAAA,EACA;AACF,CAGM,KAAA;AACJ,EAAA,2BACG,kBAAmB,CAAA,QAAA,EAAnB,EAA4B,KAAA,EAAO,aACjC,QACH,EAAA,CAAA;AAEJ;AAEO,MAAM,iBAAiB,MAAM;AAClC,EAAM,MAAA,WAAA,GAAc,WAAW,kBAAkB,CAAA;AACjD,EAAA,IAAI,gBAAgB,KAAW,CAAA,EAAA;AAC7B,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN;AAAA,KACF;AAAA;AAEF,EAAO,OAAA,WAAA;AACT;;;;"}
1
+ {"version":3,"file":"DataEditingProvider.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/DataEditingProvider.tsx"],"sourcesContent":["import { createContext, ReactNode, useContext } from \"react\";\nimport { EditTracker } from \"./EditTracker\";\n\nconst DataEditingContext = createContext<EditTracker | undefined>(undefined);\n\nexport const DataEditingProvider = ({\n children,\n editTracker,\n}: {\n children: ReactNode;\n editTracker: EditTracker;\n}) => {\n return (\n <DataEditingContext.Provider value={editTracker}>\n {children}\n </DataEditingContext.Provider>\n );\n};\n\nexport function useEditTracker(\n throwIfUnavailable?: false,\n): EditTracker | undefined;\nexport function useEditTracker(throwIfUnavailable: true): EditTracker;\nexport function useEditTracker(throwIfUnavailable = false) {\n const editTracker = useContext(DataEditingContext);\n if (editTracker === undefined) {\n const message =\n \"[useEditTracker] no DataEditingContext in scope. You need to enclose editable component(s) with DataEditingProvider\";\n if (throwIfUnavailable) {\n throw Error(message);\n } else {\n console.warn(message);\n }\n } else {\n return editTracker;\n }\n}\n"],"names":[],"mappings":";;;AAGA,MAAM,kBAAA,GAAqB,cAAuC,KAAS,CAAA,CAAA;AAEpE,MAAM,sBAAsB,CAAC;AAAA,EAClC,QAAA;AAAA,EACA;AACF,CAGM,KAAA;AACJ,EAAA,2BACG,kBAAmB,CAAA,QAAA,EAAnB,EAA4B,KAAA,EAAO,aACjC,QACH,EAAA,CAAA;AAEJ;AAMgB,SAAA,cAAA,CAAe,qBAAqB,KAAO,EAAA;AACzD,EAAM,MAAA,WAAA,GAAc,WAAW,kBAAkB,CAAA;AACjD,EAAA,IAAI,gBAAgB,KAAW,CAAA,EAAA;AAC7B,IAAA,MAAM,OACJ,GAAA,qHAAA;AACF,IAAA,IAAI,kBAAoB,EAAA;AACtB,MAAA,MAAM,MAAM,OAAO,CAAA;AAAA,KACd,MAAA;AACL,MAAA,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA;AACtB,GACK,MAAA;AACL,IAAO,OAAA,WAAA;AAAA;AAEX;;;;"}
@@ -42,6 +42,7 @@ class EditTracker extends EventEmitter {
42
42
  }
43
43
  }
44
44
  set dataSource(ds) {
45
+ console.log(`[EditTracker] set datasource ${ds.viewport}`);
45
46
  __privateSet(this, _dataSource, ds);
46
47
  }
47
48
  clear() {
@@ -50,6 +51,9 @@ class EditTracker extends EventEmitter {
50
51
  }
51
52
  async enterEditMode() {
52
53
  __privateSet(this, _inEditMode, true);
54
+ console.log(
55
+ `[EditTracker] enterEditMode datasource ${__privateGet(this, _dataSource)?.viewport}`
56
+ );
53
57
  const rpcResponse = await __privateGet(this, _dataSource)?.rpcRequest?.({
54
58
  type: "RPC_REQUEST",
55
59
  rpcName: "ENTER_EDIT_MODE",
@@ -141,7 +145,10 @@ class EditTracker extends EventEmitter {
141
145
  return rpcResponse;
142
146
  }
143
147
  } else {
144
- throw Error(`[EditTracker] commit, key ${key} not found `);
148
+ return {
149
+ errorMessage: "CHANGE_REVERTED",
150
+ type: "ERROR_RESULT"
151
+ };
145
152
  }
146
153
  }
147
154
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EditTracker.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/EditTracker.tsx"],"sourcesContent":["import { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport type { VuuRowDataItemType, VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { isRpcSuccess } from \"../protocol-message-utils\";\n\nexport type EditState = \"clean\" | \"dirty\";\n\ntype CellEdit = {\n originalValue: VuuRowDataItemType;\n editedValue: VuuRowDataItemType;\n};\n\ntype RowEditDetails = {\n /**\n * Column name => cell edit details\n */\n cellEdits: Map<string, CellEdit>;\n};\n\ntype EditTrackerEvents = {\n editState: (editState: EditState) => void;\n};\n\nexport class EditTracker extends EventEmitter<EditTrackerEvents> {\n #active = false;\n /**\n * Row key => row edits\n */\n #rowEdits = new Map<string, RowEditDetails>();\n #editCount = 0;\n #dataSource?: DataSource;\n #inEditMode = false;\n\n get active() {\n return this.#active;\n }\n set active(isActive: boolean) {\n this.#active = isActive;\n }\n get editCount() {\n return this.#editCount;\n }\n\n set editCount(val: number) {\n if (val !== this.#editCount) {\n const oldCount = this.#editCount;\n this.#editCount = val;\n if (val === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n set dataSource(ds: DataSource) {\n this.#dataSource = ds;\n }\n\n clear() {\n this.#rowEdits.clear();\n this.#editCount = 0;\n }\n\n async enterEditMode() {\n this.#inEditMode = true;\n\n const rpcResponse = await this.#dataSource?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"ENTER_EDIT_MODE\",\n params: {},\n });\n\n if (isRpcSuccess(rpcResponse)) {\n const { table: sessionTable } = rpcResponse.data as { table: VuuTable };\n return sessionTable;\n } else {\n console.log(\"fail\");\n }\n }\n\n get inEditMode() {\n return this.#inEditMode;\n }\n\n get editState(): EditState {\n return this.editCount === 0 ? \"clean\" : \"dirty\";\n }\n\n async cancelChanges() {\n const rpcResponse = await this.#dataSource?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"EXIT_EDIT_MODE\",\n params: {},\n });\n this.clear();\n return rpcResponse;\n }\n\n async saveChanges() {\n const rpcResponse = await this.#dataSource?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"EXIT_EDIT_MODE\",\n params: { save: true },\n });\n this.clear();\n return rpcResponse;\n }\n\n // TODO how do we deal with the '_edited' pattern\n edit(\n key: string,\n columnName: string,\n originalValue: VuuRowDataItemType,\n newValue: VuuRowDataItemType,\n ) {\n const rowEditDetails = this.#rowEdits.get(key);\n if (rowEditDetails) {\n const { cellEdits } = rowEditDetails;\n const cellEdit = cellEdits.get(columnName);\n if (cellEdit) {\n if (newValue === cellEdit.originalValue) {\n if (cellEdits.size === 1) {\n this.#rowEdits.delete(key);\n } else {\n // re-editing a cell had removed the edit\n cellEdits.delete(columnName);\n }\n this.editCount = this.#editCount - 1;\n } else {\n cellEdit.editedValue = newValue;\n }\n } else {\n // row has already been edited, but this column has not\n cellEdits.set(columnName, {\n originalValue,\n editedValue: newValue,\n });\n this.editCount = this.#editCount + 1;\n }\n } else {\n this.#rowEdits.set(key, {\n cellEdits: new Map([\n [columnName, { originalValue, editedValue: newValue }],\n ]),\n });\n this.editCount = this.#editCount + 1;\n }\n }\n\n //TODO alow a shortcut commit that allows a value, bypassing need\n // for edit. Thids caters for boolean values, dropdown list etc\n // that have no intermediate edit phase\n async commit(key: string, columnName: string) {\n const rowEditDetails = this.#rowEdits.get(key);\n if (rowEditDetails) {\n const { cellEdits } = rowEditDetails;\n const cellEditValues = cellEdits.get(columnName);\n if (cellEditValues) {\n const { editedValue } = cellEditValues;\n const rpcResponse = await this.#dataSource?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"editCell\",\n params: {\n column: columnName,\n data: editedValue,\n key,\n },\n });\n\n return rpcResponse;\n }\n } else {\n throw Error(`[EditTracker] commit, key ${key} not found `);\n }\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EditTracker.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/EditTracker.tsx"],"sourcesContent":["import { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport type {\n RpcResultError,\n VuuRowDataItemType,\n VuuTable,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { isRpcSuccess } from \"../protocol-message-utils\";\n\nexport type EditState = \"clean\" | \"dirty\";\n\ntype CellEdit = {\n originalValue: VuuRowDataItemType;\n editedValue: VuuRowDataItemType;\n};\n\ntype RowEditDetails = {\n /**\n * Column name => cell edit details\n */\n cellEdits: Map<string, CellEdit>;\n};\n\ntype EditTrackerEvents = {\n editState: (editState: EditState) => void;\n};\n\nexport class EditTracker extends EventEmitter<EditTrackerEvents> {\n #active = false;\n /**\n * Row key => row edits\n */\n #rowEdits = new Map<string, RowEditDetails>();\n #editCount = 0;\n #dataSource?: DataSource;\n #inEditMode = false;\n\n get active() {\n return this.#active;\n }\n set active(isActive: boolean) {\n this.#active = isActive;\n }\n get editCount() {\n return this.#editCount;\n }\n\n set editCount(val: number) {\n if (val !== this.#editCount) {\n const oldCount = this.#editCount;\n this.#editCount = val;\n if (val === 0) {\n this.emit(\"editState\", \"clean\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"dirty\");\n }\n }\n }\n\n set dataSource(ds: DataSource) {\n console.log(`[EditTracker] set datasource ${ds.viewport}`);\n\n this.#dataSource = ds;\n }\n\n clear() {\n this.#rowEdits.clear();\n this.#editCount = 0;\n }\n\n async enterEditMode() {\n this.#inEditMode = true;\n\n console.log(\n `[EditTracker] enterEditMode datasource ${this.#dataSource?.viewport}`,\n );\n\n const rpcResponse = await this.#dataSource?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"ENTER_EDIT_MODE\",\n params: {},\n });\n\n if (isRpcSuccess(rpcResponse)) {\n const { table: sessionTable } = rpcResponse.data as { table: VuuTable };\n return sessionTable;\n } else {\n console.log(\"fail\");\n }\n }\n\n get inEditMode() {\n return this.#inEditMode;\n }\n\n get editState(): EditState {\n return this.editCount === 0 ? \"clean\" : \"dirty\";\n }\n\n async cancelChanges() {\n const rpcResponse = await this.#dataSource?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"EXIT_EDIT_MODE\",\n params: {},\n });\n this.clear();\n return rpcResponse;\n }\n\n async saveChanges() {\n const rpcResponse = await this.#dataSource?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"EXIT_EDIT_MODE\",\n params: { save: true },\n });\n this.clear();\n return rpcResponse;\n }\n\n // TODO how do we deal with the '_edited' pattern\n edit(\n key: string,\n columnName: string,\n originalValue: VuuRowDataItemType,\n newValue: VuuRowDataItemType,\n ) {\n const rowEditDetails = this.#rowEdits.get(key);\n if (rowEditDetails) {\n const { cellEdits } = rowEditDetails;\n const cellEdit = cellEdits.get(columnName);\n if (cellEdit) {\n if (newValue === cellEdit.originalValue) {\n if (cellEdits.size === 1) {\n this.#rowEdits.delete(key);\n } else {\n // re-editing a cell had removed the edit\n cellEdits.delete(columnName);\n }\n this.editCount = this.#editCount - 1;\n } else {\n cellEdit.editedValue = newValue;\n }\n } else {\n // row has already been edited, but this column has not\n cellEdits.set(columnName, {\n originalValue,\n editedValue: newValue,\n });\n this.editCount = this.#editCount + 1;\n }\n } else {\n this.#rowEdits.set(key, {\n cellEdits: new Map([\n [columnName, { originalValue, editedValue: newValue }],\n ]),\n });\n this.editCount = this.#editCount + 1;\n }\n }\n\n //TODO alow a shortcut commit that allows a value, bypassing need\n // for edit. Thids caters for boolean values, dropdown list etc\n // that have no intermediate edit phase\n async commit(key: string, columnName: string) {\n const rowEditDetails = this.#rowEdits.get(key);\n if (rowEditDetails) {\n const { cellEdits } = rowEditDetails;\n const cellEditValues = cellEdits.get(columnName);\n if (cellEditValues) {\n const { editedValue } = cellEditValues;\n const rpcResponse = await this.#dataSource?.rpcRequest?.({\n type: \"RPC_REQUEST\",\n rpcName: \"editCell\",\n params: {\n column: columnName,\n data: editedValue,\n key,\n },\n });\n\n return rpcResponse;\n }\n } else {\n return {\n errorMessage: \"CHANGE_REVERTED\",\n type: \"ERROR_RESULT\",\n } as RpcResultError;\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
- import { useState, useMemo, useCallback } from 'react';
1
+ import { useState, useCallback, useMemo } from 'react';
2
2
  import { EditTracker } from './EditTracker.js';
3
3
  import { useData } from '../context-definitions/DataProvider.js';
4
4
  import { isRpcSuccess } from '../protocol-message-utils.js';
5
+ import { useLayoutEffectSkipFirst } from '../useLayoutEffectSkipFirst.js';
5
6
 
6
7
  const useEditableTable = ({
7
8
  columns,
@@ -13,7 +14,18 @@ const useEditableTable = ({
13
14
  }) => {
14
15
  const { VuuDataSource } = useData();
15
16
  const [sessionDataSource, setSessionDataSource] = useState(void 0);
17
+ console.log(`[usEditableTable] ${dataSourceProp?.viewport}`);
18
+ const clearSessionDataSource = useCallback(() => {
19
+ setSessionDataSource((dataSource2) => {
20
+ dataSource2?.unsubscribe();
21
+ return void 0;
22
+ });
23
+ }, []);
24
+ useLayoutEffectSkipFirst(() => {
25
+ console.warn(`[useEditableTable] columns and or table changed`);
26
+ }, [columns, table]);
16
27
  const dataSource = useMemo(() => {
28
+ console.log(`[useEditableTable] create new dataSource`);
17
29
  return dataSourceProp ?? new VuuDataSource({ columns, table });
18
30
  }, [VuuDataSource, columns, dataSourceProp, table]);
19
31
  const editTracker = useMemo(() => new EditTracker(), []);
@@ -25,17 +37,17 @@ const useEditableTable = ({
25
37
  const handleCancel = useCallback(() => {
26
38
  editTracker.cancelChanges();
27
39
  onCancel();
28
- setSessionDataSource(void 0);
40
+ clearSessionDataSource();
29
41
  dataSource.resume?.();
30
- }, [dataSource, editTracker, onCancel]);
42
+ }, [clearSessionDataSource, dataSource, editTracker, onCancel]);
31
43
  const handleSave = useCallback(async () => {
44
+ dataSource.resume?.();
32
45
  const response = await editTracker.saveChanges();
33
46
  if (isRpcSuccess(response)) {
34
47
  onSave();
35
- setSessionDataSource(void 0);
36
- dataSource.resume?.();
48
+ clearSessionDataSource();
37
49
  }
38
- }, [dataSource, editTracker, onSave]);
50
+ }, [clearSessionDataSource, dataSource, editTracker, onSave]);
39
51
  useMemo(async () => {
40
52
  if (isEditMode) {
41
53
  const sessionTable = await editTracker.enterEditMode();
@@ -51,7 +63,9 @@ const useEditableTable = ({
51
63
  }
52
64
  }
53
65
  }, [VuuDataSource, dataSource, editTracker, isEditMode]);
66
+ console.log(`[usEditableTable] ${dataSource.viewport}`);
54
67
  return {
68
+ // DO we need to reset the dataSource or could useDataSOurce detect the sessiondataSOurce from the editSession ?
55
69
  dataSource: sessionDataSource ?? dataSource,
56
70
  editTracker,
57
71
  onCancel: handleCancel,
@@ -1 +1 @@
1
- {"version":3,"file":"useEditableTable.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/useEditableTable.ts"],"sourcesContent":["import { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { EditTracker } from \"./EditTracker\";\nimport { useData } from \"../context-definitions/DataProvider\";\nimport { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport { isRpcSuccess } from \"../protocol-message-utils\";\n\nexport type EditMode = \"edit\" | \"view\";\n\nexport interface EditableTableHookProps {\n /**\n * columns to be included in subscription. If not provided,\n * default will be '*'. Ignored if dataSource prop present.\n */\n columns?: string[];\n dataSource?: DataSource;\n isEditMode: boolean;\n onCancel: () => void;\n onSave: () => void;\n /**\n * If dataSource nor provided, new DataSource\n * will be created using table and columns\n */\n table: VuuTable;\n}\n\nexport const useEditableTable = ({\n columns,\n dataSource: dataSourceProp,\n isEditMode,\n onCancel,\n onSave,\n table,\n}: EditableTableHookProps) => {\n const { VuuDataSource } = useData();\n const [sessionDataSource, setSessionDataSource] = useState<\n DataSource | undefined\n >(undefined);\n\n const dataSource = useMemo(() => {\n return dataSourceProp ?? new VuuDataSource({ columns, table });\n }, [VuuDataSource, columns, dataSourceProp, table]);\n\n const editTracker = useMemo(() => new EditTracker(), []);\n\n useMemo(() => {\n if (dataSource) {\n editTracker.dataSource = dataSource;\n }\n }, [dataSource, editTracker]);\n\n const handleCancel = useCallback(() => {\n // editTracker.dataSource = dataSource;\n editTracker.cancelChanges();\n onCancel();\n setSessionDataSource(undefined);\n dataSource.resume?.();\n }, [dataSource, editTracker, onCancel]);\n\n const handleSave = useCallback(async () => {\n // editTracker.dataSource = dataSource;\n const response = await editTracker.saveChanges();\n if (isRpcSuccess(response)) {\n onSave();\n setSessionDataSource(undefined);\n dataSource.resume?.();\n }\n }, [dataSource, editTracker, onSave]);\n\n useMemo(async () => {\n if (isEditMode) {\n const sessionTable = await editTracker.enterEditMode();\n if (sessionTable && dataSource.tableSchema) {\n dataSource.suspend?.(false);\n const sessionDataSource = new VuuDataSource({\n columns: dataSource.columns,\n table: sessionTable,\n viewport: sessionTable.table,\n });\n setSessionDataSource(sessionDataSource);\n editTracker.dataSource = sessionDataSource;\n }\n }\n }, [VuuDataSource, dataSource, editTracker, isEditMode]);\n\n return {\n dataSource: sessionDataSource ?? dataSource,\n editTracker,\n onCancel: handleCancel,\n onSave: handleSave,\n };\n};\n"],"names":["sessionDataSource"],"mappings":";;;;;AA0BO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,OAAA;AAAA,EACA,UAAY,EAAA,cAAA;AAAA,EACZ,UAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAA8B,KAAA;AAC5B,EAAM,MAAA,EAAE,aAAc,EAAA,GAAI,OAAQ,EAAA;AAClC,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAEhD,KAAS,CAAA,CAAA;AAEX,EAAM,MAAA,UAAA,GAAa,QAAQ,MAAM;AAC/B,IAAA,OAAO,kBAAkB,IAAI,aAAA,CAAc,EAAE,OAAA,EAAS,OAAO,CAAA;AAAA,KAC5D,CAAC,aAAA,EAAe,OAAS,EAAA,cAAA,EAAgB,KAAK,CAAC,CAAA;AAElD,EAAA,MAAM,cAAc,OAAQ,CAAA,MAAM,IAAI,WAAY,EAAA,EAAG,EAAE,CAAA;AAEvD,EAAA,OAAA,CAAQ,MAAM;AACZ,IAAA,IAAI,UAAY,EAAA;AACd,MAAA,WAAA,CAAY,UAAa,GAAA,UAAA;AAAA;AAC3B,GACC,EAAA,CAAC,UAAY,EAAA,WAAW,CAAC,CAAA;AAE5B,EAAM,MAAA,YAAA,GAAe,YAAY,MAAM;AAErC,IAAA,WAAA,CAAY,aAAc,EAAA;AAC1B,IAAS,QAAA,EAAA;AACT,IAAA,oBAAA,CAAqB,KAAS,CAAA,CAAA;AAC9B,IAAA,UAAA,CAAW,MAAS,IAAA;AAAA,GACnB,EAAA,CAAC,UAAY,EAAA,WAAA,EAAa,QAAQ,CAAC,CAAA;AAEtC,EAAM,MAAA,UAAA,GAAa,YAAY,YAAY;AAEzC,IAAM,MAAA,QAAA,GAAW,MAAM,WAAA,CAAY,WAAY,EAAA;AAC/C,IAAI,IAAA,YAAA,CAAa,QAAQ,CAAG,EAAA;AAC1B,MAAO,MAAA,EAAA;AACP,MAAA,oBAAA,CAAqB,KAAS,CAAA,CAAA;AAC9B,MAAA,UAAA,CAAW,MAAS,IAAA;AAAA;AACtB,GACC,EAAA,CAAC,UAAY,EAAA,WAAA,EAAa,MAAM,CAAC,CAAA;AAEpC,EAAA,OAAA,CAAQ,YAAY;AAClB,IAAA,IAAI,UAAY,EAAA;AACd,MAAM,MAAA,YAAA,GAAe,MAAM,WAAA,CAAY,aAAc,EAAA;AACrD,MAAI,IAAA,YAAA,IAAgB,WAAW,WAAa,EAAA;AAC1C,QAAA,UAAA,CAAW,UAAU,KAAK,CAAA;AAC1B,QAAMA,MAAAA,kBAAAA,GAAoB,IAAI,aAAc,CAAA;AAAA,UAC1C,SAAS,UAAW,CAAA,OAAA;AAAA,UACpB,KAAO,EAAA,YAAA;AAAA,UACP,UAAU,YAAa,CAAA;AAAA,SACxB,CAAA;AACD,QAAA,oBAAA,CAAqBA,kBAAiB,CAAA;AACtC,QAAA,WAAA,CAAY,UAAaA,GAAAA,kBAAAA;AAAA;AAC3B;AACF,KACC,CAAC,aAAA,EAAe,UAAY,EAAA,WAAA,EAAa,UAAU,CAAC,CAAA;AAEvD,EAAO,OAAA;AAAA,IACL,YAAY,iBAAqB,IAAA,UAAA;AAAA,IACjC,WAAA;AAAA,IACA,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA;AAAA,GACV;AACF;;;;"}
1
+ {"version":3,"file":"useEditableTable.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/useEditableTable.ts"],"sourcesContent":["import { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { EditTracker } from \"./EditTracker\";\nimport { useData } from \"../context-definitions/DataProvider\";\nimport { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport { isRpcSuccess } from \"../protocol-message-utils\";\nimport { useLayoutEffectSkipFirst } from \"../useLayoutEffectSkipFirst\";\n\nexport type EditMode = \"edit\" | \"view\";\n\nexport interface EditableTableHookProps {\n /**\n * columns to be included in subscription. If not provided,\n * default will be '*'. Ignored if dataSource prop present.\n */\n columns?: string[];\n dataSource?: DataSource;\n isEditMode: boolean;\n onCancel: () => void;\n onSave: () => void;\n /**\n * If dataSource not provided, new DataSource\n * will be created using table and columns\n */\n table: VuuTable;\n}\n\nexport const useEditableTable = ({\n columns,\n dataSource: dataSourceProp,\n isEditMode,\n onCancel,\n onSave,\n table,\n}: EditableTableHookProps) => {\n const { VuuDataSource } = useData();\n const [sessionDataSource, setSessionDataSource] = useState<\n DataSource | undefined\n >(undefined);\n\n console.log(`[usEditableTable] ${dataSourceProp?.viewport}`);\n\n const clearSessionDataSource = useCallback(() => {\n setSessionDataSource((dataSource) => {\n dataSource?.unsubscribe();\n return undefined;\n });\n }, []);\n\n useLayoutEffectSkipFirst(() => {\n console.warn(`[useEditableTable] columns and or table changed`);\n }, [columns, table]);\n\n const dataSource = useMemo(() => {\n console.log(`[useEditableTable] create new dataSource`);\n return dataSourceProp ?? new VuuDataSource({ columns, table });\n }, [VuuDataSource, columns, dataSourceProp, table]);\n\n const editTracker = useMemo(() => new EditTracker(), []);\n\n useMemo(() => {\n if (dataSource) {\n editTracker.dataSource = dataSource;\n }\n }, [dataSource, editTracker]);\n\n const handleCancel = useCallback(() => {\n // editTracker.dataSource = dataSource;\n editTracker.cancelChanges();\n onCancel();\n clearSessionDataSource();\n dataSource.resume?.();\n }, [clearSessionDataSource, dataSource, editTracker, onCancel]);\n\n const handleSave = useCallback(async () => {\n dataSource.resume?.();\n const response = await editTracker.saveChanges();\n if (isRpcSuccess(response)) {\n onSave();\n clearSessionDataSource();\n }\n }, [clearSessionDataSource, dataSource, editTracker, onSave]);\n\n useMemo(async () => {\n if (isEditMode) {\n const sessionTable = await editTracker.enterEditMode();\n if (sessionTable && dataSource.tableSchema) {\n dataSource.suspend?.(false);\n const sessionDataSource = new VuuDataSource({\n columns: dataSource.columns,\n table: sessionTable,\n viewport: sessionTable.table,\n });\n setSessionDataSource(sessionDataSource);\n editTracker.dataSource = sessionDataSource;\n }\n }\n }, [VuuDataSource, dataSource, editTracker, isEditMode]);\n\n console.log(`[usEditableTable] ${dataSource.viewport}`);\n\n return {\n // DO we need to reset the dataSource or could useDataSOurce detect the sessiondataSOurce from the editSession ?\n dataSource: sessionDataSource ?? dataSource,\n editTracker,\n onCancel: handleCancel,\n onSave: handleSave,\n };\n};\n"],"names":["dataSource","sessionDataSource"],"mappings":"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"}
@@ -63,6 +63,20 @@ function asInteger(index, defaultValue) {
63
63
  throw Error(`parseIndex invalid value ${index}`);
64
64
  }
65
65
  }
66
+ const dataDescriptorTypeToVuuRowDataItemType = ({
67
+ serverDataType = "string"
68
+ }) => {
69
+ switch (serverDataType) {
70
+ case "double":
71
+ case "int":
72
+ case "long":
73
+ return "number";
74
+ case "boolean":
75
+ return "boolean";
76
+ default:
77
+ return "string";
78
+ }
79
+ };
66
80
 
67
- export { DOWN1, DOWN2, UP1, UP2, asInteger, getMovingValueDirection, isValidNumber, numericTypeOfStringValue, shallowEquals, stringIsValidDecimal, stringIsValidInt, stringIsValidNumber };
81
+ export { DOWN1, DOWN2, UP1, UP2, asInteger, dataDescriptorTypeToVuuRowDataItemType, getMovingValueDirection, isValidNumber, numericTypeOfStringValue, shallowEquals, stringIsValidDecimal, stringIsValidInt, stringIsValidNumber };
68
82
  //# sourceMappingURL=data-utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"data-utils.js","sources":["../../../../../../packages/vuu-utils/src/data-utils.ts"],"sourcesContent":["export type valueChangeDirection = \"up1\" | \"up2\" | \"down1\" | \"down2\" | \"\";\n\nexport const UP1 = \"up1\";\nexport const UP2 = \"up2\";\nexport const DOWN1 = \"down1\";\nexport const DOWN2 = \"down2\";\n\nconst decimalPattern = /^-?[0-9]*\\.[0-9]+$/;\n\nexport const stringIsValidInt = (val: string) =>\n parseInt(val, 10).toString() === val;\n\nexport const stringIsValidDecimal = (val: string) =>\n stringIsValidInt(val) || decimalPattern.test(val);\n\nexport const stringIsValidNumber = (val: string) =>\n stringIsValidInt(val) || stringIsValidDecimal(val);\n\nexport const numericTypeOfStringValue = (val: string) =>\n stringIsValidInt(val) ? \"int\" : stringIsValidDecimal(val) ? \"double\" : \"NaN\";\n\nexport const isValidNumber = (n: unknown): n is number =>\n typeof n === \"number\" && isFinite(n);\n\nconst EMPTY = {};\nexport const shallowEquals = (\n o1: { [key: string]: unknown } = EMPTY,\n o2: { [key: string]: unknown } = EMPTY,\n) => {\n const props1 = Object.keys(o1);\n const props2 = Object.keys(o2);\n return (\n props1.length === props2.length &&\n props1.every((key) => o1[key] === o2[key])\n );\n};\n\nexport function getMovingValueDirection(\n newValue?: number,\n direction?: valueChangeDirection,\n prevValue?: number,\n /** the number of decimal places to take into account when highlighting a change */\n decimalPlaces?: number,\n): valueChangeDirection {\n if (newValue === undefined) {\n return \"\";\n }\n if (\n !isFinite(newValue) ||\n prevValue === undefined ||\n direction === undefined\n ) {\n return \"\";\n } else {\n let diff = newValue - prevValue;\n if (diff) {\n // make sure there is still a diff when reduced to number of decimals to be displayed\n if (typeof decimalPlaces === \"number\") {\n diff =\n +newValue.toFixed(decimalPlaces) - +prevValue.toFixed(decimalPlaces);\n }\n }\n\n if (diff) {\n if (direction === \"\") {\n if (diff < 0) {\n return DOWN1;\n } else {\n return UP1;\n }\n } else if (diff > 0) {\n if (direction === DOWN1 || direction === DOWN2 || direction === UP2) {\n return UP1;\n } else {\n return UP2;\n }\n } else if (\n direction === UP1 ||\n direction === UP2 ||\n direction === DOWN2\n ) {\n return DOWN1;\n } else {\n return DOWN2;\n }\n } else {\n return \"\";\n }\n }\n}\n\nexport function asInteger(\n index: number | string | undefined,\n defaultValue?: number,\n) {\n if (typeof index === \"number\") {\n return index;\n } else {\n const numIdx = parseInt(index ?? \"\");\n if (!isNaN(numIdx)) {\n return numIdx;\n } else if (typeof defaultValue === \"number\") {\n return defaultValue;\n }\n throw Error(`parseIndex invalid value ${index}`);\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-utils.js","sources":["../../../../../../packages/vuu-utils/src/data-utils.ts"],"sourcesContent":["import { DataValueDescriptor } from \"@vuu-ui/vuu-data-types\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\n\nexport type valueChangeDirection = \"up1\" | \"up2\" | \"down1\" | \"down2\" | \"\";\n\nexport const UP1 = \"up1\";\nexport const UP2 = \"up2\";\nexport const DOWN1 = \"down1\";\nexport const DOWN2 = \"down2\";\n\nconst decimalPattern = /^-?[0-9]*\\.[0-9]+$/;\n\nexport const stringIsValidInt = (val: string) =>\n parseInt(val, 10).toString() === val;\n\nexport const stringIsValidDecimal = (val: string) =>\n stringIsValidInt(val) || decimalPattern.test(val);\n\nexport const stringIsValidNumber = (val: string) =>\n stringIsValidInt(val) || stringIsValidDecimal(val);\n\nexport const numericTypeOfStringValue = (val: string) =>\n stringIsValidInt(val) ? \"int\" : stringIsValidDecimal(val) ? \"double\" : \"NaN\";\n\nexport const isValidNumber = (n: unknown): n is number =>\n typeof n === \"number\" && isFinite(n);\n\nconst EMPTY = {};\nexport const shallowEquals = (\n o1: { [key: string]: unknown } = EMPTY,\n o2: { [key: string]: unknown } = EMPTY,\n) => {\n const props1 = Object.keys(o1);\n const props2 = Object.keys(o2);\n return (\n props1.length === props2.length &&\n props1.every((key) => o1[key] === o2[key])\n );\n};\n\nexport function getMovingValueDirection(\n newValue?: number,\n direction?: valueChangeDirection,\n prevValue?: number,\n /** the number of decimal places to take into account when highlighting a change */\n decimalPlaces?: number,\n): valueChangeDirection {\n if (newValue === undefined) {\n return \"\";\n }\n if (\n !isFinite(newValue) ||\n prevValue === undefined ||\n direction === undefined\n ) {\n return \"\";\n } else {\n let diff = newValue - prevValue;\n if (diff) {\n // make sure there is still a diff when reduced to number of decimals to be displayed\n if (typeof decimalPlaces === \"number\") {\n diff =\n +newValue.toFixed(decimalPlaces) - +prevValue.toFixed(decimalPlaces);\n }\n }\n\n if (diff) {\n if (direction === \"\") {\n if (diff < 0) {\n return DOWN1;\n } else {\n return UP1;\n }\n } else if (diff > 0) {\n if (direction === DOWN1 || direction === DOWN2 || direction === UP2) {\n return UP1;\n } else {\n return UP2;\n }\n } else if (\n direction === UP1 ||\n direction === UP2 ||\n direction === DOWN2\n ) {\n return DOWN1;\n } else {\n return DOWN2;\n }\n } else {\n return \"\";\n }\n }\n}\n\nexport function asInteger(\n index: number | string | undefined,\n defaultValue?: number,\n) {\n if (typeof index === \"number\") {\n return index;\n } else {\n const numIdx = parseInt(index ?? \"\");\n if (!isNaN(numIdx)) {\n return numIdx;\n } else if (typeof defaultValue === \"number\") {\n return defaultValue;\n }\n throw Error(`parseIndex invalid value ${index}`);\n }\n}\n\nexport const dataDescriptorTypeToVuuRowDataItemType = ({\n serverDataType = \"string\",\n}: DataValueDescriptor): \"string\" | \"number\" | \"boolean\" => {\n switch (serverDataType) {\n case \"double\":\n case \"int\":\n case \"long\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n default:\n return \"string\";\n }\n};\n"],"names":[],"mappings":"AAKO,MAAM,GAAM,GAAA;AACZ,MAAM,GAAM,GAAA;AACZ,MAAM,KAAQ,GAAA;AACd,MAAM,KAAQ,GAAA;AAErB,MAAM,cAAiB,GAAA,oBAAA;AAEV,MAAA,gBAAA,GAAmB,CAAC,GAC/B,KAAA,QAAA,CAAS,KAAK,EAAE,CAAA,CAAE,UAAe,KAAA;AAEtB,MAAA,oBAAA,GAAuB,CAAC,GACnC,KAAA,gBAAA,CAAiB,GAAG,CAAK,IAAA,cAAA,CAAe,KAAK,GAAG;AAE3C,MAAM,sBAAsB,CAAC,GAAA,KAClC,iBAAiB,GAAG,CAAA,IAAK,qBAAqB,GAAG;AAEtC,MAAA,wBAAA,GAA2B,CAAC,GAAA,KACvC,gBAAiB,CAAA,GAAG,IAAI,KAAQ,GAAA,oBAAA,CAAqB,GAAG,CAAA,GAAI,QAAW,GAAA;AAElE,MAAM,gBAAgB,CAAC,CAAA,KAC5B,OAAO,CAAM,KAAA,QAAA,IAAY,SAAS,CAAC;AAErC,MAAM,QAAQ,EAAC;AACR,MAAM,aAAgB,GAAA,CAC3B,EAAiC,GAAA,KAAA,EACjC,KAAiC,KAC9B,KAAA;AACH,EAAM,MAAA,MAAA,GAAS,MAAO,CAAA,IAAA,CAAK,EAAE,CAAA;AAC7B,EAAM,MAAA,MAAA,GAAS,MAAO,CAAA,IAAA,CAAK,EAAE,CAAA;AAC7B,EAAA,OACE,MAAO,CAAA,MAAA,KAAW,MAAO,CAAA,MAAA,IACzB,MAAO,CAAA,KAAA,CAAM,CAAC,GAAA,KAAQ,EAAG,CAAA,GAAG,CAAM,KAAA,EAAA,CAAG,GAAG,CAAC,CAAA;AAE7C;AAEO,SAAS,uBACd,CAAA,QAAA,EACA,SACA,EAAA,SAAA,EAEA,aACsB,EAAA;AACtB,EAAA,IAAI,aAAa,KAAW,CAAA,EAAA;AAC1B,IAAO,OAAA,EAAA;AAAA;AAET,EAAA,IACE,CAAC,QAAS,CAAA,QAAQ,KAClB,SAAc,KAAA,KAAA,CAAA,IACd,cAAc,KACd,CAAA,EAAA;AACA,IAAO,OAAA,EAAA;AAAA,GACF,MAAA;AACL,IAAA,IAAI,OAAO,QAAW,GAAA,SAAA;AACtB,IAAA,IAAI,IAAM,EAAA;AAER,MAAI,IAAA,OAAO,kBAAkB,QAAU,EAAA;AACrC,QACE,IAAA,GAAA,CAAC,SAAS,OAAQ,CAAA,aAAa,IAAI,CAAC,SAAA,CAAU,QAAQ,aAAa,CAAA;AAAA;AACvE;AAGF,IAAA,IAAI,IAAM,EAAA;AACR,MAAA,IAAI,cAAc,EAAI,EAAA;AACpB,QAAA,IAAI,OAAO,CAAG,EAAA;AACZ,UAAO,OAAA,KAAA;AAAA,SACF,MAAA;AACL,UAAO,OAAA,GAAA;AAAA;AACT,OACF,MAAA,IAAW,OAAO,CAAG,EAAA;AACnB,QAAA,IAAI,SAAc,KAAA,KAAA,IAAS,SAAc,KAAA,KAAA,IAAS,cAAc,GAAK,EAAA;AACnE,UAAO,OAAA,GAAA;AAAA,SACF,MAAA;AACL,UAAO,OAAA,GAAA;AAAA;AACT,iBAEA,SAAc,KAAA,GAAA,IACd,SAAc,KAAA,GAAA,IACd,cAAc,KACd,EAAA;AACA,QAAO,OAAA,KAAA;AAAA,OACF,MAAA;AACL,QAAO,OAAA,KAAA;AAAA;AACT,KACK,MAAA;AACL,MAAO,OAAA,EAAA;AAAA;AACT;AAEJ;AAEgB,SAAA,SAAA,CACd,OACA,YACA,EAAA;AACA,EAAI,IAAA,OAAO,UAAU,QAAU,EAAA;AAC7B,IAAO,OAAA,KAAA;AAAA,GACF,MAAA;AACL,IAAM,MAAA,MAAA,GAAS,QAAS,CAAA,KAAA,IAAS,EAAE,CAAA;AACnC,IAAI,IAAA,CAAC,KAAM,CAAA,MAAM,CAAG,EAAA;AAClB,MAAO,OAAA,MAAA;AAAA,KACT,MAAA,IAAW,OAAO,YAAA,KAAiB,QAAU,EAAA;AAC3C,MAAO,OAAA,YAAA;AAAA;AAET,IAAM,MAAA,KAAA,CAAM,CAA4B,yBAAA,EAAA,KAAK,CAAE,CAAA,CAAA;AAAA;AAEnD;AAEO,MAAM,yCAAyC,CAAC;AAAA,EACrD,cAAiB,GAAA;AACnB,CAA4D,KAAA;AAC1D,EAAA,QAAQ,cAAgB;AAAA,IACtB,KAAK,QAAA;AAAA,IACL,KAAK,KAAA;AAAA,IACL,KAAK,MAAA;AACH,MAAO,OAAA,QAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAO,OAAA,SAAA;AAAA,IACT;AACE,MAAO,OAAA,QAAA;AAAA;AAEb;;;;"}
@@ -67,6 +67,7 @@ class BaseDataSource extends EventEmitter {
67
67
  filterSpec,
68
68
  viewport = this.viewport || (this.viewport = uuid())
69
69
  }, callback) {
70
+ console.log(`[BaseDataSource] subscribe to ${this.viewport}`);
70
71
  this._clientCallback = callback;
71
72
  this.viewport = viewport;
72
73
  if (aggregations || baseFilterSpec || columns || filterSpec || groupBy || sort) {
@@ -1 +1 @@
1
- {"version":3,"file":"BaseDataSource.js","sources":["../../../../../../../packages/vuu-utils/src/datasource/BaseDataSource.ts"],"sourcesContent":["import type {\n DataSource,\n DataSourceConfig,\n DataSourceConstructorProps,\n DataSourceEvents,\n DataSourceFilter,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n DataSourceSuspenseProps,\n WithBaseFilter,\n WithFullConfig,\n} from \"@vuu-ui/vuu-data-types\";\nimport { parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n LinkDescriptorWithLabel,\n VuuAggregation,\n VuuRange,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { uuid } from \"../nanoid\";\nimport {\n DataSourceConfigChanges,\n isConfigChanged,\n stripVisualLink,\n vanillaConfig,\n withConfigDefaults,\n} from \"./datasource-utils\";\nimport { Range } from \"../range-utils\";\nimport { filterAsQuery } from \"../filters\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\n\nexport type ConfigWithVisualLink = WithBaseFilter<WithFullConfig> & {\n visualLink?: LinkDescriptorWithLabel;\n};\n\nexport const defaultSuspenseProps: DataSourceSuspenseProps = {\n escalateToDisable: true,\n};\n\nexport abstract class BaseDataSource\n extends EventEmitter<DataSourceEvents>\n implements Pick<DataSource, \"config\">\n{\n // This should simply be id\n public viewport: string;\n\n protected _clientCallback: DataSourceSubscribeCallback | undefined;\n protected _configWithVisualLink: ConfigWithVisualLink = vanillaConfig;\n protected _impendingConfigWithVisualLink: ConfigWithVisualLink | undefined =\n undefined;\n protected _range = Range(0, 0);\n protected _size = 0;\n protected _title: string | undefined;\n protected _defaultSuspenseProps: DataSourceSuspenseProps;\n\n #freezeTimestamp: number | undefined = undefined;\n #pageCount = 0;\n\n private awaitingConfirmationOfConfigChanges = false;\n\n constructor({\n aggregations,\n baseFilterSpec,\n columns,\n filterSpec,\n groupBy,\n sort,\n suspenseProps = defaultSuspenseProps,\n title,\n viewport,\n }: Omit<DataSourceConstructorProps, \"table\">) {\n super();\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n aggregations: aggregations || this._configWithVisualLink.aggregations,\n baseFilterSpec:\n baseFilterSpec || this._configWithVisualLink.baseFilterSpec,\n columns: columns || this._configWithVisualLink.columns,\n filterSpec: filterSpec || this._configWithVisualLink.filterSpec,\n groupBy: groupBy || this._configWithVisualLink.groupBy,\n sort: sort || this._configWithVisualLink.sort,\n };\n this._defaultSuspenseProps = suspenseProps;\n this._title = title;\n this.viewport = viewport ?? \"\";\n }\n\n subscribe(\n {\n baseFilterSpec,\n columns,\n aggregations,\n range,\n sort,\n groupBy,\n filterSpec,\n viewport = this.viewport || (this.viewport = uuid()),\n }: DataSourceSubscribeProps,\n callback: DataSourceSubscribeCallback,\n ) {\n this._clientCallback = callback;\n this.viewport = viewport;\n\n if (\n aggregations ||\n baseFilterSpec ||\n columns ||\n filterSpec ||\n groupBy ||\n sort\n ) {\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n aggregations: aggregations || this._configWithVisualLink.aggregations,\n baseFilterSpec:\n baseFilterSpec || this._configWithVisualLink.baseFilterSpec,\n columns: columns || this._configWithVisualLink.columns,\n filterSpec: filterSpec || this._configWithVisualLink.filterSpec,\n groupBy: groupBy || this._configWithVisualLink.groupBy,\n sort: sort || this._configWithVisualLink.sort,\n };\n }\n\n // store the range before we await the server. It's is possible the\n // range will be updated from the client before we have been able to\n // subscribe. This ensures we will subscribe with latest value.\n if (range) {\n this._range = range;\n this.emit(\"range\", range);\n }\n }\n\n get aggregations() {\n return this._configWithVisualLink.aggregations;\n }\n\n set aggregations(aggregations: VuuAggregation[]) {\n this.config = {\n ...this._configWithVisualLink,\n aggregations,\n };\n this.emit(\"config\", this._configWithVisualLink, this.range);\n }\n\n get baseFilter() {\n return this._configWithVisualLink.baseFilterSpec;\n }\n\n set baseFilter(baseFilter: DataSourceFilter | undefined) {\n this.config = {\n ...this._configWithVisualLink,\n baseFilterSpec: baseFilter,\n };\n }\n\n get columns() {\n return this._configWithVisualLink.columns;\n }\n\n set columns(columns: string[]) {\n this.config = {\n ...this._configWithVisualLink,\n columns,\n };\n }\n\n get filter() {\n return this._configWithVisualLink.filterSpec;\n }\n\n set filter(filter: DataSourceFilter) {\n this.config = {\n ...this._configWithVisualLink,\n filterSpec: filter,\n };\n }\n\n setFilter(filter: Filter) {\n const dataSourceFilter: DataSourceFilter = {\n filter: filterAsQuery(filter),\n filterStruct: filter,\n };\n this.filter = dataSourceFilter;\n }\n\n clearFilter() {\n this.filter = { filter: \"\" };\n }\n\n get isAwaitingConfirmationOfConfigChange() {\n return this._impendingConfigWithVisualLink !== undefined;\n }\n\n protected confirmConfigChange() {\n if (this._impendingConfigWithVisualLink) {\n this._configWithVisualLink = this._impendingConfigWithVisualLink;\n this._impendingConfigWithVisualLink = undefined;\n this.emit(\"config\", this._configWithVisualLink, this.range, true);\n } else {\n throw Error(\n `[BaseDataSource], unexpected call to confirmConfigChange, no changes pending`,\n );\n }\n }\n\n get config() {\n return stripVisualLink(\n this._impendingConfigWithVisualLink ?? this._configWithVisualLink,\n );\n }\n\n set config(config: WithBaseFilter<WithFullConfig>) {\n const confirmed = this.awaitingConfirmationOfConfigChanges\n ? true\n : undefined;\n // TODO what happens if config is set and we still have an unconfirmed change ?\n this.awaitingConfirmationOfConfigChanges = false;\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n requestAnimationFrame(() => {\n this.emit(\n \"config\",\n this._configWithVisualLink,\n this.range,\n confirmed,\n configChanges,\n );\n });\n }\n }\n\n get impendingConfig() {\n return this._impendingConfigWithVisualLink;\n }\n /**\n * This can be set by subclass in cases where we want to await ACK of async request\n * before we go ahead and apply change to config.\n * It is set in place of 'config' itself and it is then the responsibility of the client\n * to call 'confirmConfigChange' once confirmation of the change is received.\n * Client can check 'isAwaitingConfirmationOfConfigChange' to see if a change is pending\n * confirmation.\n */\n set impendingConfig(config: undefined | WithBaseFilter<WithFullConfig>) {\n if (config) {\n this.awaitingConfirmationOfConfigChanges = true;\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n this.emit(\"config\", this.config, this.range, false, configChanges);\n }\n } else {\n throw Error(\n `[BaseDataSource] ''unsetting impendingConfig is not currently supported`,\n );\n }\n }\n\n get pageCount() {\n return this.#pageCount;\n }\n\n set pageCount(pageCount: number) {\n if (pageCount !== this.#pageCount) {\n this.#pageCount = pageCount;\n this.emit(\"page-count\", pageCount);\n }\n }\n\n get range() {\n return this._range;\n }\n\n set range(range: Range) {\n if (range.from !== this._range.from || range.to !== this._range.to) {\n this._range = range;\n this.pageCount = Math.ceil(this._size / (range.to - range.from));\n this.rangeRequest(range.withBuffer);\n requestAnimationFrame(() => {\n this.emit(\"range\", range);\n });\n }\n }\n\n get size() {\n return this._size;\n }\n\n set size(size: number) {\n this._size = size;\n if (this.range.to !== 0) {\n const pageCount = Math.ceil(size / (this.range.to - this.range.from));\n this.pageCount = pageCount;\n }\n }\n\n get sort() {\n return this._configWithVisualLink.sort;\n }\n\n set sort(sort: VuuSort) {\n this.config = {\n ...this._configWithVisualLink,\n sort,\n };\n this.emit(\"config\", this._configWithVisualLink, this.range);\n }\n\n get title() {\n return this._title ?? \"\";\n }\n\n set title(title: string) {\n this._title = title;\n this.emit(\"title-changed\", this.viewport ?? \"\", title);\n }\n\n private applyConfig(\n config: WithBaseFilter<DataSourceConfig>,\n preserveExistingConfigAttributes = false,\n ): DataSourceConfigChanges | undefined {\n const { noChanges, ...otherChanges } = isConfigChanged(\n this._configWithVisualLink,\n config,\n );\n if (noChanges !== true) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filterSpec?.filter &&\n config?.filterSpec.filterStruct === undefined\n ? {\n ...config,\n filterSpec: {\n filter: config.filterSpec.filter,\n filterStruct: parseFilter(config.filterSpec.filter),\n },\n }\n : config;\n if (preserveExistingConfigAttributes) {\n if (this.awaitingConfirmationOfConfigChanges) {\n this._impendingConfigWithVisualLink = {\n ...this._configWithVisualLink,\n ...config,\n };\n } else {\n this._impendingConfigWithVisualLink = undefined;\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n ...config,\n };\n }\n } else {\n if (this.awaitingConfirmationOfConfigChanges) {\n this._impendingConfigWithVisualLink = withConfigDefaults(newConfig);\n } else {\n this._impendingConfigWithVisualLink = undefined;\n this._configWithVisualLink = withConfigDefaults(newConfig);\n }\n }\n return otherChanges;\n }\n }\n }\n\n freeze() {\n if (!this.isFrozen) {\n this.#freezeTimestamp = new Date().getTime();\n this.emit(\"freeze\", true, this.#freezeTimestamp);\n } else {\n throw Error(\n \"[BaseDataSource] cannot freeze, dataSource is already frozen\",\n );\n }\n }\n unfreeze() {\n if (this.isFrozen) {\n const freezeTimestamp = this.#freezeTimestamp as number;\n this.#freezeTimestamp = undefined;\n this.emit(\"freeze\", false, freezeTimestamp);\n } else {\n throw Error(\n \"[BaseDataSource] cannot freeze, dataSource is already frozen\",\n );\n }\n }\n get freezeTimestamp() {\n return this.#freezeTimestamp;\n }\n\n get isFrozen() {\n return typeof this.#freezeTimestamp === \"number\";\n }\n\n abstract rangeRequest(range: VuuRange): void;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"BaseDataSource.js","sources":["../../../../../../../packages/vuu-utils/src/datasource/BaseDataSource.ts"],"sourcesContent":["import type {\n DataSource,\n DataSourceConfig,\n DataSourceConstructorProps,\n DataSourceEvents,\n DataSourceFilter,\n DataSourceSubscribeCallback,\n DataSourceSubscribeProps,\n DataSourceSuspenseProps,\n WithBaseFilter,\n WithFullConfig,\n} from \"@vuu-ui/vuu-data-types\";\nimport { parseFilter } from \"@vuu-ui/vuu-filter-parser\";\nimport {\n LinkDescriptorWithLabel,\n VuuAggregation,\n VuuRange,\n VuuSort,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { uuid } from \"../nanoid\";\nimport {\n DataSourceConfigChanges,\n isConfigChanged,\n stripVisualLink,\n vanillaConfig,\n withConfigDefaults,\n} from \"./datasource-utils\";\nimport { Range } from \"../range-utils\";\nimport { filterAsQuery } from \"../filters\";\nimport { Filter } from \"@vuu-ui/vuu-filter-types\";\n\nexport type ConfigWithVisualLink = WithBaseFilter<WithFullConfig> & {\n visualLink?: LinkDescriptorWithLabel;\n};\n\nexport const defaultSuspenseProps: DataSourceSuspenseProps = {\n escalateToDisable: true,\n};\n\nexport abstract class BaseDataSource\n extends EventEmitter<DataSourceEvents>\n implements Pick<DataSource, \"config\">\n{\n // This should simply be id\n public viewport: string;\n\n protected _clientCallback: DataSourceSubscribeCallback | undefined;\n protected _configWithVisualLink: ConfigWithVisualLink = vanillaConfig;\n protected _impendingConfigWithVisualLink: ConfigWithVisualLink | undefined =\n undefined;\n protected _range = Range(0, 0);\n protected _size = 0;\n protected _title: string | undefined;\n protected _defaultSuspenseProps: DataSourceSuspenseProps;\n\n #freezeTimestamp: number | undefined = undefined;\n #pageCount = 0;\n\n private awaitingConfirmationOfConfigChanges = false;\n\n constructor({\n aggregations,\n baseFilterSpec,\n columns,\n filterSpec,\n groupBy,\n sort,\n suspenseProps = defaultSuspenseProps,\n title,\n viewport,\n }: Omit<DataSourceConstructorProps, \"table\">) {\n super();\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n aggregations: aggregations || this._configWithVisualLink.aggregations,\n baseFilterSpec:\n baseFilterSpec || this._configWithVisualLink.baseFilterSpec,\n columns: columns || this._configWithVisualLink.columns,\n filterSpec: filterSpec || this._configWithVisualLink.filterSpec,\n groupBy: groupBy || this._configWithVisualLink.groupBy,\n sort: sort || this._configWithVisualLink.sort,\n };\n this._defaultSuspenseProps = suspenseProps;\n this._title = title;\n this.viewport = viewport ?? \"\";\n }\n\n subscribe(\n {\n baseFilterSpec,\n columns,\n aggregations,\n range,\n sort,\n groupBy,\n filterSpec,\n viewport = this.viewport || (this.viewport = uuid()),\n }: DataSourceSubscribeProps,\n callback: DataSourceSubscribeCallback,\n ) {\n console.log(`[BaseDataSource] subscribe to ${this.viewport}`);\n this._clientCallback = callback;\n this.viewport = viewport;\n\n if (\n aggregations ||\n baseFilterSpec ||\n columns ||\n filterSpec ||\n groupBy ||\n sort\n ) {\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n aggregations: aggregations || this._configWithVisualLink.aggregations,\n baseFilterSpec:\n baseFilterSpec || this._configWithVisualLink.baseFilterSpec,\n columns: columns || this._configWithVisualLink.columns,\n filterSpec: filterSpec || this._configWithVisualLink.filterSpec,\n groupBy: groupBy || this._configWithVisualLink.groupBy,\n sort: sort || this._configWithVisualLink.sort,\n };\n }\n\n // store the range before we await the server. It's is possible the\n // range will be updated from the client before we have been able to\n // subscribe. This ensures we will subscribe with latest value.\n if (range) {\n this._range = range;\n this.emit(\"range\", range);\n }\n }\n\n get aggregations() {\n return this._configWithVisualLink.aggregations;\n }\n\n set aggregations(aggregations: VuuAggregation[]) {\n this.config = {\n ...this._configWithVisualLink,\n aggregations,\n };\n this.emit(\"config\", this._configWithVisualLink, this.range);\n }\n\n get baseFilter() {\n return this._configWithVisualLink.baseFilterSpec;\n }\n\n set baseFilter(baseFilter: DataSourceFilter | undefined) {\n this.config = {\n ...this._configWithVisualLink,\n baseFilterSpec: baseFilter,\n };\n }\n\n get columns() {\n return this._configWithVisualLink.columns;\n }\n\n set columns(columns: string[]) {\n this.config = {\n ...this._configWithVisualLink,\n columns,\n };\n }\n\n get filter() {\n return this._configWithVisualLink.filterSpec;\n }\n\n set filter(filter: DataSourceFilter) {\n this.config = {\n ...this._configWithVisualLink,\n filterSpec: filter,\n };\n }\n\n setFilter(filter: Filter) {\n const dataSourceFilter: DataSourceFilter = {\n filter: filterAsQuery(filter),\n filterStruct: filter,\n };\n this.filter = dataSourceFilter;\n }\n\n clearFilter() {\n this.filter = { filter: \"\" };\n }\n\n get isAwaitingConfirmationOfConfigChange() {\n return this._impendingConfigWithVisualLink !== undefined;\n }\n\n protected confirmConfigChange() {\n if (this._impendingConfigWithVisualLink) {\n this._configWithVisualLink = this._impendingConfigWithVisualLink;\n this._impendingConfigWithVisualLink = undefined;\n this.emit(\"config\", this._configWithVisualLink, this.range, true);\n } else {\n throw Error(\n `[BaseDataSource], unexpected call to confirmConfigChange, no changes pending`,\n );\n }\n }\n\n get config() {\n return stripVisualLink(\n this._impendingConfigWithVisualLink ?? this._configWithVisualLink,\n );\n }\n\n set config(config: WithBaseFilter<WithFullConfig>) {\n const confirmed = this.awaitingConfirmationOfConfigChanges\n ? true\n : undefined;\n // TODO what happens if config is set and we still have an unconfirmed change ?\n this.awaitingConfirmationOfConfigChanges = false;\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n requestAnimationFrame(() => {\n this.emit(\n \"config\",\n this._configWithVisualLink,\n this.range,\n confirmed,\n configChanges,\n );\n });\n }\n }\n\n get impendingConfig() {\n return this._impendingConfigWithVisualLink;\n }\n /**\n * This can be set by subclass in cases where we want to await ACK of async request\n * before we go ahead and apply change to config.\n * It is set in place of 'config' itself and it is then the responsibility of the client\n * to call 'confirmConfigChange' once confirmation of the change is received.\n * Client can check 'isAwaitingConfirmationOfConfigChange' to see if a change is pending\n * confirmation.\n */\n set impendingConfig(config: undefined | WithBaseFilter<WithFullConfig>) {\n if (config) {\n this.awaitingConfirmationOfConfigChanges = true;\n const configChanges = this.applyConfig(config);\n if (configChanges) {\n this.emit(\"config\", this.config, this.range, false, configChanges);\n }\n } else {\n throw Error(\n `[BaseDataSource] ''unsetting impendingConfig is not currently supported`,\n );\n }\n }\n\n get pageCount() {\n return this.#pageCount;\n }\n\n set pageCount(pageCount: number) {\n if (pageCount !== this.#pageCount) {\n this.#pageCount = pageCount;\n this.emit(\"page-count\", pageCount);\n }\n }\n\n get range() {\n return this._range;\n }\n\n set range(range: Range) {\n if (range.from !== this._range.from || range.to !== this._range.to) {\n this._range = range;\n this.pageCount = Math.ceil(this._size / (range.to - range.from));\n this.rangeRequest(range.withBuffer);\n requestAnimationFrame(() => {\n this.emit(\"range\", range);\n });\n }\n }\n\n get size() {\n return this._size;\n }\n\n set size(size: number) {\n this._size = size;\n if (this.range.to !== 0) {\n const pageCount = Math.ceil(size / (this.range.to - this.range.from));\n this.pageCount = pageCount;\n }\n }\n\n get sort() {\n return this._configWithVisualLink.sort;\n }\n\n set sort(sort: VuuSort) {\n this.config = {\n ...this._configWithVisualLink,\n sort,\n };\n this.emit(\"config\", this._configWithVisualLink, this.range);\n }\n\n get title() {\n return this._title ?? \"\";\n }\n\n set title(title: string) {\n this._title = title;\n this.emit(\"title-changed\", this.viewport ?? \"\", title);\n }\n\n private applyConfig(\n config: WithBaseFilter<DataSourceConfig>,\n preserveExistingConfigAttributes = false,\n ): DataSourceConfigChanges | undefined {\n const { noChanges, ...otherChanges } = isConfigChanged(\n this._configWithVisualLink,\n config,\n );\n if (noChanges !== true) {\n if (config) {\n const newConfig: DataSourceConfig =\n config?.filterSpec?.filter &&\n config?.filterSpec.filterStruct === undefined\n ? {\n ...config,\n filterSpec: {\n filter: config.filterSpec.filter,\n filterStruct: parseFilter(config.filterSpec.filter),\n },\n }\n : config;\n if (preserveExistingConfigAttributes) {\n if (this.awaitingConfirmationOfConfigChanges) {\n this._impendingConfigWithVisualLink = {\n ...this._configWithVisualLink,\n ...config,\n };\n } else {\n this._impendingConfigWithVisualLink = undefined;\n this._configWithVisualLink = {\n ...this._configWithVisualLink,\n ...config,\n };\n }\n } else {\n if (this.awaitingConfirmationOfConfigChanges) {\n this._impendingConfigWithVisualLink = withConfigDefaults(newConfig);\n } else {\n this._impendingConfigWithVisualLink = undefined;\n this._configWithVisualLink = withConfigDefaults(newConfig);\n }\n }\n return otherChanges;\n }\n }\n }\n\n freeze() {\n if (!this.isFrozen) {\n this.#freezeTimestamp = new Date().getTime();\n this.emit(\"freeze\", true, this.#freezeTimestamp);\n } else {\n throw Error(\n \"[BaseDataSource] cannot freeze, dataSource is already frozen\",\n );\n }\n }\n unfreeze() {\n if (this.isFrozen) {\n const freezeTimestamp = this.#freezeTimestamp as number;\n this.#freezeTimestamp = undefined;\n this.emit(\"freeze\", false, freezeTimestamp);\n } else {\n throw Error(\n \"[BaseDataSource] cannot freeze, dataSource is already frozen\",\n );\n }\n }\n get freezeTimestamp() {\n return this.#freezeTimestamp;\n }\n\n get isFrozen() {\n return typeof this.#freezeTimestamp === \"number\";\n }\n\n abstract rangeRequest(range: VuuRange): void;\n}\n"],"names":[],"mappings":"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"}
@@ -14,7 +14,7 @@ export { EditButtons } from './data-editing/EditButtons.js';
14
14
  export { DataEditingProvider, useEditTracker } from './data-editing/DataEditingProvider.js';
15
15
  export { EditTracker } from './data-editing/EditTracker.js';
16
16
  export { useEditableTable } from './data-editing/useEditableTable.js';
17
- export { DOWN1, DOWN2, UP1, UP2, asInteger, getMovingValueDirection, isValidNumber, numericTypeOfStringValue, shallowEquals, stringIsValidDecimal, stringIsValidInt, stringIsValidNumber } from './data-utils.js';
17
+ export { DOWN1, DOWN2, UP1, UP2, asInteger, dataDescriptorTypeToVuuRowDataItemType, getMovingValueDirection, isValidNumber, numericTypeOfStringValue, shallowEquals, stringIsValidDecimal, stringIsValidInt, stringIsValidNumber } from './data-utils.js';
18
18
  export { BaseDataSource, defaultSuspenseProps } from './datasource/BaseDataSource.js';
19
19
  export { isViewportMenusAction, isVisualLinkCreatedAction, isVisualLinkRemovedAction, isVisualLinksAction, isVuuFeatureAction } from './datasource/datasource-action-utils.js';
20
20
  export { combineFilters } from './datasource/datasource-filter-utils.js';
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.1.0-alpha.12",
2
+ "version": "2.1.0-alpha.13",
3
3
  "author": "heswell",
4
4
  "license": "Apache-2.0",
5
5
  "types": "types/index.d.ts",
@@ -7,14 +7,14 @@
7
7
  "@salt-ds/core": "1.54.1"
8
8
  },
9
9
  "devDependencies": {
10
- "@vuu-ui/vuu-data-types": "2.1.0-alpha.12",
11
- "@vuu-ui/vuu-table-types": "2.1.0-alpha.12",
12
- "@vuu-ui/vuu-filter-types": "2.1.0-alpha.12",
13
- "@vuu-ui/vuu-protocol-types": "2.1.0-alpha.12"
10
+ "@vuu-ui/vuu-data-types": "2.1.0-alpha.13",
11
+ "@vuu-ui/vuu-table-types": "2.1.0-alpha.13",
12
+ "@vuu-ui/vuu-filter-types": "2.1.0-alpha.13",
13
+ "@vuu-ui/vuu-protocol-types": "2.1.0-alpha.13"
14
14
  },
15
15
  "peerDependencies": {
16
16
  "@internationalized/date": "^3.0.0",
17
- "@vuu-ui/vuu-filter-parser": "2.1.0-alpha.12",
17
+ "@vuu-ui/vuu-filter-parser": "2.1.0-alpha.13",
18
18
  "clsx": "^2.0.0",
19
19
  "react": "^19.2.3",
20
20
  "react-dom": "^19.2.3"
@@ -4,4 +4,5 @@ export declare const DataEditingProvider: ({ children, editTracker, }: {
4
4
  children: ReactNode;
5
5
  editTracker: EditTracker;
6
6
  }) => import("react/jsx-runtime").JSX.Element;
7
- export declare const useEditTracker: () => EditTracker | undefined;
7
+ export declare function useEditTracker(throwIfUnavailable?: false): EditTracker | undefined;
8
+ export declare function useEditTracker(throwIfUnavailable: true): EditTracker;
@@ -1,5 +1,5 @@
1
1
  import { DataSource } from "@vuu-ui/vuu-data-types";
2
- import type { VuuRowDataItemType, VuuTable } from "@vuu-ui/vuu-protocol-types";
2
+ import type { RpcResultError, VuuRowDataItemType, VuuTable } from "@vuu-ui/vuu-protocol-types";
3
3
  import { EventEmitter } from "../event-emitter";
4
4
  export type EditState = "clean" | "dirty";
5
5
  type EditTrackerEvents = {
@@ -16,9 +16,9 @@ export declare class EditTracker extends EventEmitter<EditTrackerEvents> {
16
16
  enterEditMode(): Promise<VuuTable | undefined>;
17
17
  get inEditMode(): boolean;
18
18
  get editState(): EditState;
19
- cancelChanges(): Promise<import("@vuu-ui/vuu-protocol-types").RpcResultSuccess | import("@vuu-ui/vuu-protocol-types").RpcResultError | undefined>;
20
- saveChanges(): Promise<import("@vuu-ui/vuu-protocol-types").RpcResultSuccess | import("@vuu-ui/vuu-protocol-types").RpcResultError | undefined>;
19
+ cancelChanges(): Promise<import("@vuu-ui/vuu-protocol-types").RpcResultSuccess | RpcResultError | undefined>;
20
+ saveChanges(): Promise<import("@vuu-ui/vuu-protocol-types").RpcResultSuccess | RpcResultError | undefined>;
21
21
  edit(key: string, columnName: string, originalValue: VuuRowDataItemType, newValue: VuuRowDataItemType): void;
22
- commit(key: string, columnName: string): Promise<import("@vuu-ui/vuu-protocol-types").RpcResultSuccess | import("@vuu-ui/vuu-protocol-types").RpcResultError | undefined>;
22
+ commit(key: string, columnName: string): Promise<import("@vuu-ui/vuu-protocol-types").RpcResultSuccess | RpcResultError | undefined>;
23
23
  }
24
24
  export {};
@@ -13,7 +13,7 @@ export interface EditableTableHookProps {
13
13
  onCancel: () => void;
14
14
  onSave: () => void;
15
15
  /**
16
- * If dataSource nor provided, new DataSource
16
+ * If dataSource not provided, new DataSource
17
17
  * will be created using table and columns
18
18
  */
19
19
  table: VuuTable;
@@ -1,3 +1,4 @@
1
+ import { DataValueDescriptor } from "@vuu-ui/vuu-data-types";
1
2
  export type valueChangeDirection = "up1" | "up2" | "down1" | "down2" | "";
2
3
  export declare const UP1 = "up1";
3
4
  export declare const UP2 = "up2";
@@ -17,3 +18,4 @@ export declare function getMovingValueDirection(newValue?: number, direction?: v
17
18
  /** the number of decimal places to take into account when highlighting a change */
18
19
  decimalPlaces?: number): valueChangeDirection;
19
20
  export declare function asInteger(index: number | string | undefined, defaultValue?: number): number;
21
+ export declare const dataDescriptorTypeToVuuRowDataItemType: ({ serverDataType, }: DataValueDescriptor) => "string" | "number" | "boolean";