@vuu-ui/vuu-shell 0.13.104 → 0.13.105

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 (58) hide show
  1. package/cjs/app-header/AppHeader.js +7 -3
  2. package/cjs/app-header/AppHeader.js.map +1 -1
  3. package/cjs/application-provider/ApplicationContext.js +2 -1
  4. package/cjs/application-provider/ApplicationContext.js.map +1 -1
  5. package/cjs/application-provider/ApplicationProvider.js +12 -7
  6. package/cjs/application-provider/ApplicationProvider.js.map +1 -1
  7. package/cjs/index.js +6 -1
  8. package/cjs/index.js.map +1 -1
  9. package/cjs/left-nav/LeftNav.js +0 -4
  10. package/cjs/left-nav/LeftNav.js.map +1 -1
  11. package/cjs/login/LoginPanel.js +8 -8
  12. package/cjs/login/LoginPanel.js.map +1 -1
  13. package/cjs/login/login-utils.js +31 -0
  14. package/cjs/login/login-utils.js.map +1 -0
  15. package/cjs/persistence-manager/LocalPersistenceManager.js +23 -15
  16. package/cjs/persistence-manager/LocalPersistenceManager.js.map +1 -1
  17. package/cjs/persistence-manager/RemotePersistenceManager.js +16 -4
  18. package/cjs/persistence-manager/RemotePersistenceManager.js.map +1 -1
  19. package/cjs/shell.js +10 -7
  20. package/cjs/shell.js.map +1 -1
  21. package/cjs/workspace-management/SaveLayoutPanel.js +5 -4
  22. package/cjs/workspace-management/SaveLayoutPanel.js.map +1 -1
  23. package/cjs/workspace-management/WorkspaceProvider.js +5 -0
  24. package/cjs/workspace-management/WorkspaceProvider.js.map +1 -1
  25. package/esm/app-header/AppHeader.js +7 -3
  26. package/esm/app-header/AppHeader.js.map +1 -1
  27. package/esm/application-provider/ApplicationContext.js +2 -1
  28. package/esm/application-provider/ApplicationContext.js.map +1 -1
  29. package/esm/application-provider/ApplicationProvider.js +12 -7
  30. package/esm/application-provider/ApplicationProvider.js.map +1 -1
  31. package/esm/index.js +2 -1
  32. package/esm/index.js.map +1 -1
  33. package/esm/left-nav/LeftNav.js +0 -4
  34. package/esm/left-nav/LeftNav.js.map +1 -1
  35. package/esm/login/LoginPanel.js +8 -8
  36. package/esm/login/LoginPanel.js.map +1 -1
  37. package/esm/login/login-utils.js +26 -0
  38. package/esm/login/login-utils.js.map +1 -0
  39. package/esm/persistence-manager/LocalPersistenceManager.js +23 -15
  40. package/esm/persistence-manager/LocalPersistenceManager.js.map +1 -1
  41. package/esm/persistence-manager/RemotePersistenceManager.js +16 -4
  42. package/esm/persistence-manager/RemotePersistenceManager.js.map +1 -1
  43. package/esm/shell.js +10 -7
  44. package/esm/shell.js.map +1 -1
  45. package/esm/workspace-management/SaveLayoutPanel.js +5 -4
  46. package/esm/workspace-management/SaveLayoutPanel.js.map +1 -1
  47. package/esm/workspace-management/WorkspaceProvider.js +5 -0
  48. package/esm/workspace-management/WorkspaceProvider.js.map +1 -1
  49. package/package.json +13 -13
  50. package/types/application-provider/ApplicationContext.d.ts +1 -1
  51. package/types/application-provider/ApplicationProvider.d.ts +2 -2
  52. package/types/index.d.ts +1 -1
  53. package/types/login/LoginPanel.d.ts +3 -2
  54. package/types/login/index.d.ts +2 -0
  55. package/types/login/login-utils.d.ts +4 -0
  56. package/types/persistence-manager/LocalPersistenceManager.d.ts +3 -1
  57. package/types/persistence-manager/RemotePersistenceManager.d.ts +1 -2
  58. package/types/shell.d.ts +2 -2
@@ -1,12 +1,24 @@
1
1
  'use strict';
2
2
 
3
+ require('react/jsx-runtime');
4
+ require('@vuu-ui/vuu-ui-controls');
5
+ require('@salt-ds/core');
6
+ require('@salt-ds/styles');
7
+ require('@salt-ds/window');
8
+ require('clsx');
9
+ require('react');
10
+ var loginUtils = require('../login/login-utils.js');
11
+
12
+ var __defProp = Object.defineProperty;
13
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
14
+ var __publicField = (obj, key, value) => __defNormalProp(obj, key + "" , value);
3
15
  const baseURL = "/api";
4
16
  const metadataSaveLocation = "layouts/metadata";
5
17
  const layoutsSaveLocation = "layouts";
6
18
  const applicationLayoutsSaveLocation = "application-layouts";
7
19
  class RemotePersistenceManager {
8
- constructor(userName) {
9
- this.userName = userName;
20
+ constructor() {
21
+ __publicField(this, "username", loginUtils.getAuthDetailsFromCookies()[0]);
10
22
  }
11
23
  createLayout(metadata, layout) {
12
24
  return new Promise(
@@ -112,7 +124,7 @@ class RemotePersistenceManager {
112
124
  method: "PUT",
113
125
  headers: {
114
126
  "Content-Type": "application/json",
115
- username: this.userName
127
+ username: this.username
116
128
  },
117
129
  body: JSON.stringify(applicationJSON)
118
130
  }).then((response) => {
@@ -130,7 +142,7 @@ class RemotePersistenceManager {
130
142
  (resolve, reject) => fetch(`${baseURL}/${applicationLayoutsSaveLocation}`, {
131
143
  method: "GET",
132
144
  headers: {
133
- username: this.userName
145
+ username: this.username
134
146
  }
135
147
  }).then((response) => {
136
148
  if (!response.ok) {
@@ -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 { 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 constructor(private userName: string) {}\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":["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":";;;;;;;;;;;;;;AAUA,MAAM,OAAU,GAAA,MAAA;AAChB,MAAM,oBAAuB,GAAA,kBAAA;AAC7B,MAAM,mBAAsB,GAAA,SAAA;AAC5B,MAAM,8BAAiC,GAAA,qBAAA;AAMhC,MAAM,wBAAwD,CAAA;AAAA,EAA9D,WAAA,GAAA;AACL,IAAmB,aAAA,CAAA,IAAA,EAAA,UAAA,EAAAA,oCAAA,GAA4B,CAAC,CAAA,CAAA;AAAA;AAAA,EAEhD,YAAA,CACE,UACA,MACyB,EAAA;AACzB,IAAA,OAAO,IAAI,OAAA;AAAA,MAAQ,CAAC,SAAS,MAC3B,KAAA,KAAA,CAAM,GAAG,OAAO,CAAA,CAAA,EAAI,mBAAmB,CAAI,CAAA,EAAA;AAAA,QACzC,OAAS,EAAA;AAAA,UACP,cAAgB,EAAA;AAAA,SAClB;AAAA,QACA,MAAQ,EAAA,MAAA;AAAA,QACR,IAAA,EAAM,KAAK,SAAU,CAAA;AAAA,UACnB,QAAA;AAAA,UACA,UAAY,EAAA;AAAA,SACb;AAAA,OACF,CAAA,CACE,IAAK,CAAA,CAAC,QAAa,KAAA;AAClB,QAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,UAAA,MAAA,CAAO,IAAI,KAAA,CAAM,QAAS,CAAA,UAAU,CAAC,CAAA;AAAA;AAEvC,QAAA,QAAA,CAAS,MAAO,CAAA,IAAA,CAAK,CAAC,EAAE,QAAA,EAAAC,WAAwC,KAAA;AAC9D,UAAA,IAAI,CAACA,SAAU,EAAA;AACb,YAAO,MAAA,CAAA,IAAI,KAAM,CAAA,yCAAyC,CAAC,CAAA;AAAA;AAE7D,UAAA,OAAA,CAAQA,SAAQ,CAAA;AAAA,SACjB,CAAA;AAAA,OACF,CAAA,CACA,KAAM,CAAA,CAAC,KAAiB,KAAA;AACvB,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,OACb;AAAA,KACL;AAAA;AACF,EAEA,iBAAoB,GAAA;AAAA;AAEpB,EAEA,YAAA,CACE,EACA,EAAA,QAAA,EACA,aACe,EAAA;AACf,IAAA,OAAO,IAAI,OAAA;AAAA,MAAQ,CAAC,OAAS,EAAA,MAAA,KAC3B,KAAM,CAAA,CAAA,EAAG,OAAO,CAAI,CAAA,EAAA,mBAAmB,CAAI,CAAA,EAAA,EAAE,CAAI,CAAA,EAAA;AAAA,QAC/C,MAAQ,EAAA,KAAA;AAAA,QACR,IAAA,EAAM,KAAK,SAAU,CAAA;AAAA,UACnB,QAAA;AAAA,UACA,MAAQ,EAAA;AAAA,SACT;AAAA,OACF,CAAA,CACE,IAAK,CAAA,CAAC,QAAa,KAAA;AAClB,QAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,UAAA,MAAA,CAAO,IAAI,KAAA,CAAM,QAAS,CAAA,UAAU,CAAC,CAAA;AAAA;AAEvC,QAAQ,OAAA,EAAA;AAAA,OACT,CAAA,CACA,KAAM,CAAA,CAAC,KAAiB,KAAA;AACvB,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,OACb;AAAA,KACL;AAAA;AACF,EAEA,aAAa,EAA2B,EAAA;AACtC,IAAA,OAAO,IAAI,OAAA;AAAA,MAAQ,CAAC,OAAS,EAAA,MAAA,KAC3B,KAAM,CAAA,CAAA,EAAG,OAAO,CAAI,CAAA,EAAA,mBAAmB,CAAI,CAAA,EAAA,EAAE,CAAI,CAAA,EAAA;AAAA,QAC/C,MAAQ,EAAA;AAAA,OACT,CAAA,CACE,IAAK,CAAA,CAAC,QAAa,KAAA;AAClB,QAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,UAAA,MAAA,CAAO,IAAI,KAAA,CAAM,QAAS,CAAA,UAAU,CAAC,CAAA;AAAA;AAEvC,QAAQ,OAAA,EAAA;AAAA,OACT,CAAA,CACA,KAAM,CAAA,CAAC,KAAiB,KAAA;AACvB,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,OACb;AAAA,KACL;AAAA;AACF,EAEA,WAAW,EAAiC,EAAA;AAC1C,IAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACtC,MAAA,KAAA,CAAM,GAAG,OAAO,CAAA,CAAA,EAAI,mBAAmB,CAAA,CAAA,EAAI,EAAE,CAAI,CAAA,EAAA;AAAA,QAC/C,MAAQ,EAAA;AAAA,OACT,CAAA,CACE,IAAK,CAAA,CAAC,QAAa,KAAA;AAClB,QAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,UAAA,MAAA,CAAO,IAAI,KAAA,CAAM,QAAS,CAAA,UAAU,CAAC,CAAA;AAAA;AAEvC,QAAA,QAAA,CAAS,MAAO,CAAA,IAAA,CAAK,CAAC,EAAE,YAAuC,KAAA;AAC7D,UAAA,IAAI,CAAC,UAAY,EAAA;AACf,YAAO,MAAA,CAAA,IAAI,KAAM,CAAA,yCAAyC,CAAC,CAAA;AAAA;AAE7D,UAAA,OAAA,CAAQ,UAAU,CAAA;AAAA,SACnB,CAAA;AAAA,OACF,CAAA,CACA,KAAM,CAAA,CAAC,KAAiB,KAAA;AACvB,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,OACb,CAAA;AAAA,KACJ,CAAA;AAAA;AACH,EAEA,YAA0C,GAAA;AACxC,IAAA,OAAO,IAAI,OAAA;AAAA,MAAQ,CAAC,SAAS,MAC3B,KAAA,KAAA,CAAM,GAAG,OAAO,CAAA,CAAA,EAAI,oBAAoB,CAAI,CAAA,EAAA;AAAA,QAC1C,MAAQ,EAAA;AAAA,OACT,CAAA,CACE,IAAK,CAAA,CAAC,QAAa,KAAA;AAClB,QAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,UAAA,MAAA,CAAO,IAAI,KAAA,CAAM,QAAS,CAAA,UAAU,CAAC,CAAA;AAAA;AAEvC,QAAA,QAAA,CAAS,IAAK,EAAA,CAAE,IAAK,CAAA,CAAC,QAA+B,KAAA;AACnD,UAAA,IAAI,CAAC,QAAU,EAAA;AACb,YAAO,MAAA,CAAA,IAAI,KAAM,CAAA,yCAAyC,CAAC,CAAA;AAAA;AAE7D,UAAA,OAAA,CAAQ,QAAQ,CAAA;AAAA,SACjB,CAAA;AAAA,OACF,CAAA,CACA,KAAM,CAAA,CAAC,KAAiB,KAAA;AACvB,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,OACb;AAAA,KACL;AAAA;AACF,EAEA,oBAAoB,eAAiD,EAAA;AACnE,IAAA,OAAO,IAAI,OAAA;AAAA,MAAQ,CAAC,SAAS,MAC3B,KAAA,KAAA,CAAM,GAAG,OAAO,CAAA,CAAA,EAAI,8BAA8B,CAAI,CAAA,EAAA;AAAA,QACpD,MAAQ,EAAA,KAAA;AAAA,QACR,OAAS,EAAA;AAAA,UACP,cAAgB,EAAA,kBAAA;AAAA,UAChB,UAAU,IAAK,CAAA;AAAA,SACjB;AAAA,QACA,IAAA,EAAM,IAAK,CAAA,SAAA,CAAU,eAAe;AAAA,OACrC,CAAA,CACE,IAAK,CAAA,CAAC,QAAa,KAAA;AAClB,QAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,UAAA,MAAA,CAAO,IAAI,KAAA,CAAM,QAAS,CAAA,UAAU,CAAC,CAAA;AAAA;AAEvC,QAAQ,OAAA,EAAA;AAAA,OACT,CAAA,CACA,KAAM,CAAA,CAAC,KAAiB,KAAA;AACvB,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,OACb;AAAA,KACL;AAAA;AACF,EAEA,mBAAgD,GAAA;AAC9C,IAAA,OAAO,IAAI,OAAA;AAAA,MAAQ,CAAC,SAAS,MAC3B,KAAA,KAAA,CAAM,GAAG,OAAO,CAAA,CAAA,EAAI,8BAA8B,CAAI,CAAA,EAAA;AAAA,QACpD,MAAQ,EAAA,KAAA;AAAA,QACR,OAAS,EAAA;AAAA,UACP,UAAU,IAAK,CAAA;AAAA;AACjB,OACD,CAAA,CACE,IAAK,CAAA,CAAC,QAAa,KAAA;AAClB,QAAI,IAAA,CAAC,SAAS,EAAI,EAAA;AAChB,UAAA,MAAA,CAAO,IAAI,KAAA,CAAM,QAAS,CAAA,UAAU,CAAC,CAAA;AAAA;AAEvC,QAAA,QAAA,CAAS,IAAK,EAAA,CAAE,IAAK,CAAA,CAAC,eAA+C,KAAA;AACnE,UAAA,IAAI,CAAC,eAAiB,EAAA;AACpB,YAAA,MAAA;AAAA,cACE,IAAI,KAAA;AAAA,gBACF;AAAA;AACF,aACF;AAAA;AAEF,UAAA,OAAA,CAAQ,gBAAgB,UAAU,CAAA;AAAA,SACnC,CAAA;AAAA,OACF,CAAA,CACA,KAAM,CAAA,CAAC,KAAiB,KAAA;AACvB,QAAA,MAAA,CAAO,KAAK,CAAA;AAAA,OACb;AAAA,KACL;AAAA;AACF,EAEA,MAAM,eAAkB,GAAA;AACtB,IAAA,OAAO,EAAC;AAAA;AACV,EAEA,iBAAiB,YAAwB,EAAA;AACvC,IAAA,OAAA,CAAQ,IAAI,kCAAoC,EAAA;AAAA,MAC9C;AAAA,KACD,CAAA;AAAA;AAEL;;;;"}
package/cjs/shell.js CHANGED
@@ -4,6 +4,7 @@ var jsxRuntime = require('react/jsx-runtime');
4
4
  var styles = require('@salt-ds/styles');
5
5
  var window = require('@salt-ds/window');
6
6
  var vuuContextMenu = require('@vuu-ui/vuu-context-menu');
7
+ var vuuDataReact = require('@vuu-ui/vuu-data-react');
7
8
  var vuuLayout = require('@vuu-ui/vuu-layout');
8
9
  var vuuNotifications = require('@vuu-ui/vuu-notifications');
9
10
  var vuuUiControls = require('@vuu-ui/vuu-ui-controls');
@@ -13,17 +14,16 @@ var AppHeader = require('./app-header/AppHeader.js');
13
14
  var ApplicationProvider = require('./application-provider/ApplicationProvider.js');
14
15
  var PersistenceProvider = require('./persistence-manager/PersistenceProvider.js');
15
16
  var LocalPersistenceManager = require('./persistence-manager/LocalPersistenceManager.js');
16
- require('./persistence-manager/StaticPersistenceManager.js');
17
+ require('@salt-ds/core');
17
18
  require('clsx');
19
+ require('./persistence-manager/StaticPersistenceManager.js');
18
20
  var useShellLayout = require('./shell-layout-templates/useShellLayout.js');
19
21
  var UserSettingsPanel = require('./user-settings/UserSettingsPanel.js');
20
- require('@salt-ds/core');
21
22
  require('html-to-image');
22
23
  var WorkspaceProvider = require('./workspace-management/WorkspaceProvider.js');
23
24
  require('./feature-and-layout-provider/FeatureAndLayoutProvider.js');
24
25
  var defaultWorkspaceJSON = require('./workspace-management/defaultWorkspaceJSON.js');
25
26
  var useWorkspaceContextMenuItems = require('./workspace-management/useWorkspaceContextMenuItems.js');
26
- var vuuDataReact = require('@vuu-ui/vuu-data-react');
27
27
  var shell = require('./shell.css.js');
28
28
 
29
29
  vuuUtils.registerComponent("ApplicationSettings", UserSettingsPanel.UserSettingsPanel, "view");
@@ -52,7 +52,10 @@ const getHTMLAttributes = (props) => {
52
52
  };
53
53
  const VuuApplication = ({
54
54
  shellLayoutProps: ShellLayoutProps2,
55
- children
55
+ children,
56
+ // loginUrl, // need to make this available to app header
57
+ serverUrl,
58
+ user
56
59
  }) => {
57
60
  const targetWindow = window.useWindow();
58
61
  styles.useComponentCssInjection({
@@ -72,13 +75,13 @@ const VuuApplication = ({
72
75
  },
73
76
  [saveApplicationLayout]
74
77
  );
78
+ vuuDataReact.useRemoteConnection({ serverUrl, user });
75
79
  const isLayoutLoading = workspaceJSON === defaultWorkspaceJSON.loadingJSON;
76
80
  const initialLayout = useShellLayout.useShellLayout({
77
81
  ...ShellLayoutProps2,
78
82
  appHeader: getAppHeader(ShellLayoutProps2),
79
83
  htmlAttributes: getHTMLAttributes(ShellLayoutProps2)
80
84
  });
81
- vuuDataReact.useLostConnection();
82
85
  return isLayoutLoading ? null : /* @__PURE__ */ jsxRuntime.jsxs(
83
86
  vuuContextMenu.ContextMenuProvider,
84
87
  {
@@ -99,7 +102,7 @@ const VuuApplication = ({
99
102
  );
100
103
  };
101
104
  const Shell = ({
102
- logout,
105
+ loginUrl,
103
106
  user,
104
107
  userSettingsSchema,
105
108
  workspaceProps,
@@ -119,7 +122,7 @@ const Shell = ({
119
122
  ApplicationProvider.ApplicationProvider,
120
123
  {
121
124
  density: "high",
122
- logout,
125
+ loginUrl,
123
126
  theme: "vuu-theme",
124
127
  user,
125
128
  userSettingsSchema,
package/cjs/shell.js.map CHANGED
@@ -1 +1 @@
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 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\";\nimport { useLostConnection } from \"@vuu-ui/vuu-data-react\";\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 logout?: () => void;\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}: 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 const isLayoutLoading = workspaceJSON === loadingJSON;\n\n const initialLayout = useShellLayout({\n ...ShellLayoutProps,\n appHeader: getAppHeader(ShellLayoutProps),\n htmlAttributes: getHTMLAttributes(ShellLayoutProps),\n });\n\n useLostConnection();\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 logout,\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 logout={logout}\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","loadingJSON","useShellLayout","useLostConnection","jsxs","ContextMenuProvider","jsx","LayoutProvider","usePersistenceManager","useMemo","LocalPersistenceManager","ApplicationProvider","WorkspaceProvider","ModalProvider","NotificationsProvider","PersistenceProvider"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCAA,0BAAkB,CAAA,qBAAA,EAAuBC,qCAAmB,MAAM,CAAA;AAElE,IAAI,OAAA,CAAQ,GAAI,CAAA,QAAA,KAAa,YAAc,EAAA;AAIzC,EAAI,IAAA,OAAOC,0BAAgB,UAAY,EAAA;AACrC,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN;AAAA,KACF;AAAA;AAEJ;AAEA,MAAM,EAAE,KAAA,EAAU,GAAAC,eAAA,CAAO,OAAO,CAAA;AAehC,MAAM,gBAAA,kCAAoBC,mBAAU,EAAA,EAAA,CAAA;AAEpC,MAAM,YAAe,GAAA,CAAC,gBACpB,KAAA,gBAAA,EAAkB,SAAa,IAAA,gBAAA;AAEjC,MAAM,qBAAwD,GAAA;AAAA,EAC5D,SAAW,EAAA;AACb,CAAA;AAEA,MAAM,iBAAA,GAAoB,CAAC,KAA6B,KAAA;AACtD,EAAA,IAAI,OAAO,cAAgB,EAAA;AACzB,IAAO,OAAA;AAAA,MACL,GAAG,qBAAA;AAAA,MACH,GAAG,KAAM,CAAA;AAAA,KACX;AAAA,GACK,MAAA;AACL,IAAO,OAAA,qBAAA;AAAA;AAEX,CAAA;AAEA,MAAM,iBAAiB,CAAC;AAAA,EACtB,gBAAkBC,EAAAA,iBAAAA;AAAA,EAClB;AACF,CAGM,KAAA;AACJ,EAAA,MAAM,eAAeC,gBAAU,EAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,WAAA;AAAA,IACR,GAAK,EAAAC,KAAA;AAAA,IACL,MAAQ,EAAA;AAAA,GACT,CAAA;AAED,EAAA,MAAM,EAAE,aAAA,EAAe,qBAAsB,EAAA,GAAIC,8BAAa,EAAA;AAE9D,EAAA,MAAM,EAAE,gBAAA,EAAkB,gBAAiB,EAAA,GAAIC,yDAA6B,EAAA;AAE5E,EAAA,MAAM,kBAAqB,GAAAC,iBAAA;AAAA,IACzB,CAAC,MAAW,KAAA;AACV,MAAI,IAAA;AACF,QAAA,qBAAA,CAAsB,MAAM,CAAA;AAAA,OACtB,CAAA,MAAA;AACN,QAAA,KAAA,GAAQ,uBAAuB,CAAA;AAAA;AACjC,KACF;AAAA,IACA,CAAC,qBAAqB;AAAA,GACxB;AAEA,EAAA,MAAM,kBAAkB,aAAkB,KAAAC,gCAAA;AAE1C,EAAA,MAAM,gBAAgBC,6BAAe,CAAA;AAAA,IACnC,GAAGR,iBAAAA;AAAA,IACH,SAAA,EAAW,aAAaA,iBAAgB,CAAA;AAAA,IACxC,cAAA,EAAgB,kBAAkBA,iBAAgB;AAAA,GACnD,CAAA;AAED,EAAkBS,8BAAA,EAAA;AAElB,EAAA,OAAO,kBAAkB,IACvB,mBAAAC,eAAA;AAAA,IAACC,kCAAA;AAAA,IAAA;AAAA,MACC,iBAAmB,EAAA,gBAAA;AAAA,MACnB,WAAa,EAAA,gBAAA;AAAA,MAEb,QAAA,EAAA;AAAA,wBAAAC,cAAA;AAAA,UAACC,wBAAA;AAAA,UAAA;AAAA,YACC,aAAA;AAAA,YACA,cAAgB,EAAA,kBAAA;AAAA,YAEf,QAAA,EAAA;AAAA;AAAA,SACH;AAAA,QACC;AAAA;AAAA;AAAA,GACH;AAEJ,CAAA;AAEO,MAAM,QAAQ,CAAC;AAAA,EACpB,MAAA;AAAA,EACA,IAAA;AAAA,EACA,kBAAA;AAAA,EACA,cAAA;AAAA,EACA,GAAG;AACL,CAAkB,KAAA;AAIhB,EAAA,MAAM,qBAAqBC,yCAAsB,EAAA;AACjD,EAAM,MAAA,uBAAA,GAA0BC,cAE9B,MAAM;AACN,IAAA,IAAI,kBAAoB,EAAA;AACtB,MAAO,OAAA,KAAA,CAAA;AAAA;AAET,IAAQ,OAAA,CAAA,GAAA;AAAA,MACN,CAAA,yFAAA,EAA4F,KAAK,QAAQ,CAAA,CAAA;AAAA,KAC3G;AACA,IAAA,OAAO,IAAIC,+CAAA,CAAwB,CAAO,IAAA,EAAA,IAAA,CAAK,QAAQ,CAAE,CAAA,CAAA;AAAA,GACxD,EAAA,CAAC,kBAAoB,EAAA,IAAA,CAAK,QAAQ,CAAC,CAAA;AAMtC,EAAA,MAAM,cACJ,mBAAAJ,cAAA;AAAA,IAACK,uCAAA;AAAA,IAAA;AAAA,MACC,OAAQ,EAAA,MAAA;AAAA,MACR,MAAA;AAAA,MACA,KAAM,EAAA,WAAA;AAAA,MACN,IAAA;AAAA,MACA,kBAAA;AAAA,MAEA,QAAC,kBAAAL,cAAA,CAAAM,mCAAA,EAAA,EAAmB,GAAG,cAAA,EACrB,yCAACC,2BACC,EAAA,EAAA,QAAA,kBAAAP,cAAA,CAACQ,sCACC,EAAA,EAAA,QAAA,kBAAAR,cAAA,CAAC,kBAAgB,GAAG,KAAA,EAAO,IAAY,EAAA,CAAA,EACzC,GACF,CACF,EAAA;AAAA;AAAA,GACF;AAGF,EAAA,IAAI,kBAAoB,EAAA;AACtB,IAAO,OAAA,cAAA;AAAA,GACF,MAAA;AACL,IAAA,uBACGA,cAAA,CAAAS,uCAAA,EAAA,EAAoB,kBAAoB,EAAA,uBAAA,EACtC,QACH,EAAA,cAAA,EAAA,CAAA;AAAA;AAGN;;;;"}
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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"}
@@ -5,9 +5,11 @@ var core = require('@salt-ds/core');
5
5
  var styles = require('@salt-ds/styles');
6
6
  var window = require('@salt-ds/window');
7
7
  var React = require('react');
8
+ require('@vuu-ui/vuu-ui-controls');
9
+ require('clsx');
10
+ var loginUtils = require('../login/login-utils.js');
8
11
  var screenshotUtils = require('./screenshot-utils.js');
9
12
  var SaveLayoutPanel$1 = require('./SaveLayoutPanel.css.js');
10
- var ApplicationProvider = require('../application-provider/ApplicationProvider.js');
11
13
 
12
14
  const classBase = "vuuSaveLayoutPanel";
13
15
  const groups = ["Group 1", "Group 2", "Group 3", "Group 4", "Group 5"];
@@ -23,7 +25,7 @@ const SaveLayoutPanel = (props) => {
23
25
  const [group, setGroup] = React.useState("");
24
26
  const [screenshot, setScreenshot] = React.useState();
25
27
  const [screenshotErrorMessage, setScreenshotErrorMessage] = React.useState();
26
- const { username } = ApplicationProvider.useApplicationUser();
28
+ const [username] = loginUtils.getAuthDetailsFromCookies();
27
29
  React.useEffect(() => {
28
30
  if (componentId) {
29
31
  screenshotUtils.takeScreenshot(document.getElementById(componentId)).then((screenshot2) => {
@@ -112,11 +114,10 @@ const SaveLayoutPanel = (props) => {
112
114
  /* @__PURE__ */ jsxRuntime.jsx(
113
115
  core.Button,
114
116
  {
115
- appearance: "solid",
116
117
  className: `${classBase}-saveButton`,
117
118
  onClick: handleSubmit,
118
119
  disabled: layoutName === "" || group === "",
119
- sentiment: "accented",
120
+ variant: "cta",
120
121
  children: "Save"
121
122
  }
122
123
  )
@@ -1 +1 @@
1
- {"version":3,"file":"SaveLayoutPanel.js","sources":["../../../../packages/vuu-shell/src/workspace-management/SaveLayoutPanel.tsx"],"sourcesContent":["import { LayoutMetadataDto } from \"@vuu-ui/vuu-utils\";\nimport {\n Button,\n ComboBox,\n FormField,\n FormFieldLabel,\n Input,\n Option,\n Text,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport {\n ChangeEvent,\n SyntheticEvent,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { takeScreenshot } from \"./screenshot-utils\";\n\nimport saveLayoutPanelCss from \"./SaveLayoutPanel.css\";\nimport { useApplicationUser } from \"../application-provider\";\n\nconst classBase = \"vuuSaveLayoutPanel\";\n\nconst groups = [\"Group 1\", \"Group 2\", \"Group 3\", \"Group 4\", \"Group 5\"];\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 targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-save-layout-panel\",\n css: saveLayoutPanelCss,\n window: targetWindow,\n });\n\n const [layoutName, setLayoutName] = useState<string>(defaultTitle);\n const [group, setGroup] = useState<string>(\"\");\n const [screenshot, setScreenshot] = useState<string | undefined>();\n const [screenshotErrorMessage, setScreenshotErrorMessage] = useState<\n string | undefined\n >();\n const { username } = useApplicationUser();\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 const handleSelectionChange = useCallback(\n (e: SyntheticEvent | KeyboardEvent, [selectedValue]: string[]) => {\n if (\n (e as KeyboardEvent).key === \"Tab\" &&\n !selectedValue.toLowerCase().startsWith(group.toLowerCase())\n ) {\n // ignore. The ComboBox forces selection of a value from the list on Tab\n } else {\n setGroup(selectedValue || \"\");\n }\n },\n [group],\n );\n\n const handleChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setGroup(e.target.value);\n }, []);\n\n return (\n <div className={`${classBase}`}>\n <div className={`${classBase}-panelContent`}>\n <FormField>\n <FormFieldLabel>Group</FormFieldLabel>\n <ComboBox\n data-embedded\n inputProps={{\n autoComplete: \"off\",\n className: `${classBase}-inputText`,\n placeholder: \"Select Group or Enter New Name\",\n // onChange: (event: ChangeEvent<HTMLInputElement>) =>\n // setGroup(event.target.value),\n }}\n onChange={handleChange}\n onSelectionChange={handleSelectionChange}\n value={group}\n >\n {groups.map((group, i) => (\n <Option key={i} value={group} />\n ))}\n </ComboBox>\n </FormField>\n <FormField>\n <FormFieldLabel>Layout Name</FormFieldLabel>\n <Input\n data-embedded\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 <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 appearance=\"solid\"\n className={`${classBase}-saveButton`}\n onClick={handleSubmit}\n disabled={layoutName === \"\" || group === \"\"}\n sentiment=\"accented\"\n >\n Save\n </Button>\n </div>\n </div>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","saveLayoutPanelCss","useState","useApplicationUser","useEffect","takeScreenshot","screenshot","useMemo","jsx","Text","useCallback","jsxs","FormField","FormFieldLabel","ComboBox","group","Option","Input","Button"],"mappings":"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"}
1
+ {"version":3,"file":"SaveLayoutPanel.js","sources":["../../../../packages/vuu-shell/src/workspace-management/SaveLayoutPanel.tsx"],"sourcesContent":["import { LayoutMetadataDto } from \"@vuu-ui/vuu-utils\";\nimport {\n Button,\n ComboBox,\n FormField,\n FormFieldLabel,\n Input,\n Option,\n Text,\n} from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport {\n ChangeEvent,\n SyntheticEvent,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { getAuthDetailsFromCookies } from \"../login\";\nimport { takeScreenshot } from \"./screenshot-utils\";\n\nimport saveLayoutPanelCss from \"./SaveLayoutPanel.css\";\n\nconst classBase = \"vuuSaveLayoutPanel\";\n\nconst groups = [\"Group 1\", \"Group 2\", \"Group 3\", \"Group 4\", \"Group 5\"];\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 targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-save-layout-panel\",\n css: saveLayoutPanelCss,\n window: targetWindow,\n });\n\n const [layoutName, setLayoutName] = useState<string>(defaultTitle);\n const [group, setGroup] = useState<string>(\"\");\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 const handleSelectionChange = useCallback(\n (e: SyntheticEvent | KeyboardEvent, [selectedValue]: string[]) => {\n if (\n (e as KeyboardEvent).key === \"Tab\" &&\n !selectedValue.toLowerCase().startsWith(group.toLowerCase())\n ) {\n // ignore. The ComboBox forces selection of a value from the list on Tab\n } else {\n setGroup(selectedValue || \"\");\n }\n },\n [group],\n );\n\n const handleChange = useCallback((e: ChangeEvent<HTMLInputElement>) => {\n setGroup(e.target.value);\n }, []);\n\n return (\n <div className={`${classBase}`}>\n <div className={`${classBase}-panelContent`}>\n <FormField>\n <FormFieldLabel>Group</FormFieldLabel>\n <ComboBox\n data-embedded\n inputProps={{\n autoComplete: \"off\",\n className: `${classBase}-inputText`,\n placeholder: \"Select Group or Enter New Name\",\n // onChange: (event: ChangeEvent<HTMLInputElement>) =>\n // setGroup(event.target.value),\n }}\n onChange={handleChange}\n onSelectionChange={handleSelectionChange}\n value={group}\n >\n {groups.map((group, i) => (\n <Option key={i} value={group} />\n ))}\n </ComboBox>\n </FormField>\n <FormField>\n <FormFieldLabel>Layout Name</FormFieldLabel>\n <Input\n data-embedded\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 <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 variant=\"cta\"\n >\n Save\n </Button>\n </div>\n </div>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","saveLayoutPanelCss","useState","getAuthDetailsFromCookies","useEffect","takeScreenshot","screenshot","useMemo","jsx","Text","useCallback","jsxs","FormField","FormFieldLabel","ComboBox","group","Option","Input","Button"],"mappings":"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"}
@@ -7,6 +7,11 @@ var vuuUtils = require('@vuu-ui/vuu-utils');
7
7
  var React = require('react');
8
8
  var PersistenceProvider = require('../persistence-manager/PersistenceProvider.js');
9
9
  require('../persistence-manager/LocalPersistenceManager.js');
10
+ require('@vuu-ui/vuu-ui-controls');
11
+ require('@salt-ds/core');
12
+ require('@salt-ds/styles');
13
+ require('@salt-ds/window');
14
+ require('clsx');
10
15
  require('../persistence-manager/StaticPersistenceManager.js');
11
16
  var defaultWorkspaceJSON = require('./defaultWorkspaceJSON.js');
12
17
 
@@ -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-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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"}
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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"}
@@ -6,12 +6,13 @@ import { useLayoutOperation } from '@vuu-ui/vuu-layout';
6
6
  import { Toolbar } from '@vuu-ui/vuu-ui-controls';
7
7
  import cx from 'clsx';
8
8
  import { useRef, useCallback } from 'react';
9
+ import { useLoginUrl } from '../application-provider/ApplicationProvider.js';
10
+ import { logout } from '../login/login-utils.js';
9
11
  import appHeaderCss from './AppHeader.css.js';
10
12
  import { usePersistenceManager } from '../persistence-manager/PersistenceProvider.js';
11
13
  import '../persistence-manager/LocalPersistenceManager.js';
12
14
  import '../persistence-manager/StaticPersistenceManager.js';
13
15
  import { useNotifications, NotificationType } from '@vuu-ui/vuu-notifications';
14
- import { useLogout } from '../application-provider/ApplicationProvider.js';
15
16
 
16
17
  const classBase = "vuuAppHeader";
17
18
  const AppHeader = ({
@@ -28,9 +29,12 @@ const AppHeader = ({
28
29
  const persistenceManager = usePersistenceManager();
29
30
  const settingsButtonRef = useRef(null);
30
31
  const className = cx(classBase, classNameProp);
31
- const logout = useLogout();
32
+ const loginUrl = useLoginUrl();
32
33
  const { showComponentInContextPanel } = useLayoutOperation();
33
34
  const { showNotification } = useNotifications();
35
+ const handleLogout = useCallback(() => {
36
+ logout(loginUrl);
37
+ }, [loginUrl]);
34
38
  const handleReset = useCallback(() => {
35
39
  persistenceManager?.clearUserSettings();
36
40
  showNotification({
@@ -102,7 +106,7 @@ const AppHeader = ({
102
106
  {
103
107
  appearance: "bordered",
104
108
  className: `${classBase}-menuItem`,
105
- onClick: logout,
109
+ onClick: handleLogout,
106
110
  sentiment: "neutral",
107
111
  children: "Log out"
108
112
  }
@@ -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\";\n\nimport appHeaderCss from \"./AppHeader.css\";\nimport { usePersistenceManager } from \"../persistence-manager\";\nimport { NotificationType, useNotifications } from \"@vuu-ui/vuu-notifications\";\nimport { useLogout } from \"../application-provider\";\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 logout = useLogout();\n\n const { showComponentInContextPanel } = useLayoutOperation();\n const { showNotification } = useNotifications();\n\n const handleReset = useCallback(() => {\n persistenceManager?.clearUserSettings();\n showNotification({\n animationType: \"slide-out\",\n renderPostRefresh: true,\n type: NotificationType.Toast,\n header: \"Success\",\n content: \"Settings cleared\",\n status: \"success\",\n });\n location.reload();\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={logout}\n sentiment=\"neutral\"\n >\n Log out\n </Button>\n </Toolbar>\n );\n};\n"],"names":[],"mappings":"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"}
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 showNotification({\n animationType: \"slide-out\",\n renderPostRefresh: true,\n type: NotificationType.Toast,\n header: \"Success\",\n content: \"Settings cleared\",\n status: \"success\",\n });\n location.reload();\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":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import { createContext } from 'react';
2
2
 
3
3
  const Guest = {
4
- username: "unknown"
4
+ username: "unknown",
5
+ token: ""
5
6
  };
6
7
  const ApplicationContext = createContext({
7
8
  onUserSettingChanged: (propertyName) => console.warn(
@@ -1 +1 @@
1
- {"version":3,"file":"ApplicationContext.js","sources":["../../../../packages/vuu-shell/src/application-provider/ApplicationContext.tsx"],"sourcesContent":["import type { Settings, VuuUser } from \"@vuu-ui/vuu-utils\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { createContext } from \"react\";\nimport { SettingsSchema } from \"../user-settings\";\n\nconst Guest: VuuUser = {\n username: \"unknown\",\n};\n\nexport interface ApplicationContextProps {\n onUserSettingChanged: (\n propertyName: string,\n value: VuuRowDataItemType,\n ) => void;\n logout?: () => void;\n userSettings?: Settings;\n userSettingsSchema?: SettingsSchema;\n user: VuuUser;\n}\n\nexport const ApplicationContext = createContext<ApplicationContextProps>({\n onUserSettingChanged: (propertyName: string) =>\n console.warn(\n `Cannot change setting '${propertyName}'.\\nDid you forget to declare an ApplicationProvider ?`,\n ),\n user: Guest,\n});\n"],"names":[],"mappings":";;AAKA,MAAM,KAAiB,GAAA;AAAA,EACrB,QAAU,EAAA;AACZ,CAAA;AAaO,MAAM,qBAAqB,aAAuC,CAAA;AAAA,EACvE,oBAAA,EAAsB,CAAC,YAAA,KACrB,OAAQ,CAAA,IAAA;AAAA,IACN,0BAA0B,YAAY,CAAA;AAAA,kDAAA;AAAA,GACxC;AAAA,EACF,IAAM,EAAA;AACR,CAAC;;;;"}
1
+ {"version":3,"file":"ApplicationContext.js","sources":["../../../../packages/vuu-shell/src/application-provider/ApplicationContext.tsx"],"sourcesContent":["import type { Settings, VuuUser } from \"@vuu-ui/vuu-utils\";\nimport { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport { createContext } from \"react\";\nimport { SettingsSchema } from \"../user-settings\";\n\nconst Guest: VuuUser = {\n username: \"unknown\",\n token: \"\",\n};\n\nexport interface ApplicationContextProps {\n onUserSettingChanged: (\n propertyName: string,\n value: VuuRowDataItemType,\n ) => void;\n loginUrl?: string;\n userSettings?: Settings;\n userSettingsSchema?: SettingsSchema;\n user: VuuUser;\n}\n\nexport const ApplicationContext = createContext<ApplicationContextProps>({\n onUserSettingChanged: (propertyName: string) =>\n console.warn(\n `Cannot change setting '${propertyName}'.\\nDid you forget to declare an ApplicationProvider ?`,\n ),\n user: Guest,\n});\n"],"names":[],"mappings":";;AAKA,MAAM,KAAiB,GAAA;AAAA,EACrB,QAAU,EAAA,SAAA;AAAA,EACV,KAAO,EAAA;AACT,CAAA;AAaO,MAAM,qBAAqB,aAAuC,CAAA;AAAA,EACvE,oBAAA,EAAsB,CAAC,YAAA,KACrB,OAAQ,CAAA,IAAA;AAAA,IACN,0BAA0B,YAAY,CAAA;AAAA,kDAAA;AAAA,GACxC;AAAA,EACF,IAAM,EAAA;AACR,CAAC;;;;"}
@@ -4,6 +4,11 @@ import { useContext, useState, useMemo, useCallback } from 'react';
4
4
  import { ApplicationContext } from './ApplicationContext.js';
5
5
  import { usePersistenceManager } from '../persistence-manager/PersistenceProvider.js';
6
6
  import '../persistence-manager/LocalPersistenceManager.js';
7
+ import '@vuu-ui/vuu-ui-controls';
8
+ import '@salt-ds/styles';
9
+ import '@salt-ds/window';
10
+ import 'clsx';
11
+ import '@vuu-ui/vuu-utils';
7
12
  import '../persistence-manager/StaticPersistenceManager.js';
8
13
 
9
14
  const getThemeMode = (mode = "light", userSettings) => {
@@ -16,7 +21,7 @@ const getThemeMode = (mode = "light", userSettings) => {
16
21
  const ApplicationProvider = ({
17
22
  children,
18
23
  density: densityProp,
19
- logout,
24
+ loginUrl,
20
25
  mode,
21
26
  theme,
22
27
  userSettingsSchema,
@@ -50,7 +55,7 @@ const ApplicationProvider = ({
50
55
  {
51
56
  value: {
52
57
  ...context,
53
- logout,
58
+ loginUrl,
54
59
  onUserSettingChanged,
55
60
  userSettings,
56
61
  userSettingsSchema,
@@ -72,6 +77,10 @@ const useApplicationUser = () => {
72
77
  const { user } = useContext(ApplicationContext);
73
78
  return user;
74
79
  };
80
+ const useLoginUrl = () => {
81
+ const { loginUrl } = useContext(ApplicationContext);
82
+ return loginUrl;
83
+ };
75
84
  const useApplicationSettings = () => {
76
85
  const { onUserSettingChanged, userSettings, userSettingsSchema } = useContext(ApplicationContext);
77
86
  return {
@@ -84,10 +93,6 @@ const useUserSetting = () => {
84
93
  const { userSettings } = useContext(ApplicationContext);
85
94
  return userSettings;
86
95
  };
87
- const useLogout = () => {
88
- const { logout } = useContext(ApplicationContext);
89
- return logout;
90
- };
91
96
 
92
- export { ApplicationProvider, useApplicationSettings, useApplicationUser, useLogout, useUserSetting };
97
+ export { ApplicationProvider, useApplicationSettings, useApplicationUser, useLoginUrl, useUserSetting };
93
98
  //# sourceMappingURL=ApplicationProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ApplicationProvider.js","sources":["../../../../packages/vuu-shell/src/application-provider/ApplicationProvider.tsx"],"sourcesContent":["import { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n Density,\n Mode,\n SaltProvider,\n ThemeContextProps,\n useDensity,\n useTheme,\n} from \"@salt-ds/core\";\nimport {\n ReactElement,\n ReactNode,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from \"react\";\nimport {\n ApplicationContext,\n ApplicationContextProps,\n} from \"./ApplicationContext\";\nimport { usePersistenceManager } from \"../persistence-manager\";\n\nexport interface ApplicationProviderProps\n extends Partial<Pick<ThemeContextProps, \"theme\" | \"mode\">>,\n Partial<Omit<ApplicationContextProps, \"userSettings\">> {\n children: ReactNode;\n density?: Density;\n}\n\nconst getThemeMode = (\n mode: Mode = \"light\",\n userSettings?: Record<string, string | number | boolean>,\n) => {\n const themeMode = userSettings?.themeMode;\n if (themeMode === \"light\" || themeMode === \"dark\") {\n return themeMode;\n }\n return mode;\n};\n\nexport const ApplicationProvider = ({\n children,\n density: densityProp,\n logout,\n mode,\n theme,\n userSettingsSchema: userSettingsSchema,\n user,\n}: ApplicationProviderProps): ReactElement | null => {\n const { mode: inheritedMode, theme: inheritedTheme } = useTheme();\n const density = useDensity(densityProp);\n const persistenceManager = usePersistenceManager();\n const context = useContext(ApplicationContext);\n const [userSettings, setSettings] =\n useState<Record<string, string | number | boolean>>();\n\n useMemo(async () => {\n if (persistenceManager) {\n const userSettings = await persistenceManager.getUserSettings();\n setSettings(userSettings);\n } else {\n setSettings({});\n }\n }, [persistenceManager]);\n\n const onUserSettingChanged = useCallback(\n (propertyName: string, value: VuuRowDataItemType) => {\n setSettings((currentSettings) => {\n const newSettings = { ...currentSettings, [propertyName]: value };\n persistenceManager?.saveUserSettings(newSettings);\n return newSettings;\n });\n },\n [persistenceManager],\n );\n\n return userSettings ? (\n <ApplicationContext.Provider\n value={{\n ...context,\n logout,\n onUserSettingChanged,\n userSettings,\n userSettingsSchema,\n user: user ?? context.user,\n }}\n >\n <SaltProvider\n theme={theme ?? inheritedTheme ?? \"vuu-theme\"}\n density={density}\n mode={getThemeMode(mode ?? inheritedMode, userSettings)}\n >\n {children}\n </SaltProvider>\n </ApplicationContext.Provider>\n ) : null;\n};\n\nexport const useApplicationUser = () => {\n const { user } = useContext(ApplicationContext);\n return user;\n};\n\n//Setter method (only used within the shell)\nexport const useApplicationSettings = () => {\n const { onUserSettingChanged, userSettings, userSettingsSchema } =\n useContext(ApplicationContext);\n return {\n onUserSettingChanged,\n userSettings,\n userSettingsSchema,\n };\n};\n\n//Getter method (read only access to applicationSetting)\nexport const useUserSetting = () => {\n const { userSettings } = useContext(ApplicationContext);\n return userSettings;\n};\n\nexport const useLogout = () => {\n const { logout } = useContext(ApplicationContext);\n return logout;\n};\n"],"names":["userSettings"],"mappings":"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"}
1
+ {"version":3,"file":"ApplicationProvider.js","sources":["../../../../packages/vuu-shell/src/application-provider/ApplicationProvider.tsx"],"sourcesContent":["import { VuuRowDataItemType } from \"@vuu-ui/vuu-protocol-types\";\nimport {\n Density,\n Mode,\n SaltProvider,\n ThemeContextProps,\n useDensity,\n useTheme,\n} from \"@salt-ds/core\";\nimport {\n ReactElement,\n ReactNode,\n useCallback,\n useContext,\n useMemo,\n useState,\n} from \"react\";\nimport {\n ApplicationContext,\n ApplicationContextProps,\n} from \"./ApplicationContext\";\nimport { usePersistenceManager } from \"../persistence-manager\";\n\nexport interface ApplicationProviderProps\n extends Partial<Pick<ThemeContextProps, \"theme\" | \"mode\">>,\n Partial<Omit<ApplicationContextProps, \"userSettings\">> {\n children: ReactNode;\n density?: Density;\n}\n\nconst getThemeMode = (\n mode: Mode = \"light\",\n userSettings?: Record<string, string | number | boolean>,\n) => {\n const themeMode = userSettings?.themeMode;\n if (themeMode === \"light\" || themeMode === \"dark\") {\n return themeMode;\n }\n return mode;\n};\n\nexport const ApplicationProvider = ({\n children,\n density: densityProp,\n loginUrl,\n mode,\n theme,\n userSettingsSchema: userSettingsSchema,\n user,\n}: ApplicationProviderProps): ReactElement | null => {\n const { mode: inheritedMode, theme: inheritedTheme } = useTheme();\n const density = useDensity(densityProp);\n const persistenceManager = usePersistenceManager();\n const context = useContext(ApplicationContext);\n const [userSettings, setSettings] =\n useState<Record<string, string | number | boolean>>();\n\n useMemo(async () => {\n if (persistenceManager) {\n const userSettings = await persistenceManager.getUserSettings();\n setSettings(userSettings);\n } else {\n setSettings({});\n }\n }, [persistenceManager]);\n\n const onUserSettingChanged = useCallback(\n (propertyName: string, value: VuuRowDataItemType) => {\n setSettings((currentSettings) => {\n const newSettings = { ...currentSettings, [propertyName]: value };\n persistenceManager?.saveUserSettings(newSettings);\n return newSettings;\n });\n },\n [persistenceManager],\n );\n\n return userSettings ? (\n <ApplicationContext.Provider\n value={{\n ...context,\n loginUrl,\n onUserSettingChanged,\n userSettings,\n userSettingsSchema,\n user: user ?? context.user,\n }}\n >\n <SaltProvider\n theme={theme ?? inheritedTheme ?? \"vuu-theme\"}\n density={density}\n mode={getThemeMode(mode ?? inheritedMode, userSettings)}\n >\n {children}\n </SaltProvider>\n </ApplicationContext.Provider>\n ) : null;\n};\n\nexport const useApplicationUser = () => {\n const { user } = useContext(ApplicationContext);\n return user;\n};\n\nexport const useLoginUrl = () => {\n const { loginUrl } = useContext(ApplicationContext);\n return loginUrl;\n};\n\n//Setter method (only used within the shell)\nexport const useApplicationSettings = () => {\n const { onUserSettingChanged, userSettings, userSettingsSchema } =\n useContext(ApplicationContext);\n return {\n onUserSettingChanged,\n userSettings,\n userSettingsSchema,\n };\n};\n\n//Getter method (read only access to applicationSetting)\nexport const useUserSetting = () => {\n const { userSettings } = useContext(ApplicationContext);\n return userSettings;\n};\n"],"names":["userSettings"],"mappings":"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"}
package/esm/index.js CHANGED
@@ -1,9 +1,10 @@
1
- export { ApplicationProvider, useApplicationSettings, useApplicationUser, useLogout, useUserSetting } from './application-provider/ApplicationProvider.js';
1
+ export { ApplicationProvider, useApplicationSettings, useApplicationUser, useLoginUrl, useUserSetting } from './application-provider/ApplicationProvider.js';
2
2
  export { AppHeader } from './app-header/AppHeader.js';
3
3
  export { Feature } from './feature/Feature.js';
4
4
  export { FeatureAndLayoutProvider, useFeatures, useLayouts } from './feature-and-layout-provider/FeatureAndLayoutProvider.js';
5
5
  export { LeftNav } from './left-nav/LeftNav.js';
6
6
  export { LoginPanel } from './login/LoginPanel.js';
7
+ export { getAuthDetailsFromCookies, getAuthModeFromCookies, logout, redirectToLogin } from './login/login-utils.js';
7
8
  export { PersistenceContext, PersistenceProvider, usePersistenceManager } from './persistence-manager/PersistenceProvider.js';
8
9
  export { LocalPersistenceManager } from './persistence-manager/LocalPersistenceManager.js';
9
10
  export { RemotePersistenceManager } from './persistence-manager/RemotePersistenceManager.js';
package/esm/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -10,10 +10,6 @@ import { useState, useMemo, useCallback } from 'react';
10
10
  import { FeatureList } from '../feature-list/FeatureList.js';
11
11
  import '@salt-ds/core';
12
12
  import 'html-to-image';
13
- import '../application-provider/ApplicationContext.js';
14
- import '../persistence-manager/PersistenceProvider.js';
15
- import '../persistence-manager/LocalPersistenceManager.js';
16
- import '../persistence-manager/StaticPersistenceManager.js';
17
13
  import { LayoutList } from '../workspace-management/LayoutList.js';
18
14
  import '../workspace-management/WorkspaceProvider.js';
19
15
  import '../workspace-management/defaultWorkspaceJSON.js';