@vuu-ui/vuu-shell 0.8.32 → 0.8.34
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/app-header/AppHeader.css +24 -0
- package/cjs/connection-status/ConnectionStatusIcon.css +68 -0
- package/cjs/feature-list/FeatureList.css +21 -0
- package/cjs/layout-management/LayoutList.css +86 -0
- package/cjs/layout-management/LayoutTile.css +28 -0
- package/cjs/layout-management/SaveLayoutPanel.css +130 -0
- package/cjs/left-nav/LeftNav.css +178 -0
- package/cjs/login/LoginPanel.css +70 -0
- package/cjs/node_modules/html-to-image/es/apply-style.js +24 -0
- package/cjs/node_modules/html-to-image/es/apply-style.js.map +1 -0
- package/cjs/node_modules/html-to-image/es/clone-node.js +185 -0
- package/cjs/node_modules/html-to-image/es/clone-node.js.map +1 -0
- package/cjs/node_modules/html-to-image/es/clone-pseudos.js +48 -0
- package/cjs/node_modules/html-to-image/es/clone-pseudos.js.map +1 -0
- package/cjs/node_modules/html-to-image/es/dataurl.js +83 -0
- package/cjs/node_modules/html-to-image/es/dataurl.js.map +1 -0
- package/cjs/node_modules/html-to-image/es/embed-images.js +68 -0
- package/cjs/node_modules/html-to-image/es/embed-images.js.map +1 -0
- package/cjs/node_modules/html-to-image/es/embed-resources.js +74 -0
- package/cjs/node_modules/html-to-image/es/embed-resources.js.map +1 -0
- package/cjs/node_modules/html-to-image/es/embed-webfonts.js +187 -0
- package/cjs/node_modules/html-to-image/es/embed-webfonts.js.map +1 -0
- package/cjs/node_modules/html-to-image/es/index.js +49 -0
- package/cjs/node_modules/html-to-image/es/index.js.map +1 -0
- package/cjs/node_modules/html-to-image/es/mimes.js +28 -0
- package/cjs/node_modules/html-to-image/es/mimes.js.map +1 -0
- package/cjs/node_modules/html-to-image/es/util.js +166 -0
- package/cjs/node_modules/html-to-image/es/util.js.map +1 -0
- package/cjs/packages/vuu-shell/src/ShellContextProvider.js +31 -0
- package/cjs/packages/vuu-shell/src/ShellContextProvider.js.map +1 -0
- package/cjs/packages/vuu-shell/src/app-header/AppHeader.js +57 -0
- package/cjs/packages/vuu-shell/src/app-header/AppHeader.js.map +1 -0
- package/cjs/packages/vuu-shell/src/connection-status/ConnectionStatusIcon.js +42 -0
- package/cjs/packages/vuu-shell/src/connection-status/ConnectionStatusIcon.js.map +1 -0
- package/cjs/packages/vuu-shell/src/feature/Feature.js +56 -0
- package/cjs/packages/vuu-shell/src/feature/Feature.js.map +1 -0
- package/cjs/packages/vuu-shell/src/feature/FeatureErrorBoundary.js +30 -0
- package/cjs/packages/vuu-shell/src/feature/FeatureErrorBoundary.js.map +1 -0
- package/cjs/packages/vuu-shell/src/feature/Loader.js +8 -0
- package/cjs/packages/vuu-shell/src/feature/Loader.js.map +1 -0
- package/cjs/packages/vuu-shell/src/feature/css-module-loader.js +9 -0
- package/cjs/packages/vuu-shell/src/feature/css-module-loader.js.map +1 -0
- package/cjs/packages/vuu-shell/src/feature-list/FeatureList.js +43 -0
- package/cjs/packages/vuu-shell/src/feature-list/FeatureList.js.map +1 -0
- package/cjs/packages/vuu-shell/src/index.js +51 -0
- package/cjs/packages/vuu-shell/src/index.js.map +1 -0
- package/cjs/packages/vuu-shell/src/layout-management/LayoutList.js +66 -0
- package/cjs/packages/vuu-shell/src/layout-management/LayoutList.js.map +1 -0
- package/cjs/packages/vuu-shell/src/layout-management/LayoutTile.js +27 -0
- package/cjs/packages/vuu-shell/src/layout-management/LayoutTile.js.map +1 -0
- package/cjs/packages/vuu-shell/src/layout-management/SaveLayoutPanel.js +140 -0
- package/cjs/packages/vuu-shell/src/layout-management/SaveLayoutPanel.js.map +1 -0
- package/cjs/packages/vuu-shell/src/layout-management/screenshot-utils.js +25 -0
- package/cjs/packages/vuu-shell/src/layout-management/screenshot-utils.js.map +1 -0
- package/cjs/packages/vuu-shell/src/layout-management/useLayoutContextMenuItems.js +72 -0
- package/cjs/packages/vuu-shell/src/layout-management/useLayoutContextMenuItems.js.map +1 -0
- package/cjs/packages/vuu-shell/src/layout-management/useLayoutManager.js +218 -0
- package/cjs/packages/vuu-shell/src/layout-management/useLayoutManager.js.map +1 -0
- package/cjs/packages/vuu-shell/src/left-nav/LeftNav.js +156 -0
- package/cjs/packages/vuu-shell/src/left-nav/LeftNav.js.map +1 -0
- package/cjs/packages/vuu-shell/src/login/LoginPanel.js +99 -0
- package/cjs/packages/vuu-shell/src/login/LoginPanel.js.map +1 -0
- package/cjs/packages/vuu-shell/src/login/VuuLogo.js +134 -0
- package/cjs/packages/vuu-shell/src/login/VuuLogo.js.map +1 -0
- package/cjs/packages/vuu-shell/src/login/login-utils.js +31 -0
- package/cjs/packages/vuu-shell/src/login/login-utils.js.map +1 -0
- package/cjs/packages/vuu-shell/src/persistence-management/LocalPersistenceManager.js +183 -0
- package/cjs/packages/vuu-shell/src/persistence-management/LocalPersistenceManager.js.map +1 -0
- package/cjs/packages/vuu-shell/src/persistence-management/RemotePersistenceManager.js +162 -0
- package/cjs/packages/vuu-shell/src/persistence-management/RemotePersistenceManager.js.map +1 -0
- package/cjs/packages/vuu-shell/src/persistence-management/defaultApplicationJson.js +42 -0
- package/cjs/packages/vuu-shell/src/persistence-management/defaultApplicationJson.js.map +1 -0
- package/cjs/packages/vuu-shell/src/session-editing-form/SessionEditingForm.js +271 -0
- package/cjs/packages/vuu-shell/src/session-editing-form/SessionEditingForm.js.map +1 -0
- package/cjs/packages/vuu-shell/src/shell-layouts/context-panel/ContextPanel.js +61 -0
- package/cjs/packages/vuu-shell/src/shell-layouts/context-panel/ContextPanel.js.map +1 -0
- package/cjs/packages/vuu-shell/src/shell-layouts/side-panel/SidePanel.js +27 -0
- package/cjs/packages/vuu-shell/src/shell-layouts/side-panel/SidePanel.js.map +1 -0
- package/cjs/packages/vuu-shell/src/shell-layouts/useFullHeightLeftPanel.js +41 -0
- package/cjs/packages/vuu-shell/src/shell-layouts/useFullHeightLeftPanel.js.map +1 -0
- package/cjs/packages/vuu-shell/src/shell-layouts/useInlayLeftPanel.js +78 -0
- package/cjs/packages/vuu-shell/src/shell-layouts/useInlayLeftPanel.js.map +1 -0
- package/cjs/packages/vuu-shell/src/shell-layouts/useShellLayout.js +15 -0
- package/cjs/packages/vuu-shell/src/shell-layouts/useShellLayout.js.map +1 -0
- package/cjs/packages/vuu-shell/src/shell.js +129 -0
- package/cjs/packages/vuu-shell/src/shell.js.map +1 -0
- package/cjs/packages/vuu-shell/src/shellTypes.js +8 -0
- package/cjs/packages/vuu-shell/src/shellTypes.js.map +1 -0
- package/cjs/packages/vuu-shell/src/theme-switch/ThemeSwitch.js +47 -0
- package/cjs/packages/vuu-shell/src/theme-switch/ThemeSwitch.js.map +1 -0
- package/cjs/session-editing-form/SessionEditingForm.css +53 -0
- package/cjs/shell-layouts/context-panel/ContextPanel.css +58 -0
- package/cjs/shell-layouts/side-panel/SidePanel.css +4 -0
- package/cjs/shell.css +49 -0
- package/cjs/theme-switch/ThemeSwitch.css +30 -0
- package/esm/app-header/AppHeader.css +24 -0
- package/esm/connection-status/ConnectionStatusIcon.css +68 -0
- package/esm/feature-list/FeatureList.css +21 -0
- package/esm/layout-management/LayoutList.css +86 -0
- package/esm/layout-management/LayoutTile.css +28 -0
- package/esm/layout-management/SaveLayoutPanel.css +130 -0
- package/esm/left-nav/LeftNav.css +178 -0
- package/esm/login/LoginPanel.css +70 -0
- package/esm/node_modules/html-to-image/es/apply-style.js +22 -0
- package/esm/node_modules/html-to-image/es/apply-style.js.map +1 -0
- package/esm/node_modules/html-to-image/es/clone-node.js +183 -0
- package/esm/node_modules/html-to-image/es/clone-node.js.map +1 -0
- package/esm/node_modules/html-to-image/es/clone-pseudos.js +46 -0
- package/esm/node_modules/html-to-image/es/clone-pseudos.js.map +1 -0
- package/esm/node_modules/html-to-image/es/dataurl.js +78 -0
- package/esm/node_modules/html-to-image/es/dataurl.js.map +1 -0
- package/esm/node_modules/html-to-image/es/embed-images.js +66 -0
- package/esm/node_modules/html-to-image/es/embed-images.js.map +1 -0
- package/esm/node_modules/html-to-image/es/embed-resources.js +69 -0
- package/esm/node_modules/html-to-image/es/embed-resources.js.map +1 -0
- package/esm/node_modules/html-to-image/es/embed-webfonts.js +184 -0
- package/esm/node_modules/html-to-image/es/embed-webfonts.js.map +1 -0
- package/esm/node_modules/html-to-image/es/index.js +45 -0
- package/esm/node_modules/html-to-image/es/index.js.map +1 -0
- package/esm/node_modules/html-to-image/es/mimes.js +26 -0
- package/esm/node_modules/html-to-image/es/mimes.js.map +1 -0
- package/esm/node_modules/html-to-image/es/util.js +155 -0
- package/esm/node_modules/html-to-image/es/util.js.map +1 -0
- package/esm/packages/vuu-shell/src/ShellContextProvider.js +28 -0
- package/esm/packages/vuu-shell/src/ShellContextProvider.js.map +1 -0
- package/esm/packages/vuu-shell/src/app-header/AppHeader.js +55 -0
- package/esm/packages/vuu-shell/src/app-header/AppHeader.js.map +1 -0
- package/esm/packages/vuu-shell/src/connection-status/ConnectionStatusIcon.js +40 -0
- package/esm/packages/vuu-shell/src/connection-status/ConnectionStatusIcon.js.map +1 -0
- package/esm/packages/vuu-shell/src/feature/Feature.js +54 -0
- package/esm/packages/vuu-shell/src/feature/Feature.js.map +1 -0
- package/esm/packages/vuu-shell/src/feature/FeatureErrorBoundary.js +28 -0
- package/esm/packages/vuu-shell/src/feature/FeatureErrorBoundary.js.map +1 -0
- package/esm/packages/vuu-shell/src/feature/Loader.js +6 -0
- package/esm/packages/vuu-shell/src/feature/Loader.js.map +1 -0
- package/esm/packages/vuu-shell/src/feature/css-module-loader.js +7 -0
- package/esm/packages/vuu-shell/src/feature/css-module-loader.js.map +1 -0
- package/esm/packages/vuu-shell/src/feature-list/FeatureList.js +41 -0
- package/esm/packages/vuu-shell/src/feature-list/FeatureList.js.map +1 -0
- package/esm/packages/vuu-shell/src/index.js +20 -0
- package/esm/packages/vuu-shell/src/index.js.map +1 -0
- package/esm/packages/vuu-shell/src/layout-management/LayoutList.js +64 -0
- package/esm/packages/vuu-shell/src/layout-management/LayoutList.js.map +1 -0
- package/esm/packages/vuu-shell/src/layout-management/LayoutTile.js +25 -0
- package/esm/packages/vuu-shell/src/layout-management/LayoutTile.js.map +1 -0
- package/esm/packages/vuu-shell/src/layout-management/SaveLayoutPanel.js +138 -0
- package/esm/packages/vuu-shell/src/layout-management/SaveLayoutPanel.js.map +1 -0
- package/esm/packages/vuu-shell/src/layout-management/screenshot-utils.js +23 -0
- package/esm/packages/vuu-shell/src/layout-management/screenshot-utils.js.map +1 -0
- package/esm/packages/vuu-shell/src/layout-management/useLayoutContextMenuItems.js +70 -0
- package/esm/packages/vuu-shell/src/layout-management/useLayoutContextMenuItems.js.map +1 -0
- package/esm/packages/vuu-shell/src/layout-management/useLayoutManager.js +214 -0
- package/esm/packages/vuu-shell/src/layout-management/useLayoutManager.js.map +1 -0
- package/esm/packages/vuu-shell/src/left-nav/LeftNav.js +154 -0
- package/esm/packages/vuu-shell/src/left-nav/LeftNav.js.map +1 -0
- package/esm/packages/vuu-shell/src/login/LoginPanel.js +97 -0
- package/esm/packages/vuu-shell/src/login/LoginPanel.js.map +1 -0
- package/esm/packages/vuu-shell/src/login/VuuLogo.js +132 -0
- package/esm/packages/vuu-shell/src/login/VuuLogo.js.map +1 -0
- package/esm/packages/vuu-shell/src/login/login-utils.js +26 -0
- package/esm/packages/vuu-shell/src/login/login-utils.js.map +1 -0
- package/esm/packages/vuu-shell/src/persistence-management/LocalPersistenceManager.js +181 -0
- package/esm/packages/vuu-shell/src/persistence-management/LocalPersistenceManager.js.map +1 -0
- package/esm/packages/vuu-shell/src/persistence-management/RemotePersistenceManager.js +160 -0
- package/esm/packages/vuu-shell/src/persistence-management/RemotePersistenceManager.js.map +1 -0
- package/esm/packages/vuu-shell/src/persistence-management/defaultApplicationJson.js +39 -0
- package/esm/packages/vuu-shell/src/persistence-management/defaultApplicationJson.js.map +1 -0
- package/esm/packages/vuu-shell/src/session-editing-form/SessionEditingForm.js +269 -0
- package/esm/packages/vuu-shell/src/session-editing-form/SessionEditingForm.js.map +1 -0
- package/esm/packages/vuu-shell/src/shell-layouts/context-panel/ContextPanel.js +59 -0
- package/esm/packages/vuu-shell/src/shell-layouts/context-panel/ContextPanel.js.map +1 -0
- package/esm/packages/vuu-shell/src/shell-layouts/side-panel/SidePanel.js +25 -0
- package/esm/packages/vuu-shell/src/shell-layouts/side-panel/SidePanel.js.map +1 -0
- package/esm/packages/vuu-shell/src/shell-layouts/useFullHeightLeftPanel.js +39 -0
- package/esm/packages/vuu-shell/src/shell-layouts/useFullHeightLeftPanel.js.map +1 -0
- package/esm/packages/vuu-shell/src/shell-layouts/useInlayLeftPanel.js +76 -0
- package/esm/packages/vuu-shell/src/shell-layouts/useInlayLeftPanel.js.map +1 -0
- package/esm/packages/vuu-shell/src/shell-layouts/useShellLayout.js +13 -0
- package/esm/packages/vuu-shell/src/shell-layouts/useShellLayout.js.map +1 -0
- package/esm/packages/vuu-shell/src/shell.js +127 -0
- package/esm/packages/vuu-shell/src/shell.js.map +1 -0
- package/esm/packages/vuu-shell/src/shellTypes.js +5 -0
- package/esm/packages/vuu-shell/src/shellTypes.js.map +1 -0
- package/esm/packages/vuu-shell/src/theme-switch/ThemeSwitch.js +45 -0
- package/esm/packages/vuu-shell/src/theme-switch/ThemeSwitch.js.map +1 -0
- package/esm/session-editing-form/SessionEditingForm.css +53 -0
- package/esm/shell-layouts/context-panel/ContextPanel.css +58 -0
- package/esm/shell-layouts/side-panel/SidePanel.css +4 -0
- package/esm/shell.css +49 -0
- package/esm/theme-switch/ThemeSwitch.css +30 -0
- package/package.json +17 -18
- package/types/ShellContextProvider.d.ts +2 -2
- package/types/layout-management/index.d.ts +1 -0
- package/types/persistence-management/RemotePersistenceManager.d.ts +1 -1
- package/types/persistence-management/index.d.ts +0 -1
- package/LICENSE +0 -201
- package/cjs/index.js +0 -3
- package/cjs/index.js.map +0 -7
- package/esm/index.js +0 -3
- package/esm/index.js.map +0 -7
- package/index.css +0 -2
- package/index.css.map +0 -7
- /package/types/{persistence-management → layout-management}/useLayoutContextMenuItems.d.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LayoutTile.js","sources":["../../../../../src/layout-management/LayoutTile.tsx"],"sourcesContent":["import { LayoutMetadata } from \"./layoutTypes\";\n\nimport \"./LayoutTile.css\";\n\nconst classBase = \"vuuLayoutTile\";\n\ntype LayoutTileProps = {\n metadata: LayoutMetadata;\n handleLoadLayout: (layoutId?: string) => void;\n};\n\nexport const LayoutTile = (props: LayoutTileProps) => {\n const { metadata, handleLoadLayout } = props;\n\n return (\n <div role=\"listitem\">\n <div\n className={`${classBase}-layoutTile`}\n key={metadata?.id}\n role=\"button\"\n onClick={() => handleLoadLayout(metadata?.id)}\n >\n <img className={`${classBase}-screenshot`} src={metadata?.screenshot} />\n <div>\n <div className={`${classBase}-layoutName`}>{metadata?.name}</div>\n <div className={`${classBase}-layoutDetails`}>\n <div>{`${metadata?.user}, ${metadata?.created}`}</div>\n </div>\n </div>\n </div>\n </div>\n );\n};\n"],"names":[],"mappings":";;AAIA,MAAM,SAAY,GAAA,eAAA,CAAA;AAOL,MAAA,UAAA,GAAa,CAAC,KAA2B,KAAA;AACpD,EAAM,MAAA,EAAE,QAAU,EAAA,gBAAA,EAAqB,GAAA,KAAA,CAAA;AAEvC,EACE,uBAAA,GAAA,CAAC,KAAI,EAAA,EAAA,IAAA,EAAK,UACR,EAAA,QAAA,kBAAA,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,GAAG,SAAS,CAAA,WAAA,CAAA;AAAA,MAEvB,IAAK,EAAA,QAAA;AAAA,MACL,OAAS,EAAA,MAAM,gBAAiB,CAAA,QAAA,EAAU,EAAE,CAAA;AAAA,MAE5C,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,SAAI,SAAW,EAAA,CAAA,EAAG,SAAS,CAAe,WAAA,CAAA,EAAA,GAAA,EAAK,UAAU,UAAY,EAAA,CAAA;AAAA,6BACrE,KACC,EAAA,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,SAAI,SAAW,EAAA,CAAA,EAAG,SAAS,CAAA,WAAA,CAAA,EAAgB,oBAAU,IAAK,EAAA,CAAA;AAAA,0BAC1D,GAAA,CAAA,KAAA,EAAA,EAAI,SAAW,EAAA,CAAA,EAAG,SAAS,CAC1B,cAAA,CAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,KAAK,EAAA,EAAA,QAAA,EAAA,CAAA,EAAG,UAAU,IAAI,CAAA,EAAA,EAAK,QAAU,EAAA,OAAO,IAAG,CAClD,EAAA,CAAA;AAAA,SACF,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAAA,IAVK,QAAU,EAAA,EAAA;AAAA,GAYnB,EAAA,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { ComboBox, Checkbox, RadioButton } from '@vuu-ui/vuu-ui-controls';
|
|
3
|
+
import { takeScreenshot } from './screenshot-utils.js';
|
|
4
|
+
import { Text, FormField, FormFieldLabel, Input, Button } from '@salt-ds/core';
|
|
5
|
+
import { useState, useEffect, useMemo } from 'react';
|
|
6
|
+
import 'clsx';
|
|
7
|
+
import { getAuthDetailsFromCookies } from '../login/login-utils.js';
|
|
8
|
+
|
|
9
|
+
const classBase = "saveLayoutPanel";
|
|
10
|
+
const formField = `${classBase}-formField`;
|
|
11
|
+
const groups = ["Group 1", "Group 2", "Group 3", "Group 4", "Group 5"];
|
|
12
|
+
const checkboxValues = ["Value 1", "Value 2", "Value 3"];
|
|
13
|
+
const radioValues = ["Value 1", "Value 2", "Value 3"];
|
|
14
|
+
const SaveLayoutPanel = (props) => {
|
|
15
|
+
const { defaultTitle = "", onCancel, onSave, componentId } = props;
|
|
16
|
+
const [layoutName, setLayoutName] = useState(defaultTitle);
|
|
17
|
+
const [group, setGroup] = useState("");
|
|
18
|
+
const [checkValues, setCheckValues] = useState([]);
|
|
19
|
+
const [radioValue, setRadioValue] = useState(radioValues[0]);
|
|
20
|
+
const [screenshot, setScreenshot] = useState();
|
|
21
|
+
const [screenshotErrorMessage, setScreenshotErrorMessage] = useState();
|
|
22
|
+
const [username] = getAuthDetailsFromCookies();
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (componentId) {
|
|
25
|
+
takeScreenshot(document.getElementById(componentId)).then((screenshot2) => {
|
|
26
|
+
setScreenshot(screenshot2);
|
|
27
|
+
}).catch((error) => {
|
|
28
|
+
setScreenshotErrorMessage(error.message);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}, [componentId]);
|
|
32
|
+
const handleSubmit = () => {
|
|
33
|
+
onSave({
|
|
34
|
+
name: layoutName,
|
|
35
|
+
group,
|
|
36
|
+
screenshot: screenshot ?? "",
|
|
37
|
+
user: username
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
const screenshotContent = useMemo(() => {
|
|
41
|
+
if (screenshot) {
|
|
42
|
+
return /* @__PURE__ */ jsx(
|
|
43
|
+
"img",
|
|
44
|
+
{
|
|
45
|
+
className: `${classBase}-screenshot`,
|
|
46
|
+
src: screenshot,
|
|
47
|
+
alt: "screenshot of current layout"
|
|
48
|
+
}
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
if (screenshotErrorMessage) {
|
|
52
|
+
return /* @__PURE__ */ jsx(Text, { children: screenshotErrorMessage });
|
|
53
|
+
}
|
|
54
|
+
return /* @__PURE__ */ jsx("div", { className: "spinner" });
|
|
55
|
+
}, [screenshot, screenshotErrorMessage]);
|
|
56
|
+
return /* @__PURE__ */ jsxs("div", { className: `${classBase}-panelContainer`, children: [
|
|
57
|
+
/* @__PURE__ */ jsxs("div", { className: `${classBase}-panelContent`, children: [
|
|
58
|
+
/* @__PURE__ */ jsxs("div", { className: `${classBase}-formContainer`, children: [
|
|
59
|
+
/* @__PURE__ */ jsxs(FormField, { className: formField, children: [
|
|
60
|
+
/* @__PURE__ */ jsx(FormFieldLabel, { children: "Group" }),
|
|
61
|
+
/* @__PURE__ */ jsx(
|
|
62
|
+
ComboBox,
|
|
63
|
+
{
|
|
64
|
+
source: groups,
|
|
65
|
+
allowFreeText: true,
|
|
66
|
+
InputProps: {
|
|
67
|
+
inputProps: {
|
|
68
|
+
className: `${classBase}-inputText`,
|
|
69
|
+
placeholder: "Select Group or Enter New Name",
|
|
70
|
+
onChange: (event) => setGroup(event.target.value)
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
width: "100%",
|
|
74
|
+
onSelectionChange: (_, value) => setGroup(value || "")
|
|
75
|
+
}
|
|
76
|
+
)
|
|
77
|
+
] }),
|
|
78
|
+
/* @__PURE__ */ jsxs(FormField, { className: formField, children: [
|
|
79
|
+
/* @__PURE__ */ jsx(FormFieldLabel, { children: "Layout Name" }),
|
|
80
|
+
/* @__PURE__ */ jsx(
|
|
81
|
+
Input,
|
|
82
|
+
{
|
|
83
|
+
inputProps: {
|
|
84
|
+
className: `${classBase}-inputText`,
|
|
85
|
+
placeholder: "Enter Layout Name"
|
|
86
|
+
},
|
|
87
|
+
onChange: (event) => setLayoutName(event.target.value),
|
|
88
|
+
value: layoutName
|
|
89
|
+
}
|
|
90
|
+
)
|
|
91
|
+
] }),
|
|
92
|
+
/* @__PURE__ */ jsxs(FormField, { className: formField, children: [
|
|
93
|
+
/* @__PURE__ */ jsx(FormFieldLabel, { children: "Some Layout Setting" }),
|
|
94
|
+
/* @__PURE__ */ jsx("div", { className: `${classBase}-settingsGroup`, children: checkboxValues.map((value, i) => /* @__PURE__ */ jsx(
|
|
95
|
+
Checkbox,
|
|
96
|
+
{
|
|
97
|
+
onToggle: () => setCheckValues(
|
|
98
|
+
(prev) => prev.includes(value) ? prev.filter((entry) => entry !== value) : [...prev, value]
|
|
99
|
+
),
|
|
100
|
+
checked: checkValues.includes(value),
|
|
101
|
+
label: value
|
|
102
|
+
},
|
|
103
|
+
i
|
|
104
|
+
)) })
|
|
105
|
+
] }),
|
|
106
|
+
/* @__PURE__ */ jsxs(FormField, { className: formField, children: [
|
|
107
|
+
/* @__PURE__ */ jsx(FormFieldLabel, { children: "Some Layout Setting" }),
|
|
108
|
+
/* @__PURE__ */ jsx("div", { className: `${classBase}-settingsGroup`, children: radioValues.map((value, i) => /* @__PURE__ */ jsx(
|
|
109
|
+
RadioButton,
|
|
110
|
+
{
|
|
111
|
+
onClick: () => setRadioValue(value),
|
|
112
|
+
checked: radioValue === value,
|
|
113
|
+
label: value,
|
|
114
|
+
groupName: "radioGroup"
|
|
115
|
+
},
|
|
116
|
+
i
|
|
117
|
+
)) })
|
|
118
|
+
] })
|
|
119
|
+
] }),
|
|
120
|
+
/* @__PURE__ */ jsx("div", { className: `${classBase}-screenshotContainer`, children: screenshotContent })
|
|
121
|
+
] }),
|
|
122
|
+
/* @__PURE__ */ jsxs("div", { className: `${classBase}-buttonsContainer`, children: [
|
|
123
|
+
/* @__PURE__ */ jsx(Button, { className: `${classBase}-cancelButton`, onClick: onCancel, children: "Cancel" }),
|
|
124
|
+
/* @__PURE__ */ jsx(
|
|
125
|
+
Button,
|
|
126
|
+
{
|
|
127
|
+
className: `${classBase}-saveButton`,
|
|
128
|
+
onClick: handleSubmit,
|
|
129
|
+
disabled: layoutName === "" || group === "",
|
|
130
|
+
children: "Save"
|
|
131
|
+
}
|
|
132
|
+
)
|
|
133
|
+
] })
|
|
134
|
+
] });
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
export { SaveLayoutPanel };
|
|
138
|
+
//# sourceMappingURL=SaveLayoutPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SaveLayoutPanel.js","sources":["../../../../../src/layout-management/SaveLayoutPanel.tsx"],"sourcesContent":["import { Checkbox, ComboBox, RadioButton } from \"@vuu-ui/vuu-ui-controls\";\nimport { takeScreenshot } from \"./screenshot-utils\";\nimport { Button, FormField, FormFieldLabel, Input, Text } from \"@salt-ds/core\";\nimport { ChangeEvent, useEffect, useMemo, useState } from \"react\";\nimport { LayoutMetadataDto } from \"./layoutTypes\";\nimport { getAuthDetailsFromCookies } from \"../login\";\n\nimport \"./SaveLayoutPanel.css\";\n\nconst classBase = \"saveLayoutPanel\";\nconst formField = `${classBase}-formField`;\n\nconst groups = [\"Group 1\", \"Group 2\", \"Group 3\", \"Group 4\", \"Group 5\"];\n\nconst checkboxValues = [\"Value 1\", \"Value 2\", \"Value 3\"];\n\nconst radioValues = [\"Value 1\", \"Value 2\", \"Value 3\"] as const;\n\ntype RadioValue = (typeof radioValues)[number];\n\ntype SaveLayoutPanelProps = {\n componentId?: string;\n defaultTitle?: string;\n onCancel: () => void;\n onSave: (layoutMetadata: LayoutMetadataDto) => void;\n};\n\nexport const SaveLayoutPanel = (props: SaveLayoutPanelProps) => {\n const { defaultTitle = \"\", onCancel, onSave, componentId } = props;\n\n const [layoutName, setLayoutName] = useState<string>(defaultTitle);\n const [group, setGroup] = useState<string>(\"\");\n const [checkValues, setCheckValues] = useState<string[]>([]);\n const [radioValue, setRadioValue] = useState<RadioValue>(radioValues[0]);\n const [screenshot, setScreenshot] = useState<string | undefined>();\n const [screenshotErrorMessage, setScreenshotErrorMessage] = useState<\n string | undefined\n >();\n const [username] = getAuthDetailsFromCookies();\n\n useEffect(() => {\n if (componentId) {\n takeScreenshot(document.getElementById(componentId) as HTMLElement)\n .then((screenshot) => {\n setScreenshot(screenshot);\n })\n .catch((error: Error) => {\n setScreenshotErrorMessage(error.message);\n });\n }\n }, [componentId]);\n\n const handleSubmit = () => {\n onSave({\n name: layoutName,\n group,\n screenshot: screenshot ?? \"\",\n user: username,\n });\n };\n\n const screenshotContent = useMemo(() => {\n if (screenshot) {\n return (\n <img\n className={`${classBase}-screenshot`}\n src={screenshot}\n alt=\"screenshot of current layout\"\n />\n );\n }\n if (screenshotErrorMessage) {\n return <Text>{screenshotErrorMessage}</Text>;\n }\n return <div className=\"spinner\" />;\n }, [screenshot, screenshotErrorMessage]);\n\n return (\n <div className={`${classBase}-panelContainer`}>\n <div className={`${classBase}-panelContent`}>\n <div className={`${classBase}-formContainer`}>\n <FormField className={formField}>\n <FormFieldLabel>Group</FormFieldLabel>\n <ComboBox\n source={groups}\n allowFreeText\n InputProps={{\n inputProps: {\n className: `${classBase}-inputText`,\n placeholder: \"Select Group or Enter New Name\",\n onChange: (event: ChangeEvent<HTMLInputElement>) =>\n setGroup(event.target.value),\n },\n }}\n width=\"100%\"\n onSelectionChange={(_, value) => setGroup(value || \"\")}\n />\n </FormField>\n <FormField className={formField}>\n <FormFieldLabel>Layout Name</FormFieldLabel>\n <Input\n inputProps={{\n className: `${classBase}-inputText`,\n placeholder: \"Enter Layout Name\",\n }}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n setLayoutName(event.target.value)\n }\n value={layoutName}\n />\n </FormField>\n <FormField className={formField}>\n <FormFieldLabel>Some Layout Setting</FormFieldLabel>\n <div className={`${classBase}-settingsGroup`}>\n {checkboxValues.map((value, i) => (\n <Checkbox\n key={i}\n onToggle={() =>\n setCheckValues((prev) =>\n prev.includes(value)\n ? prev.filter((entry) => entry !== value)\n : [...prev, value]\n )\n }\n checked={checkValues.includes(value)}\n label={value}\n />\n ))}\n </div>\n </FormField>\n <FormField className={formField}>\n <FormFieldLabel>Some Layout Setting</FormFieldLabel>\n <div className={`${classBase}-settingsGroup`}>\n {radioValues.map((value, i) => (\n <RadioButton\n key={i}\n onClick={() => setRadioValue(value)}\n checked={radioValue === value}\n label={value}\n groupName=\"radioGroup\"\n />\n ))}\n </div>\n </FormField>\n </div>\n <div className={`${classBase}-screenshotContainer`}>\n {screenshotContent}\n </div>\n </div>\n <div className={`${classBase}-buttonsContainer`}>\n <Button className={`${classBase}-cancelButton`} onClick={onCancel}>\n Cancel\n </Button>\n <Button\n className={`${classBase}-saveButton`}\n onClick={handleSubmit}\n disabled={layoutName === \"\" || group === \"\"}\n >\n Save\n </Button>\n </div>\n </div>\n );\n};\n"],"names":["screenshot"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { toPng } from '../../../../node_modules/html-to-image/es/index.js';
|
|
2
|
+
|
|
3
|
+
const takeScreenshot = (node) => {
|
|
4
|
+
return new Promise((resolve, reject) => {
|
|
5
|
+
toPng(node, {
|
|
6
|
+
cacheBust: true
|
|
7
|
+
}).then((screenshot) => {
|
|
8
|
+
if (!screenshot) {
|
|
9
|
+
reject(new Error("No Screenshot available"));
|
|
10
|
+
}
|
|
11
|
+
resolve(screenshot);
|
|
12
|
+
}).catch((error) => {
|
|
13
|
+
console.error(
|
|
14
|
+
"the following error occurred while taking a screenshot of a DOMNode",
|
|
15
|
+
error
|
|
16
|
+
);
|
|
17
|
+
reject(new Error("Error taking screenshot"));
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { takeScreenshot };
|
|
23
|
+
//# sourceMappingURL=screenshot-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshot-utils.js","sources":["../../../../../src/layout-management/screenshot-utils.ts"],"sourcesContent":["import { toPng } from \"html-to-image\";\n\n/**\n * Takes a screenshot of the given node and returns the base64 encoded image url\n * @param node HTMLElement to take screenshot of\n * @returns Base64 encoded image url\n */\nexport const takeScreenshot = (node: HTMLElement): Promise<string> => {\n return new Promise((resolve, reject) => {\n toPng(node, {\n cacheBust: true /*,\n filter: (child) =>\n // remove content of table rows\n child.nodeType === Node.TEXT_NODE ||\n child.getAttribute(\"role\") !== \"row\",*/,\n })\n .then((screenshot) => {\n if (!screenshot) {\n reject(new Error(\"No Screenshot available\"));\n }\n resolve(screenshot);\n })\n .catch((error: Error) => {\n console.error(\n \"the following error occurred while taking a screenshot of a DOMNode\",\n error\n );\n reject(new Error(\"Error taking screenshot\"));\n });\n });\n};\n"],"names":[],"mappings":";;AAOa,MAAA,cAAA,GAAiB,CAAC,IAAuC,KAAA;AACpE,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACtC,IAAA,KAAA,CAAM,IAAM,EAAA;AAAA,MACV,SAAW,EAAA,IAAA;AAAA,KAKZ,CAAA,CACE,IAAK,CAAA,CAAC,UAAe,KAAA;AACpB,MAAA,IAAI,CAAC,UAAY,EAAA;AACf,QAAO,MAAA,CAAA,IAAI,KAAM,CAAA,yBAAyB,CAAC,CAAA,CAAA;AAAA,OAC7C;AACA,MAAA,OAAA,CAAQ,UAAU,CAAA,CAAA;AAAA,KACnB,CAAA,CACA,KAAM,CAAA,CAAC,KAAiB,KAAA;AACvB,MAAQ,OAAA,CAAA,KAAA;AAAA,QACN,qEAAA;AAAA,QACA,KAAA;AAAA,OACF,CAAA;AACA,MAAO,MAAA,CAAA,IAAI,KAAM,CAAA,yBAAyB,CAAC,CAAA,CAAA;AAAA,KAC5C,CAAA,CAAA;AAAA,GACJ,CAAA,CAAA;AACH;;;;"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useCallback, useMemo } from 'react';
|
|
3
|
+
import { useLayoutManager } from './useLayoutManager.js';
|
|
4
|
+
import { SaveLayoutPanel } from './SaveLayoutPanel.js';
|
|
5
|
+
|
|
6
|
+
const useLayoutContextMenuItems = (setDialogState) => {
|
|
7
|
+
const { saveLayout } = useLayoutManager();
|
|
8
|
+
const handleCloseDialog = useCallback(() => {
|
|
9
|
+
setDialogState(void 0);
|
|
10
|
+
}, [setDialogState]);
|
|
11
|
+
const handleSave = useCallback(
|
|
12
|
+
(layoutMetadata) => {
|
|
13
|
+
saveLayout(layoutMetadata);
|
|
14
|
+
setDialogState(void 0);
|
|
15
|
+
},
|
|
16
|
+
[saveLayout, setDialogState]
|
|
17
|
+
);
|
|
18
|
+
const [buildMenuOptions, handleMenuAction] = useMemo(() => {
|
|
19
|
+
return [
|
|
20
|
+
(location, options) => {
|
|
21
|
+
const locations = location.split(" ");
|
|
22
|
+
const menuDescriptors = [];
|
|
23
|
+
if (locations.includes("main-tab")) {
|
|
24
|
+
menuDescriptors.push(
|
|
25
|
+
{
|
|
26
|
+
label: "Save Layout",
|
|
27
|
+
action: "save-layout",
|
|
28
|
+
options
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
label: "Layout Settings",
|
|
32
|
+
action: "layout-settings",
|
|
33
|
+
options
|
|
34
|
+
}
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
return menuDescriptors;
|
|
38
|
+
},
|
|
39
|
+
(action) => {
|
|
40
|
+
console.log("menu action", {
|
|
41
|
+
action
|
|
42
|
+
});
|
|
43
|
+
if (action.menuId === "save-layout") {
|
|
44
|
+
setDialogState({
|
|
45
|
+
content: /* @__PURE__ */ jsx(
|
|
46
|
+
SaveLayoutPanel,
|
|
47
|
+
{
|
|
48
|
+
onCancel: handleCloseDialog,
|
|
49
|
+
onSave: handleSave,
|
|
50
|
+
componentId: action.options?.controlledComponentId,
|
|
51
|
+
defaultTitle: action.options?.controlledComponentTitle
|
|
52
|
+
}
|
|
53
|
+
),
|
|
54
|
+
title: "Save Layout",
|
|
55
|
+
hideCloseButton: true
|
|
56
|
+
});
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
];
|
|
62
|
+
}, [handleCloseDialog, handleSave, setDialogState]);
|
|
63
|
+
return {
|
|
64
|
+
buildMenuOptions,
|
|
65
|
+
handleMenuAction
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export { useLayoutContextMenuItems };
|
|
70
|
+
//# sourceMappingURL=useLayoutContextMenuItems.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLayoutContextMenuItems.js","sources":["../../../../../src/layout-management/useLayoutContextMenuItems.tsx"],"sourcesContent":["import {\n ContextMenuItemDescriptor,\n MenuActionHandler,\n MenuBuilder,\n} from \"@vuu-ui/vuu-data-types\";\nimport { useCallback, useMemo } from \"react\";\nimport { MenuActionClosePopup, SetDialog } from \"@vuu-ui/vuu-popups\";\nimport { useLayoutManager } from \"./useLayoutManager\";\nimport { LayoutMetadataDto } from \"./layoutTypes\";\nimport { SaveLayoutPanel } from \"./SaveLayoutPanel\";\n\nexport const useLayoutContextMenuItems = (setDialogState: SetDialog) => {\n const { saveLayout } = useLayoutManager();\n\n const handleCloseDialog = useCallback(() => {\n setDialogState(undefined);\n }, [setDialogState]);\n\n const handleSave = useCallback(\n (layoutMetadata: LayoutMetadataDto) => {\n saveLayout(layoutMetadata);\n setDialogState(undefined);\n },\n [saveLayout, setDialogState]\n );\n\n const [buildMenuOptions, handleMenuAction] = useMemo<\n [MenuBuilder, MenuActionHandler]\n >(() => {\n return [\n (location, options) => {\n const locations = location.split(\" \");\n const menuDescriptors: ContextMenuItemDescriptor[] = [];\n if (locations.includes(\"main-tab\")) {\n menuDescriptors.push(\n {\n label: \"Save Layout\",\n action: \"save-layout\",\n options,\n },\n {\n label: \"Layout Settings\",\n action: \"layout-settings\",\n options,\n }\n );\n }\n return menuDescriptors;\n },\n (action: MenuActionClosePopup) => {\n console.log(\"menu action\", {\n action,\n });\n if (action.menuId === \"save-layout\") {\n setDialogState({\n content: (\n <SaveLayoutPanel\n onCancel={handleCloseDialog}\n onSave={handleSave}\n componentId={action.options?.controlledComponentId}\n defaultTitle={\n action.options?.controlledComponentTitle as string\n }\n />\n ),\n title: \"Save Layout\",\n hideCloseButton: true,\n });\n return true;\n }\n return false;\n },\n ];\n }, [handleCloseDialog, handleSave, setDialogState]);\n\n return {\n buildMenuOptions,\n handleMenuAction,\n };\n};\n"],"names":[],"mappings":";;;;;AAWa,MAAA,yBAAA,GAA4B,CAAC,cAA8B,KAAA;AACtE,EAAM,MAAA,EAAE,UAAW,EAAA,GAAI,gBAAiB,EAAA,CAAA;AAExC,EAAM,MAAA,iBAAA,GAAoB,YAAY,MAAM;AAC1C,IAAA,cAAA,CAAe,KAAS,CAAA,CAAA,CAAA;AAAA,GAC1B,EAAG,CAAC,cAAc,CAAC,CAAA,CAAA;AAEnB,EAAA,MAAM,UAAa,GAAA,WAAA;AAAA,IACjB,CAAC,cAAsC,KAAA;AACrC,MAAA,UAAA,CAAW,cAAc,CAAA,CAAA;AACzB,MAAA,cAAA,CAAe,KAAS,CAAA,CAAA,CAAA;AAAA,KAC1B;AAAA,IACA,CAAC,YAAY,cAAc,CAAA;AAAA,GAC7B,CAAA;AAEA,EAAA,MAAM,CAAC,gBAAA,EAAkB,gBAAgB,CAAA,GAAI,QAE3C,MAAM;AACN,IAAO,OAAA;AAAA,MACL,CAAC,UAAU,OAAY,KAAA;AACrB,QAAM,MAAA,SAAA,GAAY,QAAS,CAAA,KAAA,CAAM,GAAG,CAAA,CAAA;AACpC,QAAA,MAAM,kBAA+C,EAAC,CAAA;AACtD,QAAI,IAAA,SAAA,CAAU,QAAS,CAAA,UAAU,CAAG,EAAA;AAClC,UAAgB,eAAA,CAAA,IAAA;AAAA,YACd;AAAA,cACE,KAAO,EAAA,aAAA;AAAA,cACP,MAAQ,EAAA,aAAA;AAAA,cACR,OAAA;AAAA,aACF;AAAA,YACA;AAAA,cACE,KAAO,EAAA,iBAAA;AAAA,cACP,MAAQ,EAAA,iBAAA;AAAA,cACR,OAAA;AAAA,aACF;AAAA,WACF,CAAA;AAAA,SACF;AACA,QAAO,OAAA,eAAA,CAAA;AAAA,OACT;AAAA,MACA,CAAC,MAAiC,KAAA;AAChC,QAAA,OAAA,CAAQ,IAAI,aAAe,EAAA;AAAA,UACzB,MAAA;AAAA,SACD,CAAA,CAAA;AACD,QAAI,IAAA,MAAA,CAAO,WAAW,aAAe,EAAA;AACnC,UAAe,cAAA,CAAA;AAAA,YACb,OACE,kBAAA,GAAA;AAAA,cAAC,eAAA;AAAA,cAAA;AAAA,gBACC,QAAU,EAAA,iBAAA;AAAA,gBACV,MAAQ,EAAA,UAAA;AAAA,gBACR,WAAA,EAAa,OAAO,OAAS,EAAA,qBAAA;AAAA,gBAC7B,YAAA,EACE,OAAO,OAAS,EAAA,wBAAA;AAAA,eAAA;AAAA,aAEpB;AAAA,YAEF,KAAO,EAAA,aAAA;AAAA,YACP,eAAiB,EAAA,IAAA;AAAA,WAClB,CAAA,CAAA;AACD,UAAO,OAAA,IAAA,CAAA;AAAA,SACT;AACA,QAAO,OAAA,KAAA,CAAA;AAAA,OACT;AAAA,KACF,CAAA;AAAA,GACC,EAAA,CAAC,iBAAmB,EAAA,UAAA,EAAY,cAAc,CAAC,CAAA,CAAA;AAElD,EAAO,OAAA;AAAA,IACL,gBAAA;AAAA,IACA,gBAAA;AAAA,GACF,CAAA;AACF;;;;"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import React, { useState, useRef, useCallback, useEffect, useContext } from 'react';
|
|
3
|
+
import { isLayoutJSON, resolveJSONPath } from '@vuu-ui/vuu-layout';
|
|
4
|
+
import { useNotifications } from '@vuu-ui/vuu-popups';
|
|
5
|
+
import { defaultApplicationJson, loadingApplicationJson } from '../persistence-management/defaultApplicationJson.js';
|
|
6
|
+
import { LocalPersistenceManager } from '../persistence-management/LocalPersistenceManager.js';
|
|
7
|
+
import { RemotePersistenceManager } from '../persistence-management/RemotePersistenceManager.js';
|
|
8
|
+
|
|
9
|
+
let _persistenceManager;
|
|
10
|
+
const getPersistenceManager = () => {
|
|
11
|
+
if (_persistenceManager === void 0) {
|
|
12
|
+
_persistenceManager = process.env.LOCAL ? new LocalPersistenceManager() : new RemotePersistenceManager();
|
|
13
|
+
}
|
|
14
|
+
return _persistenceManager;
|
|
15
|
+
};
|
|
16
|
+
const LayoutManagementContext = React.createContext({
|
|
17
|
+
getApplicationSettings: () => void 0,
|
|
18
|
+
layoutMetadata: [],
|
|
19
|
+
saveLayout: () => void 0,
|
|
20
|
+
// The default Application JSON will be served if no LayoutManagementProvider
|
|
21
|
+
applicationJson: defaultApplicationJson,
|
|
22
|
+
saveApplicationLayout: () => void 0,
|
|
23
|
+
saveApplicationSettings: () => void 0,
|
|
24
|
+
loadLayoutById: () => void 0
|
|
25
|
+
});
|
|
26
|
+
const ensureLayoutHasTitle = (layout, layoutMetadata) => {
|
|
27
|
+
if (layout.props?.title !== void 0) {
|
|
28
|
+
return layout;
|
|
29
|
+
} else {
|
|
30
|
+
return {
|
|
31
|
+
...layout,
|
|
32
|
+
props: {
|
|
33
|
+
...layout.props,
|
|
34
|
+
title: layoutMetadata.name
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
const LayoutManagementProvider = (props) => {
|
|
40
|
+
const [layoutMetadata, setLayoutMetadata] = useState([]);
|
|
41
|
+
const [, forceRefresh] = useState({});
|
|
42
|
+
const notify = useNotifications();
|
|
43
|
+
const applicationJSONRef = useRef(loadingApplicationJson);
|
|
44
|
+
const setApplicationJSON = useCallback(
|
|
45
|
+
(applicationJSON, rerender = true) => {
|
|
46
|
+
applicationJSONRef.current = applicationJSON;
|
|
47
|
+
if (rerender) {
|
|
48
|
+
forceRefresh({});
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
[]
|
|
52
|
+
);
|
|
53
|
+
const setApplicationLayout = useCallback(
|
|
54
|
+
(layout, rerender = true) => {
|
|
55
|
+
setApplicationJSON(
|
|
56
|
+
{
|
|
57
|
+
...applicationJSONRef.current,
|
|
58
|
+
layout
|
|
59
|
+
},
|
|
60
|
+
rerender
|
|
61
|
+
);
|
|
62
|
+
},
|
|
63
|
+
[setApplicationJSON]
|
|
64
|
+
);
|
|
65
|
+
const setApplicationSettings = useCallback(
|
|
66
|
+
(settings) => {
|
|
67
|
+
setApplicationJSON(
|
|
68
|
+
{
|
|
69
|
+
...applicationJSONRef.current,
|
|
70
|
+
settings: {
|
|
71
|
+
...applicationJSONRef.current.settings,
|
|
72
|
+
...settings
|
|
73
|
+
}
|
|
74
|
+
},
|
|
75
|
+
false
|
|
76
|
+
);
|
|
77
|
+
},
|
|
78
|
+
[setApplicationJSON]
|
|
79
|
+
);
|
|
80
|
+
useEffect(() => {
|
|
81
|
+
const persistenceManager = getPersistenceManager();
|
|
82
|
+
persistenceManager.loadMetadata().then((metadata) => {
|
|
83
|
+
setLayoutMetadata(metadata);
|
|
84
|
+
}).catch((error) => {
|
|
85
|
+
notify({
|
|
86
|
+
type: "error",
|
|
87
|
+
header: "Failed to Load Layouts",
|
|
88
|
+
body: "Could not load list of available layouts"
|
|
89
|
+
});
|
|
90
|
+
console.error("Error occurred while retrieving metadata", error);
|
|
91
|
+
});
|
|
92
|
+
persistenceManager.loadApplicationJSON().then((applicationJSON) => {
|
|
93
|
+
setApplicationJSON(applicationJSON);
|
|
94
|
+
}).catch((error) => {
|
|
95
|
+
notify({
|
|
96
|
+
type: "error",
|
|
97
|
+
header: "Failed to Load Layout",
|
|
98
|
+
body: "Could not load your latest view"
|
|
99
|
+
});
|
|
100
|
+
console.error(
|
|
101
|
+
"Error occurred while retrieving application layout",
|
|
102
|
+
error
|
|
103
|
+
);
|
|
104
|
+
});
|
|
105
|
+
}, [notify, setApplicationJSON]);
|
|
106
|
+
const saveApplicationLayout = useCallback(
|
|
107
|
+
(layout) => {
|
|
108
|
+
if (isLayoutJSON(layout)) {
|
|
109
|
+
setApplicationLayout(layout, false);
|
|
110
|
+
getPersistenceManager().saveApplicationJSON(applicationJSONRef.current);
|
|
111
|
+
} else {
|
|
112
|
+
console.error("Tried to save invalid application layout", layout);
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
[setApplicationLayout]
|
|
116
|
+
);
|
|
117
|
+
const saveLayout = useCallback(
|
|
118
|
+
(metadata) => {
|
|
119
|
+
const layoutToSave = resolveJSONPath(
|
|
120
|
+
applicationJSONRef.current.layout,
|
|
121
|
+
"#main-tabs.ACTIVE_CHILD"
|
|
122
|
+
);
|
|
123
|
+
if (layoutToSave && isLayoutJSON(layoutToSave)) {
|
|
124
|
+
getPersistenceManager().createLayout(metadata, ensureLayoutHasTitle(layoutToSave, metadata)).then((metadata2) => {
|
|
125
|
+
notify({
|
|
126
|
+
type: "success",
|
|
127
|
+
header: "Layout Saved Successfully",
|
|
128
|
+
body: `${metadata2.name} saved successfully`
|
|
129
|
+
});
|
|
130
|
+
setLayoutMetadata((prev) => [...prev, metadata2]);
|
|
131
|
+
}).catch((error) => {
|
|
132
|
+
notify({
|
|
133
|
+
type: "error",
|
|
134
|
+
header: "Failed to Save Layout",
|
|
135
|
+
body: `Failed to save layout ${metadata.name}`
|
|
136
|
+
});
|
|
137
|
+
console.error("Error occurred while saving layout", error);
|
|
138
|
+
});
|
|
139
|
+
} else {
|
|
140
|
+
console.error("Tried to save invalid layout", layoutToSave);
|
|
141
|
+
notify({
|
|
142
|
+
type: "error",
|
|
143
|
+
header: "Failed to Save Layout",
|
|
144
|
+
body: "Cannot save invalid layout"
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
[notify]
|
|
149
|
+
);
|
|
150
|
+
const saveApplicationSettings = useCallback(
|
|
151
|
+
(settings, key) => {
|
|
152
|
+
const { settings: applicationSettings } = applicationJSONRef.current;
|
|
153
|
+
if (key) {
|
|
154
|
+
setApplicationSettings({
|
|
155
|
+
...applicationSettings,
|
|
156
|
+
[key]: settings
|
|
157
|
+
});
|
|
158
|
+
} else {
|
|
159
|
+
setApplicationSettings(settings);
|
|
160
|
+
}
|
|
161
|
+
getPersistenceManager().saveApplicationJSON(applicationJSONRef.current);
|
|
162
|
+
},
|
|
163
|
+
[setApplicationSettings]
|
|
164
|
+
);
|
|
165
|
+
const getApplicationSettings = useCallback(
|
|
166
|
+
(key) => {
|
|
167
|
+
const { settings } = applicationJSONRef.current;
|
|
168
|
+
return key ? settings?.[key] : settings;
|
|
169
|
+
},
|
|
170
|
+
[]
|
|
171
|
+
);
|
|
172
|
+
const loadLayoutById = useCallback(
|
|
173
|
+
(id) => {
|
|
174
|
+
getPersistenceManager().loadLayout(id).then((layoutJson) => {
|
|
175
|
+
const { layout: currentLayout } = applicationJSONRef.current;
|
|
176
|
+
setApplicationLayout({
|
|
177
|
+
...currentLayout,
|
|
178
|
+
children: (currentLayout.children || []).concat(layoutJson),
|
|
179
|
+
props: {
|
|
180
|
+
...currentLayout.props,
|
|
181
|
+
active: currentLayout.children?.length ?? 0
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
}).catch((error) => {
|
|
185
|
+
notify({
|
|
186
|
+
type: "error",
|
|
187
|
+
header: "Failed to Load Layout",
|
|
188
|
+
body: "Failed to load the requested layout"
|
|
189
|
+
});
|
|
190
|
+
console.error("Error occurred while loading layout", error);
|
|
191
|
+
});
|
|
192
|
+
},
|
|
193
|
+
[notify, setApplicationLayout]
|
|
194
|
+
);
|
|
195
|
+
return /* @__PURE__ */ jsx(
|
|
196
|
+
LayoutManagementContext.Provider,
|
|
197
|
+
{
|
|
198
|
+
value: {
|
|
199
|
+
getApplicationSettings,
|
|
200
|
+
layoutMetadata,
|
|
201
|
+
saveLayout,
|
|
202
|
+
applicationJson: applicationJSONRef.current,
|
|
203
|
+
saveApplicationLayout,
|
|
204
|
+
saveApplicationSettings,
|
|
205
|
+
loadLayoutById
|
|
206
|
+
},
|
|
207
|
+
children: props.children
|
|
208
|
+
}
|
|
209
|
+
);
|
|
210
|
+
};
|
|
211
|
+
const useLayoutManager = () => useContext(LayoutManagementContext);
|
|
212
|
+
|
|
213
|
+
export { LayoutManagementContext, LayoutManagementProvider, useLayoutManager };
|
|
214
|
+
//# sourceMappingURL=useLayoutManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useLayoutManager.js","sources":["../../../../../src/layout-management/useLayoutManager.tsx"],"sourcesContent":["import React, {\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport {\n ApplicationJSON,\n ApplicationSettings,\n LayoutJSON,\n resolveJSONPath,\n ApplicationSetting,\n isLayoutJSON,\n} from \"@vuu-ui/vuu-layout\";\nimport { useNotifications } from \"@vuu-ui/vuu-popups\";\nimport { LayoutMetadata, LayoutMetadataDto } from \"./layoutTypes\";\nimport {\n defaultApplicationJson,\n PersistenceManager,\n loadingApplicationJson,\n LocalPersistenceManager,\n RemotePersistenceManager,\n} from \"../persistence-management\";\n\nlet _persistenceManager: PersistenceManager;\n\nconst getPersistenceManager = () => {\n if (_persistenceManager === undefined) {\n _persistenceManager = process.env.LOCAL\n ? new LocalPersistenceManager()\n : new RemotePersistenceManager();\n }\n return _persistenceManager;\n};\n\nexport const LayoutManagementContext = React.createContext<{\n layoutMetadata: LayoutMetadata[];\n saveLayout: (n: LayoutMetadataDto) => void;\n applicationJson: ApplicationJSON;\n saveApplicationLayout: (layout: LayoutJSON) => void;\n getApplicationSettings: (\n key?: keyof ApplicationSettings\n ) => ApplicationSettings | ApplicationSetting | undefined;\n saveApplicationSettings: (\n settings: ApplicationSettings | ApplicationSetting,\n key?: keyof ApplicationSettings\n ) => void;\n loadLayoutById: (id: string) => void;\n}>({\n getApplicationSettings: () => undefined,\n layoutMetadata: [],\n saveLayout: () => undefined,\n // The default Application JSON will be served if no LayoutManagementProvider\n applicationJson: defaultApplicationJson,\n saveApplicationLayout: () => undefined,\n saveApplicationSettings: () => undefined,\n loadLayoutById: () => undefined,\n});\n\ntype LayoutManagementProviderProps = {\n children: JSX.Element | JSX.Element[];\n};\n\nconst ensureLayoutHasTitle = (\n layout: LayoutJSON,\n layoutMetadata: LayoutMetadataDto\n) => {\n if (layout.props?.title !== undefined) {\n return layout;\n } else {\n return {\n ...layout,\n props: {\n ...layout.props,\n title: layoutMetadata.name,\n },\n };\n }\n};\n\nexport const LayoutManagementProvider = (\n props: LayoutManagementProviderProps\n) => {\n const [layoutMetadata, setLayoutMetadata] = useState<LayoutMetadata[]>([]);\n // TODO this default should probably be a loading state rather than the placeholder\n // It will be replaced as soon as the localStorage/remote layout is resolved\n const [, forceRefresh] = useState({});\n const notify = useNotifications();\n const applicationJSONRef = useRef<ApplicationJSON>(loadingApplicationJson);\n\n const setApplicationJSON = useCallback(\n (applicationJSON: ApplicationJSON, rerender = true) => {\n applicationJSONRef.current = applicationJSON;\n if (rerender) {\n forceRefresh({});\n }\n },\n []\n );\n\n const setApplicationLayout = useCallback(\n (layout: LayoutJSON, rerender = true) => {\n setApplicationJSON(\n {\n ...applicationJSONRef.current,\n layout,\n },\n rerender\n );\n },\n [setApplicationJSON]\n );\n\n const setApplicationSettings = useCallback(\n (settings: ApplicationSettings) => {\n setApplicationJSON(\n {\n ...applicationJSONRef.current,\n settings: {\n ...applicationJSONRef.current.settings,\n ...settings,\n },\n },\n false\n );\n },\n [setApplicationJSON]\n );\n\n useEffect(() => {\n const persistenceManager = getPersistenceManager();\n\n persistenceManager\n .loadMetadata()\n .then((metadata) => {\n setLayoutMetadata(metadata);\n })\n .catch((error: Error) => {\n notify({\n type: \"error\",\n header: \"Failed to Load Layouts\",\n body: \"Could not load list of available layouts\",\n });\n console.error(\"Error occurred while retrieving metadata\", error);\n });\n\n persistenceManager\n .loadApplicationJSON()\n .then((applicationJSON: ApplicationJSON) => {\n setApplicationJSON(applicationJSON);\n })\n .catch((error: Error) => {\n notify({\n type: \"error\",\n header: \"Failed to Load Layout\",\n body: \"Could not load your latest view\",\n });\n console.error(\n \"Error occurred while retrieving application layout\",\n error\n );\n });\n }, [notify, setApplicationJSON]);\n\n const saveApplicationLayout = useCallback(\n (layout: LayoutJSON) => {\n if (isLayoutJSON(layout)) {\n setApplicationLayout(layout, false);\n getPersistenceManager().saveApplicationJSON(applicationJSONRef.current);\n } else {\n console.error(\"Tried to save invalid application layout\", layout);\n }\n },\n [setApplicationLayout]\n );\n\n const saveLayout = useCallback(\n (metadata: LayoutMetadataDto) => {\n const layoutToSave = resolveJSONPath(\n applicationJSONRef.current.layout,\n \"#main-tabs.ACTIVE_CHILD\"\n );\n\n if (layoutToSave && isLayoutJSON(layoutToSave)) {\n getPersistenceManager()\n .createLayout(metadata, ensureLayoutHasTitle(layoutToSave, metadata))\n .then((metadata) => {\n notify({\n type: \"success\",\n header: \"Layout Saved Successfully\",\n body: `${metadata.name} saved successfully`,\n });\n setLayoutMetadata((prev) => [...prev, metadata]);\n })\n .catch((error: Error) => {\n notify({\n type: \"error\",\n header: \"Failed to Save Layout\",\n body: `Failed to save layout ${metadata.name}`,\n });\n console.error(\"Error occurred while saving layout\", error);\n });\n } else {\n console.error(\"Tried to save invalid layout\", layoutToSave);\n notify({\n type: \"error\",\n header: \"Failed to Save Layout\",\n body: \"Cannot save invalid layout\",\n });\n }\n },\n [notify]\n );\n\n const saveApplicationSettings = useCallback(\n (\n settings: ApplicationSettings | ApplicationSetting,\n key?: keyof ApplicationSettings\n ) => {\n const { settings: applicationSettings } = applicationJSONRef.current;\n if (key) {\n setApplicationSettings({\n ...applicationSettings,\n [key]: settings,\n });\n } else {\n setApplicationSettings(settings as ApplicationSettings);\n }\n getPersistenceManager().saveApplicationJSON(applicationJSONRef.current);\n },\n [setApplicationSettings]\n );\n\n const getApplicationSettings = useCallback(\n (key?: keyof ApplicationSettings) => {\n const { settings } = applicationJSONRef.current;\n return key ? settings?.[key] : settings;\n },\n []\n );\n\n const loadLayoutById = useCallback(\n (id: string) => {\n getPersistenceManager()\n .loadLayout(id)\n .then((layoutJson) => {\n const { layout: currentLayout } = applicationJSONRef.current;\n setApplicationLayout({\n ...currentLayout,\n children: (currentLayout.children || []).concat(layoutJson),\n props: {\n ...currentLayout.props,\n active: currentLayout.children?.length ?? 0,\n },\n });\n })\n .catch((error: Error) => {\n notify({\n type: \"error\",\n header: \"Failed to Load Layout\",\n body: \"Failed to load the requested layout\",\n });\n console.error(\"Error occurred while loading layout\", error);\n });\n },\n [notify, setApplicationLayout]\n );\n\n return (\n <LayoutManagementContext.Provider\n value={{\n getApplicationSettings,\n layoutMetadata,\n saveLayout,\n applicationJson: applicationJSONRef.current,\n saveApplicationLayout,\n saveApplicationSettings,\n loadLayoutById,\n }}\n >\n {props.children}\n </LayoutManagementContext.Provider>\n );\n};\n\nexport const useLayoutManager = () => useContext(LayoutManagementContext);\n"],"names":["metadata"],"mappings":"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"}
|