@vuu-ui/vuu-utils 2.1.4 → 2.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/cjs/packages/vuu-utils/src/data-editing/DataEditingProvider.js +8 -8
  2. package/cjs/packages/vuu-utils/src/data-editing/DataEditingProvider.js.map +1 -1
  3. package/cjs/packages/vuu-utils/src/data-editing/EditButtons.js +3 -3
  4. package/cjs/packages/vuu-utils/src/data-editing/EditButtons.js.map +1 -1
  5. package/cjs/packages/vuu-utils/src/data-editing/{EditTracker.js → EditSession.js} +28 -57
  6. package/cjs/packages/vuu-utils/src/data-editing/EditSession.js.map +1 -0
  7. package/cjs/packages/vuu-utils/src/data-editing/edit-utils.js +6 -0
  8. package/cjs/packages/vuu-utils/src/data-editing/edit-utils.js.map +1 -0
  9. package/cjs/packages/vuu-utils/src/data-editing/useEditableTable.js +36 -39
  10. package/cjs/packages/vuu-utils/src/data-editing/useEditableTable.js.map +1 -1
  11. package/cjs/packages/vuu-utils/src/form-utils.js +28 -1
  12. package/cjs/packages/vuu-utils/src/form-utils.js.map +1 -1
  13. package/cjs/packages/vuu-utils/src/index.js +8 -5
  14. package/cjs/packages/vuu-utils/src/index.js.map +1 -1
  15. package/cjs/packages/vuu-utils/src/protocol-message-utils.js +1 -1
  16. package/cjs/packages/vuu-utils/src/protocol-message-utils.js.map +1 -1
  17. package/esm/packages/vuu-utils/src/data-editing/DataEditingProvider.js +8 -8
  18. package/esm/packages/vuu-utils/src/data-editing/DataEditingProvider.js.map +1 -1
  19. package/esm/packages/vuu-utils/src/data-editing/EditButtons.js +3 -3
  20. package/esm/packages/vuu-utils/src/data-editing/EditButtons.js.map +1 -1
  21. package/esm/packages/vuu-utils/src/data-editing/{EditTracker.js → EditSession.js} +28 -57
  22. package/esm/packages/vuu-utils/src/data-editing/EditSession.js.map +1 -0
  23. package/esm/packages/vuu-utils/src/data-editing/edit-utils.js +4 -0
  24. package/esm/packages/vuu-utils/src/data-editing/edit-utils.js.map +1 -0
  25. package/esm/packages/vuu-utils/src/data-editing/useEditableTable.js +37 -40
  26. package/esm/packages/vuu-utils/src/data-editing/useEditableTable.js.map +1 -1
  27. package/esm/packages/vuu-utils/src/form-utils.js +28 -2
  28. package/esm/packages/vuu-utils/src/form-utils.js.map +1 -1
  29. package/esm/packages/vuu-utils/src/index.js +4 -3
  30. package/esm/packages/vuu-utils/src/index.js.map +1 -1
  31. package/esm/packages/vuu-utils/src/protocol-message-utils.js +1 -1
  32. package/esm/packages/vuu-utils/src/protocol-message-utils.js.map +1 -1
  33. package/package.json +6 -6
  34. package/types/data-editing/DataEditingProvider.d.ts +5 -5
  35. package/types/data-editing/EditButtons.d.ts +3 -3
  36. package/types/data-editing/EditSession.d.ts +24 -0
  37. package/types/data-editing/edit-utils.d.ts +2 -0
  38. package/types/data-editing/useEditableTable.d.ts +7 -5
  39. package/types/form-utils.d.ts +5 -0
  40. package/types/index.d.ts +3 -2
  41. package/cjs/packages/vuu-utils/src/data-editing/EditTracker.js.map +0 -1
  42. package/esm/packages/vuu-utils/src/data-editing/EditTracker.js.map +0 -1
  43. package/types/data-editing/EditTracker.d.ts +0 -24
@@ -6,23 +6,23 @@ var React = require('react');
6
6
  const DataEditingContext = React.createContext(void 0);
7
7
  const DataEditingProvider = ({
8
8
  children,
9
- editTracker
9
+ editSession
10
10
  }) => {
11
- return /* @__PURE__ */ jsxRuntime.jsx(DataEditingContext.Provider, { value: editTracker, children });
11
+ return /* @__PURE__ */ jsxRuntime.jsx(DataEditingContext.Provider, { value: editSession, children });
12
12
  };
13
- function useEditTracker(throwIfUnavailable = false) {
14
- const editTracker = React.useContext(DataEditingContext);
15
- if (editTracker === void 0) {
13
+ function useEditSession(throwIfUnavailable = false) {
14
+ const editSession = React.useContext(DataEditingContext);
15
+ if (editSession === void 0) {
16
16
  if (throwIfUnavailable) {
17
17
  throw Error(
18
- "[useEditTracker] no DataEditingContext in scope. You need to enclose editable component(s) with DataEditingProvider"
18
+ "[useEditSession] no DataEditingContext in scope. You need to enclose editable component(s) with DataEditingProvider"
19
19
  );
20
20
  }
21
21
  } else {
22
- return editTracker;
22
+ return editSession;
23
23
  }
24
24
  }
25
25
 
26
26
  exports.DataEditingProvider = DataEditingProvider;
27
- exports.useEditTracker = useEditTracker;
27
+ exports.useEditSession = useEditSession;
28
28
  //# 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 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 if (throwIfUnavailable) {\n throw Error(\n \"[useEditTracker] no DataEditingContext in scope. You need to enclose editable component(s) with DataEditingProvider\",\n );\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,IAAI,kBAAoB,EAAA;AACtB,MAAM,MAAA,KAAA;AAAA,QACJ;AAAA,OACF;AAAA;AACF,GACK,MAAA;AACL,IAAO,OAAA,WAAA;AAAA;AAEX;;;;;"}
1
+ {"version":3,"file":"DataEditingProvider.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/DataEditingProvider.tsx"],"sourcesContent":["import { createContext, ReactNode, useContext } from \"react\";\nimport { EditSession } from \"./EditSession\";\n\nconst DataEditingContext = createContext<EditSession | undefined>(undefined);\n\nexport const DataEditingProvider = ({\n children,\n editSession,\n}: {\n children: ReactNode;\n editSession: EditSession;\n}) => {\n return (\n <DataEditingContext.Provider value={editSession}>\n {children}\n </DataEditingContext.Provider>\n );\n};\n\nexport function useEditSession(\n throwIfUnavailable?: false,\n): EditSession | undefined;\nexport function useEditSession(throwIfUnavailable: true): EditSession;\nexport function useEditSession(throwIfUnavailable = false) {\n const editSession = useContext(DataEditingContext);\n if (editSession === undefined) {\n if (throwIfUnavailable) {\n throw Error(\n \"[useEditSession] no DataEditingContext in scope. You need to enclose editable component(s) with DataEditingProvider\",\n );\n }\n } else {\n return editSession;\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,IAAI,kBAAoB,EAAA;AACtB,MAAM,MAAA,KAAA;AAAA,QACJ;AAAA,OACF;AAAA;AACF,GACK,MAAA;AACL,IAAO,OAAA,WAAA;AAAA;AAEX;;;;;"}
@@ -5,14 +5,14 @@ var core = require('@salt-ds/core');
5
5
  var React = require('react');
6
6
 
7
7
  const EditButtons = ({
8
- editTracker,
8
+ editSession,
9
9
  onCancel,
10
10
  onSave
11
11
  }) => {
12
12
  const [editState, setEditState] = React.useState("clean");
13
13
  React.useMemo(() => {
14
- editTracker?.on("editState", setEditState);
15
- }, [editTracker]);
14
+ editSession?.on("editState", setEditState);
15
+ }, [editSession]);
16
16
  return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
17
17
  /* @__PURE__ */ jsxRuntime.jsx(
18
18
  core.Button,
@@ -1 +1 @@
1
- {"version":3,"file":"EditButtons.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/EditButtons.tsx"],"sourcesContent":["import { Button } from \"@salt-ds/core\";\nimport { EditState, EditTracker } from \"./EditTracker\";\nimport { useMemo, useState } from \"react\";\n\nexport interface EditButtonProps {\n editTracker?: EditTracker;\n onCancel: () => void;\n onSave: () => void;\n}\n\nexport const EditButtons = ({\n editTracker,\n onCancel,\n onSave,\n}: EditButtonProps) => {\n const [editState, setEditState] = useState<EditState>(\"clean\");\n\n useMemo(() => {\n editTracker?.on(\"editState\", setEditState);\n }, [editTracker]);\n\n return (\n <>\n <Button\n disabled={editState === \"clean\"}\n onClick={onSave}\n sentiment=\"accented\"\n >\n Save\n </Button>\n <Button onClick={onCancel}>Cancel</Button>\n </>\n );\n};\n"],"names":["useState","useMemo","jsxs","Fragment","jsx","Button"],"mappings":";;;;;;AAUO,MAAM,cAAc,CAAC;AAAA,EAC1B,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAuB,KAAA;AACrB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAoB,OAAO,CAAA;AAE7D,EAAAC,aAAA,CAAQ,MAAM;AACZ,IAAa,WAAA,EAAA,EAAA,CAAG,aAAa,YAAY,CAAA;AAAA,GAC3C,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,uBAEIC,eAAA,CAAAC,mBAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAAC,cAAA;AAAA,MAACC,WAAA;AAAA,MAAA;AAAA,QACC,UAAU,SAAc,KAAA,OAAA;AAAA,QACxB,OAAS,EAAA,MAAA;AAAA,QACT,SAAU,EAAA,UAAA;AAAA,QACX,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,oBACCD,cAAA,CAAAC,WAAA,EAAA,EAAO,OAAS,EAAA,QAAA,EAAU,QAAM,EAAA,QAAA,EAAA;AAAA,GACnC,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"EditButtons.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/EditButtons.tsx"],"sourcesContent":["import { Button } from \"@salt-ds/core\";\nimport { EditState, EditSession } from \"./EditSession\";\nimport { useMemo, useState } from \"react\";\n\nexport interface EditButtonProps {\n editSession?: EditSession;\n onCancel: () => void;\n onSave: () => void;\n}\n\nexport const EditButtons = ({\n editSession,\n onCancel,\n onSave,\n}: EditButtonProps) => {\n const [editState, setEditState] = useState<EditState>(\"clean\");\n\n useMemo(() => {\n editSession?.on(\"editState\", setEditState);\n }, [editSession]);\n\n return (\n <>\n <Button\n disabled={editState === \"clean\"}\n onClick={onSave}\n sentiment=\"accented\"\n >\n Save\n </Button>\n <Button onClick={onCancel}>Cancel</Button>\n </>\n );\n};\n"],"names":["useState","useMemo","jsxs","Fragment","jsx","Button"],"mappings":";;;;;;AAUO,MAAM,cAAc,CAAC;AAAA,EAC1B,WAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAuB,KAAA;AACrB,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAIA,eAAoB,OAAO,CAAA;AAE7D,EAAAC,aAAA,CAAQ,MAAM;AACZ,IAAa,WAAA,EAAA,EAAA,CAAG,aAAa,YAAY,CAAA;AAAA,GAC3C,EAAG,CAAC,WAAW,CAAC,CAAA;AAEhB,EAAA,uBAEIC,eAAA,CAAAC,mBAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAAC,cAAA;AAAA,MAACC,WAAA;AAAA,MAAA;AAAA,QACC,UAAU,SAAc,KAAA,OAAA;AAAA,QACxB,OAAS,EAAA,MAAA;AAAA,QACT,SAAU,EAAA,UAAA;AAAA,QACX,QAAA,EAAA;AAAA;AAAA,KAED;AAAA,oBACCD,cAAA,CAAAC,WAAA,EAAA,EAAO,OAAS,EAAA,QAAA,EAAU,QAAM,EAAA,QAAA,EAAA;AAAA,GACnC,EAAA,CAAA;AAEJ;;;;"}
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  var eventEmitter = require('../event-emitter.js');
4
- var protocolMessageUtils = require('../protocol-message-utils.js');
5
4
 
6
5
  var __typeError = (msg) => {
7
6
  throw TypeError(msg);
@@ -10,18 +9,20 @@ var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot
10
9
  var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj));
11
10
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
12
11
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), member.set(obj, value), value);
13
- var _active, _rowEdits, _editCount, _dataSource, _inEditMode;
14
- class EditTracker extends eventEmitter.EventEmitter {
15
- constructor() {
16
- super(...arguments);
12
+ var _active, _rowEdits, _editCount, _sourceTableDataSource, _sessionDataSource, _inEditMode;
13
+ class EditSession extends eventEmitter.EventEmitter {
14
+ constructor(dataSource) {
15
+ super();
17
16
  __privateAdd(this, _active, false);
18
17
  /**
19
18
  * Row key => row edits
20
19
  */
21
20
  __privateAdd(this, _rowEdits, /* @__PURE__ */ new Map());
22
21
  __privateAdd(this, _editCount, 0);
23
- __privateAdd(this, _dataSource);
22
+ __privateAdd(this, _sourceTableDataSource);
23
+ __privateAdd(this, _sessionDataSource);
24
24
  __privateAdd(this, _inEditMode, false);
25
+ __privateSet(this, _sourceTableDataSource, dataSource);
25
26
  }
26
27
  get active() {
27
28
  return __privateGet(this, _active);
@@ -43,26 +44,22 @@ class EditTracker extends eventEmitter.EventEmitter {
43
44
  }
44
45
  }
45
46
  }
46
- set dataSource(ds) {
47
- __privateSet(this, _dataSource, ds);
48
- }
49
47
  clear() {
50
48
  __privateGet(this, _rowEdits).clear();
51
49
  __privateSet(this, _editCount, 0);
52
50
  }
53
- async enterEditMode() {
51
+ async begin(editSessionMode) {
54
52
  __privateSet(this, _inEditMode, true);
55
- const rpcResponse = await __privateGet(this, _dataSource)?.rpcRequest?.({
56
- type: "RPC_REQUEST",
57
- rpcName: "ENTER_EDIT_MODE",
58
- params: {}
59
- });
60
- if (protocolMessageUtils.isRpcSuccess(rpcResponse)) {
61
- const { table: sessionTable } = rpcResponse.data;
62
- return sessionTable;
63
- } else {
64
- console.log("fail");
65
- }
53
+ const sessionDataSource = await __privateGet(this, _sourceTableDataSource)?.beginEditSession?.(editSessionMode);
54
+ __privateSet(this, _sessionDataSource, sessionDataSource);
55
+ return sessionDataSource;
56
+ }
57
+ get dataSource() {
58
+ return __privateGet(this, _sessionDataSource) ?? __privateGet(this, _sourceTableDataSource);
59
+ }
60
+ async end(saveChanges = false) {
61
+ await this.dataSource?.endEditSession?.(saveChanges);
62
+ this.clear();
66
63
  }
67
64
  get inEditMode() {
68
65
  return __privateGet(this, _inEditMode);
@@ -70,24 +67,6 @@ class EditTracker extends eventEmitter.EventEmitter {
70
67
  get editState() {
71
68
  return this.editCount === 0 ? "clean" : "dirty";
72
69
  }
73
- async cancelChanges() {
74
- const rpcResponse = await __privateGet(this, _dataSource)?.rpcRequest?.({
75
- type: "RPC_REQUEST",
76
- rpcName: "EXIT_EDIT_MODE",
77
- params: {}
78
- });
79
- this.clear();
80
- return rpcResponse;
81
- }
82
- async saveChanges() {
83
- const rpcResponse = await __privateGet(this, _dataSource)?.rpcRequest?.({
84
- type: "RPC_REQUEST",
85
- rpcName: "EXIT_EDIT_MODE",
86
- params: { save: true }
87
- });
88
- this.clear();
89
- return rpcResponse;
90
- }
91
70
  // TODO how do we deal with the '_edited' pattern
92
71
  edit(key, columnName, originalValue, newValue) {
93
72
  const rowEditDetails = __privateGet(this, _rowEdits).get(key);
@@ -121,26 +100,17 @@ class EditTracker extends eventEmitter.EventEmitter {
121
100
  this.editCount = __privateGet(this, _editCount) + 1;
122
101
  }
123
102
  }
124
- //TODO alow a shortcut commit that allows a value, bypassing need
125
- // for edit. Thids caters for boolean values, dropdown list etc
126
- // that have no intermediate edit phase
127
- async commit(key, columnName) {
103
+ async commit(key, columnName, typedValue) {
128
104
  const rowEditDetails = __privateGet(this, _rowEdits).get(key);
129
105
  if (rowEditDetails) {
130
106
  const { cellEdits } = rowEditDetails;
131
107
  const cellEditValues = cellEdits.get(columnName);
132
108
  if (cellEditValues) {
133
- const { editedValue } = cellEditValues;
134
- const rpcResponse = await __privateGet(this, _dataSource)?.rpcRequest?.({
135
- type: "RPC_REQUEST",
136
- rpcName: "editCell",
137
- params: {
138
- column: columnName,
139
- data: editedValue,
140
- key
141
- }
142
- });
143
- return rpcResponse;
109
+ try {
110
+ this.dataSource?.editCell?.(key, columnName, typedValue);
111
+ } catch (e) {
112
+ console.error(e);
113
+ }
144
114
  }
145
115
  } else {
146
116
  return {
@@ -153,8 +123,9 @@ class EditTracker extends eventEmitter.EventEmitter {
153
123
  _active = new WeakMap();
154
124
  _rowEdits = new WeakMap();
155
125
  _editCount = new WeakMap();
156
- _dataSource = new WeakMap();
126
+ _sourceTableDataSource = new WeakMap();
127
+ _sessionDataSource = new WeakMap();
157
128
  _inEditMode = new WeakMap();
158
129
 
159
- exports.EditTracker = EditTracker;
160
- //# sourceMappingURL=EditTracker.js.map
130
+ exports.EditSession = EditSession;
131
+ //# sourceMappingURL=EditSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EditSession.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/EditSession.tsx"],"sourcesContent":["import { DataSource, EditSessionMode } from \"@vuu-ui/vuu-data-types\";\nimport type {\n RpcResultError,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\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 EditSessionEvents = {\n editState: (editState: EditState) => void;\n};\n\nexport class EditSession extends EventEmitter<EditSessionEvents> {\n #active = false;\n /**\n * Row key => row edits\n */\n #rowEdits = new Map<string, RowEditDetails>();\n #editCount = 0;\n #sourceTableDataSource?: DataSource;\n #sessionDataSource?: DataSource;\n #inEditMode = false;\n\n constructor(dataSource: DataSource) {\n super();\n this.#sourceTableDataSource = dataSource;\n }\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 clear() {\n this.#rowEdits.clear();\n this.#editCount = 0;\n }\n\n async begin(editSessionMode?: EditSessionMode) {\n this.#inEditMode = true;\n\n const sessionDataSource =\n await this.#sourceTableDataSource?.beginEditSession?.(editSessionMode);\n\n this.#sessionDataSource = sessionDataSource;\n\n return sessionDataSource;\n }\n\n get dataSource() {\n return this.#sessionDataSource ?? this.#sourceTableDataSource;\n }\n\n async end(saveChanges = false) {\n await this.dataSource?.endEditSession?.(saveChanges);\n this.clear();\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 // 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 async commit(\n key: string,\n columnName: string,\n typedValue: string | number | boolean,\n ) {\n const rowEditDetails = this.#rowEdits.get(key);\n if (rowEditDetails) {\n const { cellEdits } = rowEditDetails;\n const cellEditValues = cellEdits.get(columnName);\n if (cellEditValues) {\n try {\n this.dataSource?.editCell?.(key, columnName, typedValue);\n } catch (e) {\n // ??\n console.error(e);\n }\n }\n } else {\n return {\n errorMessage: \"CHANGE_REVERTED\",\n type: \"ERROR_RESULT\",\n } as RpcResultError;\n }\n }\n}\n"],"names":["EventEmitter"],"mappings":";;;;;;;;;;;AAAA,IAAA,OAAA,EAAA,SAAA,EAAA,UAAA,EAAA,sBAAA,EAAA,kBAAA,EAAA,WAAA;AAyBO,MAAM,oBAAoBA,yBAAgC,CAAA;AAAA,EAW/D,YAAY,UAAwB,EAAA;AAClC,IAAM,KAAA,EAAA;AAXR,IAAU,YAAA,CAAA,IAAA,EAAA,OAAA,EAAA,KAAA,CAAA;AAIV;AAAA;AAAA;AAAA,IAAA,YAAA,CAAA,IAAA,EAAA,SAAA,sBAAgB,GAA4B,EAAA,CAAA;AAC5C,IAAa,YAAA,CAAA,IAAA,EAAA,UAAA,EAAA,CAAA,CAAA;AACb,IAAA,YAAA,CAAA,IAAA,EAAA,sBAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,kBAAA,CAAA;AACA,IAAc,YAAA,CAAA,IAAA,EAAA,WAAA,EAAA,KAAA,CAAA;AAIZ,IAAA,YAAA,CAAA,IAAA,EAAK,sBAAyB,EAAA,UAAA,CAAA;AAAA;AAChC,EAEA,IAAI,MAAS,GAAA;AACX,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,OAAA,CAAA;AAAA;AACd,EACA,IAAI,OAAO,QAAmB,EAAA;AAC5B,IAAA,YAAA,CAAA,IAAA,EAAK,OAAU,EAAA,QAAA,CAAA;AAAA;AACjB,EACA,IAAI,SAAY,GAAA;AACd,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA;AAAA;AACd,EAEA,IAAI,UAAU,GAAa,EAAA;AACzB,IAAI,IAAA,GAAA,KAAQ,mBAAK,UAAY,CAAA,EAAA;AAC3B,MAAA,MAAM,WAAW,YAAK,CAAA,IAAA,EAAA,UAAA,CAAA;AACtB,MAAA,YAAA,CAAA,IAAA,EAAK,UAAa,EAAA,GAAA,CAAA;AAClB,MAAA,IAAI,QAAQ,CAAG,EAAA;AACb,QAAK,IAAA,CAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA,OAChC,MAAA,IAAW,aAAa,CAAG,EAAA;AACzB,QAAK,IAAA,CAAA,IAAA,CAAK,aAAa,OAAO,CAAA;AAAA;AAChC;AACF;AACF,EAEA,KAAQ,GAAA;AACN,IAAA,YAAA,CAAA,IAAA,EAAK,WAAU,KAAM,EAAA;AACrB,IAAA,YAAA,CAAA,IAAA,EAAK,UAAa,EAAA,CAAA,CAAA;AAAA;AACpB,EAEA,MAAM,MAAM,eAAmC,EAAA;AAC7C,IAAA,YAAA,CAAA,IAAA,EAAK,WAAc,EAAA,IAAA,CAAA;AAEnB,IAAA,MAAM,iBACJ,GAAA,MAAM,YAAK,CAAA,IAAA,EAAA,sBAAA,CAAA,EAAwB,mBAAmB,eAAe,CAAA;AAEvE,IAAA,YAAA,CAAA,IAAA,EAAK,kBAAqB,EAAA,iBAAA,CAAA;AAE1B,IAAO,OAAA,iBAAA;AAAA;AACT,EAEA,IAAI,UAAa,GAAA;AACf,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,uBAAsB,YAAK,CAAA,IAAA,EAAA,sBAAA,CAAA;AAAA;AACzC,EAEA,MAAM,GAAI,CAAA,WAAA,GAAc,KAAO,EAAA;AAC7B,IAAM,MAAA,IAAA,CAAK,UAAY,EAAA,cAAA,GAAiB,WAAW,CAAA;AACnD,IAAA,IAAA,CAAK,KAAM,EAAA;AAAA;AACb,EAEA,IAAI,UAAa,GAAA;AACf,IAAA,OAAO,YAAK,CAAA,IAAA,EAAA,WAAA,CAAA;AAAA;AACd,EAEA,IAAI,SAAuB,GAAA;AACzB,IAAO,OAAA,IAAA,CAAK,SAAc,KAAA,CAAA,GAAI,OAAU,GAAA,OAAA;AAAA;AAC1C;AAAA,EAGA,IACE,CAAA,GAAA,EACA,UACA,EAAA,aAAA,EACA,QACA,EAAA;AACA,IAAA,MAAM,cAAiB,GAAA,YAAA,CAAA,IAAA,EAAK,SAAU,CAAA,CAAA,GAAA,CAAI,GAAG,CAAA;AAC7C,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAM,MAAA,EAAE,WAAc,GAAA,cAAA;AACtB,MAAM,MAAA,QAAA,GAAW,SAAU,CAAA,GAAA,CAAI,UAAU,CAAA;AACzC,MAAA,IAAI,QAAU,EAAA;AACZ,QAAI,IAAA,QAAA,KAAa,SAAS,aAAe,EAAA;AACvC,UAAI,IAAA,SAAA,CAAU,SAAS,CAAG,EAAA;AACxB,YAAK,YAAA,CAAA,IAAA,EAAA,SAAA,CAAA,CAAU,OAAO,GAAG,CAAA;AAAA,WACpB,MAAA;AAEL,YAAA,SAAA,CAAU,OAAO,UAAU,CAAA;AAAA;AAE7B,UAAK,IAAA,CAAA,SAAA,GAAY,mBAAK,UAAa,CAAA,GAAA,CAAA;AAAA,SAC9B,MAAA;AACL,UAAA,QAAA,CAAS,WAAc,GAAA,QAAA;AAAA;AACzB,OACK,MAAA;AAEL,QAAA,SAAA,CAAU,IAAI,UAAY,EAAA;AAAA,UACxB,aAAA;AAAA,UACA,WAAa,EAAA;AAAA,SACd,CAAA;AACD,QAAK,IAAA,CAAA,SAAA,GAAY,mBAAK,UAAa,CAAA,GAAA,CAAA;AAAA;AACrC,KACK,MAAA;AACL,MAAK,YAAA,CAAA,IAAA,EAAA,SAAA,CAAA,CAAU,IAAI,GAAK,EAAA;AAAA,QACtB,SAAA,sBAAe,GAAI,CAAA;AAAA,UACjB,CAAC,UAAY,EAAA,EAAE,aAAe,EAAA,WAAA,EAAa,UAAU;AAAA,SACtD;AAAA,OACF,CAAA;AACD,MAAK,IAAA,CAAA,SAAA,GAAY,mBAAK,UAAa,CAAA,GAAA,CAAA;AAAA;AACrC;AACF,EAEA,MAAM,MAAA,CACJ,GACA,EAAA,UAAA,EACA,UACA,EAAA;AACA,IAAA,MAAM,cAAiB,GAAA,YAAA,CAAA,IAAA,EAAK,SAAU,CAAA,CAAA,GAAA,CAAI,GAAG,CAAA;AAC7C,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAM,MAAA,EAAE,WAAc,GAAA,cAAA;AACtB,MAAM,MAAA,cAAA,GAAiB,SAAU,CAAA,GAAA,CAAI,UAAU,CAAA;AAC/C,MAAA,IAAI,cAAgB,EAAA;AAClB,QAAI,IAAA;AACF,UAAA,IAAA,CAAK,UAAY,EAAA,QAAA,GAAW,GAAK,EAAA,UAAA,EAAY,UAAU,CAAA;AAAA,iBAChD,CAAG,EAAA;AAEV,UAAA,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA;AACjB;AACF,KACK,MAAA;AACL,MAAO,OAAA;AAAA,QACL,YAAc,EAAA,iBAAA;AAAA,QACd,IAAM,EAAA;AAAA,OACR;AAAA;AACF;AAEJ;AAvIE,OAAA,GAAA,IAAA,OAAA,EAAA;AAIA,SAAA,GAAA,IAAA,OAAA,EAAA;AACA,UAAA,GAAA,IAAA,OAAA,EAAA;AACA,sBAAA,GAAA,IAAA,OAAA,EAAA;AACA,kBAAA,GAAA,IAAA,OAAA,EAAA;AACA,WAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
@@ -0,0 +1,6 @@
1
+ 'use strict';
2
+
3
+ const isInlineEditingSession = (editSessionMode) => editSessionMode === "inline-all-rows";
4
+
5
+ exports.isInlineEditingSession = isInlineEditingSession;
6
+ //# sourceMappingURL=edit-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edit-utils.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/edit-utils.ts"],"sourcesContent":["import { EditSessionMode, InlineEditSessionMode } from \"@vuu-ui/vuu-data-types\";\n\nexport const isInlineEditingSession = (\n editSessionMode: EditSessionMode,\n): editSessionMode is InlineEditSessionMode =>\n editSessionMode === \"inline-all-rows\";\n"],"names":[],"mappings":";;AAEa,MAAA,sBAAA,GAAyB,CACpC,eAAA,KAEA,eAAoB,KAAA;;;;"}
@@ -1,14 +1,14 @@
1
1
  'use strict';
2
2
 
3
3
  var React = require('react');
4
- var EditTracker = require('./EditTracker.js');
5
4
  var DataProvider = require('../context-definitions/DataProvider.js');
6
- var protocolMessageUtils = require('../protocol-message-utils.js');
7
5
  var useLayoutEffectSkipFirst = require('../useLayoutEffectSkipFirst.js');
6
+ var EditSession = require('./EditSession.js');
8
7
 
9
8
  const useEditableTable = ({
10
9
  columns,
11
10
  dataSource: dataSourceProp,
11
+ editSessionMode = "all-rows",
12
12
  isEditMode,
13
13
  onCancel,
14
14
  onSave,
@@ -16,59 +16,56 @@ const useEditableTable = ({
16
16
  }) => {
17
17
  const { VuuDataSource } = DataProvider.useData();
18
18
  const [sessionDataSource, setSessionDataSource] = React.useState(void 0);
19
- const clearSessionDataSource = React.useCallback(() => {
20
- setSessionDataSource((dataSource2) => {
21
- dataSource2?.unsubscribe();
22
- return void 0;
23
- });
24
- }, []);
25
19
  useLayoutEffectSkipFirst.useLayoutEffectSkipFirst(() => {
26
20
  console.warn(`[useEditableTable] columns and or table changed`);
27
21
  }, [columns, table]);
28
22
  const dataSource = React.useMemo(() => {
29
- return dataSourceProp ?? new VuuDataSource({ columns, table });
30
- }, [VuuDataSource, columns, dataSourceProp, table]);
31
- const editTracker = React.useMemo(() => new EditTracker.EditTracker(), []);
32
- React.useMemo(() => {
33
- if (dataSource) {
34
- editTracker.dataSource = dataSource;
23
+ if (dataSourceProp) {
24
+ return dataSourceProp;
25
+ } else if (table) {
26
+ return new VuuDataSource({ columns, table });
27
+ } else {
28
+ throw Error(
29
+ `useEditableTable unable to provide DataSource, neither dataSource nor table available as props`
30
+ );
35
31
  }
36
- }, [dataSource, editTracker]);
32
+ }, [VuuDataSource, columns, dataSourceProp, table]);
33
+ const editSession = React.useMemo(() => new EditSession.EditSession(dataSource), [dataSource]);
37
34
  const handleCancel = React.useCallback(() => {
38
- editTracker.cancelChanges();
39
- onCancel();
40
- clearSessionDataSource();
41
- dataSource.resume?.();
42
- }, [clearSessionDataSource, dataSource, editTracker, onCancel]);
35
+ try {
36
+ editSession.end();
37
+ onCancel();
38
+ } catch (e) {
39
+ }
40
+ }, [editSession, onCancel]);
43
41
  const handleSave = React.useCallback(async () => {
44
42
  dataSource.resume?.();
45
- const response = await editTracker.saveChanges();
46
- if (protocolMessageUtils.isRpcSuccess(response)) {
43
+ try {
44
+ await editSession.end(true);
47
45
  onSave();
48
- clearSessionDataSource();
46
+ } catch (e) {
49
47
  }
50
- }, [clearSessionDataSource, dataSource, editTracker, onSave]);
48
+ }, [dataSource, editSession, onSave]);
51
49
  React.useMemo(async () => {
50
+ console.log(`[useEditableTable] editMode ${isEditMode}`);
52
51
  if (isEditMode) {
53
- const sessionTable = await editTracker.enterEditMode();
54
- if (sessionTable && dataSource.tableSchema) {
55
- dataSource.suspend?.(false);
56
- const sessionDataSource2 = new VuuDataSource({
57
- columns: dataSource.columns,
58
- table: sessionTable,
59
- viewport: sessionTable.table
60
- });
61
- setSessionDataSource(sessionDataSource2);
62
- editTracker.dataSource = sessionDataSource2;
52
+ try {
53
+ const sessionDataSource2 = await editSession.begin(editSessionMode);
54
+ if (sessionDataSource2) {
55
+ setSessionDataSource(sessionDataSource2);
56
+ }
57
+ } catch (e) {
58
+ console.error(e);
59
+ onCancel();
63
60
  }
64
61
  }
65
- }, [VuuDataSource, dataSource, editTracker, isEditMode]);
62
+ }, [editSession, editSessionMode, isEditMode, onCancel]);
66
63
  return {
67
- // DO we need to reset the dataSource or could useDataSOurce detect the sessiondataSOurce from the editSession ?
68
- dataSource: sessionDataSource ?? dataSource,
69
- editTracker,
64
+ dataSource,
65
+ editSession,
70
66
  onCancel: handleCancel,
71
- onSave: handleSave
67
+ onSave: handleSave,
68
+ sessionDataSource
72
69
  };
73
70
  };
74
71
 
@@ -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\";\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 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 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 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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"}
1
+ {"version":3,"file":"useEditableTable.js","sources":["../../../../../../../packages/vuu-utils/src/data-editing/useEditableTable.ts"],"sourcesContent":["import { DataSource, EditSessionMode } from \"@vuu-ui/vuu-data-types\";\n// import { useNotifications } from \"@vuu-ui/vuu-notifications\";\nimport { VuuTable } from \"@vuu-ui/vuu-protocol-types\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport { useData } from \"../context-definitions/DataProvider\";\nimport { useLayoutEffectSkipFirst } from \"../useLayoutEffectSkipFirst\";\nimport { EditSession } from \"./EditSession\";\n// import { useNotifications } from \"@vuu-ui/vuu-notifications\";\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 editSessionMode?: EditSessionMode;\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 editSessionMode = \"all-rows\",\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 // const { showNotification } = useNotifications();\n useLayoutEffectSkipFirst(() => {\n console.warn(`[useEditableTable] columns and or table changed`);\n }, [columns, table]);\n\n const dataSource = useMemo(() => {\n // The dataSource would normally be managed by client and passed in, but for\n // simple use cases we can create it here.\n if (dataSourceProp) {\n return dataSourceProp;\n } else if (table) {\n return new VuuDataSource({ columns, table });\n } else {\n throw Error(\n `useEditableTable unable to provide DataSource, neither dataSource nor table available as props`,\n );\n }\n }, [VuuDataSource, columns, dataSourceProp, table]);\n\n // The editSession will be made available to all the edit controls in scope by\n // wrapping the edit component with a DataEditingProvider.\n const editSession = useMemo(() => new EditSession(dataSource), [dataSource]);\n\n const handleCancel = useCallback(() => {\n // editTracker.dataSource = dataSource;\n try {\n editSession.end();\n onCancel();\n } catch (e) {\n //\n }\n }, [editSession, onCancel]);\n\n const handleSave = useCallback(async () => {\n dataSource.resume?.();\n try {\n await editSession.end(true);\n onSave();\n } catch (e) {\n // cleanup\n }\n }, [dataSource, editSession, onSave]);\n\n useMemo(async () => {\n console.log(`[useEditableTable] editMode ${isEditMode}`);\n if (isEditMode) {\n try {\n const sessionDataSource = await editSession.begin(editSessionMode);\n if (sessionDataSource) {\n setSessionDataSource(sessionDataSource);\n }\n } catch (e) {\n console.error(e);\n // deal with error\n // showNotification?.({\n // header: \"Error unable to edit\",\n // status: \"error\",\n // type: \"toast\",\n // });\n onCancel();\n }\n }\n }, [editSession, editSessionMode, isEditMode, onCancel]);\n\n return {\n dataSource,\n editSession,\n onCancel: handleCancel,\n onSave: handleSave,\n sessionDataSource,\n };\n};\n"],"names":["useData","useState","useLayoutEffectSkipFirst","useMemo","EditSession","useCallback","sessionDataSource"],"mappings":";;;;;;;AA6BO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,OAAA;AAAA,EACA,UAAY,EAAA,cAAA;AAAA,EACZ,eAAkB,GAAA,UAAA;AAAA,EAClB,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,EAAAC,iDAAA,CAAyB,MAAM;AAC7B,IAAA,OAAA,CAAQ,KAAK,CAAiD,+CAAA,CAAA,CAAA;AAAA,GAC7D,EAAA,CAAC,OAAS,EAAA,KAAK,CAAC,CAAA;AAEnB,EAAM,MAAA,UAAA,GAAaC,cAAQ,MAAM;AAG/B,IAAA,IAAI,cAAgB,EAAA;AAClB,MAAO,OAAA,cAAA;AAAA,eACE,KAAO,EAAA;AAChB,MAAA,OAAO,IAAI,aAAA,CAAc,EAAE,OAAA,EAAS,OAAO,CAAA;AAAA,KACtC,MAAA;AACL,MAAM,MAAA,KAAA;AAAA,QACJ,CAAA,8FAAA;AAAA,OACF;AAAA;AACF,KACC,CAAC,aAAA,EAAe,OAAS,EAAA,cAAA,EAAgB,KAAK,CAAC,CAAA;AAIlD,EAAM,MAAA,WAAA,GAAcA,cAAQ,MAAM,IAAIC,wBAAY,UAAU,CAAA,EAAG,CAAC,UAAU,CAAC,CAAA;AAE3E,EAAM,MAAA,YAAA,GAAeC,kBAAY,MAAM;AAErC,IAAI,IAAA;AACF,MAAA,WAAA,CAAY,GAAI,EAAA;AAChB,MAAS,QAAA,EAAA;AAAA,aACF,CAAG,EAAA;AAAA;AAEZ,GACC,EAAA,CAAC,WAAa,EAAA,QAAQ,CAAC,CAAA;AAE1B,EAAM,MAAA,UAAA,GAAaA,kBAAY,YAAY;AACzC,IAAA,UAAA,CAAW,MAAS,IAAA;AACpB,IAAI,IAAA;AACF,MAAM,MAAA,WAAA,CAAY,IAAI,IAAI,CAAA;AAC1B,MAAO,MAAA,EAAA;AAAA,aACA,CAAG,EAAA;AAAA;AAEZ,GACC,EAAA,CAAC,UAAY,EAAA,WAAA,EAAa,MAAM,CAAC,CAAA;AAEpC,EAAAF,aAAA,CAAQ,YAAY;AAClB,IAAQ,OAAA,CAAA,GAAA,CAAI,CAA+B,4BAAA,EAAA,UAAU,CAAE,CAAA,CAAA;AACvD,IAAA,IAAI,UAAY,EAAA;AACd,MAAI,IAAA;AACF,QAAA,MAAMG,kBAAoB,GAAA,MAAM,WAAY,CAAA,KAAA,CAAM,eAAe,CAAA;AACjE,QAAA,IAAIA,kBAAmB,EAAA;AACrB,UAAA,oBAAA,CAAqBA,kBAAiB,CAAA;AAAA;AACxC,eACO,CAAG,EAAA;AACV,QAAA,OAAA,CAAQ,MAAM,CAAC,CAAA;AAOf,QAAS,QAAA,EAAA;AAAA;AACX;AACF,KACC,CAAC,WAAA,EAAa,eAAiB,EAAA,UAAA,EAAY,QAAQ,CAAC,CAAA;AAEvD,EAAO,OAAA;AAAA,IACL,UAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAU,EAAA,YAAA;AAAA,IACV,MAAQ,EAAA,UAAA;AAAA,IACR;AAAA,GACF;AACF;;;;"}
@@ -7,6 +7,18 @@ require('@internationalized/date');
7
7
  var htmlUtils = require('./html-utils.js');
8
8
  var ScaledDecimal = require('./ScaledDecimal.js');
9
9
 
10
+ var __defProp = Object.defineProperty;
11
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
13
+ class DataValidationError extends Error {
14
+ constructor(message, expectedType, actualType) {
15
+ super(message);
16
+ __publicField(this, "actualType");
17
+ __publicField(this, "expectedType");
18
+ this.actualType = actualType;
19
+ this.expectedType = expectedType;
20
+ }
21
+ }
10
22
  const getFieldName = (target) => {
11
23
  const saltFormField = htmlUtils.queryClosest(target, "[data-field]");
12
24
  const fieldName = saltFormField?.dataset.field;
@@ -29,6 +41,16 @@ function getTypedRange([value1, value2], dataType, options) {
29
41
  getTypedValue(value2, dataType, false, options)
30
42
  ];
31
43
  }
44
+ const getActualType = (value) => {
45
+ if (typeof value === "boolean") {
46
+ return "boolean";
47
+ } else if (typeof value === "number") {
48
+ return "number";
49
+ } else if (typeof value === "string") {
50
+ return "string";
51
+ }
52
+ return "string";
53
+ };
32
54
  function getTypedValue(value, type, throwIfInvalid = false, options) {
33
55
  switch (type) {
34
56
  case "int":
@@ -56,7 +78,11 @@ function getTypedValue(value, type, throwIfInvalid = false, options) {
56
78
  if (dataUtils.stringIsValidDecimal(value)) {
57
79
  return parseFloat(value);
58
80
  } else if (throwIfInvalid) {
59
- throw Error(`value ${value} is not a valid ${type}`);
81
+ throw new DataValidationError(
82
+ `value ${value} is not a valid ${type}`,
83
+ "decimal",
84
+ getActualType(value)
85
+ );
60
86
  } else {
61
87
  return void 0;
62
88
  }
@@ -82,6 +108,7 @@ function getTypedValue(value, type, throwIfInvalid = false, options) {
82
108
  }
83
109
  }
84
110
 
111
+ exports.DataValidationError = DataValidationError;
85
112
  exports.getFieldName = getFieldName;
86
113
  exports.getTypedRange = getTypedRange;
87
114
  exports.getTypedValue = getTypedValue;
@@ -1 +1 @@
1
- {"version":3,"file":"form-utils.js","sources":["../../../../../../packages/vuu-utils/src/form-utils.ts"],"sourcesContent":["import { DataValueTypeSimple } from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuColumnDataType,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { KeyboardEvent, SyntheticEvent } from \"react\";\nimport { stringIsValidDecimal, stringIsValidInt } from \"./data-utils\";\nimport { isValidTimeString, Time } from \"./date\";\nimport { queryClosest } from \"./html-utils\";\nimport { ExtendedFilterOptions } from \"@vuu-ui/vuu-filter-types\";\nimport {\n type ScaledDecimal,\n ScaledDecimal2,\n ScaledDecimal4,\n ScaledDecimal6,\n ScaledDecimal8,\n} from \"./ScaledDecimal\";\n\n/**\n * Use with the following convention:\n *\n * <FormField data-field=\"my-field-name\">\n */\nexport const getFieldName = (target: EventTarget | HTMLElement): string => {\n const saltFormField = queryClosest(target, \"[data-field]\") as HTMLElement;\n const fieldName = saltFormField?.dataset.field;\n if (fieldName) {\n return fieldName;\n } else {\n throw Error(\"named form field not found\");\n }\n};\n\nexport type InputSource = \"typeahead-suggestion\" | \"text-input\";\n\nexport const isNumber = (\n type: string,\n value: VuuRowDataItemType,\n): value is number => type === \"number\";\n\nexport type CommitHandler<\n E extends HTMLElement = HTMLInputElement,\n T = VuuRowDataItemType,\n> = (\n evt: SyntheticEvent<E> | KeyboardEvent<E>,\n value: T,\n source?: InputSource,\n) => void;\n\nexport const isValidRange = <T>([val1, val2]: [T, T]) => {\n if (isValidTimeString(val1) && isValidTimeString(val2)) {\n return val2 > val1;\n }\n return true;\n};\n\n/**\n * Convert a pair of string values to the type appropriate for the\n * associated column or form field. Can be used when processing a string value\n * from an input used for user editing.\n *\n */\nexport function getTypedRange(\n [value1, value2]: [string, string],\n dataType: VuuColumnDataType | DataValueTypeSimple,\n options?: ExtendedFilterOptions,\n) {\n return [\n getTypedValue(value1, dataType, false, options),\n getTypedValue(value2, dataType, false, options),\n ];\n}\n\n/**\n * Convert a string value to the type appropriate for the associated\n * column or form field. Can be used when processing a string value\n * from an input used for user editing.\n *\n * @param value\n * @param type\n * @param throwIfInvalid\n */\nexport function getTypedValue(\n value: string,\n type: VuuColumnDataType | DataValueTypeSimple,\n throwIfInvalid?: false,\n options?: ExtendedFilterOptions,\n): VuuRowDataItemType | undefined;\nexport function getTypedValue(\n value: string,\n type: VuuColumnDataType | DataValueTypeSimple,\n throwIfInvalid: true,\n options?: ExtendedFilterOptions,\n): VuuRowDataItemType;\nexport function getTypedValue(\n value: string,\n type: VuuColumnDataType | DataValueTypeSimple,\n throwIfInvalid = false,\n options?: ExtendedFilterOptions,\n): VuuRowDataItemType | ScaledDecimal | undefined {\n switch (type) {\n case \"int\":\n case \"long\": {\n if (stringIsValidInt(value)) {\n return parseInt(value, 10);\n } else if (isValidTimeString(value)) {\n //TOCHECK\n return value;\n } else if (throwIfInvalid) {\n throw Error(`value ${value} is not a valid ${type}`);\n } else {\n return undefined;\n }\n }\n\n case \"scaleddecimal2\":\n return ScaledDecimal2(value);\n case \"scaleddecimal4\":\n return ScaledDecimal4(value);\n case \"scaleddecimal6\":\n return ScaledDecimal6(value);\n case \"scaleddecimal8\":\n return ScaledDecimal8(value);\n case \"double\":\n case \"number\": {\n if (stringIsValidDecimal(value)) {\n return parseFloat(value);\n } else if (throwIfInvalid) {\n throw Error(`value ${value} is not a valid ${type}`);\n } else {\n return undefined;\n }\n }\n\n case \"boolean\":\n return value === \"true\" ? true : false;\n\n case \"time\":\n if (isValidTimeString(value)) {\n // We don't manipulate the values of 'extended' filters, the\n // ExtendedFilter impementation will do that.\n if (options?.type === \"TimeString\") {\n return value;\n } else {\n return +Time(value).asDate();\n }\n } else if (value.length > 0 && Time.isDateInMillis(value)) {\n //if value previously converted\n return Number(value);\n } else if (throwIfInvalid) {\n throw Error(`value ${value} is not a valid ${type}`);\n } else {\n return undefined;\n }\n default:\n return value;\n }\n}\n"],"names":["queryClosest","isValidTimeString","stringIsValidInt","ScaledDecimal2","ScaledDecimal4","ScaledDecimal6","ScaledDecimal8","stringIsValidDecimal","Time"],"mappings":"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"}
1
+ {"version":3,"file":"form-utils.js","sources":["../../../../../../packages/vuu-utils/src/form-utils.ts"],"sourcesContent":["import { DataValueTypeSimple } from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuColumnDataType,\n VuuRowDataItemType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { KeyboardEvent, SyntheticEvent } from \"react\";\nimport { stringIsValidDecimal, stringIsValidInt } from \"./data-utils\";\nimport { isValidTimeString, Time } from \"./date\";\nimport { queryClosest } from \"./html-utils\";\nimport { ExtendedFilterOptions } from \"@vuu-ui/vuu-filter-types\";\nimport {\n type ScaledDecimal,\n ScaledDecimal2,\n ScaledDecimal4,\n ScaledDecimal6,\n ScaledDecimal8,\n} from \"./ScaledDecimal\";\n\nexport class DataValidationError extends Error {\n actualType: string;\n expectedType: string;\n constructor(message: string, expectedType: string, actualType: string) {\n super(message);\n this.actualType = actualType;\n this.expectedType = expectedType;\n }\n}\n\n/**\n * Use with the following convention:\n *\n * <FormField data-field=\"my-field-name\">\n */\nexport const getFieldName = (target: EventTarget | HTMLElement): string => {\n const saltFormField = queryClosest(target, \"[data-field]\") as HTMLElement;\n const fieldName = saltFormField?.dataset.field;\n if (fieldName) {\n return fieldName;\n } else {\n throw Error(\"named form field not found\");\n }\n};\n\nexport type InputSource = \"typeahead-suggestion\" | \"text-input\";\n\nexport const isNumber = (\n type: string,\n value: VuuRowDataItemType,\n): value is number => type === \"number\";\n\nexport type CommitHandler<\n E extends HTMLElement = HTMLInputElement,\n T = VuuRowDataItemType,\n> = (\n evt: SyntheticEvent<E> | KeyboardEvent<E>,\n value: T,\n source?: InputSource,\n) => void;\n\nexport const isValidRange = <T>([val1, val2]: [T, T]) => {\n if (isValidTimeString(val1) && isValidTimeString(val2)) {\n return val2 > val1;\n }\n return true;\n};\n\n/**\n * Convert a pair of string values to the type appropriate for the\n * associated column or form field. Can be used when processing a string value\n * from an input used for user editing.\n *\n */\nexport function getTypedRange(\n [value1, value2]: [string, string],\n dataType: VuuColumnDataType | DataValueTypeSimple,\n options?: ExtendedFilterOptions,\n) {\n return [\n getTypedValue(value1, dataType, false, options),\n getTypedValue(value2, dataType, false, options),\n ];\n}\n\nconst getActualType = (\n value: string | number | boolean,\n): \"string\" | \"number\" | \"boolean\" => {\n if (typeof value === \"boolean\") {\n return \"boolean\";\n } else if (typeof value === \"number\") {\n return \"number\";\n } else if (typeof value === \"string\") {\n return \"string\";\n }\n return \"string\";\n};\n\n/**\n * Convert a string value to the type appropriate for the associated\n * column or form field. Can be used when processing a string value\n * from an input used for user editing.\n *\n * @param value\n * @param type\n * @param throwIfInvalid\n */\nexport function getTypedValue(\n value: string,\n type: VuuColumnDataType | DataValueTypeSimple,\n throwIfInvalid?: false,\n options?: ExtendedFilterOptions,\n): VuuRowDataItemType | undefined;\nexport function getTypedValue(\n value: string,\n type: VuuColumnDataType | DataValueTypeSimple,\n throwIfInvalid: true,\n options?: ExtendedFilterOptions,\n): VuuRowDataItemType;\nexport function getTypedValue(\n value: string,\n type: VuuColumnDataType | DataValueTypeSimple,\n throwIfInvalid = false,\n options?: ExtendedFilterOptions,\n): VuuRowDataItemType | ScaledDecimal | undefined {\n switch (type) {\n case \"int\":\n case \"long\": {\n if (stringIsValidInt(value)) {\n return parseInt(value, 10);\n } else if (isValidTimeString(value)) {\n //TOCHECK\n return value;\n } else if (throwIfInvalid) {\n throw Error(`value ${value} is not a valid ${type}`);\n } else {\n return undefined;\n }\n }\n\n case \"scaleddecimal2\":\n return ScaledDecimal2(value);\n case \"scaleddecimal4\":\n return ScaledDecimal4(value);\n case \"scaleddecimal6\":\n return ScaledDecimal6(value);\n case \"scaleddecimal8\":\n return ScaledDecimal8(value);\n case \"double\":\n case \"number\": {\n if (stringIsValidDecimal(value)) {\n return parseFloat(value);\n } else if (throwIfInvalid) {\n throw new DataValidationError(\n `value ${value} is not a valid ${type}`,\n \"decimal\",\n getActualType(value),\n );\n } else {\n return undefined;\n }\n }\n\n case \"boolean\":\n return value === \"true\" ? true : false;\n\n case \"time\":\n if (isValidTimeString(value)) {\n // We don't manipulate the values of 'extended' filters, the\n // ExtendedFilter impementation will do that.\n if (options?.type === \"TimeString\") {\n return value;\n } else {\n return +Time(value).asDate();\n }\n } else if (value.length > 0 && Time.isDateInMillis(value)) {\n //if value previously converted\n return Number(value);\n } else if (throwIfInvalid) {\n throw Error(`value ${value} is not a valid ${type}`);\n } else {\n return undefined;\n }\n default:\n return value;\n }\n}\n"],"names":["queryClosest","isValidTimeString","stringIsValidInt","ScaledDecimal2","ScaledDecimal4","ScaledDecimal6","ScaledDecimal8","stringIsValidDecimal","Time"],"mappings":"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"}
@@ -12,9 +12,9 @@ var commonTypes = require('./common-types.js');
12
12
  var componentRegistry = require('./component-registry.js');
13
13
  var cookieUtils = require('./cookie-utils.js');
14
14
  var cssUtils = require('./css-utils.js');
15
- var EditButtons = require('./data-editing/EditButtons.js');
16
15
  var DataEditingProvider = require('./data-editing/DataEditingProvider.js');
17
- var EditTracker = require('./data-editing/EditTracker.js');
16
+ var EditButtons = require('./data-editing/EditButtons.js');
17
+ var EditSession = require('./data-editing/EditSession.js');
18
18
  var useEditableTable = require('./data-editing/useEditableTable.js');
19
19
  var dataUtils = require('./data-utils.js');
20
20
  var BaseDataSource = require('./datasource/BaseDataSource.js');
@@ -72,6 +72,7 @@ var DataContext = require('./context-definitions/DataContext.js');
72
72
  var DataProvider = require('./context-definitions/DataProvider.js');
73
73
  var DataSourceProvider = require('./context-definitions/DataSourceProvider.js');
74
74
  var WorkspaceContext = require('./context-definitions/WorkspaceContext.js');
75
+ var editUtils = require('./data-editing/edit-utils.js');
75
76
  var PageVisibilityObserver = require('./PageVisibilityObserver.js');
76
77
  var ShellContext = require('./ShellContext.js');
77
78
  var themeUtils = require('./theme-utils.js');
@@ -203,10 +204,10 @@ exports.registerConfigurationEditor = componentRegistry.registerConfigurationEdi
203
204
  exports.getCookieValue = cookieUtils.getCookieValue;
204
205
  exports.setCookieValue = cookieUtils.setCookieValue;
205
206
  exports.importCSS = cssUtils.importCSS;
206
- exports.EditButtons = EditButtons.EditButtons;
207
207
  exports.DataEditingProvider = DataEditingProvider.DataEditingProvider;
208
- exports.useEditTracker = DataEditingProvider.useEditTracker;
209
- exports.EditTracker = EditTracker.EditTracker;
208
+ exports.useEditSession = DataEditingProvider.useEditSession;
209
+ exports.EditButtons = EditButtons.EditButtons;
210
+ exports.EditSession = EditSession.EditSession;
210
211
  exports.useEditableTable = useEditableTable.useEditableTable;
211
212
  exports.DOWN1 = dataUtils.DOWN1;
212
213
  exports.DOWN2 = dataUtils.DOWN2;
@@ -310,6 +311,7 @@ exports.stripFilterFromColumns = filterUtils.stripFilterFromColumns;
310
311
  exports.ONE_DAY_IN_MILLIS = filterAsQuery.ONE_DAY_IN_MILLIS;
311
312
  exports.dateFilterAsQuery = filterAsQuery.dateFilterAsQuery;
312
313
  exports.filterAsQuery = filterAsQuery.filterAsQuery;
314
+ exports.DataValidationError = formUtils.DataValidationError;
313
315
  exports.getFieldName = formUtils.getFieldName;
314
316
  exports.getTypedRange = formUtils.getTypedRange;
315
317
  exports.getTypedValue = formUtils.getTypedValue;
@@ -457,6 +459,7 @@ exports.DataSourceProvider = DataSourceProvider.DataSourceProvider;
457
459
  exports.useDataSource = DataSourceProvider.useDataSource;
458
460
  exports.WorkspaceContext = WorkspaceContext.WorkspaceContext;
459
461
  exports.usePlaceholderJSON = WorkspaceContext.usePlaceholderJSON;
462
+ exports.isInlineEditingSession = editUtils.isInlineEditingSession;
460
463
  exports.PageVisibilityObserver = PageVisibilityObserver.PageVisibilityObserver;
461
464
  exports.ShellContext = ShellContext.ShellContext;
462
465
  exports.useShellContext = ShellContext.useShellContext;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -50,7 +50,7 @@ function isActionMessage(rpcResponse) {
50
50
  return rpcResponse.type === "VIEW_PORT_MENU_RESP";
51
51
  }
52
52
  function isSessionTableActionMessage(rpcResponse) {
53
- return isActionMessage(rpcResponse) && isOpenDialogAction(rpcResponse.action) && isSessionTable(rpcResponse.action.table) && rpcResponse.action?.renderComponent === "inline-form";
53
+ return isActionMessage(rpcResponse) && isOpenDialogAction(rpcResponse.action) && isSessionTable(rpcResponse.action.table) && (rpcResponse.action?.renderComponent === "inline-form" || rpcResponse.action?.renderComponent === "grid");
54
54
  }
55
55
  function isCustomComponentActionMessage(rpcResponse) {
56
56
  return isActionMessage(rpcResponse) && isOpenDialogAction(rpcResponse.action) && isSessionTable(rpcResponse.action.table) && typeof rpcResponse.action.renderComponent === "string" && componentRegistry.isView(rpcResponse.action.renderComponent);
@@ -1 +1 @@
1
- {"version":3,"file":"protocol-message-utils.js","sources":["../../../../../../packages/vuu-utils/src/protocol-message-utils.ts"],"sourcesContent":["import type {\n MenuRpcAction,\n MenuRpcResponse,\n OpenDialogActionWithSchema,\n RpcResponse,\n TableSchema,\n VuuUiMessageInRequestResponse,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuRpcMenuRequest,\n OpenDialogAction,\n VuuRpcRequest,\n VuuRpcResponse,\n VuuRpcMenuSuccess,\n VuuTable,\n VuuViewportRpcTypeaheadRequest,\n VuuRpcServiceRequest,\n ViewportRpcContext,\n OpenComponentInDialogAction,\n VuuLoginSuccessResponse,\n SelectRequest,\n SelectResponse,\n SelectSuccessWithRowCount,\n VuuViewportCreateSuccessResponse,\n VuuViewportCreateResponse,\n InvalidTokenReason,\n InvalidSessionReason,\n LoginErrorMessage,\n RpcResult,\n RpcResultSuccess,\n RpcResultError,\n VuuColumnDataType,\n VuuNumericType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { isView as componentInRegistry } from \"./component-registry\";\n\nconst MENU_RPC_TYPES = [\n \"VIEW_PORT_MENUS_SELECT_RPC\",\n \"VIEW_PORT_MENU_TABLE_RPC\",\n \"VIEW_PORT_MENU_ROW_RPC\",\n \"VIEW_PORT_MENU_CELL_RPC\",\n];\n\nexport const INVALID_SESSION: InvalidSessionReason = \"Invalid session\";\nexport const SESSION_LIMIT_EXCEEDED: InvalidSessionReason =\n \"User session limit exceeded\";\nexport const INVALID_TOKEN: InvalidTokenReason = \"Invalid token\";\nexport const TOKEN_EXPIRED: InvalidTokenReason = \"Token has expired\";\n\nconst InvalidLoginMessages: string[] = [\n INVALID_SESSION,\n SESSION_LIMIT_EXCEEDED,\n INVALID_TOKEN,\n TOKEN_EXPIRED,\n];\n\nexport const isLoginErrorMessage = (\n message: unknown,\n): message is LoginErrorMessage =>\n typeof message === \"string\" && InvalidLoginMessages.includes(message);\n\nexport const isSelectRequest = (message: object): message is SelectRequest =>\n message &&\n typeof message === \"object\" &&\n \"type\" in message &&\n (message.type === \"SELECT_ROW\" ||\n message.type === \"DESELECT_ROW\" ||\n message.type === \"SELECT_ROW_RANGE\" ||\n message.type === \"SELECT_ALL\" ||\n message.type === \"DESELECT_ALL\");\n\nexport const isSelectSuccessWithRowCount = (\n response: SelectResponse | SelectSuccessWithRowCount,\n): response is SelectSuccessWithRowCount =>\n [\n \"SELECT_ROW_SUCCESS\",\n \"DESELECT_ROW_SUCCESS\",\n \"SELECT_ROW_RANGE_SUCCESS\",\n \"SELECT_ALL_SUCCESS\",\n \"DESELECT_ALL_SUCCESS\",\n ].includes(response.type ?? \"\") &&\n typeof (response as SelectSuccessWithRowCount).selectedRowCount === \"number\";\n\nexport const isRpcServiceRequest = (message: {\n type: string;\n}): message is VuuRpcServiceRequest | Omit<VuuRpcServiceRequest, \"context\"> =>\n message.type === \"RPC_REQUEST\";\n\nexport const hasViewPortContext = (\n message: VuuRpcServiceRequest,\n): message is VuuRpcServiceRequest<ViewportRpcContext> =>\n message.context.type === \"VIEWPORT_CONTEXT\";\n\nexport const isVuuMenuRpcRequest = (\n message: VuuRpcRequest | Omit<VuuRpcRequest, \"vpId\">,\n): message is VuuRpcMenuRequest => MENU_RPC_TYPES.includes(message[\"type\"]);\n\nexport const isLoginResponse = (\n message: unknown,\n): message is VuuLoginSuccessResponse =>\n message !== null &&\n typeof message === \"object\" &&\n \"type\" in message &&\n (message.type === \"LOGIN_SUCCESS\" || message.type === \"LOGIN_FAIL\");\n\nexport const isRpcSuccess = (\n rpcResult?: RpcResult,\n): rpcResult is RpcResultSuccess => rpcResult?.type === \"SUCCESS_RESULT\";\n\nexport const isRpcError = (\n rpcResult?: RpcResult,\n): rpcResult is RpcResultError => rpcResult?.type === \"ERROR_RESULT\";\n\nexport const isRequestResponse = (\n message: object,\n): message is VuuUiMessageInRequestResponse => \"requestId\" in message;\n\nexport const isOpenSessionTableDialogMessage = (\n rpcResponse: RpcResponse,\n): rpcResponse is MenuRpcResponse<OpenDialogActionWithSchema> =>\n rpcResponse.type === \"VIEW_PORT_MENU_RESP\" &&\n isOpenDialogAction(rpcResponse.action) &&\n \"tableSchema\" in rpcResponse.action;\n\nexport const isOpenDialogAction = (\n action?: MenuRpcAction,\n): action is OpenDialogAction =>\n action !== undefined && action.type === \"OPEN_DIALOG_ACTION\";\n\nexport const isTypeaheadRequest = (\n request: Omit<VuuRpcRequest, \"vpId\">,\n): request is Omit<VuuViewportRpcTypeaheadRequest, \"vpId\"> => {\n return (\n isRpcServiceRequest(request) &&\n (request.rpcName === \"getUniqueFieldValues\" ||\n request.rpcName === \"getUniqueFieldValuesStartingWith\")\n );\n};\n\nexport const isCreateVpSuccess = (\n response: VuuViewportCreateResponse,\n): response is VuuViewportCreateSuccessResponse =>\n response.type === \"CREATE_VP_SUCCESS\";\n\nexport const isSessionTable = (table?: unknown) => {\n if (\n table !== null &&\n typeof table === \"object\" &&\n \"table\" in table &&\n \"module\" in table\n ) {\n return (table as VuuTable).table.startsWith(\"session\");\n }\n return false;\n};\n\nexport function isActionMessage(\n rpcResponse: VuuRpcResponse,\n): rpcResponse is VuuRpcMenuSuccess;\nexport function isActionMessage(\n rpcResponse: Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is Omit<VuuRpcMenuSuccess, \"vpId\">;\nexport function isActionMessage(\n rpcResponse: VuuRpcResponse | Omit<VuuRpcResponse, \"vpId\">,\n) {\n return rpcResponse.type === \"VIEW_PORT_MENU_RESP\";\n}\n\nexport function isSessionTableActionMessage(\n rpcResponse: VuuRpcResponse,\n): rpcResponse is VuuRpcMenuSuccess<\n OpenDialogAction & {\n tableSchema: TableSchema;\n }\n>;\nexport function isSessionTableActionMessage(\n rpcResponse: Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is Omit<\n VuuRpcMenuSuccess<\n OpenDialogAction & {\n tableSchema: TableSchema;\n }\n >,\n \"vpId\"\n>;\nexport function isSessionTableActionMessage(\n rpcResponse: VuuRpcResponse | Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is VuuRpcMenuSuccess<\n OpenDialogAction & {\n tableSchema: TableSchema;\n }\n> {\n return (\n isActionMessage(rpcResponse) &&\n isOpenDialogAction(rpcResponse.action) &&\n isSessionTable(rpcResponse.action.table) &&\n rpcResponse.action?.renderComponent === \"inline-form\"\n );\n}\n\nexport function isCustomComponentActionMessage(\n rpcResponse: VuuRpcResponse | Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is VuuRpcMenuSuccess<\n OpenComponentInDialogAction & {\n tableSchema: TableSchema;\n }\n> {\n return (\n isActionMessage(rpcResponse) &&\n isOpenDialogAction(rpcResponse.action) &&\n isSessionTable(rpcResponse.action.table) &&\n typeof rpcResponse.action.renderComponent === \"string\" &&\n componentInRegistry(rpcResponse.action.renderComponent)\n );\n}\n\nconst numericTypes: VuuNumericType[] = [\n \"int\",\n \"long\",\n \"double\",\n \"scaleddecimal2\",\n \"scaleddecimal4\",\n \"scaleddecimal6\",\n \"scaleddecimal8\",\n];\n\nexport function isNumericType(\n dataType?: VuuColumnDataType,\n): dataType is VuuNumericType {\n return numericTypes.includes(dataType as VuuNumericType);\n}\n"],"names":["componentInRegistry"],"mappings":"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"}
1
+ {"version":3,"file":"protocol-message-utils.js","sources":["../../../../../../packages/vuu-utils/src/protocol-message-utils.ts"],"sourcesContent":["import type {\n MenuRpcAction,\n MenuRpcResponse,\n OpenDialogActionWithSchema,\n RpcResponse,\n TableSchema,\n VuuUiMessageInRequestResponse,\n} from \"@vuu-ui/vuu-data-types\";\nimport {\n VuuRpcMenuRequest,\n OpenDialogAction,\n VuuRpcRequest,\n VuuRpcResponse,\n VuuRpcMenuSuccess,\n VuuTable,\n VuuViewportRpcTypeaheadRequest,\n VuuRpcServiceRequest,\n ViewportRpcContext,\n OpenComponentInDialogAction,\n VuuLoginSuccessResponse,\n SelectRequest,\n SelectResponse,\n SelectSuccessWithRowCount,\n VuuViewportCreateSuccessResponse,\n VuuViewportCreateResponse,\n InvalidTokenReason,\n InvalidSessionReason,\n LoginErrorMessage,\n RpcResult,\n RpcResultSuccess,\n RpcResultError,\n VuuColumnDataType,\n VuuNumericType,\n} from \"@vuu-ui/vuu-protocol-types\";\nimport { isView as componentInRegistry } from \"./component-registry\";\n\nconst MENU_RPC_TYPES = [\n \"VIEW_PORT_MENUS_SELECT_RPC\",\n \"VIEW_PORT_MENU_TABLE_RPC\",\n \"VIEW_PORT_MENU_ROW_RPC\",\n \"VIEW_PORT_MENU_CELL_RPC\",\n];\n\nexport const INVALID_SESSION: InvalidSessionReason = \"Invalid session\";\nexport const SESSION_LIMIT_EXCEEDED: InvalidSessionReason =\n \"User session limit exceeded\";\nexport const INVALID_TOKEN: InvalidTokenReason = \"Invalid token\";\nexport const TOKEN_EXPIRED: InvalidTokenReason = \"Token has expired\";\n\nconst InvalidLoginMessages: string[] = [\n INVALID_SESSION,\n SESSION_LIMIT_EXCEEDED,\n INVALID_TOKEN,\n TOKEN_EXPIRED,\n];\n\nexport const isLoginErrorMessage = (\n message: unknown,\n): message is LoginErrorMessage =>\n typeof message === \"string\" && InvalidLoginMessages.includes(message);\n\nexport const isSelectRequest = (message: object): message is SelectRequest =>\n message &&\n typeof message === \"object\" &&\n \"type\" in message &&\n (message.type === \"SELECT_ROW\" ||\n message.type === \"DESELECT_ROW\" ||\n message.type === \"SELECT_ROW_RANGE\" ||\n message.type === \"SELECT_ALL\" ||\n message.type === \"DESELECT_ALL\");\n\nexport const isSelectSuccessWithRowCount = (\n response: SelectResponse | SelectSuccessWithRowCount,\n): response is SelectSuccessWithRowCount =>\n [\n \"SELECT_ROW_SUCCESS\",\n \"DESELECT_ROW_SUCCESS\",\n \"SELECT_ROW_RANGE_SUCCESS\",\n \"SELECT_ALL_SUCCESS\",\n \"DESELECT_ALL_SUCCESS\",\n ].includes(response.type ?? \"\") &&\n typeof (response as SelectSuccessWithRowCount).selectedRowCount === \"number\";\n\nexport const isRpcServiceRequest = (message: {\n type: string;\n}): message is VuuRpcServiceRequest | Omit<VuuRpcServiceRequest, \"context\"> =>\n message.type === \"RPC_REQUEST\";\n\nexport const hasViewPortContext = (\n message: VuuRpcServiceRequest,\n): message is VuuRpcServiceRequest<ViewportRpcContext> =>\n message.context.type === \"VIEWPORT_CONTEXT\";\n\nexport const isVuuMenuRpcRequest = (\n message: VuuRpcRequest | Omit<VuuRpcRequest, \"vpId\">,\n): message is VuuRpcMenuRequest => MENU_RPC_TYPES.includes(message[\"type\"]);\n\nexport const isLoginResponse = (\n message: unknown,\n): message is VuuLoginSuccessResponse =>\n message !== null &&\n typeof message === \"object\" &&\n \"type\" in message &&\n (message.type === \"LOGIN_SUCCESS\" || message.type === \"LOGIN_FAIL\");\n\nexport const isRpcSuccess = (\n rpcResult?: RpcResult,\n): rpcResult is RpcResultSuccess => rpcResult?.type === \"SUCCESS_RESULT\";\n\nexport const isRpcError = (\n rpcResult?: RpcResult,\n): rpcResult is RpcResultError => rpcResult?.type === \"ERROR_RESULT\";\n\nexport const isRequestResponse = (\n message: object,\n): message is VuuUiMessageInRequestResponse => \"requestId\" in message;\n\nexport const isOpenSessionTableDialogMessage = (\n rpcResponse: RpcResponse,\n): rpcResponse is MenuRpcResponse<OpenDialogActionWithSchema> =>\n rpcResponse.type === \"VIEW_PORT_MENU_RESP\" &&\n isOpenDialogAction(rpcResponse.action) &&\n \"tableSchema\" in rpcResponse.action;\n\nexport const isOpenDialogAction = (\n action?: MenuRpcAction,\n): action is OpenDialogAction =>\n action !== undefined && action.type === \"OPEN_DIALOG_ACTION\";\n\nexport const isTypeaheadRequest = (\n request: Omit<VuuRpcRequest, \"vpId\">,\n): request is Omit<VuuViewportRpcTypeaheadRequest, \"vpId\"> => {\n return (\n isRpcServiceRequest(request) &&\n (request.rpcName === \"getUniqueFieldValues\" ||\n request.rpcName === \"getUniqueFieldValuesStartingWith\")\n );\n};\n\nexport const isCreateVpSuccess = (\n response: VuuViewportCreateResponse,\n): response is VuuViewportCreateSuccessResponse =>\n response.type === \"CREATE_VP_SUCCESS\";\n\nexport const isSessionTable = (table?: unknown) => {\n if (\n table !== null &&\n typeof table === \"object\" &&\n \"table\" in table &&\n \"module\" in table\n ) {\n return (table as VuuTable).table.startsWith(\"session\");\n }\n return false;\n};\n\nexport function isActionMessage(\n rpcResponse: VuuRpcResponse,\n): rpcResponse is VuuRpcMenuSuccess;\nexport function isActionMessage(\n rpcResponse: Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is Omit<VuuRpcMenuSuccess, \"vpId\">;\nexport function isActionMessage(\n rpcResponse: VuuRpcResponse | Omit<VuuRpcResponse, \"vpId\">,\n) {\n return rpcResponse.type === \"VIEW_PORT_MENU_RESP\";\n}\n\nexport function isSessionTableActionMessage(\n rpcResponse: VuuRpcResponse,\n): rpcResponse is VuuRpcMenuSuccess<\n OpenDialogAction & {\n tableSchema: TableSchema;\n }\n>;\nexport function isSessionTableActionMessage(\n rpcResponse: Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is Omit<\n VuuRpcMenuSuccess<\n OpenDialogAction & {\n tableSchema: TableSchema;\n }\n >,\n \"vpId\"\n>;\nexport function isSessionTableActionMessage(\n rpcResponse: VuuRpcResponse | Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is VuuRpcMenuSuccess<\n OpenDialogAction & {\n tableSchema: TableSchema;\n }\n> {\n return (\n isActionMessage(rpcResponse) &&\n isOpenDialogAction(rpcResponse.action) &&\n isSessionTable(rpcResponse.action.table) &&\n (rpcResponse.action?.renderComponent === \"inline-form\" ||\n rpcResponse.action?.renderComponent === \"grid\")\n );\n}\n\nexport function isCustomComponentActionMessage(\n rpcResponse: VuuRpcResponse | Omit<VuuRpcResponse, \"vpId\">,\n): rpcResponse is VuuRpcMenuSuccess<\n OpenComponentInDialogAction & {\n tableSchema: TableSchema;\n }\n> {\n return (\n isActionMessage(rpcResponse) &&\n isOpenDialogAction(rpcResponse.action) &&\n isSessionTable(rpcResponse.action.table) &&\n typeof rpcResponse.action.renderComponent === \"string\" &&\n componentInRegistry(rpcResponse.action.renderComponent)\n );\n}\n\nconst numericTypes: VuuNumericType[] = [\n \"int\",\n \"long\",\n \"double\",\n \"scaleddecimal2\",\n \"scaleddecimal4\",\n \"scaleddecimal6\",\n \"scaleddecimal8\",\n];\n\nexport function isNumericType(\n dataType?: VuuColumnDataType,\n): dataType is VuuNumericType {\n return numericTypes.includes(dataType as VuuNumericType);\n}\n"],"names":["componentInRegistry"],"mappings":"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"}