@vuu-ui/vuu-shell 0.13.89 → 0.13.91

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 (29) hide show
  1. package/cjs/app-header/AppHeader.js +43 -7
  2. package/cjs/app-header/AppHeader.js.map +1 -1
  3. package/cjs/persistence-manager/LocalPersistenceManager.js +4 -0
  4. package/cjs/persistence-manager/LocalPersistenceManager.js.map +1 -1
  5. package/cjs/persistence-manager/RemotePersistenceManager.js +2 -0
  6. package/cjs/persistence-manager/RemotePersistenceManager.js.map +1 -1
  7. package/cjs/persistence-manager/StaticPersistenceManager.js +2 -0
  8. package/cjs/persistence-manager/StaticPersistenceManager.js.map +1 -1
  9. package/cjs/shell.js +7 -7
  10. package/cjs/shell.js.map +1 -1
  11. package/cjs/workspace-management/WorkspaceProvider.js +8 -8
  12. package/cjs/workspace-management/WorkspaceProvider.js.map +1 -1
  13. package/esm/app-header/AppHeader.js +43 -7
  14. package/esm/app-header/AppHeader.js.map +1 -1
  15. package/esm/persistence-manager/LocalPersistenceManager.js +5 -1
  16. package/esm/persistence-manager/LocalPersistenceManager.js.map +1 -1
  17. package/esm/persistence-manager/RemotePersistenceManager.js +2 -0
  18. package/esm/persistence-manager/RemotePersistenceManager.js.map +1 -1
  19. package/esm/persistence-manager/StaticPersistenceManager.js +2 -0
  20. package/esm/persistence-manager/StaticPersistenceManager.js.map +1 -1
  21. package/esm/shell.js +6 -6
  22. package/esm/shell.js.map +1 -1
  23. package/esm/workspace-management/WorkspaceProvider.js +7 -7
  24. package/esm/workspace-management/WorkspaceProvider.js.map +1 -1
  25. package/package.json +15 -15
  26. package/types/persistence-manager/LocalPersistenceManager.d.ts +1 -0
  27. package/types/persistence-manager/PersistenceManager.d.ts +5 -0
  28. package/types/persistence-manager/RemotePersistenceManager.d.ts +1 -0
  29. package/types/persistence-manager/StaticPersistenceManager.d.ts +4 -0
@@ -11,6 +11,10 @@ var React = require('react');
11
11
  var ApplicationProvider = require('../application-provider/ApplicationProvider.js');
12
12
  var loginUtils = require('../login/login-utils.js');
13
13
  var AppHeader$1 = require('./AppHeader.css.js');
14
+ var PersistenceProvider = require('../persistence-manager/PersistenceProvider.js');
15
+ require('../persistence-manager/LocalPersistenceManager.js');
16
+ require('../persistence-manager/StaticPersistenceManager.js');
17
+ var vuuNotifications = require('@vuu-ui/vuu-notifications');
14
18
 
15
19
  const classBase = "vuuAppHeader";
16
20
  const AppHeader = ({
@@ -24,13 +28,26 @@ const AppHeader = ({
24
28
  css: AppHeader$1,
25
29
  window: targetWindow
26
30
  });
31
+ const persistenceManager = PersistenceProvider.usePersistenceManager();
27
32
  const settingsButtonRef = React.useRef(null);
28
33
  const className = cx(classBase, classNameProp);
29
34
  const loginUrl = ApplicationProvider.useLoginUrl();
30
35
  const { showComponentInContextPanel } = vuuLayout.useLayoutOperation();
36
+ const { showNotification } = vuuNotifications.useNotifications();
31
37
  const handleLogout = React.useCallback(() => {
32
38
  loginUtils.logout(loginUrl);
33
39
  }, [loginUrl]);
40
+ const handleReset = React.useCallback(() => {
41
+ persistenceManager?.clearUserSettings();
42
+ location.reload();
43
+ showNotification({
44
+ renderPostRefresh: true,
45
+ type: vuuNotifications.NotificationType.Toast,
46
+ header: "Success",
47
+ content: "Settings cleared",
48
+ status: "success"
49
+ });
50
+ }, [persistenceManager, showNotification]);
34
51
  const handleShowSettings = React.useCallback(() => {
35
52
  showComponentInContextPanel(
36
53
  {
@@ -49,18 +66,36 @@ const AppHeader = ({
49
66
  showSeparators: true,
50
67
  ...htmlAttributes,
51
68
  children: [
52
- /* @__PURE__ */ jsxRuntime.jsx(core.Button, { className: `${classBase}-menuItem`, variant: "secondary", children: "Help" }),
53
- /* @__PURE__ */ jsxRuntime.jsxs(core.Button, { className: `${classBase}-menuItem`, variant: "secondary", children: [
54
- "History ",
55
- /* @__PURE__ */ jsxRuntime.jsx("span", { "data-icon": "history" })
56
- ] }),
69
+ /* @__PURE__ */ jsxRuntime.jsx(
70
+ core.Button,
71
+ {
72
+ className: `${classBase}-menuItem`,
73
+ appearance: "bordered",
74
+ sentiment: "neutral",
75
+ children: "Help"
76
+ }
77
+ ),
78
+ /* @__PURE__ */ jsxRuntime.jsxs(
79
+ core.Button,
80
+ {
81
+ appearance: "bordered",
82
+ className: `${classBase}-menuItem`,
83
+ onClick: handleReset,
84
+ sentiment: "neutral",
85
+ children: [
86
+ "Reset ",
87
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "data-icon": "history" })
88
+ ]
89
+ }
90
+ ),
57
91
  /* @__PURE__ */ jsxRuntime.jsxs(
58
92
  core.Button,
59
93
  {
94
+ appearance: "bordered",
60
95
  className: `${classBase}-menuItem`,
61
96
  onClick: handleShowSettings,
62
97
  ref: settingsButtonRef,
63
- variant: "secondary",
98
+ sentiment: "neutral",
64
99
  children: [
65
100
  "Settings ",
66
101
  /* @__PURE__ */ jsxRuntime.jsx("span", { "data-icon": "settings" })
@@ -70,9 +105,10 @@ const AppHeader = ({
70
105
  /* @__PURE__ */ jsxRuntime.jsx(
71
106
  core.Button,
72
107
  {
108
+ appearance: "bordered",
73
109
  className: `${classBase}-menuItem`,
74
110
  onClick: handleLogout,
75
- variant: "secondary",
111
+ sentiment: "neutral",
76
112
  children: "Log out"
77
113
  }
78
114
  )
@@ -1 +1 @@
1
- {"version":3,"file":"AppHeader.js","sources":["../../../../packages/vuu-shell/src/app-header/AppHeader.tsx"],"sourcesContent":["import { Button } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { useLayoutOperation } from \"@vuu-ui/vuu-layout\";\nimport { Toolbar } from \"@vuu-ui/vuu-ui-controls\";\nimport type { ThemeMode } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useCallback, useRef } from \"react\";\nimport { useLoginUrl } from \"../application-provider\";\nimport { logout } from \"../login\";\n\nimport appHeaderCss from \"./AppHeader.css\";\n\nconst classBase = \"vuuAppHeader\";\nexport interface AppHeaderProps extends HTMLAttributes<HTMLDivElement> {\n themeMode?: ThemeMode;\n}\n\nexport const AppHeader = ({\n className: classNameProp,\n themeMode: _,\n ...htmlAttributes\n}: AppHeaderProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-app-header\",\n css: appHeaderCss,\n window: targetWindow,\n });\n\n const settingsButtonRef = useRef<HTMLButtonElement>(null);\n\n const className = cx(classBase, classNameProp);\n const loginUrl = useLoginUrl();\n\n const { showComponentInContextPanel } = useLayoutOperation();\n\n const handleLogout = useCallback(() => {\n logout(loginUrl);\n }, [loginUrl]);\n\n const handleShowSettings = useCallback(() => {\n showComponentInContextPanel(\n {\n type: \"ApplicationSettings\",\n },\n \"Settings\",\n () => settingsButtonRef.current?.focus(),\n );\n }, [showComponentInContextPanel]);\n\n return (\n <Toolbar\n alignItems=\"end\"\n className={className}\n role=\"banner\"\n showSeparators\n {...htmlAttributes}\n >\n <Button className={`${classBase}-menuItem`} variant=\"secondary\">\n Help\n </Button>\n <Button className={`${classBase}-menuItem`} variant=\"secondary\">\n History <span data-icon=\"history\" />\n </Button>\n <Button\n className={`${classBase}-menuItem`}\n onClick={handleShowSettings}\n ref={settingsButtonRef}\n variant=\"secondary\"\n >\n Settings <span data-icon=\"settings\" />\n </Button>\n <Button\n className={`${classBase}-menuItem`}\n onClick={handleLogout}\n variant=\"secondary\"\n >\n Log out\n </Button>\n </Toolbar>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","appHeaderCss","useRef","useLoginUrl","useLayoutOperation","useCallback","logout","jsxs","Toolbar","jsx","Button"],"mappings":";;;;;;;;;;;;;;AAaA,MAAM,SAAY,GAAA,cAAA;AAKX,MAAM,YAAY,CAAC;AAAA,EACxB,SAAW,EAAA,aAAA;AAAA,EACX,SAAW,EAAA,CAAA;AAAA,EACX,GAAG;AACL,CAAsB,KAAA;AACpB,EAAA,MAAM,eAAeA,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,gBAAA;AAAA,IACR,GAAK,EAAAC,WAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAM,MAAA,iBAAA,GAAoBC,aAA0B,IAAI,CAAA;AAExD,EAAM,MAAA,SAAA,GAAY,EAAG,CAAA,SAAA,EAAW,aAAa,CAAA;AAC7C,EAAA,MAAM,WAAWC,+BAAY,EAAA;AAE7B,EAAM,MAAA,EAAE,2BAA4B,EAAA,GAAIC,4BAAmB,EAAA;AAE3D,EAAM,MAAA,YAAA,GAAeC,kBAAY,MAAM;AACrC,IAAAC,iBAAA,CAAO,QAAQ,CAAA;AAAA,GACjB,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAM,MAAA,kBAAA,GAAqBD,kBAAY,MAAM;AAC3C,IAAA,2BAAA;AAAA,MACE;AAAA,QACE,IAAM,EAAA;AAAA,OACR;AAAA,MACA,UAAA;AAAA,MACA,MAAM,iBAAkB,CAAA,OAAA,EAAS,KAAM;AAAA,KACzC;AAAA,GACF,EAAG,CAAC,2BAA2B,CAAC,CAAA;AAEhC,EACE,uBAAAE,eAAA;AAAA,IAACC,qBAAA;AAAA,IAAA;AAAA,MACC,UAAW,EAAA,KAAA;AAAA,MACX,SAAA;AAAA,MACA,IAAK,EAAA,QAAA;AAAA,MACL,cAAc,EAAA,IAAA;AAAA,MACb,GAAG,cAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAAC,cAAA,CAACC,eAAO,SAAW,EAAA,CAAA,EAAG,SAAS,CAAa,SAAA,CAAA,EAAA,OAAA,EAAQ,aAAY,QAEhE,EAAA,MAAA,EAAA,CAAA;AAAA,wCACCA,WAAO,EAAA,EAAA,SAAA,EAAW,GAAG,SAAS,CAAA,SAAA,CAAA,EAAa,SAAQ,WAAY,EAAA,QAAA,EAAA;AAAA,UAAA,UAAA;AAAA,0BACtDD,cAAA,CAAC,MAAK,EAAA,EAAA,WAAA,EAAU,SAAU,EAAA;AAAA,SACpC,EAAA,CAAA;AAAA,wBACAF,eAAA;AAAA,UAACG,WAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,GAAG,SAAS,CAAA,SAAA,CAAA;AAAA,YACvB,OAAS,EAAA,kBAAA;AAAA,YACT,GAAK,EAAA,iBAAA;AAAA,YACL,OAAQ,EAAA,WAAA;AAAA,YACT,QAAA,EAAA;AAAA,cAAA,WAAA;AAAA,8BACUD,cAAA,CAAC,MAAK,EAAA,EAAA,WAAA,EAAU,UAAW,EAAA;AAAA;AAAA;AAAA,SACtC;AAAA,wBACAA,cAAA;AAAA,UAACC,WAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,GAAG,SAAS,CAAA,SAAA,CAAA;AAAA,YACvB,OAAS,EAAA,YAAA;AAAA,YACT,OAAQ,EAAA,WAAA;AAAA,YACT,QAAA,EAAA;AAAA;AAAA;AAED;AAAA;AAAA,GACF;AAEJ;;;;"}
1
+ {"version":3,"file":"AppHeader.js","sources":["../../../../packages/vuu-shell/src/app-header/AppHeader.tsx"],"sourcesContent":["import { Button } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { useLayoutOperation } from \"@vuu-ui/vuu-layout\";\nimport { Toolbar } from \"@vuu-ui/vuu-ui-controls\";\nimport type { ThemeMode } from \"@vuu-ui/vuu-utils\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useCallback, useRef } from \"react\";\nimport { useLoginUrl } from \"../application-provider\";\nimport { logout } from \"../login\";\n\nimport appHeaderCss from \"./AppHeader.css\";\nimport { usePersistenceManager } from \"../persistence-manager\";\nimport { NotificationType, useNotifications } from \"@vuu-ui/vuu-notifications\";\n\nconst classBase = \"vuuAppHeader\";\nexport interface AppHeaderProps extends HTMLAttributes<HTMLDivElement> {\n themeMode?: ThemeMode;\n}\n\nexport const AppHeader = ({\n className: classNameProp,\n themeMode: _,\n ...htmlAttributes\n}: AppHeaderProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-app-header\",\n css: appHeaderCss,\n window: targetWindow,\n });\n\n const persistenceManager = usePersistenceManager();\n const settingsButtonRef = useRef<HTMLButtonElement>(null);\n\n const className = cx(classBase, classNameProp);\n const loginUrl = useLoginUrl();\n\n const { showComponentInContextPanel } = useLayoutOperation();\n const { showNotification } = useNotifications();\n\n const handleLogout = useCallback(() => {\n logout(loginUrl);\n }, [loginUrl]);\n\n const handleReset = useCallback(() => {\n persistenceManager?.clearUserSettings();\n location.reload();\n showNotification({\n renderPostRefresh: true,\n type: NotificationType.Toast,\n header: \"Success\",\n content: \"Settings cleared\",\n status: \"success\",\n });\n }, [persistenceManager, showNotification]);\n\n const handleShowSettings = useCallback(() => {\n showComponentInContextPanel(\n {\n type: \"ApplicationSettings\",\n },\n \"Settings\",\n () => settingsButtonRef.current?.focus(),\n );\n }, [showComponentInContextPanel]);\n\n return (\n <Toolbar\n alignItems=\"end\"\n className={className}\n role=\"banner\"\n showSeparators\n {...htmlAttributes}\n >\n <Button\n className={`${classBase}-menuItem`}\n appearance=\"bordered\"\n sentiment=\"neutral\"\n >\n Help\n </Button>\n <Button\n appearance=\"bordered\"\n className={`${classBase}-menuItem`}\n onClick={handleReset}\n sentiment=\"neutral\"\n >\n Reset <span data-icon=\"history\" />\n </Button>\n <Button\n appearance=\"bordered\"\n className={`${classBase}-menuItem`}\n onClick={handleShowSettings}\n ref={settingsButtonRef}\n sentiment=\"neutral\"\n >\n Settings <span data-icon=\"settings\" />\n </Button>\n <Button\n appearance=\"bordered\"\n className={`${classBase}-menuItem`}\n onClick={handleLogout}\n sentiment=\"neutral\"\n >\n Log out\n </Button>\n </Toolbar>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","appHeaderCss","usePersistenceManager","useRef","useLoginUrl","useLayoutOperation","useNotifications","useCallback","logout","NotificationType","jsxs","Toolbar","jsx","Button"],"mappings":"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"}
@@ -79,6 +79,10 @@ class LocalPersistenceManager {
79
79
  __privateSet(this, _urlKey, urlKey);
80
80
  }
81
81
  }
82
+ clearUserSettings() {
83
+ vuuUtils.clearLocalEntity(__privateGet(this, _urlKey));
84
+ __privateSet(this, _applicationJSON, void 0);
85
+ }
82
86
  createLayout(metadata, layout) {
83
87
  return new Promise((resolve) => {
84
88
  Promise.all([this.loadLayouts(), this.loadMetadata()]).then(
@@ -1 +1 @@
1
- {"version":3,"file":"LocalPersistenceManager.js","sources":["../../../../packages/vuu-shell/src/persistence-manager/LocalPersistenceManager.ts"],"sourcesContent":["import {\n ApplicationJSON,\n LayoutJSON,\n Settings,\n formatDate,\n getLocalEntity,\n getUniqueId,\n saveLocalEntity,\n Layout,\n LayoutMetadata,\n LayoutMetadataDto,\n WithId,\n} from \"@vuu-ui/vuu-utils\";\nimport { getAuthDetailsFromCookies } from \"../login\";\nimport { IPersistenceManager } from \"./PersistenceManager\";\nconst baseMetadataSaveLocation = \"layouts/metadata\";\nconst baseLayoutsSaveLocation = \"layouts/layouts\";\n\nexport class LocalPersistenceManager implements IPersistenceManager {\n #username: string = getAuthDetailsFromCookies()[0];\n metadataSaveLocation = `${baseMetadataSaveLocation}/${this.#username}`;\n layoutsSaveLocation = `${baseLayoutsSaveLocation}/${this.#username}`;\n #urlKey = `api/vui/${this.#username}`;\n #applicationJSON: ApplicationJSON | undefined;\n\n constructor(urlKey?: string) {\n if (urlKey) {\n this.#urlKey = urlKey;\n }\n }\n\n createLayout(\n metadata: LayoutMetadataDto,\n layout: LayoutJSON,\n ): Promise<LayoutMetadata> {\n return new Promise((resolve) => {\n Promise.all([this.loadLayouts(), this.loadMetadata()]).then(\n ([existingLayouts, existingMetadata]) => {\n const id = getUniqueId();\n const newMetadata: LayoutMetadata = {\n ...metadata,\n id,\n created: formatDate({ date: \"dd.mm.yyyy\" })(new Date()),\n };\n\n this.saveLayoutsWithMetadata(\n [...existingLayouts, { id, json: layout }],\n [...existingMetadata, newMetadata],\n );\n resolve(newMetadata);\n },\n );\n });\n }\n\n updateLayout(\n id: string,\n newMetadata: LayoutMetadataDto,\n newLayout: LayoutJSON,\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n this.validateIds(id)\n .then(() => Promise.all([this.loadLayouts(), this.loadMetadata()]))\n .then(([existingLayouts, existingMetadata]) => {\n const updatedLayouts = existingLayouts.map((layout) =>\n layout.id === id ? { ...layout, json: newLayout } : layout,\n );\n const updatedMetadata = existingMetadata.map((metadata) =>\n metadata.id === id ? { ...metadata, ...newMetadata } : metadata,\n );\n this.saveLayoutsWithMetadata(updatedLayouts, updatedMetadata);\n resolve();\n })\n .catch((e) => reject(e));\n });\n }\n\n deleteLayout(id: string): Promise<void> {\n return new Promise((resolve, reject) => {\n this.validateIds(id)\n .then(() => Promise.all([this.loadLayouts(), this.loadMetadata()]))\n .then(([existingLayouts, existingMetadata]) => {\n const layouts = existingLayouts.filter((layout) => layout.id !== id);\n const metadata = existingMetadata.filter(\n (metadata) => metadata.id !== id,\n );\n this.saveLayoutsWithMetadata(layouts, metadata);\n resolve();\n })\n .catch((e) => reject(e));\n });\n }\n\n loadLayout(id: string): Promise<LayoutJSON> {\n return new Promise((resolve, reject) => {\n this.validateId(id, \"layout\")\n .then(() => this.loadLayouts())\n .then((existingLayouts) => {\n const foundLayout = existingLayouts.find(\n (layout) => layout.id === id,\n );\n if (foundLayout) {\n resolve(foundLayout.json);\n } else {\n reject(new Error(`no layout found matching id ${id}`));\n }\n })\n .catch((e) => reject(e));\n });\n }\n\n loadMetadata(): Promise<LayoutMetadata[]> {\n return new Promise((resolve) => {\n const metadata = getLocalEntity<LayoutMetadata[]>(\n this.metadataSaveLocation,\n );\n resolve(metadata || []);\n });\n }\n\n async loadApplicationJSON(): Promise<ApplicationJSON | undefined> {\n return (\n this.#applicationJSON ||\n new Promise((resolve) => {\n const applicationJSON = getLocalEntity<ApplicationJSON>(this.#urlKey);\n if (applicationJSON) {\n this.#applicationJSON = applicationJSON;\n }\n resolve(applicationJSON);\n })\n );\n }\n\n saveApplicationJSON(applicationJSON: ApplicationJSON): Promise<void> {\n return new Promise((resolve, reject) => {\n const savedLayout = saveLocalEntity<ApplicationJSON>(\n this.#urlKey,\n applicationJSON,\n );\n if (savedLayout) {\n this.#applicationJSON = applicationJSON;\n resolve();\n } else {\n reject(new Error(\"Application Json failed to save\"));\n }\n });\n }\n\n loadLayouts = (): Promise<Layout[]> => {\n return new Promise((resolve) => {\n const layouts = getLocalEntity<Layout[]>(this.layoutsSaveLocation);\n resolve(layouts || []);\n });\n };\n\n saveLayoutsWithMetadata = (\n layouts: Layout[],\n metadata: LayoutMetadata[],\n ): void => {\n saveLocalEntity<Layout[]>(this.layoutsSaveLocation, layouts);\n saveLocalEntity<LayoutMetadata[]>(this.metadataSaveLocation, metadata);\n };\n\n // Ensures that there is exactly one Layout entry and exactly one Metadata\n // entry in local storage corresponding to the provided ID.\n validateIds = async (id: string): Promise<void> => {\n return Promise.all([\n this.validateId(id, \"metadata\").catch((error) => error.message),\n this.validateId(id, \"layout\").catch((error) => error.message),\n ]).then((errorMessages: string[]) => {\n // filter() is used to remove any blank messages before joining.\n // Avoids orphaned delimiters in combined messages, e.g. \"; \" or \"; error 2\"\n const combinedMessage = errorMessages\n .filter((msg) => msg !== undefined)\n .join(\"; \");\n if (combinedMessage) {\n throw new Error(combinedMessage);\n }\n });\n };\n\n // Ensures that there is exactly one element (Layout or Metadata) in local\n // storage corresponding to the provided ID.\n validateId = (id: string, dataType: \"metadata\" | \"layout\"): Promise<void> => {\n return new Promise((resolve, reject) => {\n const loadFunc =\n dataType === \"metadata\"\n ? () => this.loadMetadata()\n : () => this.loadLayouts();\n\n loadFunc().then((array: WithId[]) => {\n const count = array.filter((element) => element.id === id).length;\n switch (count) {\n case 1: {\n resolve();\n break;\n }\n case 0: {\n reject(new Error(`No ${dataType} with ID ${id}`));\n break;\n }\n default:\n reject(new Error(`Non-unique ${dataType} with ID ${id}`));\n }\n });\n });\n };\n\n async getUserSettings() {\n if (this.#applicationJSON) {\n return this.#applicationJSON.userSettings ?? {};\n }\n\n try {\n const applicationJSON = await this.loadApplicationJSON();\n return applicationJSON?.userSettings ?? {};\n } catch (e) {\n return {};\n }\n }\n\n saveUserSettings(userSettings: Settings) {\n if (this.#applicationJSON) {\n this.saveApplicationJSON({\n ...this.#applicationJSON,\n userSettings,\n });\n }\n }\n}\n"],"names":["getAuthDetailsFromCookies","getLocalEntity","saveLocalEntity","getUniqueId","formatDate","metadata"],"mappings":"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"}
1
+ {"version":3,"file":"LocalPersistenceManager.js","sources":["../../../../packages/vuu-shell/src/persistence-manager/LocalPersistenceManager.ts"],"sourcesContent":["import {\n ApplicationJSON,\n LayoutJSON,\n Settings,\n formatDate,\n getLocalEntity,\n getUniqueId,\n saveLocalEntity,\n Layout,\n LayoutMetadata,\n LayoutMetadataDto,\n WithId,\n clearLocalEntity,\n} from \"@vuu-ui/vuu-utils\";\nimport { getAuthDetailsFromCookies } from \"../login\";\nimport { IPersistenceManager } from \"./PersistenceManager\";\nconst baseMetadataSaveLocation = \"layouts/metadata\";\nconst baseLayoutsSaveLocation = \"layouts/layouts\";\n\nexport class LocalPersistenceManager implements IPersistenceManager {\n #username: string = getAuthDetailsFromCookies()[0];\n metadataSaveLocation = `${baseMetadataSaveLocation}/${this.#username}`;\n layoutsSaveLocation = `${baseLayoutsSaveLocation}/${this.#username}`;\n #urlKey = `api/vui/${this.#username}`;\n #applicationJSON: ApplicationJSON | undefined;\n\n constructor(urlKey?: string) {\n if (urlKey) {\n this.#urlKey = urlKey;\n }\n }\n\n clearUserSettings() {\n clearLocalEntity(this.#urlKey);\n this.#applicationJSON = undefined;\n }\n\n createLayout(\n metadata: LayoutMetadataDto,\n layout: LayoutJSON,\n ): Promise<LayoutMetadata> {\n return new Promise((resolve) => {\n Promise.all([this.loadLayouts(), this.loadMetadata()]).then(\n ([existingLayouts, existingMetadata]) => {\n const id = getUniqueId();\n const newMetadata: LayoutMetadata = {\n ...metadata,\n id,\n created: formatDate({ date: \"dd.mm.yyyy\" })(new Date()),\n };\n\n this.saveLayoutsWithMetadata(\n [...existingLayouts, { id, json: layout }],\n [...existingMetadata, newMetadata],\n );\n resolve(newMetadata);\n },\n );\n });\n }\n\n updateLayout(\n id: string,\n newMetadata: LayoutMetadataDto,\n newLayout: LayoutJSON,\n ): Promise<void> {\n return new Promise((resolve, reject) => {\n this.validateIds(id)\n .then(() => Promise.all([this.loadLayouts(), this.loadMetadata()]))\n .then(([existingLayouts, existingMetadata]) => {\n const updatedLayouts = existingLayouts.map((layout) =>\n layout.id === id ? { ...layout, json: newLayout } : layout,\n );\n const updatedMetadata = existingMetadata.map((metadata) =>\n metadata.id === id ? { ...metadata, ...newMetadata } : metadata,\n );\n this.saveLayoutsWithMetadata(updatedLayouts, updatedMetadata);\n resolve();\n })\n .catch((e) => reject(e));\n });\n }\n\n deleteLayout(id: string): Promise<void> {\n return new Promise((resolve, reject) => {\n this.validateIds(id)\n .then(() => Promise.all([this.loadLayouts(), this.loadMetadata()]))\n .then(([existingLayouts, existingMetadata]) => {\n const layouts = existingLayouts.filter((layout) => layout.id !== id);\n const metadata = existingMetadata.filter(\n (metadata) => metadata.id !== id,\n );\n this.saveLayoutsWithMetadata(layouts, metadata);\n resolve();\n })\n .catch((e) => reject(e));\n });\n }\n\n loadLayout(id: string): Promise<LayoutJSON> {\n return new Promise((resolve, reject) => {\n this.validateId(id, \"layout\")\n .then(() => this.loadLayouts())\n .then((existingLayouts) => {\n const foundLayout = existingLayouts.find(\n (layout) => layout.id === id,\n );\n if (foundLayout) {\n resolve(foundLayout.json);\n } else {\n reject(new Error(`no layout found matching id ${id}`));\n }\n })\n .catch((e) => reject(e));\n });\n }\n\n loadMetadata(): Promise<LayoutMetadata[]> {\n return new Promise((resolve) => {\n const metadata = getLocalEntity<LayoutMetadata[]>(\n this.metadataSaveLocation,\n );\n resolve(metadata || []);\n });\n }\n\n async loadApplicationJSON(): Promise<ApplicationJSON | undefined> {\n return (\n this.#applicationJSON ||\n new Promise((resolve) => {\n const applicationJSON = getLocalEntity<ApplicationJSON>(this.#urlKey);\n if (applicationJSON) {\n this.#applicationJSON = applicationJSON;\n }\n resolve(applicationJSON);\n })\n );\n }\n\n saveApplicationJSON(applicationJSON: ApplicationJSON): Promise<void> {\n return new Promise((resolve, reject) => {\n const savedLayout = saveLocalEntity<ApplicationJSON>(\n this.#urlKey,\n applicationJSON,\n );\n if (savedLayout) {\n this.#applicationJSON = applicationJSON;\n resolve();\n } else {\n reject(new Error(\"Application Json failed to save\"));\n }\n });\n }\n\n loadLayouts = (): Promise<Layout[]> => {\n return new Promise((resolve) => {\n const layouts = getLocalEntity<Layout[]>(this.layoutsSaveLocation);\n resolve(layouts || []);\n });\n };\n\n saveLayoutsWithMetadata = (\n layouts: Layout[],\n metadata: LayoutMetadata[],\n ): void => {\n saveLocalEntity<Layout[]>(this.layoutsSaveLocation, layouts);\n saveLocalEntity<LayoutMetadata[]>(this.metadataSaveLocation, metadata);\n };\n\n // Ensures that there is exactly one Layout entry and exactly one Metadata\n // entry in local storage corresponding to the provided ID.\n validateIds = async (id: string): Promise<void> => {\n return Promise.all([\n this.validateId(id, \"metadata\").catch((error) => error.message),\n this.validateId(id, \"layout\").catch((error) => error.message),\n ]).then((errorMessages: string[]) => {\n // filter() is used to remove any blank messages before joining.\n // Avoids orphaned delimiters in combined messages, e.g. \"; \" or \"; error 2\"\n const combinedMessage = errorMessages\n .filter((msg) => msg !== undefined)\n .join(\"; \");\n if (combinedMessage) {\n throw new Error(combinedMessage);\n }\n });\n };\n\n // Ensures that there is exactly one element (Layout or Metadata) in local\n // storage corresponding to the provided ID.\n validateId = (id: string, dataType: \"metadata\" | \"layout\"): Promise<void> => {\n return new Promise((resolve, reject) => {\n const loadFunc =\n dataType === \"metadata\"\n ? () => this.loadMetadata()\n : () => this.loadLayouts();\n\n loadFunc().then((array: WithId[]) => {\n const count = array.filter((element) => element.id === id).length;\n switch (count) {\n case 1: {\n resolve();\n break;\n }\n case 0: {\n reject(new Error(`No ${dataType} with ID ${id}`));\n break;\n }\n default:\n reject(new Error(`Non-unique ${dataType} with ID ${id}`));\n }\n });\n });\n };\n\n async getUserSettings() {\n if (this.#applicationJSON) {\n return this.#applicationJSON.userSettings ?? {};\n }\n\n try {\n const applicationJSON = await this.loadApplicationJSON();\n return applicationJSON?.userSettings ?? {};\n } catch (e) {\n return {};\n }\n }\n\n saveUserSettings(userSettings: Settings) {\n if (this.#applicationJSON) {\n this.saveApplicationJSON({\n ...this.#applicationJSON,\n userSettings,\n });\n }\n }\n}\n"],"names":["getAuthDetailsFromCookies","getLocalEntity","saveLocalEntity","clearLocalEntity","getUniqueId","formatDate","metadata"],"mappings":"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"}
@@ -46,6 +46,8 @@ class RemotePersistenceManager {
46
46
  })
47
47
  );
48
48
  }
49
+ clearUserSettings() {
50
+ }
49
51
  updateLayout(id, metadata, newLayoutJson) {
50
52
  return new Promise(
51
53
  (resolve, reject) => fetch(`${baseURL}/${layoutsSaveLocation}/${id}`, {
@@ -1 +1 @@
1
- {"version":3,"file":"RemotePersistenceManager.js","sources":["../../../../packages/vuu-shell/src/persistence-manager/RemotePersistenceManager.ts"],"sourcesContent":["import {\n ApplicationJSON,\n LayoutJSON,\n LayoutMetadata,\n LayoutMetadataDto,\n Settings,\n} from \"@vuu-ui/vuu-utils\";\nimport { getAuthDetailsFromCookies } from \"../login\";\nimport { IPersistenceManager } from \"./PersistenceManager\";\n\nconst baseURL = \"/api\";\nconst metadataSaveLocation = \"layouts/metadata\";\nconst layoutsSaveLocation = \"layouts\";\nconst applicationLayoutsSaveLocation = \"application-layouts\";\n\nexport type CreateLayoutResponseDto = { metadata: LayoutMetadata };\nexport type GetLayoutResponseDto = { definition: LayoutJSON };\nexport type GetApplicationResponseDto = { definition: ApplicationJSON };\n\nexport class RemotePersistenceManager implements IPersistenceManager {\n username: string = getAuthDetailsFromCookies()[0];\n\n createLayout(\n metadata: LayoutMetadataDto,\n layout: LayoutJSON,\n ): Promise<LayoutMetadata> {\n return new Promise((resolve, reject) =>\n fetch(`${baseURL}/${layoutsSaveLocation}`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n body: JSON.stringify({\n metadata,\n definition: layout,\n }),\n })\n .then((response) => {\n if (!response.ok) {\n reject(new Error(response.statusText));\n }\n response.json().then(({ metadata }: CreateLayoutResponseDto) => {\n if (!metadata) {\n reject(new Error(\"Response did not contain valid metadata\"));\n }\n resolve(metadata);\n });\n })\n .catch((error: Error) => {\n reject(error);\n }),\n );\n }\n\n updateLayout(\n id: string,\n metadata: LayoutMetadataDto,\n newLayoutJson: LayoutJSON,\n ): Promise<void> {\n return new Promise((resolve, reject) =>\n fetch(`${baseURL}/${layoutsSaveLocation}/${id}`, {\n method: \"PUT\",\n body: JSON.stringify({\n metadata,\n layout: newLayoutJson,\n }),\n })\n .then((response) => {\n if (!response.ok) {\n reject(new Error(response.statusText));\n }\n resolve();\n })\n .catch((error: Error) => {\n reject(error);\n }),\n );\n }\n\n deleteLayout(id: string): Promise<void> {\n return new Promise((resolve, reject) =>\n fetch(`${baseURL}/${layoutsSaveLocation}/${id}`, {\n method: \"DELETE\",\n })\n .then((response) => {\n if (!response.ok) {\n reject(new Error(response.statusText));\n }\n resolve();\n })\n .catch((error: Error) => {\n reject(error);\n }),\n );\n }\n\n loadLayout(id: string): Promise<LayoutJSON> {\n return new Promise((resolve, reject) => {\n fetch(`${baseURL}/${layoutsSaveLocation}/${id}`, {\n method: \"GET\",\n })\n .then((response) => {\n if (!response.ok) {\n reject(new Error(response.statusText));\n }\n response.json().then(({ definition }: GetLayoutResponseDto) => {\n if (!definition) {\n reject(new Error(\"Response did not contain a valid layout\"));\n }\n resolve(definition);\n });\n })\n .catch((error: Error) => {\n reject(error);\n });\n });\n }\n\n loadMetadata(): Promise<LayoutMetadata[]> {\n return new Promise((resolve, reject) =>\n fetch(`${baseURL}/${metadataSaveLocation}`, {\n method: \"GET\",\n })\n .then((response) => {\n if (!response.ok) {\n reject(new Error(response.statusText));\n }\n response.json().then((metadata: LayoutMetadata[]) => {\n if (!metadata) {\n reject(new Error(\"Response did not contain valid metadata\"));\n }\n resolve(metadata);\n });\n })\n .catch((error: Error) => {\n reject(error);\n }),\n );\n }\n\n saveApplicationJSON(applicationJSON: ApplicationJSON): Promise<void> {\n return new Promise((resolve, reject) =>\n fetch(`${baseURL}/${applicationLayoutsSaveLocation}`, {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n username: this.username,\n },\n body: JSON.stringify(applicationJSON),\n })\n .then((response) => {\n if (!response.ok) {\n reject(new Error(response.statusText));\n }\n resolve();\n })\n .catch((error: Error) => {\n reject(error);\n }),\n );\n }\n\n loadApplicationJSON(): Promise<ApplicationJSON> {\n return new Promise((resolve, reject) =>\n fetch(`${baseURL}/${applicationLayoutsSaveLocation}`, {\n method: \"GET\",\n headers: {\n username: this.username,\n },\n })\n .then((response) => {\n if (!response.ok) {\n reject(new Error(response.statusText));\n }\n response.json().then((applicationJSON: GetApplicationResponseDto) => {\n if (!applicationJSON) {\n reject(\n new Error(\n \"Response did not contain valid application layout information\",\n ),\n );\n }\n resolve(applicationJSON.definition);\n });\n })\n .catch((error: Error) => {\n reject(error);\n }),\n );\n }\n\n async getUserSettings() {\n return {};\n }\n\n saveUserSettings(userSettings: Settings) {\n console.log(\"saveUserSettings not implemented\", {\n userSettings,\n });\n }\n}\n"],"names":["getAuthDetailsFromCookies","metadata"],"mappings":"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"}
1
+ {"version":3,"file":"RemotePersistenceManager.js","sources":["../../../../packages/vuu-shell/src/persistence-manager/RemotePersistenceManager.ts"],"sourcesContent":["import {\n ApplicationJSON,\n LayoutJSON,\n LayoutMetadata,\n LayoutMetadataDto,\n Settings,\n} from \"@vuu-ui/vuu-utils\";\nimport { getAuthDetailsFromCookies } from \"../login\";\nimport { IPersistenceManager } from \"./PersistenceManager\";\n\nconst baseURL = \"/api\";\nconst metadataSaveLocation = \"layouts/metadata\";\nconst layoutsSaveLocation = \"layouts\";\nconst applicationLayoutsSaveLocation = \"application-layouts\";\n\nexport type CreateLayoutResponseDto = { metadata: LayoutMetadata };\nexport type GetLayoutResponseDto = { definition: LayoutJSON };\nexport type GetApplicationResponseDto = { definition: ApplicationJSON };\n\nexport class RemotePersistenceManager implements IPersistenceManager {\n username: string = getAuthDetailsFromCookies()[0];\n\n createLayout(\n metadata: LayoutMetadataDto,\n layout: LayoutJSON,\n ): Promise<LayoutMetadata> {\n return new Promise((resolve, reject) =>\n fetch(`${baseURL}/${layoutsSaveLocation}`, {\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n body: JSON.stringify({\n metadata,\n definition: layout,\n }),\n })\n .then((response) => {\n if (!response.ok) {\n reject(new Error(response.statusText));\n }\n response.json().then(({ metadata }: CreateLayoutResponseDto) => {\n if (!metadata) {\n reject(new Error(\"Response did not contain valid metadata\"));\n }\n resolve(metadata);\n });\n })\n .catch((error: Error) => {\n reject(error);\n }),\n );\n }\n\n clearUserSettings() {\n // todo\n }\n\n updateLayout(\n id: string,\n metadata: LayoutMetadataDto,\n newLayoutJson: LayoutJSON,\n ): Promise<void> {\n return new Promise((resolve, reject) =>\n fetch(`${baseURL}/${layoutsSaveLocation}/${id}`, {\n method: \"PUT\",\n body: JSON.stringify({\n metadata,\n layout: newLayoutJson,\n }),\n })\n .then((response) => {\n if (!response.ok) {\n reject(new Error(response.statusText));\n }\n resolve();\n })\n .catch((error: Error) => {\n reject(error);\n }),\n );\n }\n\n deleteLayout(id: string): Promise<void> {\n return new Promise((resolve, reject) =>\n fetch(`${baseURL}/${layoutsSaveLocation}/${id}`, {\n method: \"DELETE\",\n })\n .then((response) => {\n if (!response.ok) {\n reject(new Error(response.statusText));\n }\n resolve();\n })\n .catch((error: Error) => {\n reject(error);\n }),\n );\n }\n\n loadLayout(id: string): Promise<LayoutJSON> {\n return new Promise((resolve, reject) => {\n fetch(`${baseURL}/${layoutsSaveLocation}/${id}`, {\n method: \"GET\",\n })\n .then((response) => {\n if (!response.ok) {\n reject(new Error(response.statusText));\n }\n response.json().then(({ definition }: GetLayoutResponseDto) => {\n if (!definition) {\n reject(new Error(\"Response did not contain a valid layout\"));\n }\n resolve(definition);\n });\n })\n .catch((error: Error) => {\n reject(error);\n });\n });\n }\n\n loadMetadata(): Promise<LayoutMetadata[]> {\n return new Promise((resolve, reject) =>\n fetch(`${baseURL}/${metadataSaveLocation}`, {\n method: \"GET\",\n })\n .then((response) => {\n if (!response.ok) {\n reject(new Error(response.statusText));\n }\n response.json().then((metadata: LayoutMetadata[]) => {\n if (!metadata) {\n reject(new Error(\"Response did not contain valid metadata\"));\n }\n resolve(metadata);\n });\n })\n .catch((error: Error) => {\n reject(error);\n }),\n );\n }\n\n saveApplicationJSON(applicationJSON: ApplicationJSON): Promise<void> {\n return new Promise((resolve, reject) =>\n fetch(`${baseURL}/${applicationLayoutsSaveLocation}`, {\n method: \"PUT\",\n headers: {\n \"Content-Type\": \"application/json\",\n username: this.username,\n },\n body: JSON.stringify(applicationJSON),\n })\n .then((response) => {\n if (!response.ok) {\n reject(new Error(response.statusText));\n }\n resolve();\n })\n .catch((error: Error) => {\n reject(error);\n }),\n );\n }\n\n loadApplicationJSON(): Promise<ApplicationJSON> {\n return new Promise((resolve, reject) =>\n fetch(`${baseURL}/${applicationLayoutsSaveLocation}`, {\n method: \"GET\",\n headers: {\n username: this.username,\n },\n })\n .then((response) => {\n if (!response.ok) {\n reject(new Error(response.statusText));\n }\n response.json().then((applicationJSON: GetApplicationResponseDto) => {\n if (!applicationJSON) {\n reject(\n new Error(\n \"Response did not contain valid application layout information\",\n ),\n );\n }\n resolve(applicationJSON.definition);\n });\n })\n .catch((error: Error) => {\n reject(error);\n }),\n );\n }\n\n async getUserSettings() {\n return {};\n }\n\n saveUserSettings(userSettings: Settings) {\n console.log(\"saveUserSettings not implemented\", {\n userSettings,\n });\n }\n}\n"],"names":["getAuthDetailsFromCookies","metadata"],"mappings":"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"}
@@ -29,6 +29,8 @@ class StaticPersistenceManager {
29
29
  createLayout() {
30
30
  return unsupported();
31
31
  }
32
+ clearUserSettings() {
33
+ }
32
34
  updateLayout() {
33
35
  return unsupported();
34
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"StaticPersistenceManager.js","sources":["../../../../packages/vuu-shell/src/persistence-manager/StaticPersistenceManager.ts"],"sourcesContent":["import {\n ApplicationJSON,\n LayoutJSON,\n LayoutMetadata,\n Settings,\n} from \"@vuu-ui/vuu-utils\";\nimport { IPersistenceManager } from \"./PersistenceManager\";\n\nfunction unsupported<T = void>() {\n return new Promise<T>((_, reject) => {\n reject(\"not supported\");\n });\n}\n\nexport class StaticPersistenceManager implements IPersistenceManager {\n #applicationLoadDelay: number;\n #applicationJSON?: ApplicationJSON;\n #layoutMetaData: LayoutMetadata[];\n constructor({\n applicationJSON,\n applicationLoadDelay = 0,\n layoutMetadata = [],\n }: {\n applicationJSON?: ApplicationJSON;\n applicationLoadDelay?: number;\n layoutMetadata?: LayoutMetadata[];\n }) {\n this.#applicationJSON = applicationJSON;\n this.#applicationLoadDelay = applicationLoadDelay;\n this.#layoutMetaData = layoutMetadata;\n }\n createLayout() {\n return unsupported<LayoutMetadata>();\n }\n updateLayout() {\n return unsupported();\n }\n deleteLayout() {\n return unsupported();\n }\n loadLayout(id: string) {\n console.log(`load layout #${id}`);\n return unsupported<LayoutJSON>();\n }\n loadMetadata() {\n return Promise.resolve(this.#layoutMetaData);\n }\n loadApplicationJSON() {\n return new Promise<ApplicationJSON | undefined>((resolve) => {\n setTimeout(() => {\n resolve(this.#applicationJSON);\n }, this.#applicationLoadDelay);\n });\n }\n async saveApplicationJSON(applicationJson: ApplicationJSON) {\n console.log(`save application json `, {\n applicationJson,\n });\n }\n\n async getUserSettings() {\n return this.#applicationJSON?.userSettings ?? {};\n }\n\n saveUserSettings(userSettings: Settings) {\n console.log(\"saveUserSettings not implemented\", {\n userSettings,\n });\n }\n}\n"],"names":[],"mappings":";;;;;;;;;AAAA,IAAA,qBAAA,EAAA,gBAAA,EAAA,eAAA;AAQA,SAAS,WAAwB,GAAA;AAC/B,EAAA,OAAO,IAAI,OAAA,CAAW,CAAC,CAAA,EAAG,MAAW,KAAA;AACnC,IAAA,MAAA,CAAO,eAAe,CAAA;AAAA,GACvB,CAAA;AACH;AAEO,MAAM,wBAAwD,CAAA;AAAA,EAInE,WAAY,CAAA;AAAA,IACV,eAAA;AAAA,IACA,oBAAuB,GAAA,CAAA;AAAA,IACvB,iBAAiB;AAAC,GAKjB,EAAA;AAXH,IAAA,YAAA,CAAA,IAAA,EAAA,qBAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,gBAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,eAAA,CAAA;AAUE,IAAA,YAAA,CAAA,IAAA,EAAK,gBAAmB,EAAA,eAAA,CAAA;AACxB,IAAA,YAAA,CAAA,IAAA,EAAK,qBAAwB,EAAA,oBAAA,CAAA;AAC7B,IAAA,YAAA,CAAA,IAAA,EAAK,eAAkB,EAAA,cAAA,CAAA;AAAA;AACzB,EACA,YAAe,GAAA;AACb,IAAA,OAAO,WAA4B,EAAA;AAAA;AACrC,EACA,YAAe,GAAA;AACb,IAAA,OAAO,WAAY,EAAA;AAAA;AACrB,EACA,YAAe,GAAA;AACb,IAAA,OAAO,WAAY,EAAA;AAAA;AACrB,EACA,WAAW,EAAY,EAAA;AACrB,IAAQ,OAAA,CAAA,GAAA,CAAI,CAAgB,aAAA,EAAA,EAAE,CAAE,CAAA,CAAA;AAChC,IAAA,OAAO,WAAwB,EAAA;AAAA;AACjC,EACA,YAAe,GAAA;AACb,IAAO,OAAA,OAAA,CAAQ,OAAQ,CAAA,YAAA,CAAA,IAAA,EAAK,eAAe,CAAA,CAAA;AAAA;AAC7C,EACA,mBAAsB,GAAA;AACpB,IAAO,OAAA,IAAI,OAAqC,CAAA,CAAC,OAAY,KAAA;AAC3D,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,OAAA,CAAQ,mBAAK,gBAAgB,CAAA,CAAA;AAAA,OAC/B,EAAG,mBAAK,qBAAqB,CAAA,CAAA;AAAA,KAC9B,CAAA;AAAA;AACH,EACA,MAAM,oBAAoB,eAAkC,EAAA;AAC1D,IAAA,OAAA,CAAQ,IAAI,CAA0B,sBAAA,CAAA,EAAA;AAAA,MACpC;AAAA,KACD,CAAA;AAAA;AACH,EAEA,MAAM,eAAkB,GAAA;AACtB,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,gBAAkB,CAAA,EAAA,YAAA,IAAgB,EAAC;AAAA;AACjD,EAEA,iBAAiB,YAAwB,EAAA;AACvC,IAAA,OAAA,CAAQ,IAAI,kCAAoC,EAAA;AAAA,MAC9C;AAAA,KACD,CAAA;AAAA;AAEL;AAtDE,qBAAA,GAAA,IAAA,OAAA,EAAA;AACA,gBAAA,GAAA,IAAA,OAAA,EAAA;AACA,eAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
1
+ {"version":3,"file":"StaticPersistenceManager.js","sources":["../../../../packages/vuu-shell/src/persistence-manager/StaticPersistenceManager.ts"],"sourcesContent":["import {\n ApplicationJSON,\n LayoutJSON,\n LayoutMetadata,\n Settings,\n} from \"@vuu-ui/vuu-utils\";\nimport { IPersistenceManager } from \"./PersistenceManager\";\n\nfunction unsupported<T = void>() {\n return new Promise<T>((_, reject) => {\n reject(\"not supported\");\n });\n}\n\n/**\n * Use in Showcase examples only\n */\nexport class StaticPersistenceManager implements IPersistenceManager {\n #applicationLoadDelay: number;\n #applicationJSON?: ApplicationJSON;\n #layoutMetaData: LayoutMetadata[];\n constructor({\n applicationJSON,\n applicationLoadDelay = 0,\n layoutMetadata = [],\n }: {\n applicationJSON?: ApplicationJSON;\n applicationLoadDelay?: number;\n layoutMetadata?: LayoutMetadata[];\n }) {\n this.#applicationJSON = applicationJSON;\n this.#applicationLoadDelay = applicationLoadDelay;\n this.#layoutMetaData = layoutMetadata;\n }\n createLayout() {\n return unsupported<LayoutMetadata>();\n }\n\n clearUserSettings() {\n // TODO\n }\n updateLayout() {\n return unsupported();\n }\n deleteLayout() {\n return unsupported();\n }\n loadLayout(id: string) {\n console.log(`load layout #${id}`);\n return unsupported<LayoutJSON>();\n }\n loadMetadata() {\n return Promise.resolve(this.#layoutMetaData);\n }\n loadApplicationJSON() {\n return new Promise<ApplicationJSON | undefined>((resolve) => {\n setTimeout(() => {\n resolve(this.#applicationJSON);\n }, this.#applicationLoadDelay);\n });\n }\n async saveApplicationJSON(applicationJson: ApplicationJSON) {\n console.log(`save application json `, {\n applicationJson,\n });\n }\n\n async getUserSettings() {\n return this.#applicationJSON?.userSettings ?? {};\n }\n\n saveUserSettings(userSettings: Settings) {\n console.log(\"saveUserSettings not implemented\", {\n userSettings,\n });\n }\n}\n"],"names":[],"mappings":";;;;;;;;;AAAA,IAAA,qBAAA,EAAA,gBAAA,EAAA,eAAA;AAQA,SAAS,WAAwB,GAAA;AAC/B,EAAA,OAAO,IAAI,OAAA,CAAW,CAAC,CAAA,EAAG,MAAW,KAAA;AACnC,IAAA,MAAA,CAAO,eAAe,CAAA;AAAA,GACvB,CAAA;AACH;AAKO,MAAM,wBAAwD,CAAA;AAAA,EAInE,WAAY,CAAA;AAAA,IACV,eAAA;AAAA,IACA,oBAAuB,GAAA,CAAA;AAAA,IACvB,iBAAiB;AAAC,GAKjB,EAAA;AAXH,IAAA,YAAA,CAAA,IAAA,EAAA,qBAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,gBAAA,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,eAAA,CAAA;AAUE,IAAA,YAAA,CAAA,IAAA,EAAK,gBAAmB,EAAA,eAAA,CAAA;AACxB,IAAA,YAAA,CAAA,IAAA,EAAK,qBAAwB,EAAA,oBAAA,CAAA;AAC7B,IAAA,YAAA,CAAA,IAAA,EAAK,eAAkB,EAAA,cAAA,CAAA;AAAA;AACzB,EACA,YAAe,GAAA;AACb,IAAA,OAAO,WAA4B,EAAA;AAAA;AACrC,EAEA,iBAAoB,GAAA;AAAA;AAEpB,EACA,YAAe,GAAA;AACb,IAAA,OAAO,WAAY,EAAA;AAAA;AACrB,EACA,YAAe,GAAA;AACb,IAAA,OAAO,WAAY,EAAA;AAAA;AACrB,EACA,WAAW,EAAY,EAAA;AACrB,IAAQ,OAAA,CAAA,GAAA,CAAI,CAAgB,aAAA,EAAA,EAAE,CAAE,CAAA,CAAA;AAChC,IAAA,OAAO,WAAwB,EAAA;AAAA;AACjC,EACA,YAAe,GAAA;AACb,IAAO,OAAA,OAAA,CAAQ,OAAQ,CAAA,YAAA,CAAA,IAAA,EAAK,eAAe,CAAA,CAAA;AAAA;AAC7C,EACA,mBAAsB,GAAA;AACpB,IAAO,OAAA,IAAI,OAAqC,CAAA,CAAC,OAAY,KAAA;AAC3D,MAAA,UAAA,CAAW,MAAM;AACf,QAAA,OAAA,CAAQ,mBAAK,gBAAgB,CAAA,CAAA;AAAA,OAC/B,EAAG,mBAAK,qBAAqB,CAAA,CAAA;AAAA,KAC9B,CAAA;AAAA;AACH,EACA,MAAM,oBAAoB,eAAkC,EAAA;AAC1D,IAAA,OAAA,CAAQ,IAAI,CAA0B,sBAAA,CAAA,EAAA;AAAA,MACpC;AAAA,KACD,CAAA;AAAA;AACH,EAEA,MAAM,eAAkB,GAAA;AACtB,IAAO,OAAA,YAAA,CAAA,IAAA,EAAK,gBAAkB,CAAA,EAAA,YAAA,IAAgB,EAAC;AAAA;AACjD,EAEA,iBAAiB,YAAwB,EAAA;AACvC,IAAA,OAAA,CAAQ,IAAI,kCAAoC,EAAA;AAAA,MAC9C;AAAA,KACD,CAAA;AAAA;AAEL;AA1DE,qBAAA,GAAA,IAAA,OAAA,EAAA;AACA,gBAAA,GAAA,IAAA,OAAA,EAAA;AACA,eAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
package/cjs/shell.js CHANGED
@@ -1,17 +1,19 @@
1
1
  'use strict';
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
- var vuuLayout = require('@vuu-ui/vuu-layout');
5
- var vuuPopups = require('@vuu-ui/vuu-popups');
6
- var vuuUtils = require('@vuu-ui/vuu-utils');
7
4
  var styles = require('@salt-ds/styles');
8
5
  var window = require('@salt-ds/window');
6
+ var vuuContextMenu = require('@vuu-ui/vuu-context-menu');
7
+ var vuuDataReact = require('@vuu-ui/vuu-data-react');
8
+ var vuuLayout = require('@vuu-ui/vuu-layout');
9
+ var vuuNotifications = require('@vuu-ui/vuu-notifications');
10
+ var vuuUiControls = require('@vuu-ui/vuu-ui-controls');
11
+ var vuuUtils = require('@vuu-ui/vuu-utils');
9
12
  var React = require('react');
10
13
  var AppHeader = require('./app-header/AppHeader.js');
11
14
  var ApplicationProvider = require('./application-provider/ApplicationProvider.js');
12
15
  var PersistenceProvider = require('./persistence-manager/PersistenceProvider.js');
13
16
  var LocalPersistenceManager = require('./persistence-manager/LocalPersistenceManager.js');
14
- var vuuUiControls = require('@vuu-ui/vuu-ui-controls');
15
17
  require('@salt-ds/core');
16
18
  require('clsx');
17
19
  require('./persistence-manager/StaticPersistenceManager.js');
@@ -23,8 +25,6 @@ require('./feature-and-layout-provider/FeatureAndLayoutProvider.js');
23
25
  var defaultWorkspaceJSON = require('./workspace-management/defaultWorkspaceJSON.js');
24
26
  var useWorkspaceContextMenuItems = require('./workspace-management/useWorkspaceContextMenuItems.js');
25
27
  var shell = require('./shell.css.js');
26
- var vuuContextMenu = require('@vuu-ui/vuu-context-menu');
27
- var vuuDataReact = require('@vuu-ui/vuu-data-react');
28
28
 
29
29
  vuuUtils.registerComponent("ApplicationSettings", UserSettingsPanel.UserSettingsPanel, "view");
30
30
  if (process.env.NODE_ENV === "production") {
@@ -126,7 +126,7 @@ const Shell = ({
126
126
  theme: "vuu-theme",
127
127
  user,
128
128
  userSettingsSchema,
129
- children: /* @__PURE__ */ jsxRuntime.jsx(WorkspaceProvider.WorkspaceProvider, { ...workspaceProps, children: /* @__PURE__ */ jsxRuntime.jsx(vuuUiControls.ModalProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(vuuPopups.NotificationsProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(VuuApplication, { ...props, user }) }) }) })
129
+ children: /* @__PURE__ */ jsxRuntime.jsx(WorkspaceProvider.WorkspaceProvider, { ...workspaceProps, children: /* @__PURE__ */ jsxRuntime.jsx(vuuUiControls.ModalProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(vuuNotifications.NotificationsProvider, { children: /* @__PURE__ */ jsxRuntime.jsx(VuuApplication, { ...props, user }) }) }) })
130
130
  }
131
131
  );
132
132
  if (persistenceManager) {
package/cjs/shell.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"shell.js","sources":["../../../packages/vuu-shell/src/shell.tsx"],"sourcesContent":["import type { LayoutChangeHandler } from \"@vuu-ui/vuu-layout\";\nimport { LayoutProvider, StackLayout } from \"@vuu-ui/vuu-layout\";\nimport { NotificationsProvider } from \"@vuu-ui/vuu-popups\";\nimport { VuuUser, logger, registerComponent } from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport {\n type HTMLAttributes,\n type ReactNode,\n useCallback,\n useMemo,\n} from \"react\";\nimport { AppHeader } from \"./app-header\";\nimport { ApplicationProvider } from \"./application-provider\";\nimport {\n IPersistenceManager,\n LocalPersistenceManager,\n PersistenceProvider,\n usePersistenceManager,\n} from \"./persistence-manager\";\nimport { ShellLayoutProps, useShellLayout } from \"./shell-layout-templates\";\nimport { SettingsSchema, UserSettingsPanel } from \"./user-settings\";\nimport {\n WorkspaceProps,\n WorkspaceProvider,\n useWorkspace,\n useWorkspaceContextMenuItems,\n} from \"./workspace-management\";\n\nimport shellCss from \"./shell.css\";\nimport { loadingJSON } from \"./workspace-management/defaultWorkspaceJSON\";\nimport { ContextMenuProvider } from \"@vuu-ui/vuu-context-menu\";\nimport { ModalProvider } from \"@vuu-ui/vuu-ui-controls\";\nimport { useRemoteConnection } from \"@vuu-ui/vuu-data-react\";\n\nregisterComponent(\"ApplicationSettings\", UserSettingsPanel, \"view\");\n\nif (process.env.NODE_ENV === \"production\") {\n // StackLayout is loaded just to force component registration, we know it will be\n // required when default layout is instantiated. This is only required in prod\n // to avoif tree shaking the Stack away. Causes a runtime issue in dev.\n if (typeof StackLayout !== \"function\") {\n console.warn(\n \"StackLayout module not loaded, will be unable to deserialize from layout JSON\",\n );\n }\n}\n\nconst { error } = logger(\"Shell\");\n\nexport type LayoutTemplateName = \"full-height\" | \"inlay\";\n\nexport interface ShellProps extends HTMLAttributes<HTMLDivElement> {\n shellLayoutProps?: ShellLayoutProps;\n userSettingsSchema?: SettingsSchema;\n workspaceProps?: WorkspaceProps;\n children?: ReactNode;\n loginUrl?: string;\n saveUrl?: string;\n serverUrl?: string;\n user: VuuUser;\n}\n\nconst defaultAppHeader = <AppHeader />;\n\nconst getAppHeader = (shellLayoutProps?: ShellLayoutProps) =>\n shellLayoutProps?.appHeader ?? defaultAppHeader;\n\nconst defaultHTMLAttributes: HTMLAttributes<HTMLDivElement> = {\n className: \"vuuShell\",\n};\n\nconst getHTMLAttributes = (props?: ShellLayoutProps) => {\n if (props?.htmlAttributes) {\n return {\n ...defaultHTMLAttributes,\n ...props.htmlAttributes,\n };\n } else {\n return defaultHTMLAttributes;\n }\n};\n\nconst VuuApplication = ({\n shellLayoutProps: ShellLayoutProps,\n children,\n // loginUrl, // need to make this available to app header\n serverUrl,\n user,\n}: Omit<\n ShellProps,\n \"ContentLayoutProps\" | \"loginUrl\" | \"userSettingsSchema\" | \"workspaceProps\"\n>) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-shell\",\n css: shellCss,\n window: targetWindow,\n });\n\n const { workspaceJSON, saveApplicationLayout } = useWorkspace();\n\n const { buildMenuOptions, handleMenuAction } = useWorkspaceContextMenuItems();\n\n const handleLayoutChange = useCallback<LayoutChangeHandler>(\n (layout) => {\n try {\n saveApplicationLayout(layout);\n } catch {\n error?.(\"Failed to save layout\");\n }\n },\n [saveApplicationLayout],\n );\n\n useRemoteConnection({ serverUrl, user });\n\n const isLayoutLoading = workspaceJSON === loadingJSON;\n\n const initialLayout = useShellLayout({\n ...ShellLayoutProps,\n appHeader: getAppHeader(ShellLayoutProps),\n htmlAttributes: getHTMLAttributes(ShellLayoutProps),\n });\n\n return isLayoutLoading ? null : (\n <ContextMenuProvider\n menuActionHandler={handleMenuAction}\n menuBuilder={buildMenuOptions}\n >\n <LayoutProvider\n workspaceJSON={workspaceJSON}\n onLayoutChange={handleLayoutChange}\n >\n {initialLayout}\n </LayoutProvider>\n {children}\n </ContextMenuProvider>\n );\n};\n\nexport const Shell = ({\n loginUrl,\n user,\n userSettingsSchema,\n workspaceProps,\n ...props\n}: ShellProps) => {\n // If user has provided an implementation of IPersistenceManager\n // by wrapping higher level PersistenceProvider, use it, otw\n // default to LocalPersistenceManager\n const persistenceManager = usePersistenceManager();\n const localPersistenceManager = useMemo<\n IPersistenceManager | undefined\n >(() => {\n if (persistenceManager) {\n return undefined;\n }\n console.log(\n `No Persistence Manager, configuration data will be persisted to Local Storage, key: 'vuu/${user.username}'`,\n );\n return new LocalPersistenceManager(`vuu/${user.username}`);\n }, [persistenceManager, user.username]);\n\n // ApplicationProvider must go outside Dialog and Notification providers\n // ApplicationProvider injects the SaltProvider and this must be the root\n // SaltProvider.\n\n const shellProviders = (\n <ApplicationProvider\n density=\"high\"\n loginUrl={loginUrl}\n theme=\"vuu-theme\"\n user={user}\n userSettingsSchema={userSettingsSchema}\n >\n <WorkspaceProvider {...workspaceProps}>\n <ModalProvider>\n <NotificationsProvider>\n <VuuApplication {...props} user={user} />\n </NotificationsProvider>\n </ModalProvider>\n </WorkspaceProvider>\n </ApplicationProvider>\n );\n\n if (persistenceManager) {\n return shellProviders;\n } else {\n return (\n <PersistenceProvider persistenceManager={localPersistenceManager}>\n {shellProviders}\n </PersistenceProvider>\n );\n }\n};\n"],"names":["registerComponent","UserSettingsPanel","StackLayout","logger","AppHeader","ShellLayoutProps","useWindow","useComponentCssInjection","shellCss","useWorkspace","useWorkspaceContextMenuItems","useCallback","useRemoteConnection","loadingJSON","useShellLayout","jsxs","ContextMenuProvider","jsx","LayoutProvider","usePersistenceManager","useMemo","LocalPersistenceManager","ApplicationProvider","WorkspaceProvider","ModalProvider","NotificationsProvider","PersistenceProvider"],"mappings":"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"}
1
+ {"version":3,"file":"shell.js","sources":["../../../packages/vuu-shell/src/shell.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { ContextMenuProvider } from \"@vuu-ui/vuu-context-menu\";\nimport { useRemoteConnection } from \"@vuu-ui/vuu-data-react\";\nimport type { LayoutChangeHandler } from \"@vuu-ui/vuu-layout\";\nimport { LayoutProvider, StackLayout } from \"@vuu-ui/vuu-layout\";\nimport { NotificationsProvider } from \"@vuu-ui/vuu-notifications\";\nimport { ModalProvider } from \"@vuu-ui/vuu-ui-controls\";\nimport { VuuUser, logger, registerComponent } from \"@vuu-ui/vuu-utils\";\nimport {\n type HTMLAttributes,\n type ReactNode,\n useCallback,\n useMemo,\n} from \"react\";\nimport { AppHeader } from \"./app-header\";\nimport { ApplicationProvider } from \"./application-provider\";\nimport {\n IPersistenceManager,\n LocalPersistenceManager,\n PersistenceProvider,\n usePersistenceManager,\n} from \"./persistence-manager\";\nimport { ShellLayoutProps, useShellLayout } from \"./shell-layout-templates\";\nimport { SettingsSchema, UserSettingsPanel } from \"./user-settings\";\nimport {\n WorkspaceProps,\n WorkspaceProvider,\n useWorkspace,\n useWorkspaceContextMenuItems,\n} from \"./workspace-management\";\nimport { loadingJSON } from \"./workspace-management/defaultWorkspaceJSON\";\n\nimport shellCss from \"./shell.css\";\n\nregisterComponent(\"ApplicationSettings\", UserSettingsPanel, \"view\");\n\nif (process.env.NODE_ENV === \"production\") {\n // StackLayout is loaded just to force component registration, we know it will be\n // required when default layout is instantiated. This is only required in prod\n // to avoif tree shaking the Stack away. Causes a runtime issue in dev.\n if (typeof StackLayout !== \"function\") {\n console.warn(\n \"StackLayout module not loaded, will be unable to deserialize from layout JSON\",\n );\n }\n}\n\nconst { error } = logger(\"Shell\");\n\nexport type LayoutTemplateName = \"full-height\" | \"inlay\";\n\nexport interface ShellProps extends HTMLAttributes<HTMLDivElement> {\n shellLayoutProps?: ShellLayoutProps;\n userSettingsSchema?: SettingsSchema;\n workspaceProps?: WorkspaceProps;\n children?: ReactNode;\n loginUrl?: string;\n saveUrl?: string;\n serverUrl?: string;\n user: VuuUser;\n}\n\nconst defaultAppHeader = <AppHeader />;\n\nconst getAppHeader = (shellLayoutProps?: ShellLayoutProps) =>\n shellLayoutProps?.appHeader ?? defaultAppHeader;\n\nconst defaultHTMLAttributes: HTMLAttributes<HTMLDivElement> = {\n className: \"vuuShell\",\n};\n\nconst getHTMLAttributes = (props?: ShellLayoutProps) => {\n if (props?.htmlAttributes) {\n return {\n ...defaultHTMLAttributes,\n ...props.htmlAttributes,\n };\n } else {\n return defaultHTMLAttributes;\n }\n};\n\nconst VuuApplication = ({\n shellLayoutProps: ShellLayoutProps,\n children,\n // loginUrl, // need to make this available to app header\n serverUrl,\n user,\n}: Omit<\n ShellProps,\n \"ContentLayoutProps\" | \"loginUrl\" | \"userSettingsSchema\" | \"workspaceProps\"\n>) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-shell\",\n css: shellCss,\n window: targetWindow,\n });\n\n const { workspaceJSON, saveApplicationLayout } = useWorkspace();\n\n const { buildMenuOptions, handleMenuAction } = useWorkspaceContextMenuItems();\n\n const handleLayoutChange = useCallback<LayoutChangeHandler>(\n (layout) => {\n try {\n saveApplicationLayout(layout);\n } catch {\n error?.(\"Failed to save layout\");\n }\n },\n [saveApplicationLayout],\n );\n\n useRemoteConnection({ serverUrl, user });\n\n const isLayoutLoading = workspaceJSON === loadingJSON;\n\n const initialLayout = useShellLayout({\n ...ShellLayoutProps,\n appHeader: getAppHeader(ShellLayoutProps),\n htmlAttributes: getHTMLAttributes(ShellLayoutProps),\n });\n\n return isLayoutLoading ? null : (\n <ContextMenuProvider\n menuActionHandler={handleMenuAction}\n menuBuilder={buildMenuOptions}\n >\n <LayoutProvider\n workspaceJSON={workspaceJSON}\n onLayoutChange={handleLayoutChange}\n >\n {initialLayout}\n </LayoutProvider>\n {children}\n </ContextMenuProvider>\n );\n};\n\nexport const Shell = ({\n loginUrl,\n user,\n userSettingsSchema,\n workspaceProps,\n ...props\n}: ShellProps) => {\n // If user has provided an implementation of IPersistenceManager\n // by wrapping higher level PersistenceProvider, use it, otw\n // default to LocalPersistenceManager\n const persistenceManager = usePersistenceManager();\n const localPersistenceManager = useMemo<\n IPersistenceManager | undefined\n >(() => {\n if (persistenceManager) {\n return undefined;\n }\n console.log(\n `No Persistence Manager, configuration data will be persisted to Local Storage, key: 'vuu/${user.username}'`,\n );\n return new LocalPersistenceManager(`vuu/${user.username}`);\n }, [persistenceManager, user.username]);\n\n // ApplicationProvider must go outside Dialog and Notification providers\n // ApplicationProvider injects the SaltProvider and this must be the root\n // SaltProvider.\n\n const shellProviders = (\n <ApplicationProvider\n density=\"high\"\n loginUrl={loginUrl}\n theme=\"vuu-theme\"\n user={user}\n userSettingsSchema={userSettingsSchema}\n >\n <WorkspaceProvider {...workspaceProps}>\n <ModalProvider>\n <NotificationsProvider>\n <VuuApplication {...props} user={user} />\n </NotificationsProvider>\n </ModalProvider>\n </WorkspaceProvider>\n </ApplicationProvider>\n );\n\n if (persistenceManager) {\n return shellProviders;\n } else {\n return (\n <PersistenceProvider persistenceManager={localPersistenceManager}>\n {shellProviders}\n </PersistenceProvider>\n );\n }\n};\n"],"names":["registerComponent","UserSettingsPanel","StackLayout","logger","AppHeader","ShellLayoutProps","useWindow","useComponentCssInjection","shellCss","useWorkspace","useWorkspaceContextMenuItems","useCallback","useRemoteConnection","loadingJSON","useShellLayout","jsxs","ContextMenuProvider","jsx","LayoutProvider","usePersistenceManager","useMemo","LocalPersistenceManager","ApplicationProvider","WorkspaceProvider","ModalProvider","NotificationsProvider","PersistenceProvider"],"mappings":"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"}
@@ -2,7 +2,7 @@
2
2
 
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var vuuLayout = require('@vuu-ui/vuu-layout');
5
- var vuuPopups = require('@vuu-ui/vuu-popups');
5
+ var vuuNotifications = require('@vuu-ui/vuu-notifications');
6
6
  var vuuUtils = require('@vuu-ui/vuu-utils');
7
7
  var React = require('react');
8
8
  var PersistenceProvider = require('../persistence-manager/PersistenceProvider.js');
@@ -43,7 +43,7 @@ const WorkspaceProvider = ({
43
43
  }) => {
44
44
  const [layoutMetadata, setLayoutMetadata] = React.useState([]);
45
45
  const [, forceRefresh] = React.useState({});
46
- const { showNotification } = vuuPopups.useNotifications();
46
+ const { showNotification } = vuuNotifications.useNotifications();
47
47
  const persistenceManager = PersistenceProvider.usePersistenceManager();
48
48
  const applicationJSONRef = React.useRef(loadingApplicationJSON);
49
49
  const setApplicationJSON = React.useCallback(
@@ -89,7 +89,7 @@ const WorkspaceProvider = ({
89
89
  showNotification({
90
90
  content: "Could not load list of available layouts",
91
91
  header: "Failed to Load Layouts",
92
- level: "error",
92
+ status: "error",
93
93
  type: "toast"
94
94
  });
95
95
  console.error("Error occurred while retrieving metadata", error);
@@ -116,7 +116,7 @@ const WorkspaceProvider = ({
116
116
  showNotification({
117
117
  content: "Could not load your latest view",
118
118
  header: "Failed to Load Layout",
119
- level: "error",
119
+ status: "error",
120
120
  type: "toast"
121
121
  });
122
122
  console.error(
@@ -165,7 +165,7 @@ const WorkspaceProvider = ({
165
165
  showNotification({
166
166
  content: `${metadata2.name} saved successfully`,
167
167
  header: "Layout Saved Successfully",
168
- level: "success",
168
+ status: "success",
169
169
  type: "toast"
170
170
  });
171
171
  setLayoutMetadata((prev) => [...prev, metadata2]);
@@ -173,7 +173,7 @@ const WorkspaceProvider = ({
173
173
  showNotification({
174
174
  content: `Failed to save layout ${metadata.name}`,
175
175
  header: "Failed to Save Layout",
176
- level: "error",
176
+ status: "error",
177
177
  type: "toast"
178
178
  });
179
179
  console.error("Error occurred while saving layout", error);
@@ -183,7 +183,7 @@ const WorkspaceProvider = ({
183
183
  showNotification({
184
184
  content: "Cannot save invalid layout",
185
185
  header: "Failed to Save Layout",
186
- level: "error",
186
+ status: "error",
187
187
  type: "toast"
188
188
  });
189
189
  }
@@ -232,7 +232,7 @@ const WorkspaceProvider = ({
232
232
  showNotification({
233
233
  content: "Failed to load the requested layout",
234
234
  header: "Failed to Load Layout",
235
- level: "error",
235
+ status: "error",
236
236
  type: "toast"
237
237
  });
238
238
  console.error("Error occurred while loading layout", error);
@@ -1 +1 @@
1
- {"version":3,"file":"WorkspaceProvider.js","sources":["../../../../packages/vuu-shell/src/workspace-management/WorkspaceProvider.tsx"],"sourcesContent":["import { isLayoutJSON, resolveJSONPath } from \"@vuu-ui/vuu-layout\";\nimport { useNotifications } from \"@vuu-ui/vuu-popups\";\nimport {\n LayoutMetadata,\n LayoutMetadataDto,\n VuuShellLocation,\n WorkspaceContext,\n logger,\n type ApplicationJSON,\n type ApplicationSetting,\n type ApplicationSettings,\n type LayoutJSON,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n ReactElement,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { usePersistenceManager } from \"../persistence-manager\";\nimport {\n getWorkspaceWithLayoutJSON,\n loadingJSON,\n type WorkspaceStackProps,\n} from \"./defaultWorkspaceJSON\";\n\nconst { info } = logger(\"useLayoutManager\");\n\nexport type WorkspaceProps = WorkspaceStackProps & {\n layoutPlaceholderJSON?: LayoutJSON;\n /**\n * layoutJSON defines the default layout to render on first load and until such time as\n * layout state has been persisted. After that, the persisted state will be rendered.\n */\n layoutJSON?: LayoutJSON | LayoutJSON[];\n activeLayoutIndex?: number;\n /**\n * The Vuu workspace is the container into which layouts are loaded. By default, it will be\n * a Tabbed Panel (Stack + Tabstrip), showing a tab per Layout.\n */\n workspaceJSON?: LayoutJSON | LayoutJSON[];\n};\n\nexport interface WorkspaceProviderProps extends WorkspaceProps {\n children: ReactElement | ReactElement[];\n\n /**\n * layoutPlaceholderJSON defines the layout to render when a new workspace layout is created.\n */\n layoutPlaceholderJSON?: LayoutJSON;\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\nconst loadingApplicationJSON: ApplicationJSON = {\n workspaceJSON: loadingJSON,\n};\n\n/**\n * LayoutManagementProvider supplies an API for loading and saving layout documents.\n * Initial layout is automatically loaded on startup. Because this hook is responsible\n * only for loading and saving layouts, it only triggers a render when content is loaded.\n *\n * Initial layout displays a loading state\n * User may supply a default layout. This will not be displayed until call has been made to\n * persistenceManager to retrieve stored layout state. If no stored state is returned, the\n * default layout provided by user will be set as current state (and hence rendered). If no\n * default layout has been provided by user, the sysem default will be used (simple PlaceHolder)\n * If saved layout state has been returned, that will be set as current state (and rendered)\n *\n */\nexport const WorkspaceProvider = ({\n TabstripProps,\n children,\n layoutJSON,\n activeLayoutIndex,\n layoutPlaceholderJSON,\n showTabs,\n workspaceJSON: customWorkspaceJSON,\n}: WorkspaceProviderProps) => {\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 { showNotification } = useNotifications();\n const persistenceManager = usePersistenceManager();\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 setWorkspaceJSON = useCallback(\n (workspaceJSON: LayoutJSON, rerender = true) => {\n setApplicationJSON(\n {\n ...applicationJSONRef.current,\n workspaceJSON,\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 //TODO this does not need to be done ahead of time\n persistenceManager\n ?.loadMetadata()\n .then((metadata) => {\n setLayoutMetadata(metadata);\n })\n .catch((error: Error) => {\n showNotification({\n content: \"Could not load list of available layouts\",\n header: \"Failed to Load Layouts\",\n level: \"error\",\n type: \"toast\",\n });\n console.error(\"Error occurred while retrieving metadata\", error);\n });\n\n persistenceManager\n ?.loadApplicationJSON()\n .then((applicationJSON?: ApplicationJSON) => {\n if (applicationJSON) {\n info?.(\"applicationJSON loaded successfully\");\n setApplicationJSON(applicationJSON);\n } else {\n // No applicationJSON has been saved yet. Construct our\n // initial applicationJSON from user configuration and\n // default values.\n const workspaceJSON = getWorkspaceWithLayoutJSON(\n customWorkspaceJSON,\n layoutJSON,\n activeLayoutIndex,\n { TabstripProps, showTabs },\n );\n info?.(`applicationJSON not found, getting defaultWorkspaceJSON,\n ${JSON.stringify(workspaceJSON, null, 2)}\n `);\n setApplicationJSON({\n workspaceJSON,\n });\n }\n })\n .catch((error: Error) => {\n showNotification({\n content: \"Could not load your latest view\",\n header: \"Failed to Load Layout\",\n level: \"error\",\n type: \"toast\",\n });\n console.error(\n \"Error occurred while retrieving application layout\",\n error,\n );\n });\n }, [\n TabstripProps,\n activeLayoutIndex,\n customWorkspaceJSON,\n layoutJSON,\n showNotification,\n persistenceManager,\n setApplicationJSON,\n showTabs,\n ]);\n\n const saveApplicationLayout = useCallback(\n (layout: LayoutJSON) => {\n if (isLayoutJSON(layout)) {\n setWorkspaceJSON(layout, false);\n persistenceManager?.saveApplicationJSON(applicationJSONRef.current);\n } else {\n console.error(\"Tried to save invalid application layout\", layout);\n }\n },\n [persistenceManager, setWorkspaceJSON],\n );\n\n const saveLayout = useCallback(\n (metadata: LayoutMetadataDto) => {\n let layoutToSave: LayoutJSON | undefined;\n try {\n const { workspaceJSON } = applicationJSONRef.current;\n if (Array.isArray(workspaceJSON)) {\n console.log(\"how do we identify the right thing to save\");\n } else {\n layoutToSave = resolveJSONPath(\n workspaceJSON,\n `#${VuuShellLocation.Workspace}.ACTIVE_CHILD`,\n );\n }\n } catch (e) {\n // ignore, code below will handle\n }\n\n if (layoutToSave && isLayoutJSON(layoutToSave)) {\n persistenceManager\n ?.createLayout(metadata, ensureLayoutHasTitle(layoutToSave, metadata))\n .then((metadata) => {\n showNotification({\n content: `${metadata.name} saved successfully`,\n header: \"Layout Saved Successfully\",\n level: \"success\",\n type: \"toast\",\n });\n setLayoutMetadata((prev) => [...prev, metadata]);\n })\n .catch((error: Error) => {\n showNotification({\n content: `Failed to save layout ${metadata.name}`,\n header: \"Failed to Save Layout\",\n level: \"error\",\n type: \"toast\",\n });\n console.error(\"Error occurred while saving layout\", error);\n });\n } else {\n console.error(\"Tried to save invalid layout\", layoutToSave);\n showNotification({\n content: \"Cannot save invalid layout\",\n header: \"Failed to Save Layout\",\n level: \"error\",\n type: \"toast\",\n });\n }\n },\n [showNotification, persistenceManager],\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 persistenceManager?.saveApplicationJSON(applicationJSONRef.current);\n },\n [persistenceManager, 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 persistenceManager\n ?.loadLayout(id)\n .then((layoutJson) => {\n const { workspaceJSON: currentLayout } = applicationJSONRef.current;\n if (Array.isArray(currentLayout)) {\n console.log(\"how do we deal witha amulti layoput\");\n } else {\n setWorkspaceJSON({\n ...currentLayout,\n children: (currentLayout.children || []).concat(layoutJson),\n props: {\n ...currentLayout.props,\n active: currentLayout.children?.length ?? 0,\n },\n });\n }\n })\n .catch((error: Error) => {\n showNotification({\n content: \"Failed to load the requested layout\",\n header: \"Failed to Load Layout\",\n level: \"error\",\n type: \"toast\",\n });\n console.error(\"Error occurred while loading layout\", error);\n });\n },\n [showNotification, persistenceManager, setWorkspaceJSON],\n );\n\n return (\n <WorkspaceContext.Provider\n value={{\n getApplicationSettings,\n layoutMetadata,\n layoutPlaceholderJSON,\n saveLayout,\n workspaceJSON: applicationJSONRef.current.workspaceJSON,\n saveApplicationLayout,\n saveApplicationSettings,\n loadLayoutById,\n }}\n >\n {children}\n </WorkspaceContext.Provider>\n );\n};\n\nexport const useWorkspace = () => {\n // The default Application JSON will be served if no LayoutManagementProvider\n const { workspaceJSON = getWorkspaceWithLayoutJSON(), ...contextProps } =\n useContext(WorkspaceContext);\n\n return {\n ...contextProps,\n workspaceJSON,\n };\n};\n"],"names":["logger","loadingJSON","useState","useNotifications","usePersistenceManager","useRef","useCallback","useEffect","getWorkspaceWithLayoutJSON","isLayoutJSON","resolveJSONPath","VuuShellLocation","metadata","jsx","WorkspaceContext","useContext"],"mappings":"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"}
1
+ {"version":3,"file":"WorkspaceProvider.js","sources":["../../../../packages/vuu-shell/src/workspace-management/WorkspaceProvider.tsx"],"sourcesContent":["import { isLayoutJSON, resolveJSONPath } from \"@vuu-ui/vuu-layout\";\nimport { useNotifications } from \"@vuu-ui/vuu-notifications\";\nimport {\n LayoutMetadata,\n LayoutMetadataDto,\n VuuShellLocation,\n WorkspaceContext,\n logger,\n type ApplicationJSON,\n type ApplicationSetting,\n type ApplicationSettings,\n type LayoutJSON,\n} from \"@vuu-ui/vuu-utils\";\nimport {\n ReactElement,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from \"react\";\nimport { usePersistenceManager } from \"../persistence-manager\";\nimport {\n getWorkspaceWithLayoutJSON,\n loadingJSON,\n type WorkspaceStackProps,\n} from \"./defaultWorkspaceJSON\";\n\nconst { info } = logger(\"useLayoutManager\");\n\nexport type WorkspaceProps = WorkspaceStackProps & {\n layoutPlaceholderJSON?: LayoutJSON;\n /**\n * layoutJSON defines the default layout to render on first load and until such time as\n * layout state has been persisted. After that, the persisted state will be rendered.\n */\n layoutJSON?: LayoutJSON | LayoutJSON[];\n activeLayoutIndex?: number;\n /**\n * The Vuu workspace is the container into which layouts are loaded. By default, it will be\n * a Tabbed Panel (Stack + Tabstrip), showing a tab per Layout.\n */\n workspaceJSON?: LayoutJSON | LayoutJSON[];\n};\n\nexport interface WorkspaceProviderProps extends WorkspaceProps {\n children: ReactElement | ReactElement[];\n\n /**\n * layoutPlaceholderJSON defines the layout to render when a new workspace layout is created.\n */\n layoutPlaceholderJSON?: LayoutJSON;\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\nconst loadingApplicationJSON: ApplicationJSON = {\n workspaceJSON: loadingJSON,\n};\n\n/**\n * LayoutManagementProvider supplies an API for loading and saving layout documents.\n * Initial layout is automatically loaded on startup. Because this hook is responsible\n * only for loading and saving layouts, it only triggers a render when content is loaded.\n *\n * Initial layout displays a loading state\n * User may supply a default layout. This will not be displayed until call has been made to\n * persistenceManager to retrieve stored layout state. If no stored state is returned, the\n * default layout provided by user will be set as current state (and hence rendered). If no\n * default layout has been provided by user, the sysem default will be used (simple PlaceHolder)\n * If saved layout state has been returned, that will be set as current state (and rendered)\n *\n */\nexport const WorkspaceProvider = ({\n TabstripProps,\n children,\n layoutJSON,\n activeLayoutIndex,\n layoutPlaceholderJSON,\n showTabs,\n workspaceJSON: customWorkspaceJSON,\n}: WorkspaceProviderProps) => {\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 { showNotification } = useNotifications();\n const persistenceManager = usePersistenceManager();\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 setWorkspaceJSON = useCallback(\n (workspaceJSON: LayoutJSON, rerender = true) => {\n setApplicationJSON(\n {\n ...applicationJSONRef.current,\n workspaceJSON,\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 //TODO this does not need to be done ahead of time\n persistenceManager\n ?.loadMetadata()\n .then((metadata) => {\n setLayoutMetadata(metadata);\n })\n .catch((error: Error) => {\n showNotification({\n content: \"Could not load list of available layouts\",\n header: \"Failed to Load Layouts\",\n status: \"error\",\n type: \"toast\",\n });\n console.error(\"Error occurred while retrieving metadata\", error);\n });\n\n persistenceManager\n ?.loadApplicationJSON()\n .then((applicationJSON?: ApplicationJSON) => {\n if (applicationJSON) {\n info?.(\"applicationJSON loaded successfully\");\n setApplicationJSON(applicationJSON);\n } else {\n // No applicationJSON has been saved yet. Construct our\n // initial applicationJSON from user configuration and\n // default values.\n const workspaceJSON = getWorkspaceWithLayoutJSON(\n customWorkspaceJSON,\n layoutJSON,\n activeLayoutIndex,\n { TabstripProps, showTabs },\n );\n info?.(`applicationJSON not found, getting defaultWorkspaceJSON,\n ${JSON.stringify(workspaceJSON, null, 2)}\n `);\n setApplicationJSON({\n workspaceJSON,\n });\n }\n })\n .catch((error: Error) => {\n showNotification({\n content: \"Could not load your latest view\",\n header: \"Failed to Load Layout\",\n status: \"error\",\n type: \"toast\",\n });\n console.error(\n \"Error occurred while retrieving application layout\",\n error,\n );\n });\n }, [\n TabstripProps,\n activeLayoutIndex,\n customWorkspaceJSON,\n layoutJSON,\n showNotification,\n persistenceManager,\n setApplicationJSON,\n showTabs,\n ]);\n\n const saveApplicationLayout = useCallback(\n (layout: LayoutJSON) => {\n if (isLayoutJSON(layout)) {\n setWorkspaceJSON(layout, false);\n persistenceManager?.saveApplicationJSON(applicationJSONRef.current);\n } else {\n console.error(\"Tried to save invalid application layout\", layout);\n }\n },\n [persistenceManager, setWorkspaceJSON],\n );\n\n const saveLayout = useCallback(\n (metadata: LayoutMetadataDto) => {\n let layoutToSave: LayoutJSON | undefined;\n try {\n const { workspaceJSON } = applicationJSONRef.current;\n if (Array.isArray(workspaceJSON)) {\n console.log(\"how do we identify the right thing to save\");\n } else {\n layoutToSave = resolveJSONPath(\n workspaceJSON,\n `#${VuuShellLocation.Workspace}.ACTIVE_CHILD`,\n );\n }\n } catch (e) {\n // ignore, code below will handle\n }\n\n if (layoutToSave && isLayoutJSON(layoutToSave)) {\n persistenceManager\n ?.createLayout(metadata, ensureLayoutHasTitle(layoutToSave, metadata))\n .then((metadata) => {\n showNotification({\n content: `${metadata.name} saved successfully`,\n header: \"Layout Saved Successfully\",\n status: \"success\",\n type: \"toast\",\n });\n setLayoutMetadata((prev) => [...prev, metadata]);\n })\n .catch((error: Error) => {\n showNotification({\n content: `Failed to save layout ${metadata.name}`,\n header: \"Failed to Save Layout\",\n status: \"error\",\n type: \"toast\",\n });\n console.error(\"Error occurred while saving layout\", error);\n });\n } else {\n console.error(\"Tried to save invalid layout\", layoutToSave);\n showNotification({\n content: \"Cannot save invalid layout\",\n header: \"Failed to Save Layout\",\n status: \"error\",\n type: \"toast\",\n });\n }\n },\n [showNotification, persistenceManager],\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 persistenceManager?.saveApplicationJSON(applicationJSONRef.current);\n },\n [persistenceManager, 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 persistenceManager\n ?.loadLayout(id)\n .then((layoutJson) => {\n const { workspaceJSON: currentLayout } = applicationJSONRef.current;\n if (Array.isArray(currentLayout)) {\n console.log(\"how do we deal witha amulti layoput\");\n } else {\n setWorkspaceJSON({\n ...currentLayout,\n children: (currentLayout.children || []).concat(layoutJson),\n props: {\n ...currentLayout.props,\n active: currentLayout.children?.length ?? 0,\n },\n });\n }\n })\n .catch((error: Error) => {\n showNotification({\n content: \"Failed to load the requested layout\",\n header: \"Failed to Load Layout\",\n status: \"error\",\n type: \"toast\",\n });\n console.error(\"Error occurred while loading layout\", error);\n });\n },\n [showNotification, persistenceManager, setWorkspaceJSON],\n );\n\n return (\n <WorkspaceContext.Provider\n value={{\n getApplicationSettings,\n layoutMetadata,\n layoutPlaceholderJSON,\n saveLayout,\n workspaceJSON: applicationJSONRef.current.workspaceJSON,\n saveApplicationLayout,\n saveApplicationSettings,\n loadLayoutById,\n }}\n >\n {children}\n </WorkspaceContext.Provider>\n );\n};\n\nexport const useWorkspace = () => {\n // The default Application JSON will be served if no LayoutManagementProvider\n const { workspaceJSON = getWorkspaceWithLayoutJSON(), ...contextProps } =\n useContext(WorkspaceContext);\n\n return {\n ...contextProps,\n workspaceJSON,\n };\n};\n"],"names":["logger","loadingJSON","useState","useNotifications","usePersistenceManager","useRef","useCallback","useEffect","getWorkspaceWithLayoutJSON","isLayoutJSON","resolveJSONPath","VuuShellLocation","metadata","jsx","WorkspaceContext","useContext"],"mappings":"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"}