@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.
Files changed (203) hide show
  1. package/cjs/app-header/AppHeader.css +24 -0
  2. package/cjs/connection-status/ConnectionStatusIcon.css +68 -0
  3. package/cjs/feature-list/FeatureList.css +21 -0
  4. package/cjs/layout-management/LayoutList.css +86 -0
  5. package/cjs/layout-management/LayoutTile.css +28 -0
  6. package/cjs/layout-management/SaveLayoutPanel.css +130 -0
  7. package/cjs/left-nav/LeftNav.css +178 -0
  8. package/cjs/login/LoginPanel.css +70 -0
  9. package/cjs/node_modules/html-to-image/es/apply-style.js +24 -0
  10. package/cjs/node_modules/html-to-image/es/apply-style.js.map +1 -0
  11. package/cjs/node_modules/html-to-image/es/clone-node.js +185 -0
  12. package/cjs/node_modules/html-to-image/es/clone-node.js.map +1 -0
  13. package/cjs/node_modules/html-to-image/es/clone-pseudos.js +48 -0
  14. package/cjs/node_modules/html-to-image/es/clone-pseudos.js.map +1 -0
  15. package/cjs/node_modules/html-to-image/es/dataurl.js +83 -0
  16. package/cjs/node_modules/html-to-image/es/dataurl.js.map +1 -0
  17. package/cjs/node_modules/html-to-image/es/embed-images.js +68 -0
  18. package/cjs/node_modules/html-to-image/es/embed-images.js.map +1 -0
  19. package/cjs/node_modules/html-to-image/es/embed-resources.js +74 -0
  20. package/cjs/node_modules/html-to-image/es/embed-resources.js.map +1 -0
  21. package/cjs/node_modules/html-to-image/es/embed-webfonts.js +187 -0
  22. package/cjs/node_modules/html-to-image/es/embed-webfonts.js.map +1 -0
  23. package/cjs/node_modules/html-to-image/es/index.js +49 -0
  24. package/cjs/node_modules/html-to-image/es/index.js.map +1 -0
  25. package/cjs/node_modules/html-to-image/es/mimes.js +28 -0
  26. package/cjs/node_modules/html-to-image/es/mimes.js.map +1 -0
  27. package/cjs/node_modules/html-to-image/es/util.js +166 -0
  28. package/cjs/node_modules/html-to-image/es/util.js.map +1 -0
  29. package/cjs/packages/vuu-shell/src/ShellContextProvider.js +31 -0
  30. package/cjs/packages/vuu-shell/src/ShellContextProvider.js.map +1 -0
  31. package/cjs/packages/vuu-shell/src/app-header/AppHeader.js +57 -0
  32. package/cjs/packages/vuu-shell/src/app-header/AppHeader.js.map +1 -0
  33. package/cjs/packages/vuu-shell/src/connection-status/ConnectionStatusIcon.js +42 -0
  34. package/cjs/packages/vuu-shell/src/connection-status/ConnectionStatusIcon.js.map +1 -0
  35. package/cjs/packages/vuu-shell/src/feature/Feature.js +56 -0
  36. package/cjs/packages/vuu-shell/src/feature/Feature.js.map +1 -0
  37. package/cjs/packages/vuu-shell/src/feature/FeatureErrorBoundary.js +30 -0
  38. package/cjs/packages/vuu-shell/src/feature/FeatureErrorBoundary.js.map +1 -0
  39. package/cjs/packages/vuu-shell/src/feature/Loader.js +8 -0
  40. package/cjs/packages/vuu-shell/src/feature/Loader.js.map +1 -0
  41. package/cjs/packages/vuu-shell/src/feature/css-module-loader.js +9 -0
  42. package/cjs/packages/vuu-shell/src/feature/css-module-loader.js.map +1 -0
  43. package/cjs/packages/vuu-shell/src/feature-list/FeatureList.js +43 -0
  44. package/cjs/packages/vuu-shell/src/feature-list/FeatureList.js.map +1 -0
  45. package/cjs/packages/vuu-shell/src/index.js +51 -0
  46. package/cjs/packages/vuu-shell/src/index.js.map +1 -0
  47. package/cjs/packages/vuu-shell/src/layout-management/LayoutList.js +66 -0
  48. package/cjs/packages/vuu-shell/src/layout-management/LayoutList.js.map +1 -0
  49. package/cjs/packages/vuu-shell/src/layout-management/LayoutTile.js +27 -0
  50. package/cjs/packages/vuu-shell/src/layout-management/LayoutTile.js.map +1 -0
  51. package/cjs/packages/vuu-shell/src/layout-management/SaveLayoutPanel.js +140 -0
  52. package/cjs/packages/vuu-shell/src/layout-management/SaveLayoutPanel.js.map +1 -0
  53. package/cjs/packages/vuu-shell/src/layout-management/screenshot-utils.js +25 -0
  54. package/cjs/packages/vuu-shell/src/layout-management/screenshot-utils.js.map +1 -0
  55. package/cjs/packages/vuu-shell/src/layout-management/useLayoutContextMenuItems.js +72 -0
  56. package/cjs/packages/vuu-shell/src/layout-management/useLayoutContextMenuItems.js.map +1 -0
  57. package/cjs/packages/vuu-shell/src/layout-management/useLayoutManager.js +218 -0
  58. package/cjs/packages/vuu-shell/src/layout-management/useLayoutManager.js.map +1 -0
  59. package/cjs/packages/vuu-shell/src/left-nav/LeftNav.js +156 -0
  60. package/cjs/packages/vuu-shell/src/left-nav/LeftNav.js.map +1 -0
  61. package/cjs/packages/vuu-shell/src/login/LoginPanel.js +99 -0
  62. package/cjs/packages/vuu-shell/src/login/LoginPanel.js.map +1 -0
  63. package/cjs/packages/vuu-shell/src/login/VuuLogo.js +134 -0
  64. package/cjs/packages/vuu-shell/src/login/VuuLogo.js.map +1 -0
  65. package/cjs/packages/vuu-shell/src/login/login-utils.js +31 -0
  66. package/cjs/packages/vuu-shell/src/login/login-utils.js.map +1 -0
  67. package/cjs/packages/vuu-shell/src/persistence-management/LocalPersistenceManager.js +183 -0
  68. package/cjs/packages/vuu-shell/src/persistence-management/LocalPersistenceManager.js.map +1 -0
  69. package/cjs/packages/vuu-shell/src/persistence-management/RemotePersistenceManager.js +162 -0
  70. package/cjs/packages/vuu-shell/src/persistence-management/RemotePersistenceManager.js.map +1 -0
  71. package/cjs/packages/vuu-shell/src/persistence-management/defaultApplicationJson.js +42 -0
  72. package/cjs/packages/vuu-shell/src/persistence-management/defaultApplicationJson.js.map +1 -0
  73. package/cjs/packages/vuu-shell/src/session-editing-form/SessionEditingForm.js +271 -0
  74. package/cjs/packages/vuu-shell/src/session-editing-form/SessionEditingForm.js.map +1 -0
  75. package/cjs/packages/vuu-shell/src/shell-layouts/context-panel/ContextPanel.js +61 -0
  76. package/cjs/packages/vuu-shell/src/shell-layouts/context-panel/ContextPanel.js.map +1 -0
  77. package/cjs/packages/vuu-shell/src/shell-layouts/side-panel/SidePanel.js +27 -0
  78. package/cjs/packages/vuu-shell/src/shell-layouts/side-panel/SidePanel.js.map +1 -0
  79. package/cjs/packages/vuu-shell/src/shell-layouts/useFullHeightLeftPanel.js +41 -0
  80. package/cjs/packages/vuu-shell/src/shell-layouts/useFullHeightLeftPanel.js.map +1 -0
  81. package/cjs/packages/vuu-shell/src/shell-layouts/useInlayLeftPanel.js +78 -0
  82. package/cjs/packages/vuu-shell/src/shell-layouts/useInlayLeftPanel.js.map +1 -0
  83. package/cjs/packages/vuu-shell/src/shell-layouts/useShellLayout.js +15 -0
  84. package/cjs/packages/vuu-shell/src/shell-layouts/useShellLayout.js.map +1 -0
  85. package/cjs/packages/vuu-shell/src/shell.js +129 -0
  86. package/cjs/packages/vuu-shell/src/shell.js.map +1 -0
  87. package/cjs/packages/vuu-shell/src/shellTypes.js +8 -0
  88. package/cjs/packages/vuu-shell/src/shellTypes.js.map +1 -0
  89. package/cjs/packages/vuu-shell/src/theme-switch/ThemeSwitch.js +47 -0
  90. package/cjs/packages/vuu-shell/src/theme-switch/ThemeSwitch.js.map +1 -0
  91. package/cjs/session-editing-form/SessionEditingForm.css +53 -0
  92. package/cjs/shell-layouts/context-panel/ContextPanel.css +58 -0
  93. package/cjs/shell-layouts/side-panel/SidePanel.css +4 -0
  94. package/cjs/shell.css +49 -0
  95. package/cjs/theme-switch/ThemeSwitch.css +30 -0
  96. package/esm/app-header/AppHeader.css +24 -0
  97. package/esm/connection-status/ConnectionStatusIcon.css +68 -0
  98. package/esm/feature-list/FeatureList.css +21 -0
  99. package/esm/layout-management/LayoutList.css +86 -0
  100. package/esm/layout-management/LayoutTile.css +28 -0
  101. package/esm/layout-management/SaveLayoutPanel.css +130 -0
  102. package/esm/left-nav/LeftNav.css +178 -0
  103. package/esm/login/LoginPanel.css +70 -0
  104. package/esm/node_modules/html-to-image/es/apply-style.js +22 -0
  105. package/esm/node_modules/html-to-image/es/apply-style.js.map +1 -0
  106. package/esm/node_modules/html-to-image/es/clone-node.js +183 -0
  107. package/esm/node_modules/html-to-image/es/clone-node.js.map +1 -0
  108. package/esm/node_modules/html-to-image/es/clone-pseudos.js +46 -0
  109. package/esm/node_modules/html-to-image/es/clone-pseudos.js.map +1 -0
  110. package/esm/node_modules/html-to-image/es/dataurl.js +78 -0
  111. package/esm/node_modules/html-to-image/es/dataurl.js.map +1 -0
  112. package/esm/node_modules/html-to-image/es/embed-images.js +66 -0
  113. package/esm/node_modules/html-to-image/es/embed-images.js.map +1 -0
  114. package/esm/node_modules/html-to-image/es/embed-resources.js +69 -0
  115. package/esm/node_modules/html-to-image/es/embed-resources.js.map +1 -0
  116. package/esm/node_modules/html-to-image/es/embed-webfonts.js +184 -0
  117. package/esm/node_modules/html-to-image/es/embed-webfonts.js.map +1 -0
  118. package/esm/node_modules/html-to-image/es/index.js +45 -0
  119. package/esm/node_modules/html-to-image/es/index.js.map +1 -0
  120. package/esm/node_modules/html-to-image/es/mimes.js +26 -0
  121. package/esm/node_modules/html-to-image/es/mimes.js.map +1 -0
  122. package/esm/node_modules/html-to-image/es/util.js +155 -0
  123. package/esm/node_modules/html-to-image/es/util.js.map +1 -0
  124. package/esm/packages/vuu-shell/src/ShellContextProvider.js +28 -0
  125. package/esm/packages/vuu-shell/src/ShellContextProvider.js.map +1 -0
  126. package/esm/packages/vuu-shell/src/app-header/AppHeader.js +55 -0
  127. package/esm/packages/vuu-shell/src/app-header/AppHeader.js.map +1 -0
  128. package/esm/packages/vuu-shell/src/connection-status/ConnectionStatusIcon.js +40 -0
  129. package/esm/packages/vuu-shell/src/connection-status/ConnectionStatusIcon.js.map +1 -0
  130. package/esm/packages/vuu-shell/src/feature/Feature.js +54 -0
  131. package/esm/packages/vuu-shell/src/feature/Feature.js.map +1 -0
  132. package/esm/packages/vuu-shell/src/feature/FeatureErrorBoundary.js +28 -0
  133. package/esm/packages/vuu-shell/src/feature/FeatureErrorBoundary.js.map +1 -0
  134. package/esm/packages/vuu-shell/src/feature/Loader.js +6 -0
  135. package/esm/packages/vuu-shell/src/feature/Loader.js.map +1 -0
  136. package/esm/packages/vuu-shell/src/feature/css-module-loader.js +7 -0
  137. package/esm/packages/vuu-shell/src/feature/css-module-loader.js.map +1 -0
  138. package/esm/packages/vuu-shell/src/feature-list/FeatureList.js +41 -0
  139. package/esm/packages/vuu-shell/src/feature-list/FeatureList.js.map +1 -0
  140. package/esm/packages/vuu-shell/src/index.js +20 -0
  141. package/esm/packages/vuu-shell/src/index.js.map +1 -0
  142. package/esm/packages/vuu-shell/src/layout-management/LayoutList.js +64 -0
  143. package/esm/packages/vuu-shell/src/layout-management/LayoutList.js.map +1 -0
  144. package/esm/packages/vuu-shell/src/layout-management/LayoutTile.js +25 -0
  145. package/esm/packages/vuu-shell/src/layout-management/LayoutTile.js.map +1 -0
  146. package/esm/packages/vuu-shell/src/layout-management/SaveLayoutPanel.js +138 -0
  147. package/esm/packages/vuu-shell/src/layout-management/SaveLayoutPanel.js.map +1 -0
  148. package/esm/packages/vuu-shell/src/layout-management/screenshot-utils.js +23 -0
  149. package/esm/packages/vuu-shell/src/layout-management/screenshot-utils.js.map +1 -0
  150. package/esm/packages/vuu-shell/src/layout-management/useLayoutContextMenuItems.js +70 -0
  151. package/esm/packages/vuu-shell/src/layout-management/useLayoutContextMenuItems.js.map +1 -0
  152. package/esm/packages/vuu-shell/src/layout-management/useLayoutManager.js +214 -0
  153. package/esm/packages/vuu-shell/src/layout-management/useLayoutManager.js.map +1 -0
  154. package/esm/packages/vuu-shell/src/left-nav/LeftNav.js +154 -0
  155. package/esm/packages/vuu-shell/src/left-nav/LeftNav.js.map +1 -0
  156. package/esm/packages/vuu-shell/src/login/LoginPanel.js +97 -0
  157. package/esm/packages/vuu-shell/src/login/LoginPanel.js.map +1 -0
  158. package/esm/packages/vuu-shell/src/login/VuuLogo.js +132 -0
  159. package/esm/packages/vuu-shell/src/login/VuuLogo.js.map +1 -0
  160. package/esm/packages/vuu-shell/src/login/login-utils.js +26 -0
  161. package/esm/packages/vuu-shell/src/login/login-utils.js.map +1 -0
  162. package/esm/packages/vuu-shell/src/persistence-management/LocalPersistenceManager.js +181 -0
  163. package/esm/packages/vuu-shell/src/persistence-management/LocalPersistenceManager.js.map +1 -0
  164. package/esm/packages/vuu-shell/src/persistence-management/RemotePersistenceManager.js +160 -0
  165. package/esm/packages/vuu-shell/src/persistence-management/RemotePersistenceManager.js.map +1 -0
  166. package/esm/packages/vuu-shell/src/persistence-management/defaultApplicationJson.js +39 -0
  167. package/esm/packages/vuu-shell/src/persistence-management/defaultApplicationJson.js.map +1 -0
  168. package/esm/packages/vuu-shell/src/session-editing-form/SessionEditingForm.js +269 -0
  169. package/esm/packages/vuu-shell/src/session-editing-form/SessionEditingForm.js.map +1 -0
  170. package/esm/packages/vuu-shell/src/shell-layouts/context-panel/ContextPanel.js +59 -0
  171. package/esm/packages/vuu-shell/src/shell-layouts/context-panel/ContextPanel.js.map +1 -0
  172. package/esm/packages/vuu-shell/src/shell-layouts/side-panel/SidePanel.js +25 -0
  173. package/esm/packages/vuu-shell/src/shell-layouts/side-panel/SidePanel.js.map +1 -0
  174. package/esm/packages/vuu-shell/src/shell-layouts/useFullHeightLeftPanel.js +39 -0
  175. package/esm/packages/vuu-shell/src/shell-layouts/useFullHeightLeftPanel.js.map +1 -0
  176. package/esm/packages/vuu-shell/src/shell-layouts/useInlayLeftPanel.js +76 -0
  177. package/esm/packages/vuu-shell/src/shell-layouts/useInlayLeftPanel.js.map +1 -0
  178. package/esm/packages/vuu-shell/src/shell-layouts/useShellLayout.js +13 -0
  179. package/esm/packages/vuu-shell/src/shell-layouts/useShellLayout.js.map +1 -0
  180. package/esm/packages/vuu-shell/src/shell.js +127 -0
  181. package/esm/packages/vuu-shell/src/shell.js.map +1 -0
  182. package/esm/packages/vuu-shell/src/shellTypes.js +5 -0
  183. package/esm/packages/vuu-shell/src/shellTypes.js.map +1 -0
  184. package/esm/packages/vuu-shell/src/theme-switch/ThemeSwitch.js +45 -0
  185. package/esm/packages/vuu-shell/src/theme-switch/ThemeSwitch.js.map +1 -0
  186. package/esm/session-editing-form/SessionEditingForm.css +53 -0
  187. package/esm/shell-layouts/context-panel/ContextPanel.css +58 -0
  188. package/esm/shell-layouts/side-panel/SidePanel.css +4 -0
  189. package/esm/shell.css +49 -0
  190. package/esm/theme-switch/ThemeSwitch.css +30 -0
  191. package/package.json +17 -18
  192. package/types/ShellContextProvider.d.ts +2 -2
  193. package/types/layout-management/index.d.ts +1 -0
  194. package/types/persistence-management/RemotePersistenceManager.d.ts +1 -1
  195. package/types/persistence-management/index.d.ts +0 -1
  196. package/LICENSE +0 -201
  197. package/cjs/index.js +0 -3
  198. package/cjs/index.js.map +0 -7
  199. package/esm/index.js +0 -3
  200. package/esm/index.js.map +0 -7
  201. package/index.css +0 -2
  202. package/index.css.map +0 -7
  203. /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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"}