@vuu-ui/vuu-shell 0.8.55 → 0.8.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cjs/app-header/AppHeader.js +27 -8
- package/cjs/app-header/AppHeader.js.map +1 -1
- package/cjs/application-provider/ApplicationContext.js +21 -0
- package/cjs/application-provider/ApplicationContext.js.map +1 -0
- package/cjs/application-provider/ApplicationProvider.js +38 -0
- package/cjs/application-provider/ApplicationProvider.js.map +1 -0
- package/cjs/application-settings/ApplicationSettingsPanel.css.js +6 -0
- package/cjs/application-settings/ApplicationSettingsPanel.css.js.map +1 -0
- package/cjs/application-settings/ApplicationSettingsPanel.js +49 -0
- package/cjs/application-settings/ApplicationSettingsPanel.js.map +1 -0
- package/cjs/layout-management/SaveLayoutPanel.js +24 -43
- package/cjs/layout-management/SaveLayoutPanel.js.map +1 -1
- package/cjs/shell.js +11 -30
- package/cjs/shell.js.map +1 -1
- package/esm/app-header/AppHeader.js +27 -8
- package/esm/app-header/AppHeader.js.map +1 -1
- package/esm/application-provider/ApplicationContext.js +19 -0
- package/esm/application-provider/ApplicationContext.js.map +1 -0
- package/esm/application-provider/ApplicationProvider.js +35 -0
- package/esm/application-provider/ApplicationProvider.js.map +1 -0
- package/esm/application-settings/ApplicationSettingsPanel.css.js +4 -0
- package/esm/application-settings/ApplicationSettingsPanel.css.js.map +1 -0
- package/esm/application-settings/ApplicationSettingsPanel.js +47 -0
- package/esm/application-settings/ApplicationSettingsPanel.js.map +1 -0
- package/esm/layout-management/SaveLayoutPanel.js +25 -44
- package/esm/layout-management/SaveLayoutPanel.js.map +1 -1
- package/esm/shell.js +12 -31
- package/esm/shell.js.map +1 -1
- package/package.json +12 -12
- package/types/app-header/AppHeader.d.ts +1 -6
- package/types/application-provider/ApplicationContext.d.ts +11 -0
- package/types/application-provider/ApplicationProvider.d.ts +11 -0
- package/types/application-provider/index.d.ts +1 -0
- package/types/application-settings/ApplicationSettingsPanel.d.ts +7 -0
- package/types/application-settings/index.d.ts +1 -0
- package/types/get-layout-history.d.ts +1 -1
- package/types/layout-management/useLayoutContextMenuItems.d.ts +1 -1
- package/types/shell.d.ts +1 -4
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var vuuLayout = require('@vuu-ui/vuu-layout');
|
|
4
5
|
var vuuUiControls = require('@vuu-ui/vuu-ui-controls');
|
|
5
6
|
var core = require('@salt-ds/core');
|
|
6
7
|
var styles = require('@salt-ds/styles');
|
|
@@ -13,12 +14,8 @@ var AppHeader$1 = require('./AppHeader.css.js');
|
|
|
13
14
|
const classBase = "vuuAppHeader";
|
|
14
15
|
const AppHeader = ({
|
|
15
16
|
className: classNameProp,
|
|
16
|
-
layoutId,
|
|
17
17
|
loginUrl,
|
|
18
|
-
onNavigate,
|
|
19
|
-
onSwitchTheme,
|
|
20
18
|
themeMode: _,
|
|
21
|
-
user,
|
|
22
19
|
...htmlAttributes
|
|
23
20
|
}) => {
|
|
24
21
|
const targetWindow = window.useWindow();
|
|
@@ -28,9 +25,23 @@ const AppHeader = ({
|
|
|
28
25
|
window: targetWindow
|
|
29
26
|
});
|
|
30
27
|
const className = cx(classBase, classNameProp);
|
|
28
|
+
const dispatchLayoutAction = vuuLayout.useLayoutProviderDispatch();
|
|
31
29
|
const handleLogout = React.useCallback(() => {
|
|
32
30
|
loginUtils.logout(loginUrl);
|
|
33
31
|
}, [loginUrl]);
|
|
32
|
+
const handleShowSettings = React.useCallback(() => {
|
|
33
|
+
dispatchLayoutAction({
|
|
34
|
+
type: "set-props",
|
|
35
|
+
path: "#context-panel",
|
|
36
|
+
props: {
|
|
37
|
+
expanded: true,
|
|
38
|
+
content: {
|
|
39
|
+
type: "ApplicationSettings"
|
|
40
|
+
},
|
|
41
|
+
title: "Settings"
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}, [dispatchLayoutAction]);
|
|
34
45
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
35
46
|
vuuUiControls.Toolbar,
|
|
36
47
|
{
|
|
@@ -44,10 +55,18 @@ const AppHeader = ({
|
|
|
44
55
|
"History ",
|
|
45
56
|
/* @__PURE__ */ jsxRuntime.jsx("span", { "data-icon": "history" })
|
|
46
57
|
] }),
|
|
47
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
58
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
59
|
+
core.Button,
|
|
60
|
+
{
|
|
61
|
+
className: `${classBase}-menuItem`,
|
|
62
|
+
onClick: handleShowSettings,
|
|
63
|
+
variant: "secondary",
|
|
64
|
+
children: [
|
|
65
|
+
"Settings ",
|
|
66
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { "data-icon": "settings" })
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
),
|
|
51
70
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
52
71
|
core.Button,
|
|
53
72
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppHeader.js","sources":["../../src/app-header/AppHeader.tsx"],"sourcesContent":["import { Toolbar } from \"@vuu-ui/vuu-ui-controls\";\nimport { ThemeMode } from \"@vuu-ui/vuu-utils\";\nimport { Button } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useCallback } from \"react\";\nimport { logout } from \"../login\";\
|
|
1
|
+
{"version":3,"file":"AppHeader.js","sources":["../../src/app-header/AppHeader.tsx"],"sourcesContent":["import { useLayoutProviderDispatch } from \"@vuu-ui/vuu-layout\";\nimport { Toolbar } from \"@vuu-ui/vuu-ui-controls\";\nimport { ThemeMode } from \"@vuu-ui/vuu-utils\";\nimport { Button } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useCallback } from \"react\";\nimport { logout } from \"../login\";\n\nimport appHeaderCss from \"./AppHeader.css\";\n\nconst classBase = \"vuuAppHeader\";\nexport interface AppHeaderProps extends HTMLAttributes<HTMLDivElement> {\n loginUrl?: string;\n themeMode?: ThemeMode;\n}\n\nexport const AppHeader = ({\n className: classNameProp,\n loginUrl,\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 className = cx(classBase, classNameProp);\n\n const dispatchLayoutAction = useLayoutProviderDispatch();\n\n const handleLogout = useCallback(() => {\n logout(loginUrl);\n }, [loginUrl]);\n\n const handleShowSettings = useCallback(() => {\n dispatchLayoutAction({\n type: \"set-props\",\n path: \"#context-panel\",\n props: {\n expanded: true,\n content: {\n type: \"ApplicationSettings\",\n },\n title: \"Settings\",\n },\n });\n }, [dispatchLayoutAction]);\n\n return (\n <Toolbar\n alignItems=\"end\"\n className={className}\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 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","useLayoutProviderDispatch","useCallback","logout","jsxs","Toolbar","jsx","Button"],"mappings":";;;;;;;;;;;;;AAYA,MAAM,SAAY,GAAA,cAAA,CAAA;AAMX,MAAM,YAAY,CAAC;AAAA,EACxB,SAAW,EAAA,aAAA;AAAA,EACX,QAAA;AAAA,EACA,SAAW,EAAA,CAAA;AAAA,EACX,GAAG,cAAA;AACL,CAAsB,KAAA;AACpB,EAAA,MAAM,eAAeA,gBAAU,EAAA,CAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,gBAAA;AAAA,IACR,GAAK,EAAAC,WAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAM,MAAA,SAAA,GAAY,EAAG,CAAA,SAAA,EAAW,aAAa,CAAA,CAAA;AAE7C,EAAA,MAAM,uBAAuBC,mCAA0B,EAAA,CAAA;AAEvD,EAAM,MAAA,YAAA,GAAeC,kBAAY,MAAM;AACrC,IAAAC,iBAAA,CAAO,QAAQ,CAAA,CAAA;AAAA,GACjB,EAAG,CAAC,QAAQ,CAAC,CAAA,CAAA;AAEb,EAAM,MAAA,kBAAA,GAAqBD,kBAAY,MAAM;AAC3C,IAAqB,oBAAA,CAAA;AAAA,MACnB,IAAM,EAAA,WAAA;AAAA,MACN,IAAM,EAAA,gBAAA;AAAA,MACN,KAAO,EAAA;AAAA,QACL,QAAU,EAAA,IAAA;AAAA,QACV,OAAS,EAAA;AAAA,UACP,IAAM,EAAA,qBAAA;AAAA,SACR;AAAA,QACA,KAAO,EAAA,UAAA;AAAA,OACT;AAAA,KACD,CAAA,CAAA;AAAA,GACH,EAAG,CAAC,oBAAoB,CAAC,CAAA,CAAA;AAEzB,EACE,uBAAAE,eAAA;AAAA,IAACC,qBAAA;AAAA,IAAA;AAAA,MACC,UAAW,EAAA,KAAA;AAAA,MACX,SAAA;AAAA,MACA,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,CAAA;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,OAAQ,EAAA,WAAA;AAAA,YACT,QAAA,EAAA;AAAA,cAAA,WAAA;AAAA,8BACUD,cAAA,CAAC,MAAK,EAAA,EAAA,WAAA,EAAU,UAAW,EAAA,CAAA;AAAA,aAAA;AAAA,WAAA;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,SAAA;AAAA,WAAA;AAAA,SAED;AAAA,OAAA;AAAA,KAAA;AAAA,GACF,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
|
|
5
|
+
const Guest = {
|
|
6
|
+
username: "unknown",
|
|
7
|
+
token: ""
|
|
8
|
+
};
|
|
9
|
+
const ApplicationContext = React.createContext({
|
|
10
|
+
changeSetting: (propertyName) => console.log(
|
|
11
|
+
`Cannot change setting '${propertyName}'.
|
|
12
|
+
Did you forget to declare an ApplicationProvider ?`
|
|
13
|
+
),
|
|
14
|
+
settings: {
|
|
15
|
+
themeMode: "light"
|
|
16
|
+
},
|
|
17
|
+
user: Guest
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
exports.ApplicationContext = ApplicationContext;
|
|
21
|
+
//# sourceMappingURL=ApplicationContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApplicationContext.js","sources":["../../src/application-provider/ApplicationContext.tsx"],"sourcesContent":["import type { ThemeMode, VuuUser } from \"@vuu-ui/vuu-utils\";\nimport { createContext } from \"react\";\n\nexport interface CoreSettings {\n themeMode: ThemeMode;\n}\n\nconst Guest: VuuUser = {\n username: \"unknown\",\n token: \"\",\n};\n\nexport interface ApplicationContextProps {\n changeSetting: (propertyName: string, value: unknown) => void;\n settings: CoreSettings;\n user: VuuUser;\n}\n\nexport const ApplicationContext = createContext<ApplicationContextProps>({\n changeSetting: (propertyName: string) =>\n console.log(\n `Cannot change setting '${propertyName}'.\\nDid you forget to declare an ApplicationProvider ?`\n ),\n settings: {\n themeMode: \"light\",\n },\n user: Guest,\n});\n"],"names":["createContext"],"mappings":";;;;AAOA,MAAM,KAAiB,GAAA;AAAA,EACrB,QAAU,EAAA,SAAA;AAAA,EACV,KAAO,EAAA,EAAA;AACT,CAAA,CAAA;AAQO,MAAM,qBAAqBA,mBAAuC,CAAA;AAAA,EACvE,aAAA,EAAe,CAAC,YAAA,KACd,OAAQ,CAAA,GAAA;AAAA,IACN,0BAA0B,YAAY,CAAA;AAAA,kDAAA,CAAA;AAAA,GACxC;AAAA,EACF,QAAU,EAAA;AAAA,IACR,SAAW,EAAA,OAAA;AAAA,GACb;AAAA,EACA,IAAM,EAAA,KAAA;AACR,CAAC;;;;"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var ApplicationContext = require('./ApplicationContext.js');
|
|
6
|
+
var core = require('@salt-ds/core');
|
|
7
|
+
|
|
8
|
+
const ApplicationProvider = ({
|
|
9
|
+
children,
|
|
10
|
+
settings: settingsProp,
|
|
11
|
+
user
|
|
12
|
+
}) => {
|
|
13
|
+
const context = React.useContext(ApplicationContext.ApplicationContext);
|
|
14
|
+
const [settings, setSettings] = React.useState(settingsProp ?? context.settings);
|
|
15
|
+
const changeSetting = React.useCallback((propertyName, value) => {
|
|
16
|
+
setSettings((s) => ({ ...s, [propertyName]: value }));
|
|
17
|
+
}, []);
|
|
18
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
19
|
+
ApplicationContext.ApplicationContext.Provider,
|
|
20
|
+
{
|
|
21
|
+
value: {
|
|
22
|
+
...context,
|
|
23
|
+
changeSetting,
|
|
24
|
+
settings,
|
|
25
|
+
user: user ?? context.user
|
|
26
|
+
},
|
|
27
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(core.SaltProvider, { theme: "vuu-theme", density: "high", mode: settings.themeMode, children })
|
|
28
|
+
}
|
|
29
|
+
);
|
|
30
|
+
};
|
|
31
|
+
const useApplicationSettings = () => {
|
|
32
|
+
const { changeSetting, settings } = React.useContext(ApplicationContext.ApplicationContext);
|
|
33
|
+
return { changeSetting, settings };
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
exports.ApplicationProvider = ApplicationProvider;
|
|
37
|
+
exports.useApplicationSettings = useApplicationSettings;
|
|
38
|
+
//# sourceMappingURL=ApplicationProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApplicationProvider.js","sources":["../../src/application-provider/ApplicationProvider.tsx"],"sourcesContent":["import {\n ReactElement,\n ReactNode,\n useCallback,\n useContext,\n useState,\n} from \"react\";\nimport {\n ApplicationContext,\n ApplicationContextProps,\n} from \"./ApplicationContext\";\nimport { SaltProvider } from \"@salt-ds/core\";\n\nexport interface ApplicationProviderProps\n extends Partial<ApplicationContextProps> {\n children: ReactNode;\n}\n\nexport const ApplicationProvider = ({\n children,\n settings: settingsProp,\n user,\n}: ApplicationProviderProps): ReactElement => {\n const context = useContext(ApplicationContext);\n const [settings, setSettings] = useState(settingsProp ?? context.settings);\n\n const changeSetting = useCallback((propertyName: string, value: unknown) => {\n setSettings((s) => ({ ...s, [propertyName]: value }));\n }, []);\n\n return (\n <ApplicationContext.Provider\n value={{\n ...context,\n changeSetting,\n settings,\n user: user ?? context.user,\n }}\n >\n <SaltProvider theme=\"vuu-theme\" density=\"high\" mode={settings.themeMode}>\n {children}\n </SaltProvider>\n </ApplicationContext.Provider>\n );\n};\n\nexport const useApplicationUser = () => {\n const { user } = useContext(ApplicationContext);\n return user;\n};\n\nexport const useApplicationSettings = () => {\n const { changeSetting, settings } = useContext(ApplicationContext);\n return { changeSetting, settings };\n};\n"],"names":["useContext","ApplicationContext","useState","useCallback","jsx","SaltProvider"],"mappings":";;;;;;;AAkBO,MAAM,sBAAsB,CAAC;AAAA,EAClC,QAAA;AAAA,EACA,QAAU,EAAA,YAAA;AAAA,EACV,IAAA;AACF,CAA8C,KAAA;AAC5C,EAAM,MAAA,OAAA,GAAUA,iBAAWC,qCAAkB,CAAA,CAAA;AAC7C,EAAA,MAAM,CAAC,QAAU,EAAA,WAAW,IAAIC,cAAS,CAAA,YAAA,IAAgB,QAAQ,QAAQ,CAAA,CAAA;AAEzE,EAAA,MAAM,aAAgB,GAAAC,iBAAA,CAAY,CAAC,YAAA,EAAsB,KAAmB,KAAA;AAC1E,IAAY,WAAA,CAAA,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,YAAY,GAAG,KAAA,EAAQ,CAAA,CAAA,CAAA;AAAA,GACtD,EAAG,EAAE,CAAA,CAAA;AAEL,EACE,uBAAAC,cAAA;AAAA,IAACH,qCAAmB,CAAA,QAAA;AAAA,IAAnB;AAAA,MACC,KAAO,EAAA;AAAA,QACL,GAAG,OAAA;AAAA,QACH,aAAA;AAAA,QACA,QAAA;AAAA,QACA,IAAA,EAAM,QAAQ,OAAQ,CAAA,IAAA;AAAA,OACxB;AAAA,MAEA,QAAA,kBAAAG,cAAA,CAACC,qBAAa,KAAM,EAAA,WAAA,EAAY,SAAQ,MAAO,EAAA,IAAA,EAAM,QAAS,CAAA,SAAA,EAC3D,QACH,EAAA,CAAA;AAAA,KAAA;AAAA,GACF,CAAA;AAEJ,EAAA;AAOO,MAAM,yBAAyB,MAAM;AAC1C,EAAA,MAAM,EAAE,aAAA,EAAe,QAAS,EAAA,GAAIL,iBAAWC,qCAAkB,CAAA,CAAA;AACjE,EAAO,OAAA,EAAE,eAAe,QAAS,EAAA,CAAA;AACnC;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApplicationSettingsPanel.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
5
|
+
var styles = require('@salt-ds/styles');
|
|
6
|
+
var window = require('@salt-ds/window');
|
|
7
|
+
var React = require('react');
|
|
8
|
+
var ApplicationSettingsPanel$1 = require('./ApplicationSettingsPanel.css.js');
|
|
9
|
+
var core = require('@salt-ds/core');
|
|
10
|
+
var ApplicationProvider = require('../application-provider/ApplicationProvider.js');
|
|
11
|
+
|
|
12
|
+
const classBase = "vuuApplicationSettingsPanel";
|
|
13
|
+
const ApplicationSettingsPanel = () => {
|
|
14
|
+
const targetWindow = window.useWindow();
|
|
15
|
+
styles.useComponentCssInjection({
|
|
16
|
+
testId: "vuu-application-settings-panel",
|
|
17
|
+
css: ApplicationSettingsPanel$1,
|
|
18
|
+
window: targetWindow
|
|
19
|
+
});
|
|
20
|
+
const { changeSetting, settings } = ApplicationProvider.useApplicationSettings();
|
|
21
|
+
const onChangeToggleButton = React.useCallback(
|
|
22
|
+
(e) => {
|
|
23
|
+
const button = vuuUtils.queryClosest(e.target, "button");
|
|
24
|
+
if (button) {
|
|
25
|
+
const fieldName = vuuUtils.getFieldName(button);
|
|
26
|
+
const { value } = button;
|
|
27
|
+
changeSetting(fieldName, value);
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
[changeSetting]
|
|
31
|
+
);
|
|
32
|
+
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: classBase, children: /* @__PURE__ */ jsxRuntime.jsxs(core.FormField, { "data-field": "themeMode", children: [
|
|
33
|
+
/* @__PURE__ */ jsxRuntime.jsx(core.FormFieldLabel, { children: "Light or Dark Mode" }),
|
|
34
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
35
|
+
core.ToggleButtonGroup,
|
|
36
|
+
{
|
|
37
|
+
onChange: onChangeToggleButton,
|
|
38
|
+
value: settings.themeMode,
|
|
39
|
+
children: [
|
|
40
|
+
/* @__PURE__ */ jsxRuntime.jsx(core.ToggleButton, { value: "light", children: "Light" }),
|
|
41
|
+
/* @__PURE__ */ jsxRuntime.jsx(core.ToggleButton, { value: "dark", children: "Dark" })
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
)
|
|
45
|
+
] }) });
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
exports.ApplicationSettingsPanel = ApplicationSettingsPanel;
|
|
49
|
+
//# sourceMappingURL=ApplicationSettingsPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApplicationSettingsPanel.js","sources":["../../src/application-settings/ApplicationSettingsPanel.tsx"],"sourcesContent":["import { getFieldName, queryClosest } from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { FormEventHandler, HTMLAttributes, useCallback } from \"react\";\n\nimport applicationSettingsPanelCss from \"./ApplicationSettingsPanel.css\";\nimport {\n FormField,\n FormFieldLabel,\n ToggleButton,\n ToggleButtonGroup,\n} from \"@salt-ds/core\";\nimport { useApplicationSettings } from \"../application-provider\";\n\nexport interface ApplicationSettingsPanelProps\n extends HTMLAttributes<HTMLDivElement> {\n settings: { [key: string]: unknown };\n}\n\nconst classBase = \"vuuApplicationSettingsPanel\";\n\nexport const ApplicationSettingsPanel = () => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-application-settings-panel\",\n css: applicationSettingsPanelCss,\n window: targetWindow,\n });\n\n const { changeSetting, settings } = useApplicationSettings();\n\n const onChangeToggleButton = useCallback<FormEventHandler>(\n (e) => {\n const button = queryClosest<HTMLButtonElement>(e.target, \"button\");\n if (button) {\n const fieldName = getFieldName(button);\n const { value } = button;\n changeSetting(fieldName, value);\n }\n },\n [changeSetting]\n );\n\n return (\n <div className={classBase}>\n <FormField data-field=\"themeMode\">\n <FormFieldLabel>Light or Dark Mode</FormFieldLabel>\n <ToggleButtonGroup\n onChange={onChangeToggleButton}\n value={settings.themeMode}\n >\n <ToggleButton value=\"light\">Light</ToggleButton>\n <ToggleButton value=\"dark\">Dark</ToggleButton>\n </ToggleButtonGroup>\n </FormField>\n </div>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","applicationSettingsPanelCss","useApplicationSettings","useCallback","queryClosest","getFieldName","jsxs","FormField","jsx","FormFieldLabel","ToggleButtonGroup","ToggleButton"],"mappings":";;;;;;;;;;;AAmBA,MAAM,SAAY,GAAA,6BAAA,CAAA;AAEX,MAAM,2BAA2B,MAAM;AAC5C,EAAA,MAAM,eAAeA,gBAAU,EAAA,CAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,gCAAA;AAAA,IACR,GAAK,EAAAC,0BAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAA,MAAM,EAAE,aAAA,EAAe,QAAS,EAAA,GAAIC,0CAAuB,EAAA,CAAA;AAE3D,EAAA,MAAM,oBAAuB,GAAAC,iBAAA;AAAA,IAC3B,CAAC,CAAM,KAAA;AACL,MAAA,MAAM,MAAS,GAAAC,qBAAA,CAAgC,CAAE,CAAA,MAAA,EAAQ,QAAQ,CAAA,CAAA;AACjE,MAAA,IAAI,MAAQ,EAAA;AACV,QAAM,MAAA,SAAA,GAAYC,sBAAa,MAAM,CAAA,CAAA;AACrC,QAAM,MAAA,EAAE,OAAU,GAAA,MAAA,CAAA;AAClB,QAAA,aAAA,CAAc,WAAW,KAAK,CAAA,CAAA;AAAA,OAChC;AAAA,KACF;AAAA,IACA,CAAC,aAAa,CAAA;AAAA,GAChB,CAAA;AAEA,EAAA,sCACG,KAAI,EAAA,EAAA,SAAA,EAAW,WACd,QAAC,kBAAAC,eAAA,CAAAC,cAAA,EAAA,EAAU,cAAW,WACpB,EAAA,QAAA,EAAA;AAAA,oBAAAC,cAAA,CAACC,uBAAe,QAAkB,EAAA,oBAAA,EAAA,CAAA;AAAA,oBAClCH,eAAA;AAAA,MAACI,sBAAA;AAAA,MAAA;AAAA,QACC,QAAU,EAAA,oBAAA;AAAA,QACV,OAAO,QAAS,CAAA,SAAA;AAAA,QAEhB,QAAA,EAAA;AAAA,0BAACF,cAAA,CAAAG,iBAAA,EAAA,EAAa,KAAM,EAAA,OAAA,EAAQ,QAAK,EAAA,OAAA,EAAA,CAAA;AAAA,0BAChCH,cAAA,CAAAG,iBAAA,EAAA,EAAa,KAAM,EAAA,MAAA,EAAO,QAAI,EAAA,MAAA,EAAA,CAAA;AAAA,SAAA;AAAA,OAAA;AAAA,KACjC;AAAA,GAAA,EACF,CACF,EAAA,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
-
var vuuUiControls = require('@vuu-ui/vuu-ui-controls');
|
|
5
4
|
var styles = require('@salt-ds/styles');
|
|
6
5
|
var window = require('@salt-ds/window');
|
|
7
6
|
var screenshotUtils = require('./screenshot-utils.js');
|
|
8
7
|
var core = require('@salt-ds/core');
|
|
9
8
|
var React = require('react');
|
|
9
|
+
require('@vuu-ui/vuu-ui-controls');
|
|
10
10
|
require('clsx');
|
|
11
11
|
var loginUtils = require('../login/login-utils.js');
|
|
12
12
|
var SaveLayoutPanel$1 = require('./SaveLayoutPanel.css.js');
|
|
@@ -14,8 +14,6 @@ var SaveLayoutPanel$1 = require('./SaveLayoutPanel.css.js');
|
|
|
14
14
|
const classBase = "saveLayoutPanel";
|
|
15
15
|
const formField = `${classBase}-formField`;
|
|
16
16
|
const groups = ["Group 1", "Group 2", "Group 3", "Group 4", "Group 5"];
|
|
17
|
-
const checkboxValues = ["Value 1", "Value 2", "Value 3"];
|
|
18
|
-
const radioValues = ["Value 1", "Value 2", "Value 3"];
|
|
19
17
|
const SaveLayoutPanel = (props) => {
|
|
20
18
|
const { defaultTitle = "", onCancel, onSave, componentId } = props;
|
|
21
19
|
const targetWindow = window.useWindow();
|
|
@@ -26,8 +24,6 @@ const SaveLayoutPanel = (props) => {
|
|
|
26
24
|
});
|
|
27
25
|
const [layoutName, setLayoutName] = React.useState(defaultTitle);
|
|
28
26
|
const [group, setGroup] = React.useState("");
|
|
29
|
-
const [checkValues, setCheckValues] = React.useState([]);
|
|
30
|
-
const [radioValue, setRadioValue] = React.useState(radioValues[0]);
|
|
31
27
|
const [screenshot, setScreenshot] = React.useState();
|
|
32
28
|
const [screenshotErrorMessage, setScreenshotErrorMessage] = React.useState();
|
|
33
29
|
const [username] = loginUtils.getAuthDetailsFromCookies();
|
|
@@ -64,25 +60,37 @@ const SaveLayoutPanel = (props) => {
|
|
|
64
60
|
}
|
|
65
61
|
return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "spinner" });
|
|
66
62
|
}, [screenshot, screenshotErrorMessage]);
|
|
63
|
+
const handleSelectionChange = React.useCallback(
|
|
64
|
+
(e, [selectedValue]) => {
|
|
65
|
+
if (e.key === "Tab" && !selectedValue.toLowerCase().startsWith(group.toLowerCase())) ; else {
|
|
66
|
+
setGroup(selectedValue || "");
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
[group]
|
|
70
|
+
);
|
|
71
|
+
const handleChange = React.useCallback((e) => {
|
|
72
|
+
console.log(`set Group ${e.target.value}`);
|
|
73
|
+
setGroup(e.target.value);
|
|
74
|
+
}, []);
|
|
67
75
|
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${classBase}-panelContainer`, children: [
|
|
68
76
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${classBase}-panelContent`, children: [
|
|
69
77
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${classBase}-formContainer`, children: [
|
|
70
78
|
/* @__PURE__ */ jsxRuntime.jsxs(core.FormField, { className: formField, children: [
|
|
71
79
|
/* @__PURE__ */ jsxRuntime.jsx(core.FormFieldLabel, { children: "Group" }),
|
|
72
80
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
73
|
-
|
|
81
|
+
core.ComboBox,
|
|
74
82
|
{
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
onChange: (event) => setGroup(event.target.value)
|
|
82
|
-
}
|
|
83
|
+
inputProps: {
|
|
84
|
+
autoComplete: "off",
|
|
85
|
+
className: `${classBase}-inputText`,
|
|
86
|
+
placeholder: "Select Group or Enter New Name"
|
|
87
|
+
// onChange: (event: ChangeEvent<HTMLInputElement>) =>
|
|
88
|
+
// setGroup(event.target.value),
|
|
83
89
|
},
|
|
84
|
-
|
|
85
|
-
onSelectionChange:
|
|
90
|
+
onChange: handleChange,
|
|
91
|
+
onSelectionChange: handleSelectionChange,
|
|
92
|
+
value: group,
|
|
93
|
+
children: groups.map((group2, i) => /* @__PURE__ */ jsxRuntime.jsx(core.Option, { value: group2 }, i))
|
|
86
94
|
}
|
|
87
95
|
)
|
|
88
96
|
] }),
|
|
@@ -99,33 +107,6 @@ const SaveLayoutPanel = (props) => {
|
|
|
99
107
|
value: layoutName
|
|
100
108
|
}
|
|
101
109
|
)
|
|
102
|
-
] }),
|
|
103
|
-
/* @__PURE__ */ jsxRuntime.jsxs(core.FormField, { className: formField, children: [
|
|
104
|
-
/* @__PURE__ */ jsxRuntime.jsx(core.FormFieldLabel, { children: "Some Layout Setting" }),
|
|
105
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: `${classBase}-settingsGroup`, children: checkboxValues.map((value, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
106
|
-
vuuUiControls.Checkbox,
|
|
107
|
-
{
|
|
108
|
-
onToggle: () => setCheckValues(
|
|
109
|
-
(prev) => prev.includes(value) ? prev.filter((entry) => entry !== value) : [...prev, value]
|
|
110
|
-
),
|
|
111
|
-
checked: checkValues.includes(value),
|
|
112
|
-
label: value
|
|
113
|
-
},
|
|
114
|
-
i
|
|
115
|
-
)) })
|
|
116
|
-
] }),
|
|
117
|
-
/* @__PURE__ */ jsxRuntime.jsxs(core.FormField, { className: formField, children: [
|
|
118
|
-
/* @__PURE__ */ jsxRuntime.jsx(core.FormFieldLabel, { children: "Some Layout Setting" }),
|
|
119
|
-
/* @__PURE__ */ jsxRuntime.jsx("div", { className: `${classBase}-settingsGroup`, children: radioValues.map((value, i) => /* @__PURE__ */ jsxRuntime.jsx(
|
|
120
|
-
vuuUiControls.RadioButton,
|
|
121
|
-
{
|
|
122
|
-
onClick: () => setRadioValue(value),
|
|
123
|
-
checked: radioValue === value,
|
|
124
|
-
label: value,
|
|
125
|
-
groupName: "radioGroup"
|
|
126
|
-
},
|
|
127
|
-
i
|
|
128
|
-
)) })
|
|
129
110
|
] })
|
|
130
111
|
] }),
|
|
131
112
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: `${classBase}-screenshotContainer`, children: screenshotContent })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SaveLayoutPanel.js","sources":["../../src/layout-management/SaveLayoutPanel.tsx"],"sourcesContent":["import { Checkbox, ComboBox, RadioButton } from \"@vuu-ui/vuu-ui-controls\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { takeScreenshot } from \"./screenshot-utils\";\nimport { Button, FormField, FormFieldLabel, Input, Text } from \"@salt-ds/core\";\nimport { ChangeEvent, useEffect, useMemo, useState } from \"react\";\nimport { LayoutMetadataDto } from \"./layoutTypes\";\nimport { getAuthDetailsFromCookies } from \"../login\";\n\nimport saveLayoutPanelCss from \"./SaveLayoutPanel.css\";\n\nconst classBase = \"saveLayoutPanel\";\nconst formField = `${classBase}-formField`;\n\nconst groups = [\"Group 1\", \"Group 2\", \"Group 3\", \"Group 4\", \"Group 5\"];\n\nconst checkboxValues = [\"Value 1\", \"Value 2\", \"Value 3\"];\n\nconst radioValues = [\"Value 1\", \"Value 2\", \"Value 3\"] as const;\n\ntype RadioValue = (typeof radioValues)[number];\n\ntype SaveLayoutPanelProps = {\n componentId?: string;\n defaultTitle?: string;\n onCancel: () => void;\n onSave: (layoutMetadata: LayoutMetadataDto) => void;\n};\n\nexport const SaveLayoutPanel = (props: SaveLayoutPanelProps) => {\n const { defaultTitle = \"\", onCancel, onSave, componentId } = props;\n\n const 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 [checkValues, setCheckValues] = useState<string[]>([]);\n const [radioValue, setRadioValue] = useState<RadioValue>(radioValues[0]);\n const [screenshot, setScreenshot] = useState<string | undefined>();\n const [screenshotErrorMessage, setScreenshotErrorMessage] = useState<\n string | undefined\n >();\n const [username] = getAuthDetailsFromCookies();\n\n useEffect(() => {\n if (componentId) {\n takeScreenshot(document.getElementById(componentId) as HTMLElement)\n .then((screenshot) => {\n setScreenshot(screenshot);\n })\n .catch((error: Error) => {\n setScreenshotErrorMessage(error.message);\n });\n }\n }, [componentId]);\n\n const handleSubmit = () => {\n onSave({\n name: layoutName,\n group,\n screenshot: screenshot ?? \"\",\n user: username,\n });\n };\n\n const screenshotContent = useMemo(() => {\n if (screenshot) {\n return (\n <img\n className={`${classBase}-screenshot`}\n src={screenshot}\n alt=\"screenshot of current layout\"\n />\n );\n }\n if (screenshotErrorMessage) {\n return <Text>{screenshotErrorMessage}</Text>;\n }\n return <div className=\"spinner\" />;\n }, [screenshot, screenshotErrorMessage]);\n\n return (\n <div className={`${classBase}-panelContainer`}>\n <div className={`${classBase}-panelContent`}>\n <div className={`${classBase}-formContainer`}>\n <FormField className={formField}>\n <FormFieldLabel>Group</FormFieldLabel>\n <ComboBox\n source={groups}\n allowFreeText\n InputProps={{\n inputProps: {\n className: `${classBase}-inputText`,\n placeholder: \"Select Group or Enter New Name\",\n onChange: (event: ChangeEvent<HTMLInputElement>) =>\n setGroup(event.target.value),\n },\n }}\n width=\"100%\"\n onSelectionChange={(_, value) => setGroup(value || \"\")}\n />\n </FormField>\n <FormField className={formField}>\n <FormFieldLabel>Layout Name</FormFieldLabel>\n <Input\n inputProps={{\n className: `${classBase}-inputText`,\n placeholder: \"Enter Layout Name\",\n }}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n setLayoutName(event.target.value)\n }\n value={layoutName}\n />\n </FormField>\n <FormField className={formField}>\n <FormFieldLabel>Some Layout Setting</FormFieldLabel>\n <div className={`${classBase}-settingsGroup`}>\n {checkboxValues.map((value, i) => (\n <Checkbox\n key={i}\n onToggle={() =>\n setCheckValues((prev) =>\n prev.includes(value)\n ? prev.filter((entry) => entry !== value)\n : [...prev, value]\n )\n }\n checked={checkValues.includes(value)}\n label={value}\n />\n ))}\n </div>\n </FormField>\n <FormField className={formField}>\n <FormFieldLabel>Some Layout Setting</FormFieldLabel>\n <div className={`${classBase}-settingsGroup`}>\n {radioValues.map((value, i) => (\n <RadioButton\n key={i}\n onClick={() => setRadioValue(value)}\n checked={radioValue === value}\n label={value}\n groupName=\"radioGroup\"\n />\n ))}\n </div>\n </FormField>\n </div>\n <div className={`${classBase}-screenshotContainer`}>\n {screenshotContent}\n </div>\n </div>\n <div className={`${classBase}-buttonsContainer`}>\n <Button className={`${classBase}-cancelButton`} onClick={onCancel}>\n Cancel\n </Button>\n <Button\n className={`${classBase}-saveButton`}\n onClick={handleSubmit}\n disabled={layoutName === \"\" || group === \"\"}\n >\n Save\n </Button>\n </div>\n </div>\n );\n};\n"],"names":["useWindow","useComponentCssInjection","saveLayoutPanelCss","useState","getAuthDetailsFromCookies","useEffect","takeScreenshot","screenshot","useMemo","jsx","Text","jsxs","FormField","FormFieldLabel","ComboBox","Input","Checkbox","RadioButton","Button"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SaveLayoutPanel.js","sources":["../../src/layout-management/SaveLayoutPanel.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { takeScreenshot } from \"./screenshot-utils\";\nimport {\n Button,\n ComboBox,\n FormField,\n FormFieldLabel,\n Input,\n Option,\n Text,\n} from \"@salt-ds/core\";\nimport {\n ChangeEvent,\n SyntheticEvent,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { LayoutMetadataDto } from \"./layoutTypes\";\nimport { getAuthDetailsFromCookies } from \"../login\";\n\nimport saveLayoutPanelCss from \"./SaveLayoutPanel.css\";\n\nconst classBase = \"saveLayoutPanel\";\nconst formField = `${classBase}-formField`;\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 console.log(`set Group ${e.target.value}`);\n setGroup(e.target.value);\n }, []);\n\n return (\n <div className={`${classBase}-panelContainer`}>\n <div className={`${classBase}-panelContent`}>\n <div className={`${classBase}-formContainer`}>\n <FormField className={formField}>\n <FormFieldLabel>Group</FormFieldLabel>\n <ComboBox\n 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 className={formField}>\n <FormFieldLabel>Layout Name</FormFieldLabel>\n <Input\n inputProps={{\n className: `${classBase}-inputText`,\n placeholder: \"Enter Layout Name\",\n }}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n setLayoutName(event.target.value)\n }\n value={layoutName}\n />\n </FormField>\n </div>\n <div className={`${classBase}-screenshotContainer`}>\n {screenshotContent}\n </div>\n </div>\n <div className={`${classBase}-buttonsContainer`}>\n <Button className={`${classBase}-cancelButton`} onClick={onCancel}>\n Cancel\n </Button>\n <Button\n className={`${classBase}-saveButton`}\n onClick={handleSubmit}\n disabled={layoutName === \"\" || group === \"\"}\n >\n Save\n </Button>\n </div>\n </div>\n );\n};\n"],"names":["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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"}
|
package/cjs/shell.js
CHANGED
|
@@ -2,17 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var vuuDataRemote = require('@vuu-ui/vuu-data-remote');
|
|
5
|
-
var styles = require('@salt-ds/styles');
|
|
6
|
-
var window = require('@salt-ds/window');
|
|
7
5
|
var vuuLayout = require('@vuu-ui/vuu-layout');
|
|
8
6
|
var vuuPopups = require('@vuu-ui/vuu-popups');
|
|
9
7
|
var vuuUtils = require('@vuu-ui/vuu-utils');
|
|
10
|
-
var
|
|
8
|
+
var styles = require('@salt-ds/styles');
|
|
9
|
+
var window = require('@salt-ds/window');
|
|
11
10
|
var cx = require('clsx');
|
|
12
11
|
var React = require('react');
|
|
13
12
|
var AppHeader = require('./app-header/AppHeader.js');
|
|
14
|
-
require('
|
|
13
|
+
var ApplicationProvider = require('./application-provider/ApplicationProvider.js');
|
|
14
|
+
var ApplicationSettingsPanel = require('./application-settings/ApplicationSettingsPanel.js');
|
|
15
15
|
require('html-to-image');
|
|
16
|
+
require('@salt-ds/core');
|
|
17
|
+
require('@vuu-ui/vuu-ui-controls');
|
|
16
18
|
var useLayoutManager = require('./layout-management/useLayoutManager.js');
|
|
17
19
|
var useLayoutContextMenuItems = require('./layout-management/useLayoutContextMenuItems.js');
|
|
18
20
|
var defaultApplicationJson = require('./persistence-management/defaultApplicationJson.js');
|
|
@@ -21,6 +23,7 @@ require('./persistence-management/RemotePersistenceManager.js');
|
|
|
21
23
|
var useShellLayout = require('./shell-layouts/useShellLayout.js');
|
|
22
24
|
var shell = require('./shell.css.js');
|
|
23
25
|
|
|
26
|
+
vuuLayout.registerComponent("ApplicationSettings", ApplicationSettingsPanel.ApplicationSettingsPanel, "view");
|
|
24
27
|
if (typeof vuuLayout.StackLayout !== "function") {
|
|
25
28
|
console.warn(
|
|
26
29
|
"StackLayout module not loaded, will be unsbale to deserialize from layout JSON"
|
|
@@ -49,8 +52,7 @@ const Shell = ({
|
|
|
49
52
|
});
|
|
50
53
|
const rootRef = React.useRef(null);
|
|
51
54
|
const { dialog, setDialogState } = vuuPopups.useDialog();
|
|
52
|
-
const
|
|
53
|
-
const { applicationJson, saveApplicationLayout, loadLayoutById } = useLayoutManager.useLayoutManager();
|
|
55
|
+
const { applicationJson, saveApplicationLayout } = useLayoutManager.useLayoutManager();
|
|
54
56
|
const { buildMenuOptions, handleMenuAction } = useLayoutContextMenuItems.useLayoutContextMenuItems(setDialogState);
|
|
55
57
|
const [connectionStatus, setConnectionStatus] = React.useState("connected");
|
|
56
58
|
const handleLayoutChange = React.useCallback(
|
|
@@ -63,18 +65,6 @@ const Shell = ({
|
|
|
63
65
|
},
|
|
64
66
|
[saveApplicationLayout]
|
|
65
67
|
);
|
|
66
|
-
const handleSwitchTheme = React.useCallback((mode) => {
|
|
67
|
-
if (rootRef.current) {
|
|
68
|
-
rootRef.current.dataset.mode = mode;
|
|
69
|
-
}
|
|
70
|
-
}, []);
|
|
71
|
-
const handleNavigate = React.useCallback(
|
|
72
|
-
(id) => {
|
|
73
|
-
layoutId.current = id;
|
|
74
|
-
loadLayoutById(id);
|
|
75
|
-
},
|
|
76
|
-
[loadLayoutById]
|
|
77
|
-
);
|
|
78
68
|
React.useMemo(async () => {
|
|
79
69
|
if (serverUrl && user.token) {
|
|
80
70
|
const connectionStatus2 = await vuuDataRemote.connectToServer({
|
|
@@ -86,25 +76,16 @@ const Shell = ({
|
|
|
86
76
|
}
|
|
87
77
|
}, [serverUrl, user.token, user.username]);
|
|
88
78
|
const className = cx("vuuShell");
|
|
89
|
-
const
|
|
79
|
+
const isLayoutLoading = applicationJson === defaultApplicationJson.loadingApplicationJson;
|
|
90
80
|
const shellLayout = useShellLayout.useShellLayout({
|
|
91
81
|
LeftSidePanelProps,
|
|
92
82
|
leftSidePanelLayout,
|
|
93
|
-
appHeader: /* @__PURE__ */ jsxRuntime.jsx(
|
|
94
|
-
AppHeader.AppHeader,
|
|
95
|
-
{
|
|
96
|
-
layoutId: layoutId.current,
|
|
97
|
-
loginUrl,
|
|
98
|
-
user,
|
|
99
|
-
onNavigate: handleNavigate,
|
|
100
|
-
onSwitchTheme: handleSwitchTheme
|
|
101
|
-
}
|
|
102
|
-
)
|
|
83
|
+
appHeader: /* @__PURE__ */ jsxRuntime.jsx(AppHeader.AppHeader, { loginUrl })
|
|
103
84
|
});
|
|
104
85
|
if (connectionStatus === "rejected") {
|
|
105
86
|
console.log("game over, no connection to server");
|
|
106
87
|
}
|
|
107
|
-
return
|
|
88
|
+
return isLayoutLoading ? null : /* @__PURE__ */ jsxRuntime.jsx(ApplicationProvider.ApplicationProvider, { user, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
108
89
|
vuuPopups.ContextMenuProvider,
|
|
109
90
|
{
|
|
110
91
|
menuActionHandler: handleMenuAction,
|
package/cjs/shell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sources":["../src/shell.tsx"],"sourcesContent":["import { connectToServer } from \"@vuu-ui/vuu-data-remote\";\nimport {
|
|
1
|
+
{"version":3,"file":"shell.js","sources":["../src/shell.tsx"],"sourcesContent":["import { connectToServer } from \"@vuu-ui/vuu-data-remote\";\nimport type { LayoutChangeHandler } from \"@vuu-ui/vuu-layout\";\nimport {\n DraggableLayout,\n LayoutProvider,\n LayoutProviderProps,\n StackLayout,\n registerComponent,\n} from \"@vuu-ui/vuu-layout\";\nimport { ContextMenuProvider, useDialog } from \"@vuu-ui/vuu-popups\";\nimport { VuuUser, logger } from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport {\n HTMLAttributes,\n ReactNode,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { AppHeader } from \"./app-header\";\nimport { ApplicationProvider } from \"./application-provider\";\nimport { ApplicationSettingsPanel } from \"./application-settings\";\nimport {\n useLayoutContextMenuItems,\n useLayoutManager,\n} from \"./layout-management\";\nimport { loadingApplicationJson } from \"./persistence-management\";\nimport { SidePanelProps, useShellLayout } from \"./shell-layouts\";\nimport { SaveLocation } from \"./shellTypes\";\n\nimport shellCss from \"./shell.css\";\n\nregisterComponent(\"ApplicationSettings\", ApplicationSettingsPanel, \"view\");\n\nif (typeof StackLayout !== \"function\") {\n console.warn(\n \"StackLayout module not loaded, will be unsbale to deserialize from layout JSON\"\n );\n}\n\nconst { error } = logger(\"Shell\");\n\nconst defaultLeftSidePanel: ShellProps[\"LeftSidePanelProps\"] = {};\n\nexport type LayoutTemplateName = \"full-height\" | \"inlay\";\n\nexport interface ShellProps extends HTMLAttributes<HTMLDivElement> {\n LayoutProps?: Pick<\n LayoutProviderProps,\n \"createNewChild\" | \"pathToDropTarget\"\n >;\n LeftSidePanelProps?: SidePanelProps;\n children?: ReactNode;\n leftSidePanelLayout?: \"full-height\" | \"inlay\";\n loginUrl?: string;\n // paletteConfig: any;\n saveLocation?: SaveLocation;\n saveUrl?: string;\n serverUrl?: string;\n user: VuuUser;\n}\n\nexport const Shell = ({\n LayoutProps,\n LeftSidePanelProps = defaultLeftSidePanel,\n children,\n className: classNameProp,\n leftSidePanelLayout,\n loginUrl,\n saveLocation: _,\n saveUrl,\n serverUrl,\n user,\n ...htmlAttributes\n}: ShellProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-shell\",\n css: shellCss,\n window: targetWindow,\n });\n\n const rootRef = useRef<HTMLDivElement>(null);\n const { dialog, setDialogState } = useDialog();\n const { applicationJson, saveApplicationLayout } = useLayoutManager();\n const { buildMenuOptions, handleMenuAction } =\n useLayoutContextMenuItems(setDialogState);\n const [connectionStatus, setConnectionStatus] = useState<\n \"connected\" | \"rejected\"\n >(\"connected\");\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 useMemo(async () => {\n if (serverUrl && user.token) {\n const connectionStatus = await connectToServer({\n authToken: user.token,\n url: serverUrl,\n username: user.username,\n });\n setConnectionStatus(connectionStatus);\n }\n }, [serverUrl, user.token, user.username]);\n\n const className = cx(\"vuuShell\");\n\n const isLayoutLoading = applicationJson === loadingApplicationJson;\n\n const shellLayout = useShellLayout({\n LeftSidePanelProps,\n leftSidePanelLayout,\n appHeader: <AppHeader loginUrl={loginUrl} />,\n });\n\n if (connectionStatus === \"rejected\") {\n console.log(\"game over, no connection to server\");\n }\n\n return isLayoutLoading ? null : (\n <ApplicationProvider user={user}>\n <ContextMenuProvider\n menuActionHandler={handleMenuAction}\n menuBuilder={buildMenuOptions}\n >\n <LayoutProvider\n {...LayoutProps}\n layout={applicationJson.layout}\n onLayoutChange={handleLayoutChange}\n >\n <DraggableLayout\n className={className}\n ref={rootRef}\n {...htmlAttributes}\n >\n {shellLayout}\n </DraggableLayout>\n </LayoutProvider>\n {children || dialog}\n </ContextMenuProvider>\n </ApplicationProvider>\n );\n};\n"],"names":["registerComponent","ApplicationSettingsPanel","StackLayout","logger","useWindow","useComponentCssInjection","shellCss","useRef","useDialog","useLayoutManager","useLayoutContextMenuItems","useState","useCallback","useMemo","connectionStatus","connectToServer","loadingApplicationJson","useShellLayout","jsx","AppHeader","ApplicationProvider","jsxs","ContextMenuProvider","LayoutProvider","DraggableLayout"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAmCAA,2BAAkB,CAAA,qBAAA,EAAuBC,mDAA0B,MAAM,CAAA,CAAA;AAEzE,IAAI,OAAOC,0BAAgB,UAAY,EAAA;AACrC,EAAQ,OAAA,CAAA,IAAA;AAAA,IACN,gFAAA;AAAA,GACF,CAAA;AACF,CAAA;AAEA,MAAM,EAAE,KAAA,EAAU,GAAAC,eAAA,CAAO,OAAO,CAAA,CAAA;AAEhC,MAAM,uBAAyD,EAAC,CAAA;AAoBzD,MAAM,QAAQ,CAAC;AAAA,EACpB,WAAA;AAAA,EACA,kBAAqB,GAAA,oBAAA;AAAA,EACrB,QAAA;AAAA,EACA,SAAW,EAAA,aAAA;AAAA,EACX,mBAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAc,EAAA,CAAA;AAAA,EACd,OAAA;AAAA,EACA,SAAA;AAAA,EACA,IAAA;AAAA,EACA,GAAG,cAAA;AACL,CAAkB,KAAA;AAChB,EAAA,MAAM,eAAeC,gBAAU,EAAA,CAAA;AAC/B,EAAyBC,+BAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,WAAA;AAAA,IACR,GAAK,EAAAC,KAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAM,MAAA,OAAA,GAAUC,aAAuB,IAAI,CAAA,CAAA;AAC3C,EAAA,MAAM,EAAE,MAAA,EAAQ,cAAe,EAAA,GAAIC,mBAAU,EAAA,CAAA;AAC7C,EAAA,MAAM,EAAE,eAAA,EAAiB,qBAAsB,EAAA,GAAIC,iCAAiB,EAAA,CAAA;AACpE,EAAA,MAAM,EAAE,gBAAA,EAAkB,gBAAiB,EAAA,GACzCC,oDAA0B,cAAc,CAAA,CAAA;AAC1C,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAIC,eAE9C,WAAW,CAAA,CAAA;AAEb,EAAA,MAAM,kBAAqB,GAAAC,iBAAA;AAAA,IACzB,CAAC,MAAW,KAAA;AACV,MAAI,IAAA;AACF,QAAA,qBAAA,CAAsB,MAAM,CAAA,CAAA;AAAA,OACtB,CAAA,MAAA;AACN,QAAA,KAAA,GAAQ,uBAAuB,CAAA,CAAA;AAAA,OACjC;AAAA,KACF;AAAA,IACA,CAAC,qBAAqB,CAAA;AAAA,GACxB,CAAA;AAEA,EAAAC,aAAA,CAAQ,YAAY;AAClB,IAAI,IAAA,SAAA,IAAa,KAAK,KAAO,EAAA;AAC3B,MAAMC,MAAAA,iBAAAA,GAAmB,MAAMC,6BAAgB,CAAA;AAAA,QAC7C,WAAW,IAAK,CAAA,KAAA;AAAA,QAChB,GAAK,EAAA,SAAA;AAAA,QACL,UAAU,IAAK,CAAA,QAAA;AAAA,OAChB,CAAA,CAAA;AACD,MAAA,mBAAA,CAAoBD,iBAAgB,CAAA,CAAA;AAAA,KACtC;AAAA,KACC,CAAC,SAAA,EAAW,KAAK,KAAO,EAAA,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA;AAEzC,EAAM,MAAA,SAAA,GAAY,GAAG,UAAU,CAAA,CAAA;AAE/B,EAAA,MAAM,kBAAkB,eAAoB,KAAAE,6CAAA,CAAA;AAE5C,EAAA,MAAM,cAAcC,6BAAe,CAAA;AAAA,IACjC,kBAAA;AAAA,IACA,mBAAA;AAAA,IACA,SAAA,kBAAYC,cAAA,CAAAC,mBAAA,EAAA,EAAU,QAAoB,EAAA,CAAA;AAAA,GAC3C,CAAA,CAAA;AAED,EAAA,IAAI,qBAAqB,UAAY,EAAA;AACnC,IAAA,OAAA,CAAQ,IAAI,oCAAoC,CAAA,CAAA;AAAA,GAClD;AAEA,EAAA,OAAO,eAAkB,GAAA,IAAA,mBACtBD,cAAA,CAAAE,uCAAA,EAAA,EAAoB,IACnB,EAAA,QAAA,kBAAAC,eAAA;AAAA,IAACC,6BAAA;AAAA,IAAA;AAAA,MACC,iBAAmB,EAAA,gBAAA;AAAA,MACnB,WAAa,EAAA,gBAAA;AAAA,MAEb,QAAA,EAAA;AAAA,wBAAAJ,cAAA;AAAA,UAACK,wBAAA;AAAA,UAAA;AAAA,YACE,GAAG,WAAA;AAAA,YACJ,QAAQ,eAAgB,CAAA,MAAA;AAAA,YACxB,cAAgB,EAAA,kBAAA;AAAA,YAEhB,QAAA,kBAAAL,cAAA;AAAA,cAACM,yBAAA;AAAA,cAAA;AAAA,gBACC,SAAA;AAAA,gBACA,GAAK,EAAA,OAAA;AAAA,gBACJ,GAAG,cAAA;AAAA,gBAEH,QAAA,EAAA,WAAA;AAAA,eAAA;AAAA,aACH;AAAA,WAAA;AAAA,SACF;AAAA,QACC,QAAY,IAAA,MAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GAEjB,EAAA,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useLayoutProviderDispatch } from '@vuu-ui/vuu-layout';
|
|
2
3
|
import { Toolbar } from '@vuu-ui/vuu-ui-controls';
|
|
3
4
|
import { Button } from '@salt-ds/core';
|
|
4
5
|
import { useComponentCssInjection } from '@salt-ds/styles';
|
|
@@ -11,12 +12,8 @@ import appHeaderCss from './AppHeader.css.js';
|
|
|
11
12
|
const classBase = "vuuAppHeader";
|
|
12
13
|
const AppHeader = ({
|
|
13
14
|
className: classNameProp,
|
|
14
|
-
layoutId,
|
|
15
15
|
loginUrl,
|
|
16
|
-
onNavigate,
|
|
17
|
-
onSwitchTheme,
|
|
18
16
|
themeMode: _,
|
|
19
|
-
user,
|
|
20
17
|
...htmlAttributes
|
|
21
18
|
}) => {
|
|
22
19
|
const targetWindow = useWindow();
|
|
@@ -26,9 +23,23 @@ const AppHeader = ({
|
|
|
26
23
|
window: targetWindow
|
|
27
24
|
});
|
|
28
25
|
const className = cx(classBase, classNameProp);
|
|
26
|
+
const dispatchLayoutAction = useLayoutProviderDispatch();
|
|
29
27
|
const handleLogout = useCallback(() => {
|
|
30
28
|
logout(loginUrl);
|
|
31
29
|
}, [loginUrl]);
|
|
30
|
+
const handleShowSettings = useCallback(() => {
|
|
31
|
+
dispatchLayoutAction({
|
|
32
|
+
type: "set-props",
|
|
33
|
+
path: "#context-panel",
|
|
34
|
+
props: {
|
|
35
|
+
expanded: true,
|
|
36
|
+
content: {
|
|
37
|
+
type: "ApplicationSettings"
|
|
38
|
+
},
|
|
39
|
+
title: "Settings"
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
}, [dispatchLayoutAction]);
|
|
32
43
|
return /* @__PURE__ */ jsxs(
|
|
33
44
|
Toolbar,
|
|
34
45
|
{
|
|
@@ -42,10 +53,18 @@ const AppHeader = ({
|
|
|
42
53
|
"History ",
|
|
43
54
|
/* @__PURE__ */ jsx("span", { "data-icon": "history" })
|
|
44
55
|
] }),
|
|
45
|
-
/* @__PURE__ */ jsxs(
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
56
|
+
/* @__PURE__ */ jsxs(
|
|
57
|
+
Button,
|
|
58
|
+
{
|
|
59
|
+
className: `${classBase}-menuItem`,
|
|
60
|
+
onClick: handleShowSettings,
|
|
61
|
+
variant: "secondary",
|
|
62
|
+
children: [
|
|
63
|
+
"Settings ",
|
|
64
|
+
/* @__PURE__ */ jsx("span", { "data-icon": "settings" })
|
|
65
|
+
]
|
|
66
|
+
}
|
|
67
|
+
),
|
|
49
68
|
/* @__PURE__ */ jsx(
|
|
50
69
|
Button,
|
|
51
70
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AppHeader.js","sources":["../../src/app-header/AppHeader.tsx"],"sourcesContent":["import { Toolbar } from \"@vuu-ui/vuu-ui-controls\";\nimport { ThemeMode } from \"@vuu-ui/vuu-utils\";\nimport { Button } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useCallback } from \"react\";\nimport { logout } from \"../login\";\
|
|
1
|
+
{"version":3,"file":"AppHeader.js","sources":["../../src/app-header/AppHeader.tsx"],"sourcesContent":["import { useLayoutProviderDispatch } from \"@vuu-ui/vuu-layout\";\nimport { Toolbar } from \"@vuu-ui/vuu-ui-controls\";\nimport { ThemeMode } from \"@vuu-ui/vuu-utils\";\nimport { Button } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport { HTMLAttributes, useCallback } from \"react\";\nimport { logout } from \"../login\";\n\nimport appHeaderCss from \"./AppHeader.css\";\n\nconst classBase = \"vuuAppHeader\";\nexport interface AppHeaderProps extends HTMLAttributes<HTMLDivElement> {\n loginUrl?: string;\n themeMode?: ThemeMode;\n}\n\nexport const AppHeader = ({\n className: classNameProp,\n loginUrl,\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 className = cx(classBase, classNameProp);\n\n const dispatchLayoutAction = useLayoutProviderDispatch();\n\n const handleLogout = useCallback(() => {\n logout(loginUrl);\n }, [loginUrl]);\n\n const handleShowSettings = useCallback(() => {\n dispatchLayoutAction({\n type: \"set-props\",\n path: \"#context-panel\",\n props: {\n expanded: true,\n content: {\n type: \"ApplicationSettings\",\n },\n title: \"Settings\",\n },\n });\n }, [dispatchLayoutAction]);\n\n return (\n <Toolbar\n alignItems=\"end\"\n className={className}\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 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":[],"mappings":";;;;;;;;;;;AAYA,MAAM,SAAY,GAAA,cAAA,CAAA;AAMX,MAAM,YAAY,CAAC;AAAA,EACxB,SAAW,EAAA,aAAA;AAAA,EACX,QAAA;AAAA,EACA,SAAW,EAAA,CAAA;AAAA,EACX,GAAG,cAAA;AACL,CAAsB,KAAA;AACpB,EAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,gBAAA;AAAA,IACR,GAAK,EAAA,YAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAM,MAAA,SAAA,GAAY,EAAG,CAAA,SAAA,EAAW,aAAa,CAAA,CAAA;AAE7C,EAAA,MAAM,uBAAuB,yBAA0B,EAAA,CAAA;AAEvD,EAAM,MAAA,YAAA,GAAe,YAAY,MAAM;AACrC,IAAA,MAAA,CAAO,QAAQ,CAAA,CAAA;AAAA,GACjB,EAAG,CAAC,QAAQ,CAAC,CAAA,CAAA;AAEb,EAAM,MAAA,kBAAA,GAAqB,YAAY,MAAM;AAC3C,IAAqB,oBAAA,CAAA;AAAA,MACnB,IAAM,EAAA,WAAA;AAAA,MACN,IAAM,EAAA,gBAAA;AAAA,MACN,KAAO,EAAA;AAAA,QACL,QAAU,EAAA,IAAA;AAAA,QACV,OAAS,EAAA;AAAA,UACP,IAAM,EAAA,qBAAA;AAAA,SACR;AAAA,QACA,KAAO,EAAA,UAAA;AAAA,OACT;AAAA,KACD,CAAA,CAAA;AAAA,GACH,EAAG,CAAC,oBAAoB,CAAC,CAAA,CAAA;AAEzB,EACE,uBAAA,IAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,UAAW,EAAA,KAAA;AAAA,MACX,SAAA;AAAA,MACA,cAAc,EAAA,IAAA;AAAA,MACb,GAAG,cAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,UAAO,SAAW,EAAA,CAAA,EAAG,SAAS,CAAa,SAAA,CAAA,EAAA,OAAA,EAAQ,aAAY,QAEhE,EAAA,MAAA,EAAA,CAAA;AAAA,6BACC,MAAO,EAAA,EAAA,SAAA,EAAW,GAAG,SAAS,CAAA,SAAA,CAAA,EAAa,SAAQ,WAAY,EAAA,QAAA,EAAA;AAAA,UAAA,UAAA;AAAA,0BACtD,GAAA,CAAC,MAAK,EAAA,EAAA,WAAA,EAAU,SAAU,EAAA,CAAA;AAAA,SACpC,EAAA,CAAA;AAAA,wBACA,IAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,GAAG,SAAS,CAAA,SAAA,CAAA;AAAA,YACvB,OAAS,EAAA,kBAAA;AAAA,YACT,OAAQ,EAAA,WAAA;AAAA,YACT,QAAA,EAAA;AAAA,cAAA,WAAA;AAAA,8BACU,GAAA,CAAC,MAAK,EAAA,EAAA,WAAA,EAAU,UAAW,EAAA,CAAA;AAAA,aAAA;AAAA,WAAA;AAAA,SACtC;AAAA,wBACA,GAAA;AAAA,UAAC,MAAA;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,SAAA;AAAA,WAAA;AAAA,SAED;AAAA,OAAA;AAAA,KAAA;AAAA,GACF,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { createContext } from 'react';
|
|
2
|
+
|
|
3
|
+
const Guest = {
|
|
4
|
+
username: "unknown",
|
|
5
|
+
token: ""
|
|
6
|
+
};
|
|
7
|
+
const ApplicationContext = createContext({
|
|
8
|
+
changeSetting: (propertyName) => console.log(
|
|
9
|
+
`Cannot change setting '${propertyName}'.
|
|
10
|
+
Did you forget to declare an ApplicationProvider ?`
|
|
11
|
+
),
|
|
12
|
+
settings: {
|
|
13
|
+
themeMode: "light"
|
|
14
|
+
},
|
|
15
|
+
user: Guest
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
export { ApplicationContext };
|
|
19
|
+
//# sourceMappingURL=ApplicationContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApplicationContext.js","sources":["../../src/application-provider/ApplicationContext.tsx"],"sourcesContent":["import type { ThemeMode, VuuUser } from \"@vuu-ui/vuu-utils\";\nimport { createContext } from \"react\";\n\nexport interface CoreSettings {\n themeMode: ThemeMode;\n}\n\nconst Guest: VuuUser = {\n username: \"unknown\",\n token: \"\",\n};\n\nexport interface ApplicationContextProps {\n changeSetting: (propertyName: string, value: unknown) => void;\n settings: CoreSettings;\n user: VuuUser;\n}\n\nexport const ApplicationContext = createContext<ApplicationContextProps>({\n changeSetting: (propertyName: string) =>\n console.log(\n `Cannot change setting '${propertyName}'.\\nDid you forget to declare an ApplicationProvider ?`\n ),\n settings: {\n themeMode: \"light\",\n },\n user: Guest,\n});\n"],"names":[],"mappings":";;AAOA,MAAM,KAAiB,GAAA;AAAA,EACrB,QAAU,EAAA,SAAA;AAAA,EACV,KAAO,EAAA,EAAA;AACT,CAAA,CAAA;AAQO,MAAM,qBAAqB,aAAuC,CAAA;AAAA,EACvE,aAAA,EAAe,CAAC,YAAA,KACd,OAAQ,CAAA,GAAA;AAAA,IACN,0BAA0B,YAAY,CAAA;AAAA,kDAAA,CAAA;AAAA,GACxC;AAAA,EACF,QAAU,EAAA;AAAA,IACR,SAAW,EAAA,OAAA;AAAA,GACb;AAAA,EACA,IAAM,EAAA,KAAA;AACR,CAAC;;;;"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useContext, useState, useCallback } from 'react';
|
|
3
|
+
import { ApplicationContext } from './ApplicationContext.js';
|
|
4
|
+
import { SaltProvider } from '@salt-ds/core';
|
|
5
|
+
|
|
6
|
+
const ApplicationProvider = ({
|
|
7
|
+
children,
|
|
8
|
+
settings: settingsProp,
|
|
9
|
+
user
|
|
10
|
+
}) => {
|
|
11
|
+
const context = useContext(ApplicationContext);
|
|
12
|
+
const [settings, setSettings] = useState(settingsProp ?? context.settings);
|
|
13
|
+
const changeSetting = useCallback((propertyName, value) => {
|
|
14
|
+
setSettings((s) => ({ ...s, [propertyName]: value }));
|
|
15
|
+
}, []);
|
|
16
|
+
return /* @__PURE__ */ jsx(
|
|
17
|
+
ApplicationContext.Provider,
|
|
18
|
+
{
|
|
19
|
+
value: {
|
|
20
|
+
...context,
|
|
21
|
+
changeSetting,
|
|
22
|
+
settings,
|
|
23
|
+
user: user ?? context.user
|
|
24
|
+
},
|
|
25
|
+
children: /* @__PURE__ */ jsx(SaltProvider, { theme: "vuu-theme", density: "high", mode: settings.themeMode, children })
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
};
|
|
29
|
+
const useApplicationSettings = () => {
|
|
30
|
+
const { changeSetting, settings } = useContext(ApplicationContext);
|
|
31
|
+
return { changeSetting, settings };
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export { ApplicationProvider, useApplicationSettings };
|
|
35
|
+
//# sourceMappingURL=ApplicationProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApplicationProvider.js","sources":["../../src/application-provider/ApplicationProvider.tsx"],"sourcesContent":["import {\n ReactElement,\n ReactNode,\n useCallback,\n useContext,\n useState,\n} from \"react\";\nimport {\n ApplicationContext,\n ApplicationContextProps,\n} from \"./ApplicationContext\";\nimport { SaltProvider } from \"@salt-ds/core\";\n\nexport interface ApplicationProviderProps\n extends Partial<ApplicationContextProps> {\n children: ReactNode;\n}\n\nexport const ApplicationProvider = ({\n children,\n settings: settingsProp,\n user,\n}: ApplicationProviderProps): ReactElement => {\n const context = useContext(ApplicationContext);\n const [settings, setSettings] = useState(settingsProp ?? context.settings);\n\n const changeSetting = useCallback((propertyName: string, value: unknown) => {\n setSettings((s) => ({ ...s, [propertyName]: value }));\n }, []);\n\n return (\n <ApplicationContext.Provider\n value={{\n ...context,\n changeSetting,\n settings,\n user: user ?? context.user,\n }}\n >\n <SaltProvider theme=\"vuu-theme\" density=\"high\" mode={settings.themeMode}>\n {children}\n </SaltProvider>\n </ApplicationContext.Provider>\n );\n};\n\nexport const useApplicationUser = () => {\n const { user } = useContext(ApplicationContext);\n return user;\n};\n\nexport const useApplicationSettings = () => {\n const { changeSetting, settings } = useContext(ApplicationContext);\n return { changeSetting, settings };\n};\n"],"names":[],"mappings":";;;;;AAkBO,MAAM,sBAAsB,CAAC;AAAA,EAClC,QAAA;AAAA,EACA,QAAU,EAAA,YAAA;AAAA,EACV,IAAA;AACF,CAA8C,KAAA;AAC5C,EAAM,MAAA,OAAA,GAAU,WAAW,kBAAkB,CAAA,CAAA;AAC7C,EAAA,MAAM,CAAC,QAAU,EAAA,WAAW,IAAI,QAAS,CAAA,YAAA,IAAgB,QAAQ,QAAQ,CAAA,CAAA;AAEzE,EAAA,MAAM,aAAgB,GAAA,WAAA,CAAY,CAAC,YAAA,EAAsB,KAAmB,KAAA;AAC1E,IAAY,WAAA,CAAA,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,YAAY,GAAG,KAAA,EAAQ,CAAA,CAAA,CAAA;AAAA,GACtD,EAAG,EAAE,CAAA,CAAA;AAEL,EACE,uBAAA,GAAA;AAAA,IAAC,kBAAmB,CAAA,QAAA;AAAA,IAAnB;AAAA,MACC,KAAO,EAAA;AAAA,QACL,GAAG,OAAA;AAAA,QACH,aAAA;AAAA,QACA,QAAA;AAAA,QACA,IAAA,EAAM,QAAQ,OAAQ,CAAA,IAAA;AAAA,OACxB;AAAA,MAEA,QAAA,kBAAA,GAAA,CAAC,gBAAa,KAAM,EAAA,WAAA,EAAY,SAAQ,MAAO,EAAA,IAAA,EAAM,QAAS,CAAA,SAAA,EAC3D,QACH,EAAA,CAAA;AAAA,KAAA;AAAA,GACF,CAAA;AAEJ,EAAA;AAOO,MAAM,yBAAyB,MAAM;AAC1C,EAAA,MAAM,EAAE,aAAA,EAAe,QAAS,EAAA,GAAI,WAAW,kBAAkB,CAAA,CAAA;AACjE,EAAO,OAAA,EAAE,eAAe,QAAS,EAAA,CAAA;AACnC;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApplicationSettingsPanel.css.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { queryClosest, getFieldName } from '@vuu-ui/vuu-utils';
|
|
3
|
+
import { useComponentCssInjection } from '@salt-ds/styles';
|
|
4
|
+
import { useWindow } from '@salt-ds/window';
|
|
5
|
+
import { useCallback } from 'react';
|
|
6
|
+
import applicationSettingsPanelCss from './ApplicationSettingsPanel.css.js';
|
|
7
|
+
import { FormField, FormFieldLabel, ToggleButtonGroup, ToggleButton } from '@salt-ds/core';
|
|
8
|
+
import { useApplicationSettings } from '../application-provider/ApplicationProvider.js';
|
|
9
|
+
|
|
10
|
+
const classBase = "vuuApplicationSettingsPanel";
|
|
11
|
+
const ApplicationSettingsPanel = () => {
|
|
12
|
+
const targetWindow = useWindow();
|
|
13
|
+
useComponentCssInjection({
|
|
14
|
+
testId: "vuu-application-settings-panel",
|
|
15
|
+
css: applicationSettingsPanelCss,
|
|
16
|
+
window: targetWindow
|
|
17
|
+
});
|
|
18
|
+
const { changeSetting, settings } = useApplicationSettings();
|
|
19
|
+
const onChangeToggleButton = useCallback(
|
|
20
|
+
(e) => {
|
|
21
|
+
const button = queryClosest(e.target, "button");
|
|
22
|
+
if (button) {
|
|
23
|
+
const fieldName = getFieldName(button);
|
|
24
|
+
const { value } = button;
|
|
25
|
+
changeSetting(fieldName, value);
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
[changeSetting]
|
|
29
|
+
);
|
|
30
|
+
return /* @__PURE__ */ jsx("div", { className: classBase, children: /* @__PURE__ */ jsxs(FormField, { "data-field": "themeMode", children: [
|
|
31
|
+
/* @__PURE__ */ jsx(FormFieldLabel, { children: "Light or Dark Mode" }),
|
|
32
|
+
/* @__PURE__ */ jsxs(
|
|
33
|
+
ToggleButtonGroup,
|
|
34
|
+
{
|
|
35
|
+
onChange: onChangeToggleButton,
|
|
36
|
+
value: settings.themeMode,
|
|
37
|
+
children: [
|
|
38
|
+
/* @__PURE__ */ jsx(ToggleButton, { value: "light", children: "Light" }),
|
|
39
|
+
/* @__PURE__ */ jsx(ToggleButton, { value: "dark", children: "Dark" })
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
)
|
|
43
|
+
] }) });
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export { ApplicationSettingsPanel };
|
|
47
|
+
//# sourceMappingURL=ApplicationSettingsPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ApplicationSettingsPanel.js","sources":["../../src/application-settings/ApplicationSettingsPanel.tsx"],"sourcesContent":["import { getFieldName, queryClosest } from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { FormEventHandler, HTMLAttributes, useCallback } from \"react\";\n\nimport applicationSettingsPanelCss from \"./ApplicationSettingsPanel.css\";\nimport {\n FormField,\n FormFieldLabel,\n ToggleButton,\n ToggleButtonGroup,\n} from \"@salt-ds/core\";\nimport { useApplicationSettings } from \"../application-provider\";\n\nexport interface ApplicationSettingsPanelProps\n extends HTMLAttributes<HTMLDivElement> {\n settings: { [key: string]: unknown };\n}\n\nconst classBase = \"vuuApplicationSettingsPanel\";\n\nexport const ApplicationSettingsPanel = () => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-application-settings-panel\",\n css: applicationSettingsPanelCss,\n window: targetWindow,\n });\n\n const { changeSetting, settings } = useApplicationSettings();\n\n const onChangeToggleButton = useCallback<FormEventHandler>(\n (e) => {\n const button = queryClosest<HTMLButtonElement>(e.target, \"button\");\n if (button) {\n const fieldName = getFieldName(button);\n const { value } = button;\n changeSetting(fieldName, value);\n }\n },\n [changeSetting]\n );\n\n return (\n <div className={classBase}>\n <FormField data-field=\"themeMode\">\n <FormFieldLabel>Light or Dark Mode</FormFieldLabel>\n <ToggleButtonGroup\n onChange={onChangeToggleButton}\n value={settings.themeMode}\n >\n <ToggleButton value=\"light\">Light</ToggleButton>\n <ToggleButton value=\"dark\">Dark</ToggleButton>\n </ToggleButtonGroup>\n </FormField>\n </div>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;AAmBA,MAAM,SAAY,GAAA,6BAAA,CAAA;AAEX,MAAM,2BAA2B,MAAM;AAC5C,EAAA,MAAM,eAAe,SAAU,EAAA,CAAA;AAC/B,EAAyB,wBAAA,CAAA;AAAA,IACvB,MAAQ,EAAA,gCAAA;AAAA,IACR,GAAK,EAAA,2BAAA;AAAA,IACL,MAAQ,EAAA,YAAA;AAAA,GACT,CAAA,CAAA;AAED,EAAA,MAAM,EAAE,aAAA,EAAe,QAAS,EAAA,GAAI,sBAAuB,EAAA,CAAA;AAE3D,EAAA,MAAM,oBAAuB,GAAA,WAAA;AAAA,IAC3B,CAAC,CAAM,KAAA;AACL,MAAA,MAAM,MAAS,GAAA,YAAA,CAAgC,CAAE,CAAA,MAAA,EAAQ,QAAQ,CAAA,CAAA;AACjE,MAAA,IAAI,MAAQ,EAAA;AACV,QAAM,MAAA,SAAA,GAAY,aAAa,MAAM,CAAA,CAAA;AACrC,QAAM,MAAA,EAAE,OAAU,GAAA,MAAA,CAAA;AAClB,QAAA,aAAA,CAAc,WAAW,KAAK,CAAA,CAAA;AAAA,OAChC;AAAA,KACF;AAAA,IACA,CAAC,aAAa,CAAA;AAAA,GAChB,CAAA;AAEA,EAAA,2BACG,KAAI,EAAA,EAAA,SAAA,EAAW,WACd,QAAC,kBAAA,IAAA,CAAA,SAAA,EAAA,EAAU,cAAW,WACpB,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,kBAAe,QAAkB,EAAA,oBAAA,EAAA,CAAA;AAAA,oBAClC,IAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,QAAU,EAAA,oBAAA;AAAA,QACV,OAAO,QAAS,CAAA,SAAA;AAAA,QAEhB,QAAA,EAAA;AAAA,0BAAC,GAAA,CAAA,YAAA,EAAA,EAAa,KAAM,EAAA,OAAA,EAAQ,QAAK,EAAA,OAAA,EAAA,CAAA;AAAA,0BAChC,GAAA,CAAA,YAAA,EAAA,EAAa,KAAM,EAAA,MAAA,EAAO,QAAI,EAAA,MAAA,EAAA,CAAA;AAAA,SAAA;AAAA,OAAA;AAAA,KACjC;AAAA,GAAA,EACF,CACF,EAAA,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
-
import { ComboBox, Checkbox, RadioButton } from '@vuu-ui/vuu-ui-controls';
|
|
3
2
|
import { useComponentCssInjection } from '@salt-ds/styles';
|
|
4
3
|
import { useWindow } from '@salt-ds/window';
|
|
5
4
|
import { takeScreenshot } from './screenshot-utils.js';
|
|
6
|
-
import { Text, FormField, FormFieldLabel, Input, Button } from '@salt-ds/core';
|
|
7
|
-
import { useState, useEffect, useMemo } from 'react';
|
|
5
|
+
import { Text, FormField, FormFieldLabel, ComboBox, Option, Input, Button } from '@salt-ds/core';
|
|
6
|
+
import { useState, useEffect, useMemo, useCallback } from 'react';
|
|
7
|
+
import '@vuu-ui/vuu-ui-controls';
|
|
8
8
|
import 'clsx';
|
|
9
9
|
import { getAuthDetailsFromCookies } from '../login/login-utils.js';
|
|
10
10
|
import saveLayoutPanelCss from './SaveLayoutPanel.css.js';
|
|
@@ -12,8 +12,6 @@ import saveLayoutPanelCss from './SaveLayoutPanel.css.js';
|
|
|
12
12
|
const classBase = "saveLayoutPanel";
|
|
13
13
|
const formField = `${classBase}-formField`;
|
|
14
14
|
const groups = ["Group 1", "Group 2", "Group 3", "Group 4", "Group 5"];
|
|
15
|
-
const checkboxValues = ["Value 1", "Value 2", "Value 3"];
|
|
16
|
-
const radioValues = ["Value 1", "Value 2", "Value 3"];
|
|
17
15
|
const SaveLayoutPanel = (props) => {
|
|
18
16
|
const { defaultTitle = "", onCancel, onSave, componentId } = props;
|
|
19
17
|
const targetWindow = useWindow();
|
|
@@ -24,8 +22,6 @@ const SaveLayoutPanel = (props) => {
|
|
|
24
22
|
});
|
|
25
23
|
const [layoutName, setLayoutName] = useState(defaultTitle);
|
|
26
24
|
const [group, setGroup] = useState("");
|
|
27
|
-
const [checkValues, setCheckValues] = useState([]);
|
|
28
|
-
const [radioValue, setRadioValue] = useState(radioValues[0]);
|
|
29
25
|
const [screenshot, setScreenshot] = useState();
|
|
30
26
|
const [screenshotErrorMessage, setScreenshotErrorMessage] = useState();
|
|
31
27
|
const [username] = getAuthDetailsFromCookies();
|
|
@@ -62,6 +58,18 @@ const SaveLayoutPanel = (props) => {
|
|
|
62
58
|
}
|
|
63
59
|
return /* @__PURE__ */ jsx("div", { className: "spinner" });
|
|
64
60
|
}, [screenshot, screenshotErrorMessage]);
|
|
61
|
+
const handleSelectionChange = useCallback(
|
|
62
|
+
(e, [selectedValue]) => {
|
|
63
|
+
if (e.key === "Tab" && !selectedValue.toLowerCase().startsWith(group.toLowerCase())) ; else {
|
|
64
|
+
setGroup(selectedValue || "");
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
[group]
|
|
68
|
+
);
|
|
69
|
+
const handleChange = useCallback((e) => {
|
|
70
|
+
console.log(`set Group ${e.target.value}`);
|
|
71
|
+
setGroup(e.target.value);
|
|
72
|
+
}, []);
|
|
65
73
|
return /* @__PURE__ */ jsxs("div", { className: `${classBase}-panelContainer`, children: [
|
|
66
74
|
/* @__PURE__ */ jsxs("div", { className: `${classBase}-panelContent`, children: [
|
|
67
75
|
/* @__PURE__ */ jsxs("div", { className: `${classBase}-formContainer`, children: [
|
|
@@ -70,17 +78,17 @@ const SaveLayoutPanel = (props) => {
|
|
|
70
78
|
/* @__PURE__ */ jsx(
|
|
71
79
|
ComboBox,
|
|
72
80
|
{
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
onChange: (event) => setGroup(event.target.value)
|
|
80
|
-
}
|
|
81
|
+
inputProps: {
|
|
82
|
+
autoComplete: "off",
|
|
83
|
+
className: `${classBase}-inputText`,
|
|
84
|
+
placeholder: "Select Group or Enter New Name"
|
|
85
|
+
// onChange: (event: ChangeEvent<HTMLInputElement>) =>
|
|
86
|
+
// setGroup(event.target.value),
|
|
81
87
|
},
|
|
82
|
-
|
|
83
|
-
onSelectionChange:
|
|
88
|
+
onChange: handleChange,
|
|
89
|
+
onSelectionChange: handleSelectionChange,
|
|
90
|
+
value: group,
|
|
91
|
+
children: groups.map((group2, i) => /* @__PURE__ */ jsx(Option, { value: group2 }, i))
|
|
84
92
|
}
|
|
85
93
|
)
|
|
86
94
|
] }),
|
|
@@ -97,33 +105,6 @@ const SaveLayoutPanel = (props) => {
|
|
|
97
105
|
value: layoutName
|
|
98
106
|
}
|
|
99
107
|
)
|
|
100
|
-
] }),
|
|
101
|
-
/* @__PURE__ */ jsxs(FormField, { className: formField, children: [
|
|
102
|
-
/* @__PURE__ */ jsx(FormFieldLabel, { children: "Some Layout Setting" }),
|
|
103
|
-
/* @__PURE__ */ jsx("div", { className: `${classBase}-settingsGroup`, children: checkboxValues.map((value, i) => /* @__PURE__ */ jsx(
|
|
104
|
-
Checkbox,
|
|
105
|
-
{
|
|
106
|
-
onToggle: () => setCheckValues(
|
|
107
|
-
(prev) => prev.includes(value) ? prev.filter((entry) => entry !== value) : [...prev, value]
|
|
108
|
-
),
|
|
109
|
-
checked: checkValues.includes(value),
|
|
110
|
-
label: value
|
|
111
|
-
},
|
|
112
|
-
i
|
|
113
|
-
)) })
|
|
114
|
-
] }),
|
|
115
|
-
/* @__PURE__ */ jsxs(FormField, { className: formField, children: [
|
|
116
|
-
/* @__PURE__ */ jsx(FormFieldLabel, { children: "Some Layout Setting" }),
|
|
117
|
-
/* @__PURE__ */ jsx("div", { className: `${classBase}-settingsGroup`, children: radioValues.map((value, i) => /* @__PURE__ */ jsx(
|
|
118
|
-
RadioButton,
|
|
119
|
-
{
|
|
120
|
-
onClick: () => setRadioValue(value),
|
|
121
|
-
checked: radioValue === value,
|
|
122
|
-
label: value,
|
|
123
|
-
groupName: "radioGroup"
|
|
124
|
-
},
|
|
125
|
-
i
|
|
126
|
-
)) })
|
|
127
108
|
] })
|
|
128
109
|
] }),
|
|
129
110
|
/* @__PURE__ */ jsx("div", { className: `${classBase}-screenshotContainer`, children: screenshotContent })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SaveLayoutPanel.js","sources":["../../src/layout-management/SaveLayoutPanel.tsx"],"sourcesContent":["import { Checkbox, ComboBox, RadioButton } from \"@vuu-ui/vuu-ui-controls\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { takeScreenshot } from \"./screenshot-utils\";\nimport { Button, FormField, FormFieldLabel, Input, Text } from \"@salt-ds/core\";\nimport { ChangeEvent, useEffect, useMemo, useState } from \"react\";\nimport { LayoutMetadataDto } from \"./layoutTypes\";\nimport { getAuthDetailsFromCookies } from \"../login\";\n\nimport saveLayoutPanelCss from \"./SaveLayoutPanel.css\";\n\nconst classBase = \"saveLayoutPanel\";\nconst formField = `${classBase}-formField`;\n\nconst groups = [\"Group 1\", \"Group 2\", \"Group 3\", \"Group 4\", \"Group 5\"];\n\nconst checkboxValues = [\"Value 1\", \"Value 2\", \"Value 3\"];\n\nconst radioValues = [\"Value 1\", \"Value 2\", \"Value 3\"] as const;\n\ntype RadioValue = (typeof radioValues)[number];\n\ntype SaveLayoutPanelProps = {\n componentId?: string;\n defaultTitle?: string;\n onCancel: () => void;\n onSave: (layoutMetadata: LayoutMetadataDto) => void;\n};\n\nexport const SaveLayoutPanel = (props: SaveLayoutPanelProps) => {\n const { defaultTitle = \"\", onCancel, onSave, componentId } = props;\n\n const 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 [checkValues, setCheckValues] = useState<string[]>([]);\n const [radioValue, setRadioValue] = useState<RadioValue>(radioValues[0]);\n const [screenshot, setScreenshot] = useState<string | undefined>();\n const [screenshotErrorMessage, setScreenshotErrorMessage] = useState<\n string | undefined\n >();\n const [username] = getAuthDetailsFromCookies();\n\n useEffect(() => {\n if (componentId) {\n takeScreenshot(document.getElementById(componentId) as HTMLElement)\n .then((screenshot) => {\n setScreenshot(screenshot);\n })\n .catch((error: Error) => {\n setScreenshotErrorMessage(error.message);\n });\n }\n }, [componentId]);\n\n const handleSubmit = () => {\n onSave({\n name: layoutName,\n group,\n screenshot: screenshot ?? \"\",\n user: username,\n });\n };\n\n const screenshotContent = useMemo(() => {\n if (screenshot) {\n return (\n <img\n className={`${classBase}-screenshot`}\n src={screenshot}\n alt=\"screenshot of current layout\"\n />\n );\n }\n if (screenshotErrorMessage) {\n return <Text>{screenshotErrorMessage}</Text>;\n }\n return <div className=\"spinner\" />;\n }, [screenshot, screenshotErrorMessage]);\n\n return (\n <div className={`${classBase}-panelContainer`}>\n <div className={`${classBase}-panelContent`}>\n <div className={`${classBase}-formContainer`}>\n <FormField className={formField}>\n <FormFieldLabel>Group</FormFieldLabel>\n <ComboBox\n source={groups}\n allowFreeText\n InputProps={{\n inputProps: {\n className: `${classBase}-inputText`,\n placeholder: \"Select Group or Enter New Name\",\n onChange: (event: ChangeEvent<HTMLInputElement>) =>\n setGroup(event.target.value),\n },\n }}\n width=\"100%\"\n onSelectionChange={(_, value) => setGroup(value || \"\")}\n />\n </FormField>\n <FormField className={formField}>\n <FormFieldLabel>Layout Name</FormFieldLabel>\n <Input\n inputProps={{\n className: `${classBase}-inputText`,\n placeholder: \"Enter Layout Name\",\n }}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n setLayoutName(event.target.value)\n }\n value={layoutName}\n />\n </FormField>\n <FormField className={formField}>\n <FormFieldLabel>Some Layout Setting</FormFieldLabel>\n <div className={`${classBase}-settingsGroup`}>\n {checkboxValues.map((value, i) => (\n <Checkbox\n key={i}\n onToggle={() =>\n setCheckValues((prev) =>\n prev.includes(value)\n ? prev.filter((entry) => entry !== value)\n : [...prev, value]\n )\n }\n checked={checkValues.includes(value)}\n label={value}\n />\n ))}\n </div>\n </FormField>\n <FormField className={formField}>\n <FormFieldLabel>Some Layout Setting</FormFieldLabel>\n <div className={`${classBase}-settingsGroup`}>\n {radioValues.map((value, i) => (\n <RadioButton\n key={i}\n onClick={() => setRadioValue(value)}\n checked={radioValue === value}\n label={value}\n groupName=\"radioGroup\"\n />\n ))}\n </div>\n </FormField>\n </div>\n <div className={`${classBase}-screenshotContainer`}>\n {screenshotContent}\n </div>\n </div>\n <div className={`${classBase}-buttonsContainer`}>\n <Button className={`${classBase}-cancelButton`} onClick={onCancel}>\n Cancel\n </Button>\n <Button\n className={`${classBase}-saveButton`}\n onClick={handleSubmit}\n disabled={layoutName === \"\" || group === \"\"}\n >\n Save\n </Button>\n </div>\n </div>\n );\n};\n"],"names":["screenshot"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SaveLayoutPanel.js","sources":["../../src/layout-management/SaveLayoutPanel.tsx"],"sourcesContent":["import { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { takeScreenshot } from \"./screenshot-utils\";\nimport {\n Button,\n ComboBox,\n FormField,\n FormFieldLabel,\n Input,\n Option,\n Text,\n} from \"@salt-ds/core\";\nimport {\n ChangeEvent,\n SyntheticEvent,\n useCallback,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { LayoutMetadataDto } from \"./layoutTypes\";\nimport { getAuthDetailsFromCookies } from \"../login\";\n\nimport saveLayoutPanelCss from \"./SaveLayoutPanel.css\";\n\nconst classBase = \"saveLayoutPanel\";\nconst formField = `${classBase}-formField`;\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 console.log(`set Group ${e.target.value}`);\n setGroup(e.target.value);\n }, []);\n\n return (\n <div className={`${classBase}-panelContainer`}>\n <div className={`${classBase}-panelContent`}>\n <div className={`${classBase}-formContainer`}>\n <FormField className={formField}>\n <FormFieldLabel>Group</FormFieldLabel>\n <ComboBox\n 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 className={formField}>\n <FormFieldLabel>Layout Name</FormFieldLabel>\n <Input\n inputProps={{\n className: `${classBase}-inputText`,\n placeholder: \"Enter Layout Name\",\n }}\n onChange={(event: ChangeEvent<HTMLInputElement>) =>\n setLayoutName(event.target.value)\n }\n value={layoutName}\n />\n </FormField>\n </div>\n <div className={`${classBase}-screenshotContainer`}>\n {screenshotContent}\n </div>\n </div>\n <div className={`${classBase}-buttonsContainer`}>\n <Button className={`${classBase}-cancelButton`} onClick={onCancel}>\n Cancel\n </Button>\n <Button\n className={`${classBase}-saveButton`}\n onClick={handleSubmit}\n disabled={layoutName === \"\" || group === \"\"}\n >\n Save\n </Button>\n </div>\n </div>\n );\n};\n"],"names":["screenshot","group"],"mappings":"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"}
|
package/esm/shell.js
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { connectToServer } from '@vuu-ui/vuu-data-remote';
|
|
3
|
-
import {
|
|
4
|
-
import { useWindow } from '@salt-ds/window';
|
|
5
|
-
import { StackLayout, LayoutProvider, DraggableLayout } from '@vuu-ui/vuu-layout';
|
|
3
|
+
import { registerComponent, StackLayout, LayoutProvider, DraggableLayout } from '@vuu-ui/vuu-layout';
|
|
6
4
|
import { useDialog, ContextMenuProvider } from '@vuu-ui/vuu-popups';
|
|
7
5
|
import { logger } from '@vuu-ui/vuu-utils';
|
|
8
|
-
import {
|
|
6
|
+
import { useComponentCssInjection } from '@salt-ds/styles';
|
|
7
|
+
import { useWindow } from '@salt-ds/window';
|
|
9
8
|
import cx from 'clsx';
|
|
10
9
|
import { useRef, useState, useCallback, useMemo } from 'react';
|
|
11
10
|
import { AppHeader } from './app-header/AppHeader.js';
|
|
12
|
-
import '
|
|
11
|
+
import { ApplicationProvider } from './application-provider/ApplicationProvider.js';
|
|
12
|
+
import { ApplicationSettingsPanel } from './application-settings/ApplicationSettingsPanel.js';
|
|
13
13
|
import 'html-to-image';
|
|
14
|
+
import '@salt-ds/core';
|
|
15
|
+
import '@vuu-ui/vuu-ui-controls';
|
|
14
16
|
import { useLayoutManager } from './layout-management/useLayoutManager.js';
|
|
15
17
|
import { useLayoutContextMenuItems } from './layout-management/useLayoutContextMenuItems.js';
|
|
16
18
|
import { loadingApplicationJson } from './persistence-management/defaultApplicationJson.js';
|
|
@@ -19,6 +21,7 @@ import './persistence-management/RemotePersistenceManager.js';
|
|
|
19
21
|
import { useShellLayout } from './shell-layouts/useShellLayout.js';
|
|
20
22
|
import shellCss from './shell.css.js';
|
|
21
23
|
|
|
24
|
+
registerComponent("ApplicationSettings", ApplicationSettingsPanel, "view");
|
|
22
25
|
if (typeof StackLayout !== "function") {
|
|
23
26
|
console.warn(
|
|
24
27
|
"StackLayout module not loaded, will be unsbale to deserialize from layout JSON"
|
|
@@ -47,8 +50,7 @@ const Shell = ({
|
|
|
47
50
|
});
|
|
48
51
|
const rootRef = useRef(null);
|
|
49
52
|
const { dialog, setDialogState } = useDialog();
|
|
50
|
-
const
|
|
51
|
-
const { applicationJson, saveApplicationLayout, loadLayoutById } = useLayoutManager();
|
|
53
|
+
const { applicationJson, saveApplicationLayout } = useLayoutManager();
|
|
52
54
|
const { buildMenuOptions, handleMenuAction } = useLayoutContextMenuItems(setDialogState);
|
|
53
55
|
const [connectionStatus, setConnectionStatus] = useState("connected");
|
|
54
56
|
const handleLayoutChange = useCallback(
|
|
@@ -61,18 +63,6 @@ const Shell = ({
|
|
|
61
63
|
},
|
|
62
64
|
[saveApplicationLayout]
|
|
63
65
|
);
|
|
64
|
-
const handleSwitchTheme = useCallback((mode) => {
|
|
65
|
-
if (rootRef.current) {
|
|
66
|
-
rootRef.current.dataset.mode = mode;
|
|
67
|
-
}
|
|
68
|
-
}, []);
|
|
69
|
-
const handleNavigate = useCallback(
|
|
70
|
-
(id) => {
|
|
71
|
-
layoutId.current = id;
|
|
72
|
-
loadLayoutById(id);
|
|
73
|
-
},
|
|
74
|
-
[loadLayoutById]
|
|
75
|
-
);
|
|
76
66
|
useMemo(async () => {
|
|
77
67
|
if (serverUrl && user.token) {
|
|
78
68
|
const connectionStatus2 = await connectToServer({
|
|
@@ -84,25 +74,16 @@ const Shell = ({
|
|
|
84
74
|
}
|
|
85
75
|
}, [serverUrl, user.token, user.username]);
|
|
86
76
|
const className = cx("vuuShell");
|
|
87
|
-
const
|
|
77
|
+
const isLayoutLoading = applicationJson === loadingApplicationJson;
|
|
88
78
|
const shellLayout = useShellLayout({
|
|
89
79
|
LeftSidePanelProps,
|
|
90
80
|
leftSidePanelLayout,
|
|
91
|
-
appHeader: /* @__PURE__ */ jsx(
|
|
92
|
-
AppHeader,
|
|
93
|
-
{
|
|
94
|
-
layoutId: layoutId.current,
|
|
95
|
-
loginUrl,
|
|
96
|
-
user,
|
|
97
|
-
onNavigate: handleNavigate,
|
|
98
|
-
onSwitchTheme: handleSwitchTheme
|
|
99
|
-
}
|
|
100
|
-
)
|
|
81
|
+
appHeader: /* @__PURE__ */ jsx(AppHeader, { loginUrl })
|
|
101
82
|
});
|
|
102
83
|
if (connectionStatus === "rejected") {
|
|
103
84
|
console.log("game over, no connection to server");
|
|
104
85
|
}
|
|
105
|
-
return
|
|
86
|
+
return isLayoutLoading ? null : /* @__PURE__ */ jsx(ApplicationProvider, { user, children: /* @__PURE__ */ jsxs(
|
|
106
87
|
ContextMenuProvider,
|
|
107
88
|
{
|
|
108
89
|
menuActionHandler: handleMenuAction,
|
package/esm/shell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.js","sources":["../src/shell.tsx"],"sourcesContent":["import { connectToServer } from \"@vuu-ui/vuu-data-remote\";\nimport {
|
|
1
|
+
{"version":3,"file":"shell.js","sources":["../src/shell.tsx"],"sourcesContent":["import { connectToServer } from \"@vuu-ui/vuu-data-remote\";\nimport type { LayoutChangeHandler } from \"@vuu-ui/vuu-layout\";\nimport {\n DraggableLayout,\n LayoutProvider,\n LayoutProviderProps,\n StackLayout,\n registerComponent,\n} from \"@vuu-ui/vuu-layout\";\nimport { ContextMenuProvider, useDialog } from \"@vuu-ui/vuu-popups\";\nimport { VuuUser, logger } from \"@vuu-ui/vuu-utils\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport cx from \"clsx\";\nimport {\n HTMLAttributes,\n ReactNode,\n useCallback,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { AppHeader } from \"./app-header\";\nimport { ApplicationProvider } from \"./application-provider\";\nimport { ApplicationSettingsPanel } from \"./application-settings\";\nimport {\n useLayoutContextMenuItems,\n useLayoutManager,\n} from \"./layout-management\";\nimport { loadingApplicationJson } from \"./persistence-management\";\nimport { SidePanelProps, useShellLayout } from \"./shell-layouts\";\nimport { SaveLocation } from \"./shellTypes\";\n\nimport shellCss from \"./shell.css\";\n\nregisterComponent(\"ApplicationSettings\", ApplicationSettingsPanel, \"view\");\n\nif (typeof StackLayout !== \"function\") {\n console.warn(\n \"StackLayout module not loaded, will be unsbale to deserialize from layout JSON\"\n );\n}\n\nconst { error } = logger(\"Shell\");\n\nconst defaultLeftSidePanel: ShellProps[\"LeftSidePanelProps\"] = {};\n\nexport type LayoutTemplateName = \"full-height\" | \"inlay\";\n\nexport interface ShellProps extends HTMLAttributes<HTMLDivElement> {\n LayoutProps?: Pick<\n LayoutProviderProps,\n \"createNewChild\" | \"pathToDropTarget\"\n >;\n LeftSidePanelProps?: SidePanelProps;\n children?: ReactNode;\n leftSidePanelLayout?: \"full-height\" | \"inlay\";\n loginUrl?: string;\n // paletteConfig: any;\n saveLocation?: SaveLocation;\n saveUrl?: string;\n serverUrl?: string;\n user: VuuUser;\n}\n\nexport const Shell = ({\n LayoutProps,\n LeftSidePanelProps = defaultLeftSidePanel,\n children,\n className: classNameProp,\n leftSidePanelLayout,\n loginUrl,\n saveLocation: _,\n saveUrl,\n serverUrl,\n user,\n ...htmlAttributes\n}: ShellProps) => {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"vuu-shell\",\n css: shellCss,\n window: targetWindow,\n });\n\n const rootRef = useRef<HTMLDivElement>(null);\n const { dialog, setDialogState } = useDialog();\n const { applicationJson, saveApplicationLayout } = useLayoutManager();\n const { buildMenuOptions, handleMenuAction } =\n useLayoutContextMenuItems(setDialogState);\n const [connectionStatus, setConnectionStatus] = useState<\n \"connected\" | \"rejected\"\n >(\"connected\");\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 useMemo(async () => {\n if (serverUrl && user.token) {\n const connectionStatus = await connectToServer({\n authToken: user.token,\n url: serverUrl,\n username: user.username,\n });\n setConnectionStatus(connectionStatus);\n }\n }, [serverUrl, user.token, user.username]);\n\n const className = cx(\"vuuShell\");\n\n const isLayoutLoading = applicationJson === loadingApplicationJson;\n\n const shellLayout = useShellLayout({\n LeftSidePanelProps,\n leftSidePanelLayout,\n appHeader: <AppHeader loginUrl={loginUrl} />,\n });\n\n if (connectionStatus === \"rejected\") {\n console.log(\"game over, no connection to server\");\n }\n\n return isLayoutLoading ? null : (\n <ApplicationProvider user={user}>\n <ContextMenuProvider\n menuActionHandler={handleMenuAction}\n menuBuilder={buildMenuOptions}\n >\n <LayoutProvider\n {...LayoutProps}\n layout={applicationJson.layout}\n onLayoutChange={handleLayoutChange}\n >\n <DraggableLayout\n className={className}\n ref={rootRef}\n {...htmlAttributes}\n >\n {shellLayout}\n </DraggableLayout>\n </LayoutProvider>\n {children || dialog}\n </ContextMenuProvider>\n </ApplicationProvider>\n );\n};\n"],"names":["connectionStatus"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "0.8.
|
|
2
|
+
"version": "0.8.57",
|
|
3
3
|
"description": "VUU UI Shell",
|
|
4
4
|
"author": "heswell",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"devDependencies": {
|
|
7
|
-
"@vuu-ui/vuu-data-types": "0.8.
|
|
8
|
-
"@vuu-ui/vuu-protocol-types": "0.8.
|
|
9
|
-
"@vuu-ui/vuu-table-types": "0.8.
|
|
7
|
+
"@vuu-ui/vuu-data-types": "0.8.57",
|
|
8
|
+
"@vuu-ui/vuu-protocol-types": "0.8.57",
|
|
9
|
+
"@vuu-ui/vuu-table-types": "0.8.57"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"@salt-ds/core": "1.
|
|
12
|
+
"@salt-ds/core": "1.22.0",
|
|
13
13
|
"@salt-ds/styles": "0.2.1",
|
|
14
14
|
"@salt-ds/window": "0.1.1",
|
|
15
|
-
"@vuu-ui/vuu-data-remote": "0.8.
|
|
16
|
-
"@vuu-ui/vuu-icons": "0.8.
|
|
17
|
-
"@vuu-ui/vuu-layout": "0.8.
|
|
18
|
-
"@vuu-ui/vuu-popups": "0.8.
|
|
19
|
-
"@vuu-ui/vuu-table": "0.8.
|
|
20
|
-
"@vuu-ui/vuu-ui-controls": "0.8.
|
|
21
|
-
"@vuu-ui/vuu-utils": "0.8.
|
|
15
|
+
"@vuu-ui/vuu-data-remote": "0.8.57",
|
|
16
|
+
"@vuu-ui/vuu-icons": "0.8.57",
|
|
17
|
+
"@vuu-ui/vuu-layout": "0.8.57",
|
|
18
|
+
"@vuu-ui/vuu-popups": "0.8.57",
|
|
19
|
+
"@vuu-ui/vuu-table": "0.8.57",
|
|
20
|
+
"@vuu-ui/vuu-ui-controls": "0.8.57",
|
|
21
|
+
"@vuu-ui/vuu-utils": "0.8.57",
|
|
22
22
|
"html-to-image": "^1.11.11"
|
|
23
23
|
},
|
|
24
24
|
"peerDependencies": {
|
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
import { ThemeMode } from "@vuu-ui/vuu-utils";
|
|
2
2
|
import { HTMLAttributes } from "react";
|
|
3
|
-
import { VuuUser } from "../shell";
|
|
4
3
|
export interface AppHeaderProps extends HTMLAttributes<HTMLDivElement> {
|
|
5
|
-
layoutId: string;
|
|
6
4
|
loginUrl?: string;
|
|
7
|
-
onNavigate: (id: string) => void;
|
|
8
|
-
onSwitchTheme?: (mode: ThemeMode) => void;
|
|
9
5
|
themeMode?: ThemeMode;
|
|
10
|
-
user: VuuUser;
|
|
11
6
|
}
|
|
12
|
-
export declare const AppHeader: ({ className: classNameProp,
|
|
7
|
+
export declare const AppHeader: ({ className: classNameProp, loginUrl, themeMode: _, ...htmlAttributes }: AppHeaderProps) => JSX.Element;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import type { ThemeMode, VuuUser } from "@vuu-ui/vuu-utils";
|
|
3
|
+
export interface CoreSettings {
|
|
4
|
+
themeMode: ThemeMode;
|
|
5
|
+
}
|
|
6
|
+
export interface ApplicationContextProps {
|
|
7
|
+
changeSetting: (propertyName: string, value: unknown) => void;
|
|
8
|
+
settings: CoreSettings;
|
|
9
|
+
user: VuuUser;
|
|
10
|
+
}
|
|
11
|
+
export declare const ApplicationContext: import("react").Context<ApplicationContextProps>;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ReactElement, ReactNode } from "react";
|
|
2
|
+
import { ApplicationContextProps } from "./ApplicationContext";
|
|
3
|
+
export interface ApplicationProviderProps extends Partial<ApplicationContextProps> {
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
}
|
|
6
|
+
export declare const ApplicationProvider: ({ children, settings: settingsProp, user, }: ApplicationProviderProps) => ReactElement;
|
|
7
|
+
export declare const useApplicationUser: () => import("packages/vuu-utils/src").VuuUser;
|
|
8
|
+
export declare const useApplicationSettings: () => {
|
|
9
|
+
changeSetting: (propertyName: string, value: unknown) => void;
|
|
10
|
+
settings: import("./ApplicationContext").CoreSettings;
|
|
11
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./ApplicationProvider";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./ApplicationSettingsPanel";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { MenuActionHandler, MenuBuilder } from "@vuu-ui/vuu-data-types";
|
|
2
2
|
import { SetDialog } from "@vuu-ui/vuu-popups";
|
|
3
3
|
export declare const useLayoutContextMenuItems: (setDialogState: SetDialog) => {
|
|
4
|
-
buildMenuOptions: MenuBuilder
|
|
4
|
+
buildMenuOptions: MenuBuilder;
|
|
5
5
|
handleMenuAction: MenuActionHandler;
|
|
6
6
|
};
|
package/types/shell.d.ts
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
import { LayoutProviderProps } from "@vuu-ui/vuu-layout";
|
|
2
|
+
import { VuuUser } from "@vuu-ui/vuu-utils";
|
|
2
3
|
import { HTMLAttributes, ReactNode } from "react";
|
|
3
4
|
import { SidePanelProps } from "./shell-layouts";
|
|
4
5
|
import { SaveLocation } from "./shellTypes";
|
|
5
|
-
export type VuuUser = {
|
|
6
|
-
username: string;
|
|
7
|
-
token: string;
|
|
8
|
-
};
|
|
9
6
|
export type LayoutTemplateName = "full-height" | "inlay";
|
|
10
7
|
export interface ShellProps extends HTMLAttributes<HTMLDivElement> {
|
|
11
8
|
LayoutProps?: Pick<LayoutProviderProps, "createNewChild" | "pathToDropTarget">;
|