@vuu-ui/vuu-utils 2.1.14 → 2.1.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/node_modules/@dnd-kit/react/hooks.js +17 -17
- package/cjs/node_modules/@dnd-kit/react/hooks.js.map +1 -1
- package/cjs/node_modules/@dnd-kit/react/index.js +24 -24
- package/cjs/node_modules/@dnd-kit/react/index.js.map +1 -1
- package/cjs/node_modules/@dnd-kit/react/sortable.js +5 -5
- package/cjs/node_modules/@dnd-kit/react/sortable.js.map +1 -1
- package/cjs/packages/vuu-utils/src/ShellContext.js +3 -3
- package/cjs/packages/vuu-utils/src/ShellContext.js.map +1 -1
- package/cjs/packages/vuu-utils/src/ThemeProvider.js +10 -10
- package/cjs/packages/vuu-utils/src/ThemeProvider.js.map +1 -1
- package/cjs/packages/vuu-utils/src/context-definitions/DataContext.js +2 -2
- package/cjs/packages/vuu-utils/src/context-definitions/DataContext.js.map +1 -1
- package/cjs/packages/vuu-utils/src/context-definitions/DataProvider.js +4 -4
- package/cjs/packages/vuu-utils/src/context-definitions/DataProvider.js.map +1 -1
- package/cjs/packages/vuu-utils/src/context-definitions/DataSourceProvider.js +5 -5
- package/cjs/packages/vuu-utils/src/context-definitions/DataSourceProvider.js.map +1 -1
- package/cjs/packages/vuu-utils/src/context-definitions/WorkspaceContext.js +3 -3
- package/cjs/packages/vuu-utils/src/context-definitions/WorkspaceContext.js.map +1 -1
- package/cjs/packages/vuu-utils/src/data-editing/DataEditingProvider.js +5 -5
- package/cjs/packages/vuu-utils/src/data-editing/DataEditingProvider.js.map +1 -1
- package/cjs/packages/vuu-utils/src/data-editing/EditButtons.js +12 -15
- package/cjs/packages/vuu-utils/src/data-editing/EditButtons.js.map +1 -1
- package/cjs/packages/vuu-utils/src/data-editing/EditSession.js +52 -130
- package/cjs/packages/vuu-utils/src/data-editing/EditSession.js.map +1 -1
- package/cjs/packages/vuu-utils/src/data-editing/edit-utils.js +1 -32
- package/cjs/packages/vuu-utils/src/data-editing/edit-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/data-editing/useEditableTable.js +15 -23
- package/cjs/packages/vuu-utils/src/data-editing/useEditableTable.js.map +1 -1
- package/cjs/packages/vuu-utils/src/datasource/BaseDataSource.js +3 -2
- package/cjs/packages/vuu-utils/src/datasource/BaseDataSource.js.map +1 -1
- package/cjs/packages/vuu-utils/src/datasource/datasource-filter-utils.js +3 -3
- package/cjs/packages/vuu-utils/src/datasource/datasource-filter-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/date/date-utils.js +2 -2
- package/cjs/packages/vuu-utils/src/date/date-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/date/formatter.js +2 -2
- package/cjs/packages/vuu-utils/src/date/formatter.js.map +1 -1
- package/cjs/packages/vuu-utils/src/feature-utils.js +2 -2
- package/cjs/packages/vuu-utils/src/feature-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/index.js +2 -9
- package/cjs/packages/vuu-utils/src/index.js.map +1 -1
- package/cjs/packages/vuu-utils/src/protocol-message-utils.js +0 -10
- package/cjs/packages/vuu-utils/src/protocol-message-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/react-utils.js +8 -8
- package/cjs/packages/vuu-utils/src/react-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/theme-utils.js +3 -3
- package/cjs/packages/vuu-utils/src/theme-utils.js.map +1 -1
- package/cjs/packages/vuu-utils/src/useId.js +2 -2
- package/cjs/packages/vuu-utils/src/useId.js.map +1 -1
- package/cjs/packages/vuu-utils/src/useLayoutEffectSkipFirst.js +3 -3
- package/cjs/packages/vuu-utils/src/useLayoutEffectSkipFirst.js.map +1 -1
- package/cjs/packages/vuu-utils/src/useResizeObserver.js +5 -5
- package/cjs/packages/vuu-utils/src/useResizeObserver.js.map +1 -1
- package/cjs/packages/vuu-utils/src/useStateRef.js +4 -4
- package/cjs/packages/vuu-utils/src/useStateRef.js.map +1 -1
- package/esm/packages/vuu-utils/src/ThemeProvider.js +2 -2
- package/esm/packages/vuu-utils/src/ThemeProvider.js.map +1 -1
- package/esm/packages/vuu-utils/src/context-definitions/WorkspaceContext.js +2 -2
- package/esm/packages/vuu-utils/src/context-definitions/WorkspaceContext.js.map +1 -1
- package/esm/packages/vuu-utils/src/data-editing/EditButtons.js +4 -7
- package/esm/packages/vuu-utils/src/data-editing/EditButtons.js.map +1 -1
- package/esm/packages/vuu-utils/src/data-editing/EditSession.js +53 -130
- package/esm/packages/vuu-utils/src/data-editing/EditSession.js.map +1 -1
- package/esm/packages/vuu-utils/src/data-editing/edit-utils.js +2 -32
- package/esm/packages/vuu-utils/src/data-editing/edit-utils.js.map +1 -1
- package/esm/packages/vuu-utils/src/data-editing/useEditableTable.js +9 -17
- package/esm/packages/vuu-utils/src/data-editing/useEditableTable.js.map +1 -1
- package/esm/packages/vuu-utils/src/datasource/BaseDataSource.js +1 -0
- package/esm/packages/vuu-utils/src/datasource/BaseDataSource.js.map +1 -1
- package/esm/packages/vuu-utils/src/feature-utils.js +2 -2
- package/esm/packages/vuu-utils/src/feature-utils.js.map +1 -1
- package/esm/packages/vuu-utils/src/index.js +3 -3
- package/esm/packages/vuu-utils/src/protocol-message-utils.js +1 -6
- package/esm/packages/vuu-utils/src/protocol-message-utils.js.map +1 -1
- package/package.json +6 -6
- package/types/data-editing/EditButtons.d.ts +1 -1
- package/types/data-editing/EditSession.d.ts +6 -30
- package/types/data-editing/edit-utils.d.ts +0 -2
- package/types/data-editing/useEditableTable.d.ts +1 -1
- package/types/filters/filter-utils.d.ts +1 -2
- package/types/index.d.ts +2 -3
- package/types/protocol-message-utils.d.ts +1 -6
- package/cjs/packages/vuu-utils/dist/index.js +0 -6004
- package/cjs/packages/vuu-utils/dist/index.js.map +0 -1
- package/esm/packages/vuu-utils/dist/index.js +0 -5979
- package/esm/packages/vuu-utils/dist/index.js.map +0 -1
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var cx = require('clsx');
|
|
6
6
|
|
|
7
7
|
const DEFAULT_DENSITY = "medium";
|
|
8
8
|
const DEFAULT_THEME = "salt-theme";
|
|
9
9
|
const DEFAULT_THEME_MODE = "light";
|
|
10
|
-
const ThemeContext =
|
|
10
|
+
const ThemeContext = React.createContext({
|
|
11
11
|
density: "high",
|
|
12
12
|
theme: "vuu",
|
|
13
13
|
themeMode: "light"
|
|
@@ -18,7 +18,7 @@ const DEFAULT_THEME_ATTRIBUTES = [
|
|
|
18
18
|
"light"
|
|
19
19
|
];
|
|
20
20
|
const useThemeAttributes = (themeAttributes) => {
|
|
21
|
-
const context =
|
|
21
|
+
const context = React.useContext(ThemeContext);
|
|
22
22
|
if (themeAttributes) {
|
|
23
23
|
return [
|
|
24
24
|
themeAttributes.themeClass,
|
|
@@ -35,9 +35,9 @@ const useThemeAttributes = (themeAttributes) => {
|
|
|
35
35
|
return DEFAULT_THEME_ATTRIBUTES;
|
|
36
36
|
};
|
|
37
37
|
const createThemedChildren = (children, theme, themeMode, density) => {
|
|
38
|
-
if (
|
|
39
|
-
return
|
|
40
|
-
className:
|
|
38
|
+
if (React.isValidElement(children)) {
|
|
39
|
+
return React.cloneElement(children, {
|
|
40
|
+
className: cx(
|
|
41
41
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
42
42
|
children.props?.className,
|
|
43
43
|
`${theme}-theme`,
|
|
@@ -67,12 +67,12 @@ const ThemeProvider = ({
|
|
|
67
67
|
density: inheritedDensity,
|
|
68
68
|
themeMode: inheritedThemeMode,
|
|
69
69
|
theme: inheritedTheme
|
|
70
|
-
} =
|
|
70
|
+
} = React.useContext(ThemeContext);
|
|
71
71
|
const density = densityProp ?? inheritedDensity ?? DEFAULT_DENSITY;
|
|
72
72
|
const themeMode = themeModeProp ?? inheritedThemeMode ?? DEFAULT_THEME_MODE;
|
|
73
73
|
const theme = themeProp ?? inheritedTheme ?? DEFAULT_THEME;
|
|
74
74
|
const themedChildren = applyThemeClasses ? createThemedChildren(children, theme, themeMode, density) : children;
|
|
75
|
-
return /* @__PURE__ */
|
|
75
|
+
return /* @__PURE__ */ jsxRuntime.jsx(ThemeContext.Provider, { value: { themeMode, density, theme }, children: themedChildren });
|
|
76
76
|
};
|
|
77
77
|
ThemeProvider.displayName = "ThemeProvider";
|
|
78
78
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThemeProvider.js","sources":["../../../../../../packages/vuu-utils/src/ThemeProvider.tsx"],"sourcesContent":["import React, {\n createContext,\n HTMLAttributes,\n ReactNode,\n isValidElement,\n cloneElement,\n useContext,\n} from \"react\";\nimport cx from \"clsx\";\n\nexport const DEFAULT_DENSITY: Density = \"medium\";\nexport const DEFAULT_THEME = \"salt-theme\";\nexport const DEFAULT_THEME_MODE: ThemeMode = \"light\";\n\nexport type Density = \"high\" | \"medium\" | \"low\" | \"touch\";\nexport type ThemeMode = \"light\" | \"dark\";\nexport type TargetElement = \"root\" | \"scope\" | \"child\";\n\nexport interface ThemeContextProps {\n density: Density;\n theme: string;\n themeMode: ThemeMode;\n}\n\nexport const ThemeContext = createContext<ThemeContextProps>({\n density: \"high\",\n theme: \"vuu\",\n themeMode: \"light\",\n});\n\nexport type ThemeClasses = [string, string, ThemeMode];\n\nconst DEFAULT_THEME_ATTRIBUTES: ThemeClasses = [\n \"vuu\",\n \"salt-density-high\",\n \"light\" as ThemeMode,\n];\n\nexport type ThemeAttributes = {\n themeClass: string;\n densityClass: string;\n dataMode: ThemeMode;\n};\n\nexport const useThemeAttributes = (\n themeAttributes?: ThemeAttributes\n): [string, string, ThemeMode] => {\n const context = useContext(ThemeContext);\n if (themeAttributes) {\n return [\n themeAttributes.themeClass,\n themeAttributes.densityClass,\n themeAttributes.dataMode,\n ];\n } else if (context) {\n return [\n `${context.theme}-theme`,\n `salt-density-${context.density}`,\n context.themeMode,\n ];\n }\n return DEFAULT_THEME_ATTRIBUTES;\n};\n\nconst createThemedChildren = (\n children: ReactNode,\n theme: string,\n themeMode: ThemeMode,\n density: Density\n) => {\n if (isValidElement<HTMLAttributes<HTMLElement>>(children)) {\n return cloneElement(children, {\n className: cx(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n children.props?.className,\n `${theme}-theme`,\n `salt-density-${density}`\n ),\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n \"data-mode\": themeMode,\n });\n } else {\n console.warn(\n `\\nThemeProvider can only apply CSS classes for theming to a single nested child element of the ThemeProvider.\n Wrap elements with a single container`\n );\n return children;\n }\n};\n\ninterface ThemeProviderProps {\n applyThemeClasses?: boolean;\n children: ReactNode;\n density?: Density;\n theme?: string;\n themeMode?: ThemeMode;\n}\n\nexport const ThemeProvider = ({\n applyThemeClasses = false,\n children,\n theme: themeProp,\n themeMode: themeModeProp,\n density: densityProp,\n}: ThemeProviderProps) => {\n const {\n density: inheritedDensity,\n themeMode: inheritedThemeMode,\n theme: inheritedTheme,\n } = useContext(ThemeContext);\n const density = densityProp ?? inheritedDensity ?? DEFAULT_DENSITY;\n const themeMode = themeModeProp ?? inheritedThemeMode ?? DEFAULT_THEME_MODE;\n const theme = themeProp ?? inheritedTheme ?? DEFAULT_THEME;\n const themedChildren = applyThemeClasses\n ? createThemedChildren(children, theme, themeMode, density)\n : children;\n\n return (\n <ThemeContext.Provider value={{ themeMode, density, theme }}>\n {themedChildren}\n </ThemeContext.Provider>\n );\n};\n\nThemeProvider.displayName = \"ThemeProvider\";\n"],"names":["createContext","useContext","isValidElement","cloneElement","
|
|
1
|
+
{"version":3,"file":"ThemeProvider.js","sources":["../../../../../../packages/vuu-utils/src/ThemeProvider.tsx"],"sourcesContent":["import React, {\n createContext,\n HTMLAttributes,\n ReactNode,\n isValidElement,\n cloneElement,\n useContext,\n} from \"react\";\nimport cx from \"clsx\";\n\nexport const DEFAULT_DENSITY: Density = \"medium\";\nexport const DEFAULT_THEME = \"salt-theme\";\nexport const DEFAULT_THEME_MODE: ThemeMode = \"light\";\n\nexport type Density = \"high\" | \"medium\" | \"low\" | \"touch\";\nexport type ThemeMode = \"light\" | \"dark\";\nexport type TargetElement = \"root\" | \"scope\" | \"child\";\n\nexport interface ThemeContextProps {\n density: Density;\n theme: string;\n themeMode: ThemeMode;\n}\n\nexport const ThemeContext = createContext<ThemeContextProps>({\n density: \"high\",\n theme: \"vuu\",\n themeMode: \"light\",\n});\n\nexport type ThemeClasses = [string, string, ThemeMode];\n\nconst DEFAULT_THEME_ATTRIBUTES: ThemeClasses = [\n \"vuu\",\n \"salt-density-high\",\n \"light\" as ThemeMode,\n];\n\nexport type ThemeAttributes = {\n themeClass: string;\n densityClass: string;\n dataMode: ThemeMode;\n};\n\nexport const useThemeAttributes = (\n themeAttributes?: ThemeAttributes\n): [string, string, ThemeMode] => {\n const context = useContext(ThemeContext);\n if (themeAttributes) {\n return [\n themeAttributes.themeClass,\n themeAttributes.densityClass,\n themeAttributes.dataMode,\n ];\n } else if (context) {\n return [\n `${context.theme}-theme`,\n `salt-density-${context.density}`,\n context.themeMode,\n ];\n }\n return DEFAULT_THEME_ATTRIBUTES;\n};\n\nconst createThemedChildren = (\n children: ReactNode,\n theme: string,\n themeMode: ThemeMode,\n density: Density\n) => {\n if (isValidElement<HTMLAttributes<HTMLElement>>(children)) {\n return cloneElement(children, {\n className: cx(\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n children.props?.className,\n `${theme}-theme`,\n `salt-density-${density}`\n ),\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-expect-error\n \"data-mode\": themeMode,\n });\n } else {\n console.warn(\n `\\nThemeProvider can only apply CSS classes for theming to a single nested child element of the ThemeProvider.\n Wrap elements with a single container`\n );\n return children;\n }\n};\n\ninterface ThemeProviderProps {\n applyThemeClasses?: boolean;\n children: ReactNode;\n density?: Density;\n theme?: string;\n themeMode?: ThemeMode;\n}\n\nexport const ThemeProvider = ({\n applyThemeClasses = false,\n children,\n theme: themeProp,\n themeMode: themeModeProp,\n density: densityProp,\n}: ThemeProviderProps) => {\n const {\n density: inheritedDensity,\n themeMode: inheritedThemeMode,\n theme: inheritedTheme,\n } = useContext(ThemeContext);\n const density = densityProp ?? inheritedDensity ?? DEFAULT_DENSITY;\n const themeMode = themeModeProp ?? inheritedThemeMode ?? DEFAULT_THEME_MODE;\n const theme = themeProp ?? inheritedTheme ?? DEFAULT_THEME;\n const themedChildren = applyThemeClasses\n ? createThemedChildren(children, theme, themeMode, density)\n : children;\n\n return (\n <ThemeContext.Provider value={{ themeMode, density, theme }}>\n {themedChildren}\n </ThemeContext.Provider>\n );\n};\n\nThemeProvider.displayName = \"ThemeProvider\";\n"],"names":["createContext","useContext","isValidElement","cloneElement","jsx"],"mappings":";;;;;;AAUO,MAAM,eAA2B,GAAA;AACjC,MAAM,aAAgB,GAAA;AACtB,MAAM,kBAAgC,GAAA;AAYtC,MAAM,eAAeA,mBAAiC,CAAA;AAAA,EAC3D,OAAS,EAAA,MAAA;AAAA,EACT,KAAO,EAAA,KAAA;AAAA,EACP,SAAW,EAAA;AACb,CAAC;AAID,MAAM,wBAAyC,GAAA;AAAA,EAC7C,KAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF,CAAA;AAQa,MAAA,kBAAA,GAAqB,CAChC,eACgC,KAAA;AAChC,EAAM,MAAA,OAAA,GAAUC,iBAAW,YAAY,CAAA;AACvC,EAAA,IAAI,eAAiB,EAAA;AACnB,IAAO,OAAA;AAAA,MACL,eAAgB,CAAA,UAAA;AAAA,MAChB,eAAgB,CAAA,YAAA;AAAA,MAChB,eAAgB,CAAA;AAAA,KAClB;AAAA,aACS,OAAS,EAAA;AAClB,IAAO,OAAA;AAAA,MACL,CAAA,EAAG,QAAQ,KAAK,CAAA,MAAA,CAAA;AAAA,MAChB,CAAA,aAAA,EAAgB,QAAQ,OAAO,CAAA,CAAA;AAAA,MAC/B,OAAQ,CAAA;AAAA,KACV;AAAA;AAEF,EAAO,OAAA,wBAAA;AACT;AAEA,MAAM,oBAAuB,GAAA,CAC3B,QACA,EAAA,KAAA,EACA,WACA,OACG,KAAA;AACH,EAAI,IAAAC,oBAAA,CAA4C,QAAQ,CAAG,EAAA;AACzD,IAAA,OAAOC,mBAAa,QAAU,EAAA;AAAA,MAC5B,SAAW,EAAA,EAAA;AAAA;AAAA,QAET,SAAS,KAAO,EAAA,SAAA;AAAA,QAChB,GAAG,KAAK,CAAA,MAAA,CAAA;AAAA,QACR,gBAAgB,OAAO,CAAA;AAAA,OACzB;AAAA;AAAA;AAAA,MAGA,WAAa,EAAA;AAAA,KACd,CAAA;AAAA,GACI,MAAA;AACL,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN;AAAA;AAAA,iDAAA;AAAA,KAEF;AACA,IAAO,OAAA,QAAA;AAAA;AAEX,CAAA;AAUO,MAAM,gBAAgB,CAAC;AAAA,EAC5B,iBAAoB,GAAA,KAAA;AAAA,EACpB,QAAA;AAAA,EACA,KAAO,EAAA,SAAA;AAAA,EACP,SAAW,EAAA,aAAA;AAAA,EACX,OAAS,EAAA;AACX,CAA0B,KAAA;AACxB,EAAM,MAAA;AAAA,IACJ,OAAS,EAAA,gBAAA;AAAA,IACT,SAAW,EAAA,kBAAA;AAAA,IACX,KAAO,EAAA;AAAA,GACT,GAAIF,iBAAW,YAAY,CAAA;AAC3B,EAAM,MAAA,OAAA,GAAU,eAAe,gBAAoB,IAAA,eAAA;AACnD,EAAM,MAAA,SAAA,GAAY,iBAAiB,kBAAsB,IAAA,kBAAA;AACzD,EAAM,MAAA,KAAA,GAAQ,aAAa,cAAkB,IAAA,aAAA;AAC7C,EAAA,MAAM,iBAAiB,iBACnB,GAAA,oBAAA,CAAqB,UAAU,KAAO,EAAA,SAAA,EAAW,OAAO,CACxD,GAAA,QAAA;AAEJ,EACE,uBAAAG,cAAA,CAAC,YAAa,CAAA,QAAA,EAAb,EAAsB,KAAA,EAAO,EAAE,SAAW,EAAA,OAAA,EAAS,KAAM,EAAA,EACvD,QACH,EAAA,cAAA,EAAA,CAAA;AAEJ;AAEA,aAAA,CAAc,WAAc,GAAA,eAAA;;;;;;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var React = require('react');
|
|
4
4
|
|
|
5
5
|
const getServerAPI = () => {
|
|
6
6
|
throw Error("no DataProvider has been installed");
|
|
@@ -10,7 +10,7 @@ class NullDataSourceConstructor {
|
|
|
10
10
|
throw Error("no DataProvider has been installed");
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
|
-
const DataContext =
|
|
13
|
+
const DataContext = React.createContext({
|
|
14
14
|
isLocalData: false,
|
|
15
15
|
getServerAPI,
|
|
16
16
|
VuuDataSource: NullDataSourceConstructor
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataContext.js","sources":["../../../../../../../packages/vuu-utils/src/context-definitions/DataContext.tsx"],"sourcesContent":["import type {\n DataSource,\n DataSourceConstructorProps,\n ServerAPI,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport { createContext } from \"react\";\n\nexport type DataSourceConstructor = {\n new (props: DataSourceConstructorProps): DataSource;\n};\n\nexport interface DataContextProps {\n VuuDataSource: DataSourceConstructor;\n isLocalData: boolean;\n getServerAPI: () => Promise<\n Pick<ServerAPI, \"getTableList\" | \"getTableSchema\" | \"rpcCall\">\n >;\n /**\n * A tableSchema would normally be requested via the serverAPI.\n * schemas can be injected, in which case these 'local' schemas\n * will be returned from the getTableSchema API call.\n * The key is formed from concatenation of module and tableName\n * from VuuTable e.g 'SIMUL:instruments'\n */\n tableSchemas?: Record<string, TableSchema>;\n}\n\nconst getServerAPI = () => {\n throw Error(\"no DataProvider has been installed\");\n};\n\nexport class NullDataSourceConstructor {\n constructor(_: DataSourceConstructorProps) {\n throw Error(\"no DataProvider has been installed\");\n }\n}\n\nexport const DataContext = createContext<DataContextProps>({\n isLocalData: false,\n getServerAPI,\n VuuDataSource: NullDataSourceConstructor as DataSourceConstructor,\n});\n"],"names":["createContext"],"mappings":";;;;AA4BA,MAAM,eAAe,MAAM;AACzB,EAAA,MAAM,MAAM,oCAAoC,CAAA;AAClD,CAAA;AAEO,MAAM,yBAA0B,CAAA;AAAA,EACrC,YAAY,CAA+B,EAAA;AACzC,IAAA,MAAM,MAAM,oCAAoC,CAAA;AAAA;AAEpD;AAEO,MAAM,cAAcA
|
|
1
|
+
{"version":3,"file":"DataContext.js","sources":["../../../../../../../packages/vuu-utils/src/context-definitions/DataContext.tsx"],"sourcesContent":["import type {\n DataSource,\n DataSourceConstructorProps,\n ServerAPI,\n TableSchema,\n} from \"@vuu-ui/vuu-data-types\";\nimport { createContext } from \"react\";\n\nexport type DataSourceConstructor = {\n new (props: DataSourceConstructorProps): DataSource;\n};\n\nexport interface DataContextProps {\n VuuDataSource: DataSourceConstructor;\n isLocalData: boolean;\n getServerAPI: () => Promise<\n Pick<ServerAPI, \"getTableList\" | \"getTableSchema\" | \"rpcCall\">\n >;\n /**\n * A tableSchema would normally be requested via the serverAPI.\n * schemas can be injected, in which case these 'local' schemas\n * will be returned from the getTableSchema API call.\n * The key is formed from concatenation of module and tableName\n * from VuuTable e.g 'SIMUL:instruments'\n */\n tableSchemas?: Record<string, TableSchema>;\n}\n\nconst getServerAPI = () => {\n throw Error(\"no DataProvider has been installed\");\n};\n\nexport class NullDataSourceConstructor {\n constructor(_: DataSourceConstructorProps) {\n throw Error(\"no DataProvider has been installed\");\n }\n}\n\nexport const DataContext = createContext<DataContextProps>({\n isLocalData: false,\n getServerAPI,\n VuuDataSource: NullDataSourceConstructor as DataSourceConstructor,\n});\n"],"names":["createContext"],"mappings":";;;;AA4BA,MAAM,eAAe,MAAM;AACzB,EAAA,MAAM,MAAM,oCAAoC,CAAA;AAClD,CAAA;AAEO,MAAM,yBAA0B,CAAA;AAAA,EACrC,YAAY,CAA+B,EAAA;AACzC,IAAA,MAAM,MAAM,oCAAoC,CAAA;AAAA;AAEpD;AAEO,MAAM,cAAcA,mBAAgC,CAAA;AAAA,EACzD,WAAa,EAAA,KAAA;AAAA,EACb,YAAA;AAAA,EACA,aAAe,EAAA;AACjB,CAAC;;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
5
|
var DataContext = require('./DataContext.js');
|
|
6
6
|
|
|
7
7
|
const DataProvider = ({
|
|
@@ -10,9 +10,9 @@ const DataProvider = ({
|
|
|
10
10
|
isLocalData = true,
|
|
11
11
|
VuuDataSource
|
|
12
12
|
}) => {
|
|
13
|
-
return /* @__PURE__ */
|
|
13
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DataContext.DataContext.Provider, { value: { isLocalData, VuuDataSource, getServerAPI }, children });
|
|
14
14
|
};
|
|
15
|
-
const useData = () =>
|
|
15
|
+
const useData = () => React.useContext(DataContext.DataContext);
|
|
16
16
|
|
|
17
17
|
exports.DataProvider = DataProvider;
|
|
18
18
|
exports.useData = useData;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataProvider.js","sources":["../../../../../../../packages/vuu-utils/src/context-definitions/DataProvider.tsx"],"sourcesContent":["import { ReactNode, useContext } from \"react\";\nimport { DataContext, DataContextProps } from \"./DataContext\";\n\nexport const DataProvider = ({\n children,\n getServerAPI,\n isLocalData = true,\n VuuDataSource,\n}: Omit<DataContextProps, \"isLocalData\"> & {\n children: ReactNode;\n isLocalData?: boolean;\n}) => {\n return (\n <DataContext.Provider value={{ isLocalData, VuuDataSource, getServerAPI }}>\n {children}\n </DataContext.Provider>\n );\n};\n\nexport const useData = () => useContext(DataContext);\n"],"names":["jsx","DataContext","useContext"],"mappings":";;;;;;AAGO,MAAM,eAAe,CAAC;AAAA,EAC3B,QAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAc,GAAA,IAAA;AAAA,EACd;AACF,CAGM,KAAA;AACJ,EACE,uBAAAA,
|
|
1
|
+
{"version":3,"file":"DataProvider.js","sources":["../../../../../../../packages/vuu-utils/src/context-definitions/DataProvider.tsx"],"sourcesContent":["import { ReactNode, useContext } from \"react\";\nimport { DataContext, DataContextProps } from \"./DataContext\";\n\nexport const DataProvider = ({\n children,\n getServerAPI,\n isLocalData = true,\n VuuDataSource,\n}: Omit<DataContextProps, \"isLocalData\"> & {\n children: ReactNode;\n isLocalData?: boolean;\n}) => {\n return (\n <DataContext.Provider value={{ isLocalData, VuuDataSource, getServerAPI }}>\n {children}\n </DataContext.Provider>\n );\n};\n\nexport const useData = () => useContext(DataContext);\n"],"names":["jsx","DataContext","useContext"],"mappings":";;;;;;AAGO,MAAM,eAAe,CAAC;AAAA,EAC3B,QAAA;AAAA,EACA,YAAA;AAAA,EACA,WAAc,GAAA,IAAA;AAAA,EACd;AACF,CAGM,KAAA;AACJ,EACE,uBAAAA,cAAA,CAACC,uBAAY,CAAA,QAAA,EAAZ,EAAqB,KAAA,EAAO,EAAE,WAAa,EAAA,aAAA,EAAe,YAAa,EAAA,EACrE,QACH,EAAA,CAAA;AAEJ;AAEa,MAAA,OAAA,GAAU,MAAMC,gBAAA,CAAWD,uBAAW;;;;;"}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
5
|
|
|
6
|
-
const DataSourceContext =
|
|
6
|
+
const DataSourceContext = React.createContext({
|
|
7
7
|
dataSource: void 0
|
|
8
8
|
});
|
|
9
9
|
const DataSourceProvider = ({
|
|
10
10
|
children,
|
|
11
11
|
dataSource
|
|
12
12
|
}) => {
|
|
13
|
-
return /* @__PURE__ */
|
|
13
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DataSourceContext.Provider, { value: { dataSource }, children });
|
|
14
14
|
};
|
|
15
15
|
function useDataSource(throwIfNoDataSource = false) {
|
|
16
|
-
const { dataSource } =
|
|
16
|
+
const { dataSource } = React.useContext(DataSourceContext);
|
|
17
17
|
if (dataSource) {
|
|
18
18
|
return dataSource;
|
|
19
19
|
} else if (throwIfNoDataSource) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataSourceProvider.js","sources":["../../../../../../../packages/vuu-utils/src/context-definitions/DataSourceProvider.tsx"],"sourcesContent":["import { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport { createContext, ReactNode, useContext } from \"react\";\n\nexport interface DataSourceContextProps {\n dataSource?: DataSource;\n}\n\nexport const DataSourceContext = createContext<DataSourceContextProps>({\n dataSource: undefined,\n});\n\nexport const DataSourceProvider = ({\n children,\n dataSource,\n}: {\n children: ReactNode;\n dataSource: DataSource;\n}) => {\n return (\n <DataSourceContext.Provider value={{ dataSource }}>\n {children}\n </DataSourceContext.Provider>\n );\n};\n\nexport function useDataSource(throwIfNoDataSource: true): DataSource;\nexport function useDataSource(\n throwIfNoDataSource: false | undefined,\n): DataSource | undefined;\nexport function useDataSource(throwIfNoDataSource = false) {\n const { dataSource } = useContext(DataSourceContext);\n if (dataSource) {\n return dataSource;\n } else if (throwIfNoDataSource) {\n throw Error(\n `[DataSOurceProvider] useDataSource,no DataSourceProvider has been declared `,\n );\n } else {\n console.warn(\n `[DataSourceProvider] useDataSource: no DataSourceProvider has been declared`,\n );\n }\n}\n"],"names":["createContext","jsx","useContext"],"mappings":";;;;;AAOO,MAAM,oBAAoBA
|
|
1
|
+
{"version":3,"file":"DataSourceProvider.js","sources":["../../../../../../../packages/vuu-utils/src/context-definitions/DataSourceProvider.tsx"],"sourcesContent":["import { DataSource } from \"@vuu-ui/vuu-data-types\";\nimport { createContext, ReactNode, useContext } from \"react\";\n\nexport interface DataSourceContextProps {\n dataSource?: DataSource;\n}\n\nexport const DataSourceContext = createContext<DataSourceContextProps>({\n dataSource: undefined,\n});\n\nexport const DataSourceProvider = ({\n children,\n dataSource,\n}: {\n children: ReactNode;\n dataSource: DataSource;\n}) => {\n return (\n <DataSourceContext.Provider value={{ dataSource }}>\n {children}\n </DataSourceContext.Provider>\n );\n};\n\nexport function useDataSource(throwIfNoDataSource: true): DataSource;\nexport function useDataSource(\n throwIfNoDataSource: false | undefined,\n): DataSource | undefined;\nexport function useDataSource(throwIfNoDataSource = false) {\n const { dataSource } = useContext(DataSourceContext);\n if (dataSource) {\n return dataSource;\n } else if (throwIfNoDataSource) {\n throw Error(\n `[DataSOurceProvider] useDataSource,no DataSourceProvider has been declared `,\n );\n } else {\n console.warn(\n `[DataSourceProvider] useDataSource: no DataSourceProvider has been declared`,\n );\n }\n}\n"],"names":["createContext","jsx","useContext"],"mappings":";;;;;AAOO,MAAM,oBAAoBA,mBAAsC,CAAA;AAAA,EACrE,UAAY,EAAA,KAAA;AACd,CAAC;AAEM,MAAM,qBAAqB,CAAC;AAAA,EACjC,QAAA;AAAA,EACA;AACF,CAGM,KAAA;AACJ,EACE,uBAAAC,cAAA,CAAC,kBAAkB,QAAlB,EAAA,EAA2B,OAAO,EAAE,UAAA,IAClC,QACH,EAAA,CAAA;AAEJ;AAMgB,SAAA,aAAA,CAAc,sBAAsB,KAAO,EAAA;AACzD,EAAA,MAAM,EAAE,UAAA,EAAe,GAAAC,gBAAA,CAAW,iBAAiB,CAAA;AACnD,EAAA,IAAI,UAAY,EAAA;AACd,IAAO,OAAA,UAAA;AAAA,aACE,mBAAqB,EAAA;AAC9B,IAAM,MAAA,KAAA;AAAA,MACJ,CAAA,2EAAA;AAAA,KACF;AAAA,GACK,MAAA;AACL,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN,CAAA,2EAAA;AAAA,KACF;AAAA;AAEJ;;;;;;"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var React = require('react');
|
|
4
4
|
|
|
5
|
-
const WorkspaceContext =
|
|
5
|
+
const WorkspaceContext = React.createContext({
|
|
6
6
|
getApplicationSettings: () => void 0,
|
|
7
7
|
layoutMetadata: [],
|
|
8
8
|
saveLayout: () => void 0,
|
|
@@ -11,7 +11,7 @@ const WorkspaceContext = __WEBPACK_EXTERNAL_MODULE_react__.createContext({
|
|
|
11
11
|
loadLayoutById: () => void 0
|
|
12
12
|
});
|
|
13
13
|
const usePlaceholderJSON = () => {
|
|
14
|
-
const { layoutPlaceholderJSON } =
|
|
14
|
+
const { layoutPlaceholderJSON } = React.useContext(WorkspaceContext);
|
|
15
15
|
return layoutPlaceholderJSON;
|
|
16
16
|
};
|
|
17
17
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WorkspaceContext.js","sources":["../../../../../../../packages/vuu-utils/src/context-definitions/WorkspaceContext.tsx"],"sourcesContent":["import React, { useContext } from \"react\";\nimport {\n ApplicationSetting,\n ApplicationSettings,\n LayoutJSON\n} from \"../json-types\";\nimport { LayoutMetadata, LayoutMetadataDto } from \"../layout-types\";\n\nexport interface WorkspaceContextProps {\n layoutMetadata: LayoutMetadata[];\n layoutPlaceholderJSON?: LayoutJSON;\n getApplicationSettings: (\n key?: keyof ApplicationSettings\n ) => ApplicationSettings | ApplicationSetting | undefined;\n loadLayoutById: (id: string) => void;\n saveApplicationSettings: (\n settings: ApplicationSettings | ApplicationSetting,\n key?: keyof ApplicationSettings\n ) => void;\n saveLayout: (n: LayoutMetadataDto) => void;\n saveApplicationLayout: (layout: LayoutJSON) => void;\n workspaceJSON?: LayoutJSON | LayoutJSON[];\n}\n\nexport const WorkspaceContext = React.createContext<WorkspaceContextProps>({\n getApplicationSettings: () => undefined,\n layoutMetadata: [],\n saveLayout: () => undefined,\n saveApplicationLayout: () => undefined,\n saveApplicationSettings: () => undefined,\n loadLayoutById: () => undefined\n});\n\nexport const usePlaceholderJSON = () => {\n const { layoutPlaceholderJSON } = useContext(WorkspaceContext);\n return layoutPlaceholderJSON;\n};\n"],"names":["
|
|
1
|
+
{"version":3,"file":"WorkspaceContext.js","sources":["../../../../../../../packages/vuu-utils/src/context-definitions/WorkspaceContext.tsx"],"sourcesContent":["import React, { useContext } from \"react\";\nimport {\n ApplicationSetting,\n ApplicationSettings,\n LayoutJSON\n} from \"../json-types\";\nimport { LayoutMetadata, LayoutMetadataDto } from \"../layout-types\";\n\nexport interface WorkspaceContextProps {\n layoutMetadata: LayoutMetadata[];\n layoutPlaceholderJSON?: LayoutJSON;\n getApplicationSettings: (\n key?: keyof ApplicationSettings\n ) => ApplicationSettings | ApplicationSetting | undefined;\n loadLayoutById: (id: string) => void;\n saveApplicationSettings: (\n settings: ApplicationSettings | ApplicationSetting,\n key?: keyof ApplicationSettings\n ) => void;\n saveLayout: (n: LayoutMetadataDto) => void;\n saveApplicationLayout: (layout: LayoutJSON) => void;\n workspaceJSON?: LayoutJSON | LayoutJSON[];\n}\n\nexport const WorkspaceContext = React.createContext<WorkspaceContextProps>({\n getApplicationSettings: () => undefined,\n layoutMetadata: [],\n saveLayout: () => undefined,\n saveApplicationLayout: () => undefined,\n saveApplicationSettings: () => undefined,\n loadLayoutById: () => undefined\n});\n\nexport const usePlaceholderJSON = () => {\n const { layoutPlaceholderJSON } = useContext(WorkspaceContext);\n return layoutPlaceholderJSON;\n};\n"],"names":["useContext"],"mappings":";;;;AAwBa,MAAA,gBAAA,GAAmB,MAAM,aAAqC,CAAA;AAAA,EACzE,wBAAwB,MAAM,KAAA,CAAA;AAAA,EAC9B,gBAAgB,EAAC;AAAA,EACjB,YAAY,MAAM,KAAA,CAAA;AAAA,EAClB,uBAAuB,MAAM,KAAA,CAAA;AAAA,EAC7B,yBAAyB,MAAM,KAAA,CAAA;AAAA,EAC/B,gBAAgB,MAAM,KAAA;AACxB,CAAC;AAEM,MAAM,qBAAqB,MAAM;AACtC,EAAA,MAAM,EAAE,qBAAA,EAA0B,GAAAA,gBAAA,CAAW,gBAAgB,CAAA;AAC7D,EAAO,OAAA,qBAAA;AACT;;;;;"}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
5
|
|
|
6
|
-
const DataEditingContext =
|
|
6
|
+
const DataEditingContext = React.createContext(void 0);
|
|
7
7
|
const DataEditingProvider = ({
|
|
8
8
|
children,
|
|
9
9
|
editSession
|
|
10
10
|
}) => {
|
|
11
|
-
return /* @__PURE__ */
|
|
11
|
+
return /* @__PURE__ */ jsxRuntime.jsx(DataEditingContext.Provider, { value: editSession, children });
|
|
12
12
|
};
|
|
13
13
|
function useEditSession(throwIfUnavailable = false) {
|
|
14
|
-
const editSession =
|
|
14
|
+
const editSession = React.useContext(DataEditingContext);
|
|
15
15
|
if (editSession === void 0) {
|
|
16
16
|
if (throwIfUnavailable) {
|
|
17
17
|
throw Error(
|
|
@@ -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 { 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,
|
|
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;;;;;"}
|
|
@@ -1,32 +1,29 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var core = require('@salt-ds/core');
|
|
5
|
+
var React = require('react');
|
|
6
6
|
|
|
7
7
|
const EditButtons = ({
|
|
8
8
|
editSession,
|
|
9
9
|
onCancel,
|
|
10
10
|
onSave
|
|
11
11
|
}) => {
|
|
12
|
-
const [editState, setEditState] =
|
|
13
|
-
|
|
14
|
-
onSave(editState === "stale");
|
|
15
|
-
}, [editState, onSave]);
|
|
16
|
-
__WEBPACK_EXTERNAL_MODULE_react__.useMemo(() => {
|
|
12
|
+
const [editState, setEditState] = React.useState("clean");
|
|
13
|
+
React.useMemo(() => {
|
|
17
14
|
editSession?.on("editState", setEditState);
|
|
18
15
|
}, [editSession]);
|
|
19
|
-
return /* @__PURE__ */
|
|
20
|
-
/* @__PURE__ */
|
|
21
|
-
|
|
16
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
17
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
18
|
+
core.Button,
|
|
22
19
|
{
|
|
23
|
-
disabled: editState === "clean"
|
|
24
|
-
onClick:
|
|
20
|
+
disabled: editState === "clean",
|
|
21
|
+
onClick: onSave,
|
|
25
22
|
sentiment: "accented",
|
|
26
|
-
children:
|
|
23
|
+
children: "Save"
|
|
27
24
|
}
|
|
28
25
|
),
|
|
29
|
-
/* @__PURE__ */
|
|
26
|
+
/* @__PURE__ */ jsxRuntime.jsx(core.Button, { onClick: onCancel, children: "Cancel" })
|
|
30
27
|
] });
|
|
31
28
|
};
|
|
32
29
|
|
|
@@ -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, EditSession } from \"./EditSession\";\nimport {
|
|
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 index = require('../../dist/index.js');
|
|
5
4
|
|
|
6
5
|
var __typeError = (msg) => {
|
|
7
6
|
throw TypeError(msg);
|
|
@@ -10,28 +9,26 @@ 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 _rowEdits, _editCount,
|
|
14
|
-
class StaleUpdateError extends Error {
|
|
15
|
-
}
|
|
12
|
+
var _active, _rowEdits, _editCount, _sourceTableDataSource, _sessionDataSource, _inEditMode;
|
|
16
13
|
class EditSession extends eventEmitter.EventEmitter {
|
|
17
14
|
constructor(dataSource) {
|
|
18
15
|
super();
|
|
16
|
+
__privateAdd(this, _active, false);
|
|
19
17
|
/**
|
|
20
18
|
* Row key => row edits
|
|
21
19
|
*/
|
|
22
20
|
__privateAdd(this, _rowEdits, /* @__PURE__ */ new Map());
|
|
23
21
|
__privateAdd(this, _editCount, 0);
|
|
24
|
-
__privateAdd(this, _invalidCount, 0);
|
|
25
22
|
__privateAdd(this, _sourceTableDataSource);
|
|
26
23
|
__privateAdd(this, _sessionDataSource);
|
|
27
24
|
__privateAdd(this, _inEditMode, false);
|
|
28
25
|
__privateSet(this, _sourceTableDataSource, dataSource);
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
26
|
+
}
|
|
27
|
+
get active() {
|
|
28
|
+
return __privateGet(this, _active);
|
|
29
|
+
}
|
|
30
|
+
set active(isActive) {
|
|
31
|
+
__privateSet(this, _active, isActive);
|
|
35
32
|
}
|
|
36
33
|
get editCount() {
|
|
37
34
|
return __privateGet(this, _editCount);
|
|
@@ -47,51 +44,22 @@ class EditSession extends eventEmitter.EventEmitter {
|
|
|
47
44
|
}
|
|
48
45
|
}
|
|
49
46
|
}
|
|
50
|
-
get invalidCount() {
|
|
51
|
-
return __privateGet(this, _invalidCount);
|
|
52
|
-
}
|
|
53
|
-
set invalidCount(val) {
|
|
54
|
-
if (val !== __privateGet(this, _invalidCount)) {
|
|
55
|
-
const oldCount = __privateGet(this, _invalidCount);
|
|
56
|
-
__privateSet(this, _invalidCount, val);
|
|
57
|
-
if (val === 0) {
|
|
58
|
-
this.emit("editState", __privateGet(this, _editCount) === 0 ? "clean" : "dirty");
|
|
59
|
-
} else if (oldCount === 0) {
|
|
60
|
-
this.emit("editState", "invalid");
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
47
|
clear() {
|
|
65
48
|
__privateGet(this, _rowEdits).clear();
|
|
66
49
|
__privateSet(this, _editCount, 0);
|
|
67
|
-
__privateSet(this, _inEditMode, false);
|
|
68
50
|
}
|
|
69
51
|
async begin(editSessionMode) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
return sessionDataSource;
|
|
75
|
-
} catch (e) {
|
|
76
|
-
__privateSet(this, _inEditMode, false);
|
|
77
|
-
}
|
|
52
|
+
__privateSet(this, _inEditMode, true);
|
|
53
|
+
const sessionDataSource = await __privateGet(this, _sourceTableDataSource)?.beginEditSession?.(editSessionMode);
|
|
54
|
+
__privateSet(this, _sessionDataSource, sessionDataSource);
|
|
55
|
+
return sessionDataSource;
|
|
78
56
|
}
|
|
79
57
|
get dataSource() {
|
|
80
58
|
return __privateGet(this, _sessionDataSource) ?? __privateGet(this, _sourceTableDataSource);
|
|
81
59
|
}
|
|
82
|
-
async end(saveChanges = false
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
await this.dataSource?.endEditSession?.(saveChanges, force);
|
|
86
|
-
this.clear();
|
|
87
|
-
}
|
|
88
|
-
} catch (e) {
|
|
89
|
-
if (e instanceof StaleUpdateError) {
|
|
90
|
-
this.emit("editState", "stale");
|
|
91
|
-
} else {
|
|
92
|
-
console.error(`[EditSession] ${e.message}`);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
60
|
+
async end(saveChanges = false) {
|
|
61
|
+
await this.dataSource?.endEditSession?.(saveChanges);
|
|
62
|
+
this.clear();
|
|
95
63
|
}
|
|
96
64
|
get inEditMode() {
|
|
97
65
|
return __privateGet(this, _inEditMode);
|
|
@@ -99,111 +67,65 @@ class EditSession extends eventEmitter.EventEmitter {
|
|
|
99
67
|
get editState() {
|
|
100
68
|
return this.editCount === 0 ? "clean" : "dirty";
|
|
101
69
|
}
|
|
102
|
-
|
|
70
|
+
// TODO how do we deal with the '_edited' pattern
|
|
71
|
+
edit(key, columnName, originalValue, newValue) {
|
|
103
72
|
const rowEditDetails = __privateGet(this, _rowEdits).get(key);
|
|
104
73
|
if (rowEditDetails) {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
const cellEdit = cellEdits.get(column);
|
|
116
|
-
if (cellEdit) {
|
|
117
|
-
if (isValid && cellEdit.isValid === false) {
|
|
118
|
-
cellEdit.isValid = true;
|
|
119
|
-
this.invalidCount -= 1;
|
|
120
|
-
}
|
|
121
|
-
return cellEdit;
|
|
122
|
-
} else {
|
|
123
|
-
const cellEdit2 = {
|
|
124
|
-
originalValue,
|
|
125
|
-
editedValue,
|
|
126
|
-
isValid
|
|
127
|
-
};
|
|
128
|
-
cellEdits.set(column, cellEdit2);
|
|
129
|
-
this.editCount = __privateGet(this, _editCount) + 1;
|
|
130
|
-
return cellEdit2;
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
/**
|
|
134
|
-
* Apply incremental edit(s) to edit control value. Used for TextInput, where multiple
|
|
135
|
-
* edits may follow in sequence before value finally committed.
|
|
136
|
-
*
|
|
137
|
-
* @param key value for edited Row
|
|
138
|
-
* @param columnName
|
|
139
|
-
* @param originalValue
|
|
140
|
-
* @param newValue
|
|
141
|
-
*/
|
|
142
|
-
edit(key, columnName, originalValue, newValue) {
|
|
143
|
-
const { cellEdits } = this.getRowEdits(key);
|
|
144
|
-
const cellEdit = cellEdits.get(columnName);
|
|
145
|
-
if (cellEdit) {
|
|
146
|
-
if (newValue === cellEdit.originalValue) {
|
|
147
|
-
if (cellEdits.size === 1) {
|
|
148
|
-
__privateGet(this, _rowEdits).delete(key);
|
|
74
|
+
const { cellEdits } = rowEditDetails;
|
|
75
|
+
const cellEdit = cellEdits.get(columnName);
|
|
76
|
+
if (cellEdit) {
|
|
77
|
+
if (newValue === cellEdit.originalValue) {
|
|
78
|
+
if (cellEdits.size === 1) {
|
|
79
|
+
__privateGet(this, _rowEdits).delete(key);
|
|
80
|
+
} else {
|
|
81
|
+
cellEdits.delete(columnName);
|
|
82
|
+
}
|
|
83
|
+
this.editCount = __privateGet(this, _editCount) - 1;
|
|
149
84
|
} else {
|
|
150
|
-
|
|
85
|
+
cellEdit.editedValue = newValue;
|
|
151
86
|
}
|
|
152
|
-
this.editCount = __privateGet(this, _editCount) - 1;
|
|
153
87
|
} else {
|
|
154
|
-
|
|
88
|
+
cellEdits.set(columnName, {
|
|
89
|
+
originalValue,
|
|
90
|
+
editedValue: newValue
|
|
91
|
+
});
|
|
92
|
+
this.editCount = __privateGet(this, _editCount) + 1;
|
|
155
93
|
}
|
|
156
94
|
} else {
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
95
|
+
__privateGet(this, _rowEdits).set(key, {
|
|
96
|
+
cellEdits: /* @__PURE__ */ new Map([
|
|
97
|
+
[columnName, { originalValue, editedValue: newValue }]
|
|
98
|
+
])
|
|
160
99
|
});
|
|
161
100
|
this.editCount = __privateGet(this, _editCount) + 1;
|
|
162
101
|
}
|
|
163
102
|
}
|
|
164
|
-
async commit(key, columnName,
|
|
165
|
-
const rowEditDetails = this.
|
|
166
|
-
if (
|
|
103
|
+
async commit(key, columnName, typedValue) {
|
|
104
|
+
const rowEditDetails = __privateGet(this, _rowEdits).get(key);
|
|
105
|
+
if (rowEditDetails) {
|
|
167
106
|
const { cellEdits } = rowEditDetails;
|
|
168
|
-
const
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
);
|
|
175
|
-
const response = await this.dataSource?.editCell?.(
|
|
176
|
-
key,
|
|
177
|
-
columnName,
|
|
178
|
-
typedValue
|
|
179
|
-
);
|
|
180
|
-
if (index.isRpcError(response)) {
|
|
181
|
-
cellEdit.isValid = false;
|
|
182
|
-
this.invalidCount += 1;
|
|
183
|
-
}
|
|
184
|
-
return response;
|
|
185
|
-
} else {
|
|
186
|
-
if (rowEditDetails) {
|
|
187
|
-
const { cellEdits } = rowEditDetails;
|
|
188
|
-
const cellEditValues = cellEdits.get(columnName);
|
|
189
|
-
if (cellEditValues && cellEditValues.isValid !== false) {
|
|
190
|
-
cellEditValues.isValid = false;
|
|
191
|
-
this.invalidCount += 1;
|
|
107
|
+
const cellEditValues = cellEdits.get(columnName);
|
|
108
|
+
if (cellEditValues) {
|
|
109
|
+
try {
|
|
110
|
+
this.dataSource?.editCell?.(key, columnName, typedValue);
|
|
111
|
+
} catch (e) {
|
|
112
|
+
console.error(e);
|
|
192
113
|
}
|
|
193
114
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
115
|
+
} else {
|
|
116
|
+
return {
|
|
117
|
+
errorMessage: "CHANGE_REVERTED",
|
|
118
|
+
type: "ERROR_RESULT"
|
|
119
|
+
};
|
|
197
120
|
}
|
|
198
121
|
}
|
|
199
122
|
}
|
|
123
|
+
_active = new WeakMap();
|
|
200
124
|
_rowEdits = new WeakMap();
|
|
201
125
|
_editCount = new WeakMap();
|
|
202
|
-
_invalidCount = new WeakMap();
|
|
203
126
|
_sourceTableDataSource = new WeakMap();
|
|
204
127
|
_sessionDataSource = new WeakMap();
|
|
205
128
|
_inEditMode = new WeakMap();
|
|
206
129
|
|
|
207
130
|
exports.EditSession = EditSession;
|
|
208
|
-
exports.StaleUpdateError = StaleUpdateError;
|
|
209
131
|
//# sourceMappingURL=EditSession.js.map
|
|
@@ -1 +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 { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { EventEmitter } from \"../event-emitter\";\nimport { isRpcError } from \"../../dist/index.mjs\";\n\nexport type EditState = \"clean\" | \"dirty\" | \"invalid\" | \"stale\";\n\ntype CellEdit = {\n originalValue: VuuRowDataItemType;\n editedValue: VuuRowDataItemType;\n isValid?: boolean;\n};\n\n// TODO can add more when when we know what the server implementation of error columns will look like\nexport class StaleUpdateError extends Error {}\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 /**\n * Row key => row edits\n */\n #rowEdits = new Map<string, RowEditDetails>();\n #editCount = 0;\n #invalidCount = 0;\n #sourceTableDataSource?: DataSource;\n #sessionDataSource?: DataSource;\n #inEditMode = false;\n\n constructor(dataSource: DataSource) {\n super();\n this.#sourceTableDataSource = dataSource;\n\n dataSource.on(\"remote-update-during-local-edit\", (rows) => {\n console.log(\n `source table updated via another channel, whilst we have an inline edit session in progress`,\n { rows },\n );\n });\n }\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 get invalidCount() {\n return this.#invalidCount;\n }\n\n set invalidCount(val: number) {\n if (val !== this.#invalidCount) {\n const oldCount = this.#invalidCount;\n this.#invalidCount = val;\n if (val === 0) {\n this.emit(\"editState\", this.#editCount === 0 ? \"clean\" : \"dirty\");\n } else if (oldCount === 0) {\n this.emit(\"editState\", \"invalid\");\n }\n }\n }\n\n clear() {\n this.#rowEdits.clear();\n this.#editCount = 0;\n this.#inEditMode = false;\n }\n\n async begin(editSessionMode?: EditSessionMode) {\n try {\n this.#inEditMode = true;\n const sessionDataSource =\n await this.#sourceTableDataSource?.beginEditSession?.(editSessionMode);\n\n this.#sessionDataSource = sessionDataSource;\n\n return sessionDataSource;\n } catch (e) {\n this.#inEditMode = false;\n }\n }\n\n get dataSource() {\n return this.#sessionDataSource ?? this.#sourceTableDataSource;\n }\n\n async end(saveChanges = false, force = false) {\n try {\n if (this.#inEditMode) {\n await this.dataSource?.endEditSession?.(saveChanges, force);\n this.clear();\n }\n } catch (e) {\n if (e instanceof StaleUpdateError) {\n this.emit(\"editState\", \"stale\");\n } else {\n console.error(`[EditSession] ${(e as Error).message}`);\n }\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 getRowEdits(key: string): RowEditDetails {\n const rowEditDetails = this.#rowEdits.get(key);\n if (rowEditDetails) {\n return rowEditDetails;\n } else {\n const rowEditDetails = {\n cellEdits: new Map(),\n };\n this.#rowEdits.set(key, rowEditDetails);\n return rowEditDetails;\n }\n }\n\n storeCellEdit(\n cellEdits: Map<string, CellEdit>,\n column: string,\n originalValue: VuuRowDataItemType,\n editedValue: VuuRowDataItemType,\n isValid: boolean,\n ) {\n const cellEdit = cellEdits.get(column);\n if (cellEdit) {\n if (isValid && cellEdit.isValid === false) {\n cellEdit.isValid = true;\n this.invalidCount -= 1;\n }\n return cellEdit;\n } else {\n const cellEdit = {\n originalValue,\n editedValue,\n isValid,\n };\n cellEdits.set(column, cellEdit);\n this.editCount = this.#editCount + 1;\n return cellEdit;\n }\n }\n\n /**\n * Apply incremental edit(s) to edit control value. Used for TextInput, where multiple\n * edits may follow in sequence before value finally committed.\n *\n * @param key value for edited Row\n * @param columnName\n * @param originalValue\n * @param newValue\n */\n edit(\n key: string,\n columnName: string,\n originalValue: VuuRowDataItemType,\n newValue: VuuRowDataItemType,\n ) {\n const { cellEdits } = this.getRowEdits(key);\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 cellEdits.set(columnName, {\n originalValue,\n editedValue: newValue,\n });\n this.editCount = this.#editCount + 1;\n }\n }\n\n async commit(\n key: string,\n columnName: string,\n originalValue: VuuRowDataItemType,\n typedValue: string | number | boolean,\n isValid: boolean,\n ) {\n const rowEditDetails = this.getRowEdits(key);\n\n if (isValid) {\n const { cellEdits } = rowEditDetails;\n const cellEdit = this.storeCellEdit(\n cellEdits,\n columnName,\n originalValue,\n typedValue,\n isValid,\n );\n\n const response = await this.dataSource?.editCell?.(\n key,\n columnName,\n typedValue,\n );\n if (isRpcError(response)) {\n cellEdit.isValid = false;\n this.invalidCount += 1;\n }\n\n return response;\n } else {\n if (rowEditDetails) {\n const { cellEdits } = rowEditDetails;\n const cellEditValues = cellEdits.get(columnName);\n if (cellEditValues && cellEditValues.isValid !== false) {\n cellEditValues.isValid = false;\n this.invalidCount += 1;\n }\n }\n console.log(\n `[EditSession] key ${key}, column ${columnName} is valid ? ${isValid} `,\n );\n }\n }\n}\n"],"names":["EventEmitter","rowEditDetails","cellEdit","isRpcError"],"mappings":"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"}
|
|
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":"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"}
|