wcz-layout 5.8.2 → 5.8.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/src/components/Button.d.ts +3 -3
  2. package/dist/src/components/Button.js +8 -8
  3. package/dist/src/components/Dialog.d.ts +16 -0
  4. package/dist/src/components/Dialog.js +19 -0
  5. package/dist/src/components/Dialog.js.map +1 -0
  6. package/dist/src/components/Layout.d.ts +15 -15
  7. package/dist/src/components/Layout.js +82 -71
  8. package/dist/src/components/Layout.js.map +1 -1
  9. package/dist/src/components/LayoutSnackbar.d.ts +2 -2
  10. package/dist/src/components/LayoutSnackbar.js +16 -16
  11. package/dist/src/components/LayoutSnackbar.js.map +1 -1
  12. package/dist/src/components/TypographyWithIcon.d.ts +8 -0
  13. package/dist/src/components/TypographyWithIcon.js +6 -0
  14. package/dist/src/components/TypographyWithIcon.js.map +1 -0
  15. package/dist/src/components/common/CenteredBox.d.ts +6 -6
  16. package/dist/src/components/common/CenteredBox.js +12 -12
  17. package/dist/src/components/layout/AccountMenu.d.ts +9 -9
  18. package/dist/src/components/layout/AccountMenu.js +50 -50
  19. package/dist/src/components/layout/LeftDrawer.d.ts +9 -9
  20. package/dist/src/components/layout/LeftDrawer.js +71 -70
  21. package/dist/src/components/layout/LeftDrawer.js.map +1 -1
  22. package/dist/src/contexts/LayoutContext.d.ts +29 -29
  23. package/dist/src/contexts/LayoutContext.js +68 -67
  24. package/dist/src/contexts/LayoutContext.js.map +1 -1
  25. package/dist/src/contexts/SnackbarContext.d.ts +14 -14
  26. package/dist/src/contexts/SnackbarContext.js +8 -8
  27. package/dist/src/index.d.ts +12 -10
  28. package/dist/src/index.js +10 -8
  29. package/dist/src/index.js.map +1 -1
  30. package/dist/src/models/KeycloakExtendedConfig.d.ts +11 -11
  31. package/dist/src/models/KeycloakExtendedConfig.js +1 -1
  32. package/dist/src/models/LeftDrawerItem.d.ts +8 -8
  33. package/dist/src/models/LeftDrawerItem.js +1 -1
  34. package/dist/src/models/SnackbarModel.d.ts +8 -8
  35. package/dist/src/models/SnackbarModel.js +1 -1
  36. package/dist/src/models/User.d.ts +10 -11
  37. package/dist/src/models/User.js +1 -1
  38. package/dist/src/models/User.js.map +1 -1
  39. package/dist/src/utils/Fetches.d.ts +5 -5
  40. package/dist/src/utils/Fetches.js +69 -69
  41. package/dist/src/utils/Fetches.js.map +1 -1
  42. package/dist/src/utils/Helpers.d.ts +4 -4
  43. package/dist/src/utils/Helpers.js +5 -5
  44. package/dist/src/utils/PersistStorage.d.ts +8 -8
  45. package/dist/src/utils/PersistStorage.js +22 -22
  46. package/dist/src/utils/PersistStorage.js.map +1 -1
  47. package/dist/src/utils/Translations.d.ts +40 -0
  48. package/dist/src/utils/Translations.js +41 -0
  49. package/dist/src/utils/Translations.js.map +1 -0
  50. package/dist/src/utils/UseUser.d.ts +2 -2
  51. package/dist/src/utils/UseUser.js +23 -23
  52. package/dist/src/utils/UserService.d.ts +8 -8
  53. package/dist/src/utils/UserService.js +82 -82
  54. package/dist/src/utils/UserService.js.map +1 -1
  55. package/dist/tsconfig.tsbuildinfo +1 -1
  56. package/package.json +3 -3
  57. package/src/components/Dialog.tsx +75 -0
  58. package/src/components/Layout.tsx +30 -4
  59. package/src/components/LayoutSnackbar.tsx +5 -5
  60. package/src/components/TypographyWithIcon.tsx +16 -0
  61. package/src/components/layout/LeftDrawer.tsx +13 -9
  62. package/src/contexts/LayoutContext.tsx +2 -1
  63. package/src/index.ts +2 -0
  64. package/src/models/User.ts +6 -8
  65. package/src/utils/Translations.ts +40 -0
  66. package/src/utils/UserService.ts +3 -3
@@ -1,3 +1,3 @@
1
- import { ButtonProps } from "@mui/material";
2
- import React from "react";
3
- export declare const Button: React.FC<ButtonProps>;
1
+ import { ButtonProps } from "@mui/material";
2
+ import React from "react";
3
+ export declare const Button: React.FC<ButtonProps>;
@@ -1,9 +1,9 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- import { Button as MaterialButton } from "@mui/material";
3
- import { useIsFetching, useIsMutating } from "@tanstack/react-query";
4
- export const Button = props => {
5
- const isFetching = !!useIsFetching();
6
- const isMutating = !!useIsMutating();
7
- return _jsx(MaterialButton, { ...props, disabled: isFetching || isMutating || props.disabled });
8
- };
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Button as MaterialButton } from "@mui/material";
3
+ import { useIsFetching, useIsMutating } from "@tanstack/react-query";
4
+ export const Button = props => {
5
+ const isFetching = !!useIsFetching();
6
+ const isMutating = !!useIsMutating();
7
+ return _jsx(MaterialButton, { ...props, disabled: isFetching || isMutating || props.disabled });
8
+ };
9
9
  //# sourceMappingURL=Button.js.map
@@ -0,0 +1,16 @@
1
+ import { Breakpoint } from "@mui/material";
2
+ import { ReactNode } from "react";
3
+ interface DialogProps {
4
+ children?: ReactNode;
5
+ title: string | ReactNode;
6
+ subtitle?: string | ReactNode;
7
+ open: boolean;
8
+ onClose: () => void;
9
+ color?: "success" | "info" | "warning" | "error" | "primary" | "secondary" | "inherit" | "default";
10
+ maxWidth?: Breakpoint;
11
+ actions?: ReactNode[];
12
+ disablePadding?: boolean;
13
+ disableAutoClose?: boolean;
14
+ }
15
+ export declare const Dialog: React.FC<DialogProps>;
16
+ export {};
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Close } from "@mui/icons-material";
3
+ import { AppBar, Dialog as MaterialDialog, DialogActions, DialogContent, DialogTitle, Grid, IconButton, LinearProgress, Toolbar, Typography, useMediaQuery } from "@mui/material";
4
+ import { useTheme } from "@mui/material/styles";
5
+ import { useIsFetching, useIsMutating } from "@tanstack/react-query";
6
+ import { Fragment } from "react";
7
+ import { LayoutSnackbar } from "./LayoutSnackbar";
8
+ export const Dialog = ({ open, onClose, title, subtitle, children, color, maxWidth, actions, disablePadding, disableAutoClose }) => {
9
+ const theme = useTheme();
10
+ const fullScreen = useMediaQuery(theme.breakpoints.down("sm"));
11
+ const isFetching = !!useIsFetching();
12
+ const isMutating = !!useIsMutating();
13
+ return (_jsxs(MaterialDialog, { open: open, onClose: disableAutoClose ? undefined : onClose, fullScreen: fullScreen, fullWidth: true, maxWidth: maxWidth, children: [fullScreen ?
14
+ _jsxs(Fragment, { children: [_jsx(AppBar, { sx: { position: "relative", bgcolor: `${color}.main` }, children: _jsxs(Toolbar, { children: [_jsxs(Typography, { sx: { flex: 1 }, variant: "h6", children: [title, subtitle && _jsx(Typography, { variant: "body2", sx: { opacity: 0.5 }, children: subtitle })] }), _jsx(IconButton, { edge: "start", onClick: onClose, children: _jsx(Close, { sx: { color: `${color}.contrastText` } }) })] }) }), (isFetching || isMutating) && _jsx(LinearProgress, { color: color === "default" ? undefined : color })] })
15
+ :
16
+ _jsxs(Fragment, { children: [_jsxs(Grid, { container: true, justifyContent: "space-between", sx: { bgcolor: `${color}.main`, color: `${color}.contrastText` }, children: [_jsx(Grid, { item: true, xs: true, children: _jsxs(DialogTitle, { children: [title, subtitle && _jsx(Typography, { variant: "body2", sx: { opacity: 0.5 }, children: subtitle })] }) }), _jsx(Grid, { item: true, xs: 2, sx: { p: 1, textAlign: "right" }, children: _jsx(IconButton, { onClick: onClose, children: _jsx(Close, { fontSize: "small", sx: { color: `${color}.contrastText` } }) }) })] }), (isFetching || isMutating) && _jsx(LinearProgress, { color: color === "default" ? undefined : color })] }), disablePadding ? children : _jsx(DialogContent, { children: children }), actions &&
17
+ _jsx(DialogActions, { children: actions.map(action => action) }), _jsx(LayoutSnackbar, {})] }));
18
+ };
19
+ //# sourceMappingURL=Dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dialog.js","sourceRoot":"","sources":["../../../src/components/Dialog.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Close } from \"@mui/icons-material\";\r\nimport { AppBar, Breakpoint, Dialog as MaterialDialog, DialogActions, DialogContent, DialogTitle, Grid, IconButton, LinearProgress, Toolbar, Typography, useMediaQuery } from \"@mui/material\";\r\nimport { useTheme } from \"@mui/material/styles\";\r\nimport { useIsFetching, useIsMutating } from \"@tanstack/react-query\";\r\nimport { Fragment, ReactNode } from \"react\";\r\nimport { LayoutSnackbar } from \"./LayoutSnackbar\";\r\n\r\ninterface DialogProps {\r\n children?: ReactNode,\r\n title: string | ReactNode;\r\n subtitle?: string | ReactNode;\r\n open: boolean;\r\n onClose: () => void;\r\n color?: \"success\" | \"info\" | \"warning\" | \"error\" | \"primary\" | \"secondary\" | \"inherit\" | \"default\";\r\n maxWidth?: Breakpoint;\r\n actions?: ReactNode[];\r\n disablePadding?: boolean;\r\n disableAutoClose?: boolean;\r\n}\r\n\r\nexport const Dialog: React.FC<DialogProps> = ({ open, onClose, title, subtitle, children, color, maxWidth, actions, disablePadding, disableAutoClose }) => {\r\n const theme = useTheme();\r\n const fullScreen = useMediaQuery(theme.breakpoints.down(\"sm\"));\r\n const isFetching = !!useIsFetching();\r\n const isMutating = !!useIsMutating();\r\n\r\n return (\r\n <MaterialDialog open={open} onClose={disableAutoClose ? undefined : onClose} fullScreen={fullScreen} fullWidth maxWidth={maxWidth}>\r\n {fullScreen ?\r\n <Fragment>\r\n <AppBar sx={{ position: \"relative\", bgcolor: `${color}.main` }}>\r\n <Toolbar>\r\n <Typography sx={{ flex: 1 }} variant=\"h6\">\r\n {title}\r\n {subtitle && <Typography variant=\"body2\" sx={{ opacity: 0.5 }}>{subtitle}</Typography>}\r\n </Typography>\r\n <IconButton edge=\"start\" onClick={onClose}>\r\n <Close sx={{ color: `${color}.contrastText` }} />\r\n </IconButton>\r\n </Toolbar>\r\n </AppBar>\r\n {(isFetching || isMutating) && <LinearProgress color={color === \"default\" ? undefined : color} />}\r\n </Fragment>\r\n :\r\n <Fragment>\r\n <Grid container justifyContent=\"space-between\" sx={{ bgcolor: `${color}.main`, color: `${color}.contrastText` }}>\r\n <Grid item xs>\r\n <DialogTitle>\r\n {title}\r\n {subtitle && <Typography variant=\"body2\" sx={{ opacity: 0.5 }}>{subtitle}</Typography>}\r\n </DialogTitle>\r\n </Grid>\r\n\r\n <Grid item xs={2} sx={{ p: 1, textAlign: \"right\" }}>\r\n <IconButton onClick={onClose}>\r\n <Close fontSize=\"small\" sx={{ color: `${color}.contrastText` }} />\r\n </IconButton>\r\n </Grid>\r\n </Grid>\r\n {(isFetching || isMutating) && <LinearProgress color={color === \"default\" ? undefined : color} />}\r\n </Fragment>\r\n }\r\n\r\n {disablePadding ? children : <DialogContent>{children}</DialogContent>}\r\n\r\n {actions &&\r\n <DialogActions>\r\n {actions.map(action => action)}\r\n </DialogActions>\r\n }\r\n\r\n <LayoutSnackbar />\r\n </MaterialDialog>\r\n );\r\n};\r\n"]}
@@ -1,15 +1,15 @@
1
- import React from "react";
2
- import { LeftDrawerItem } from "../models/LeftDrawerItem";
3
- import { ExtendedUser } from "../models/User";
4
- interface LayoutProps {
5
- title: string;
6
- appVersion: string;
7
- leftDrawerItems: LeftDrawerItem[];
8
- primaryColor: string;
9
- secondaryColor: string;
10
- children: React.ReactNode;
11
- user: ExtendedUser;
12
- initialized: boolean;
13
- }
14
- export default function Layout(props: LayoutProps): import("react/jsx-runtime").JSX.Element;
15
- export {};
1
+ import React from "react";
2
+ import { LeftDrawerItem } from "../models/LeftDrawerItem";
3
+ import { ExtendedUser } from "../models/User";
4
+ interface LayoutProps {
5
+ title: string;
6
+ appVersion: string;
7
+ leftDrawerItems: LeftDrawerItem[];
8
+ primaryColor: string;
9
+ secondaryColor: string;
10
+ children: React.ReactNode;
11
+ user: ExtendedUser;
12
+ initialized: boolean;
13
+ }
14
+ export default function Layout(props: LayoutProps): import("react/jsx-runtime").JSX.Element;
15
+ export {};
@@ -1,72 +1,83 @@
1
- var _a;
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { Menu } from "@mui/icons-material";
4
- import { AppBar as MuiAppBar, Box, Chip, CssBaseline, IconButton, LinearProgress, Toolbar, Typography, useMediaQuery } from "@mui/material";
5
- import { csCZ, enUS } from "@mui/material/locale";
6
- import { createTheme, styled, ThemeProvider } from "@mui/material/styles";
7
- import { useIsFetching, useIsMutating } from "@tanstack/react-query";
8
- import { useCallback, useEffect, useState } from "react";
9
- import { useTranslation } from "react-i18next";
10
- import { useLocation } from "react-router-dom";
11
- import { isDevelopment } from "../utils/Helpers";
12
- import { persistStorage } from "../utils/PersistStorage";
13
- import CenteredBox from "./common/CenteredBox";
14
- import AccountMenu from "./layout/AccountMenu";
15
- import LeftDrawer from "./layout/LeftDrawer";
16
- //Mode
17
- const storedMode = (_a = persistStorage.get("mode")) !== null && _a !== void 0 ? _a : "system";
18
- //Drawer
19
- const drawerWidth = 240;
20
- const DrawerHeader = styled("div")(({ theme }) => ({
21
- display: "flex",
22
- alignItems: "center",
23
- justifyContent: "flex-end",
24
- padding: theme.spacing(0, 1),
25
- // necessary for content to be below app bar
26
- ...theme.mixins.toolbar,
27
- }));
28
- const AppBar = styled(MuiAppBar, {
29
- shouldForwardProp: (prop) => prop !== "open",
30
- })(({ theme, open }) => ({
31
- zIndex: theme.zIndex.drawer + 1,
32
- transition: theme.transitions.create(["width", "margin"], {
33
- easing: theme.transitions.easing.sharp,
34
- duration: theme.transitions.duration.leavingScreen,
35
- }),
36
- ...(open && {
37
- marginLeft: drawerWidth,
38
- width: `calc(100% - ${drawerWidth}px)`,
39
- transition: theme.transitions.create(["width", "margin"], {
40
- easing: theme.transitions.easing.sharp,
41
- duration: theme.transitions.duration.enteringScreen,
42
- }),
43
- }),
44
- }));
45
- export default function Layout(props) {
46
- const { primaryColor, secondaryColor, title, appVersion, leftDrawerItems, user, initialized, children } = props;
47
- const prefersDarkMode = useMediaQuery("(prefers-color-scheme: dark)");
48
- const [mode, setMode] = useState(storedMode);
49
- const [leftDrawerOpen, setLeftDrawerOpen] = useState(false);
50
- const [authorized, setAuthorized] = useState(true);
51
- const isFetching = !!useIsFetching();
52
- const isMutating = !!useIsMutating();
53
- const location = useLocation();
54
- const { t, i18n } = useTranslation();
55
- const theme = createTheme({
56
- palette: {
57
- mode: mode === "system" ? prefersDarkMode ? "dark" : "light" : mode,
58
- primary: { main: primaryColor },
59
- secondary: { main: secondaryColor },
60
- },
61
- }, i18n.language === "cs" ? csCZ : enUS);
62
- useEffect(() => handleUnauthorized(), [location.pathname, initialized, leftDrawerItems]);
63
- const handleUnauthorized = () => {
64
- const activePage = leftDrawerItems.find(i => i.path === location.pathname);
65
- if (activePage === null || activePage === void 0 ? void 0 : activePage.hidden)
66
- return setAuthorized(false);
67
- return setAuthorized(true);
68
- };
69
- const toggleDrawerOpen = useCallback(() => setLeftDrawerOpen(!leftDrawerOpen), [leftDrawerOpen]);
70
- return (_jsxs(ThemeProvider, { theme: theme, children: [_jsxs(Box, { sx: { display: "flex", position: "sticky" }, children: [_jsx(CssBaseline, {}), _jsx(AppBar, { position: "fixed", open: leftDrawerOpen, children: _jsxs(Toolbar, { children: [_jsx(IconButton, { color: "inherit", onClick: toggleDrawerOpen, edge: "start", sx: { marginRight: 2, ...(leftDrawerOpen && { display: "none" }) }, children: _jsx(Menu, {}) }), _jsx(Typography, { variant: "h6", noWrap: true, component: "div", sx: { flexGrow: 1 }, children: title }), isDevelopment && _jsx(Chip, { color: "secondary", sx: { mr: 1.5 }, label: "Development" }), _jsx(AccountMenu, { mode: mode, setMode: setMode, user: user })] }) }), _jsx(LeftDrawer, { appVersion: appVersion, items: leftDrawerItems, drawerOpen: leftDrawerOpen, setDrawerOpen: setLeftDrawerOpen }), _jsxs(Box, { component: "main", sx: { flex: 1, overflow: "auto" }, children: [_jsx(DrawerHeader, {}), authorized ? children : _jsx(CenteredBox, { label: t("Layout.Unauthorized") })] })] }), (isFetching || isMutating) && _jsx(LinearProgress, { sx: { position: "fixed", top: { xs: 56, sm: 64 }, left: 0, right: 0 } })] }));
71
- }
1
+ var _a;
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { Menu, Warning } from "@mui/icons-material";
4
+ import { Box, Chip, CssBaseline, IconButton, LinearProgress, AppBar as MuiAppBar, Toolbar, Typography, useMediaQuery } from "@mui/material";
5
+ import { csCZ, enUS } from "@mui/material/locale";
6
+ import { ThemeProvider, createTheme, styled } from "@mui/material/styles";
7
+ import { useIsFetching, useIsMutating } from "@tanstack/react-query";
8
+ import { useCallback, useEffect, useState } from "react";
9
+ import { useTranslation } from "react-i18next";
10
+ import { useLocation } from "react-router-dom";
11
+ import { isDevelopment } from "../utils/Helpers";
12
+ import { persistStorage } from "../utils/PersistStorage";
13
+ import { hasRole } from "../utils/UserService";
14
+ import { Dialog } from "./Dialog";
15
+ import { TypographyWithIcon } from "./TypographyWithIcon";
16
+ import CenteredBox from "./common/CenteredBox";
17
+ import AccountMenu from "./layout/AccountMenu";
18
+ import LeftDrawer from "./layout/LeftDrawer";
19
+ import { Button } from "./Button";
20
+ //Mode
21
+ const storedMode = (_a = persistStorage.get("mode")) !== null && _a !== void 0 ? _a : "system";
22
+ //Drawer
23
+ const drawerWidth = 240;
24
+ const DrawerHeader = styled("div")(({ theme }) => ({
25
+ display: "flex",
26
+ alignItems: "center",
27
+ justifyContent: "flex-end",
28
+ padding: theme.spacing(0, 1),
29
+ // necessary for content to be below app bar
30
+ ...theme.mixins.toolbar,
31
+ }));
32
+ const AppBar = styled(MuiAppBar, {
33
+ shouldForwardProp: (prop) => prop !== "open",
34
+ })(({ theme, open }) => ({
35
+ zIndex: theme.zIndex.drawer + 1,
36
+ transition: theme.transitions.create(["width", "margin"], {
37
+ easing: theme.transitions.easing.sharp,
38
+ duration: theme.transitions.duration.leavingScreen,
39
+ }),
40
+ ...(open && {
41
+ marginLeft: drawerWidth,
42
+ width: `calc(100% - ${drawerWidth}px)`,
43
+ transition: theme.transitions.create(["width", "margin"], {
44
+ easing: theme.transitions.easing.sharp,
45
+ duration: theme.transitions.duration.enteringScreen,
46
+ }),
47
+ }),
48
+ }));
49
+ export default function Layout(props) {
50
+ const { primaryColor, secondaryColor, title, appVersion, leftDrawerItems, user, initialized, children } = props;
51
+ const prefersDarkMode = useMediaQuery("(prefers-color-scheme: dark)");
52
+ const [mode, setMode] = useState(storedMode);
53
+ const [leftDrawerOpen, setLeftDrawerOpen] = useState(false);
54
+ const [authorized, setAuthorized] = useState(true);
55
+ const [developmentDialogOpen, setDevelopmentDialogOpen] = useState(false);
56
+ const isFetching = !!useIsFetching();
57
+ const isMutating = !!useIsMutating();
58
+ const location = useLocation();
59
+ const { t, i18n } = useTranslation();
60
+ const theme = createTheme({
61
+ palette: {
62
+ mode: mode === "system" ? prefersDarkMode ? "dark" : "light" : mode,
63
+ primary: { main: primaryColor },
64
+ secondary: { main: secondaryColor },
65
+ },
66
+ }, i18n.language === "cs" ? csCZ : enUS);
67
+ useEffect(() => handleUnauthorized(), [location.pathname, initialized, leftDrawerItems]);
68
+ const handleUnauthorized = () => {
69
+ const activePage = leftDrawerItems.find(i => i.path === location.pathname);
70
+ if (activePage === null || activePage === void 0 ? void 0 : activePage.hidden)
71
+ return setAuthorized(false);
72
+ return setAuthorized(true);
73
+ };
74
+ useEffect(() => {
75
+ if (user.loggedIn && !hasRole(["wcz-developers"]))
76
+ toggleDevelopmentDialogOpen();
77
+ }, [user.loggedIn]);
78
+ const toggleDevelopmentDialogOpen = useCallback(() => setDevelopmentDialogOpen(!developmentDialogOpen), [developmentDialogOpen]);
79
+ const developmentDialog = (_jsx(Dialog, { open: developmentDialogOpen, onClose: toggleDevelopmentDialogOpen, title: _jsx(TypographyWithIcon, { variant: "h6", startIcon: _jsx(Warning, {}), children: t("Layout.DevelopmentDialogTitle") }), color: "warning", disableAutoClose: true, actions: [_jsx(Button, { color: "warning", onClick: toggleDevelopmentDialogOpen, children: t("Close") }, "close")], children: t("Layout.DevelopmentDialogContent") }));
80
+ const toggleDrawerOpen = useCallback(() => setLeftDrawerOpen(!leftDrawerOpen), [leftDrawerOpen]);
81
+ return (_jsxs(ThemeProvider, { theme: theme, children: [_jsxs(Box, { sx: { display: "flex", position: "sticky" }, children: [_jsx(CssBaseline, {}), _jsx(AppBar, { position: "fixed", open: leftDrawerOpen, children: _jsxs(Toolbar, { children: [_jsx(IconButton, { color: "inherit", onClick: toggleDrawerOpen, edge: "start", sx: { marginRight: 2, ...(leftDrawerOpen && { display: "none" }) }, children: _jsx(Menu, {}) }), _jsx(Typography, { variant: "h6", noWrap: true, component: "div", sx: { flexGrow: 1 }, children: title }), isDevelopment && _jsx(Chip, { variant: "outlined", sx: theme => ({ mr: 1.5, color: theme.palette.primary.contrastText }), label: "Development" }), _jsx(AccountMenu, { mode: mode, setMode: setMode, user: user })] }) }), _jsx(LeftDrawer, { appVersion: appVersion, items: leftDrawerItems, drawerOpen: leftDrawerOpen, setDrawerOpen: setLeftDrawerOpen }), _jsxs(Box, { component: "main", sx: { flex: 1, overflow: "auto" }, children: [_jsx(DrawerHeader, {}), authorized ? children : _jsx(CenteredBox, { label: t("Layout.Unauthorized") })] })] }), developmentDialog, (isFetching || isMutating) && _jsx(LinearProgress, { sx: { position: "fixed", top: { xs: 56, sm: 64 }, left: 0, right: 0 } })] }));
82
+ }
72
83
  //# sourceMappingURL=Layout.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../../src/components/Layout.tsx"],"names":[],"mappings":";;AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,MAAM,IAAI,SAAS,EAAiC,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAsB,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC/L,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAc,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAC/C,OAAO,WAAW,MAAM,sBAAsB,CAAC;AAC/C,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAE7C,MAAM;AACN,MAAM,UAAU,GAAG,MAAA,cAAc,CAAC,GAAG,CAAC,MAAM,CAAgB,mCAAI,QAAQ,CAAC;AAEzE,QAAQ;AACR,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/C,OAAO,EAAE,MAAM;IACf,UAAU,EAAE,QAAQ;IACpB,cAAc,EAAE,UAAU;IAC1B,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5B,4CAA4C;IAC5C,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO;CAC1B,CAAC,CAAC,CAAC;AAOJ,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE;IAC7B,iBAAiB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,MAAM;CAC/C,CAAC,CAAc,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAClC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;IAC/B,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;QACtD,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK;QACtC,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,aAAa;KACrD,CAAC;IACF,GAAG,CAAC,IAAI,IAAI;QACR,UAAU,EAAE,WAAW;QACvB,KAAK,EAAE,eAAe,WAAW,KAAK;QACtC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;YACtD,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK;YACtC,QAAQ,EAAE,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,cAAc;SACtD,CAAC;KACL,CAAC;CACL,CAAC,CAAC,CAAC;AAcJ,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,KAAkB;IAC7C,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAChH,MAAM,eAAe,GAAY,aAAa,CAAC,8BAA8B,CAAC,CAAC;IAC/E,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAyB,UAAU,CAAC,CAAC;IACrE,MAAM,CAAC,cAAc,EAAE,iBAAiB,CAAC,GAAG,QAAQ,CAAU,KAAK,CAAC,CAAC;IACrE,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAU,IAAI,CAAC,CAAC;IAC5D,MAAM,UAAU,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,CAAC,CAAC,aAAa,EAAE,CAAC;IACrC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAC;IAErC,MAAM,KAAK,GAAU,WAAW,CAAC;QAC7B,OAAO,EAAE;YACL,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;YACnE,OAAO,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE;YAC/B,SAAS,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE;SACtC;KACJ,EAAE,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAEzC,SAAS,CAAC,GAAG,EAAE,CAAC,kBAAkB,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC;IAEzF,MAAM,kBAAkB,GAAG,GAAG,EAAE;QAC5B,MAAM,UAAU,GAA+B,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,QAAQ,CAAC,CAAC;QACvG,IAAI,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM;YAClB,OAAO,aAAa,CAAC,KAAK,CAAC,CAAC;QAEhC,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,iBAAiB,CAAC,CAAC,cAAc,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAEjG,OAAO,CACH,MAAC,aAAa,IAAC,KAAK,EAAE,KAAK,aACvB,MAAC,GAAG,IAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAC5C,KAAC,WAAW,KAAG,EACf,KAAC,MAAM,IAAC,QAAQ,EAAC,OAAO,EAAC,IAAI,EAAE,cAAc,YACzC,MAAC,OAAO,eACJ,KAAC,UAAU,IAAC,KAAK,EAAC,SAAS,EAAC,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAC,OAAO,EAAC,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,GAAG,CAAC,cAAc,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,YAClI,KAAC,IAAI,KAAG,GACC,EAEb,KAAC,UAAU,IAAC,OAAO,EAAC,IAAI,EAAC,MAAM,QAAC,SAAS,EAAC,KAAK,EAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,YAAG,KAAK,GAAc,EAExF,aAAa,IAAI,KAAC,IAAI,IAAC,KAAK,EAAC,WAAW,EAAC,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,KAAK,EAAC,aAAa,GAAG,EAEjF,KAAC,WAAW,IAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAI,IACnD,GACL,EAET,KAAC,UAAU,IAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,aAAa,EAAE,iBAAiB,GAAI,EAE5H,MAAC,GAAG,IAAC,SAAS,EAAC,MAAM,EAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,aACnD,KAAC,YAAY,KAAG,EACf,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAC,WAAW,IAAC,KAAK,EAAE,CAAC,CAAC,qBAAqB,CAAE,GAAI,IACxE,IACJ,EAEL,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,KAAC,cAAc,IAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAI,IAC5G,CACnB,CAAC;AACN,CAAC","sourcesContent":["import { Menu } from \"@mui/icons-material\";\r\nimport { AppBar as MuiAppBar, AppBarProps as MuiAppBarProps, Box, Chip, CssBaseline, IconButton, LinearProgress, PaletteMode, Theme, Toolbar, Typography, useMediaQuery } from \"@mui/material\";\r\nimport { csCZ, enUS } from \"@mui/material/locale\";\r\nimport { createTheme, styled, ThemeProvider } from \"@mui/material/styles\";\r\nimport { useIsFetching, useIsMutating } from \"@tanstack/react-query\";\r\nimport React, { useCallback, useEffect, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useLocation } from \"react-router-dom\";\r\nimport { LeftDrawerItem } from \"../models/LeftDrawerItem\";\r\nimport { ExtendedUser } from \"../models/User\";\r\nimport { isDevelopment } from \"../utils/Helpers\";\r\nimport { persistStorage } from \"../utils/PersistStorage\";\r\nimport CenteredBox from \"./common/CenteredBox\";\r\nimport AccountMenu from \"./layout/AccountMenu\";\r\nimport LeftDrawer from \"./layout/LeftDrawer\";\r\n\r\n//Mode\r\nconst storedMode = persistStorage.get(\"mode\") as PaletteMode ?? \"system\";\r\n\r\n//Drawer\r\nconst drawerWidth = 240;\r\nconst DrawerHeader = styled(\"div\")(({ theme }) => ({\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"flex-end\",\r\n padding: theme.spacing(0, 1),\r\n // necessary for content to be below app bar\r\n ...theme.mixins.toolbar,\r\n}));\r\n\r\n//AppBar\r\ninterface AppBarProps extends MuiAppBarProps {\r\n open?: boolean;\r\n}\r\n\r\nconst AppBar = styled(MuiAppBar, {\r\n shouldForwardProp: (prop) => prop !== \"open\",\r\n})<AppBarProps>(({ theme, open }) => ({\r\n zIndex: theme.zIndex.drawer + 1,\r\n transition: theme.transitions.create([\"width\", \"margin\"], {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n ...(open && {\r\n marginLeft: drawerWidth,\r\n width: `calc(100% - ${drawerWidth}px)`,\r\n transition: theme.transitions.create([\"width\", \"margin\"], {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n }),\r\n}));\r\n\r\n//Layout\r\ninterface LayoutProps {\r\n title: string,\r\n appVersion: string,\r\n leftDrawerItems: LeftDrawerItem[],\r\n primaryColor: string,\r\n secondaryColor: string,\r\n children: React.ReactNode,\r\n user: ExtendedUser,\r\n initialized: boolean\r\n}\r\n\r\nexport default function Layout(props: LayoutProps) {\r\n const { primaryColor, secondaryColor, title, appVersion, leftDrawerItems, user, initialized, children } = props;\r\n const prefersDarkMode: boolean = useMediaQuery(\"(prefers-color-scheme: dark)\");\r\n const [mode, setMode] = useState<PaletteMode | \"system\">(storedMode);\r\n const [leftDrawerOpen, setLeftDrawerOpen] = useState<boolean>(false);\r\n const [authorized, setAuthorized] = useState<boolean>(true);\r\n const isFetching = !!useIsFetching();\r\n const isMutating = !!useIsMutating();\r\n const location = useLocation();\r\n const { t, i18n } = useTranslation();\r\n\r\n const theme: Theme = createTheme({\r\n palette: {\r\n mode: mode === \"system\" ? prefersDarkMode ? \"dark\" : \"light\" : mode,\r\n primary: { main: primaryColor },\r\n secondary: { main: secondaryColor },\r\n },\r\n }, i18n.language === \"cs\" ? csCZ : enUS);\r\n\r\n useEffect(() => handleUnauthorized(), [location.pathname, initialized, leftDrawerItems]);\r\n\r\n const handleUnauthorized = () => {\r\n const activePage: LeftDrawerItem | undefined = leftDrawerItems.find(i => i.path === location.pathname);\r\n if (activePage?.hidden)\r\n return setAuthorized(false);\r\n\r\n return setAuthorized(true);\r\n };\r\n\r\n const toggleDrawerOpen = useCallback(() => setLeftDrawerOpen(!leftDrawerOpen), [leftDrawerOpen]);\r\n\r\n return (\r\n <ThemeProvider theme={theme}>\r\n <Box sx={{ display: \"flex\", position: \"sticky\" }}>\r\n <CssBaseline />\r\n <AppBar position=\"fixed\" open={leftDrawerOpen}>\r\n <Toolbar>\r\n <IconButton color=\"inherit\" onClick={toggleDrawerOpen} edge=\"start\" sx={{ marginRight: 2, ...(leftDrawerOpen && { display: \"none\" }) }} >\r\n <Menu />\r\n </IconButton>\r\n\r\n <Typography variant=\"h6\" noWrap component=\"div\" sx={{ flexGrow: 1 }}>{title}</Typography>\r\n\r\n {isDevelopment && <Chip color=\"secondary\" sx={{ mr: 1.5 }} label=\"Development\" />}\r\n\r\n <AccountMenu mode={mode} setMode={setMode} user={user} />\r\n </Toolbar>\r\n </AppBar>\r\n\r\n <LeftDrawer appVersion={appVersion} items={leftDrawerItems} drawerOpen={leftDrawerOpen} setDrawerOpen={setLeftDrawerOpen} />\r\n\r\n <Box component=\"main\" sx={{ flex: 1, overflow: \"auto\" }}>\r\n <DrawerHeader />\r\n {authorized ? children : <CenteredBox label={t(\"Layout.Unauthorized\")!} />}\r\n </Box>\r\n </Box>\r\n\r\n {(isFetching || isMutating) && <LinearProgress sx={{ position: \"fixed\", top: { xs: 56, sm: 64 }, left: 0, right: 0 }} />}\r\n </ThemeProvider>\r\n );\r\n}\r\n"]}
1
+ {"version":3,"file":"Layout.js","sourceRoot":"","sources":["../../../src/components/Layout.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Menu, Warning } from \"@mui/icons-material\";\r\nimport { Box, Chip, CssBaseline, IconButton, LinearProgress, AppBar as MuiAppBar, AppBarProps as MuiAppBarProps, PaletteMode, Theme, Toolbar, Typography, useMediaQuery } from \"@mui/material\";\r\nimport { csCZ, enUS } from \"@mui/material/locale\";\r\nimport { ThemeProvider, createTheme, styled } from \"@mui/material/styles\";\r\nimport { useIsFetching, useIsMutating } from \"@tanstack/react-query\";\r\nimport React, { useCallback, useEffect, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { useLocation } from \"react-router-dom\";\r\nimport { LeftDrawerItem } from \"../models/LeftDrawerItem\";\r\nimport { ExtendedUser } from \"../models/User\";\r\nimport { isDevelopment } from \"../utils/Helpers\";\r\nimport { persistStorage } from \"../utils/PersistStorage\";\r\nimport { hasRole } from \"../utils/UserService\";\r\nimport { Dialog } from \"./Dialog\";\r\nimport { TypographyWithIcon } from \"./TypographyWithIcon\";\r\nimport CenteredBox from \"./common/CenteredBox\";\r\nimport AccountMenu from \"./layout/AccountMenu\";\r\nimport LeftDrawer from \"./layout/LeftDrawer\";\r\nimport { Button } from \"./Button\";\r\n\r\n//Mode\r\nconst storedMode = persistStorage.get(\"mode\") as PaletteMode ?? \"system\";\r\n\r\n//Drawer\r\nconst drawerWidth = 240;\r\nconst DrawerHeader = styled(\"div\")(({ theme }) => ({\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"flex-end\",\r\n padding: theme.spacing(0, 1),\r\n // necessary for content to be below app bar\r\n ...theme.mixins.toolbar,\r\n}));\r\n\r\n//AppBar\r\ninterface AppBarProps extends MuiAppBarProps {\r\n open?: boolean;\r\n}\r\n\r\nconst AppBar = styled(MuiAppBar, {\r\n shouldForwardProp: (prop) => prop !== \"open\",\r\n})<AppBarProps>(({ theme, open }) => ({\r\n zIndex: theme.zIndex.drawer + 1,\r\n transition: theme.transitions.create([\"width\", \"margin\"], {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n ...(open && {\r\n marginLeft: drawerWidth,\r\n width: `calc(100% - ${drawerWidth}px)`,\r\n transition: theme.transitions.create([\"width\", \"margin\"], {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n }),\r\n}));\r\n\r\n//Layout\r\ninterface LayoutProps {\r\n title: string,\r\n appVersion: string,\r\n leftDrawerItems: LeftDrawerItem[],\r\n primaryColor: string,\r\n secondaryColor: string,\r\n children: React.ReactNode,\r\n user: ExtendedUser,\r\n initialized: boolean\r\n}\r\n\r\nexport default function Layout(props: LayoutProps) {\r\n const { primaryColor, secondaryColor, title, appVersion, leftDrawerItems, user, initialized, children } = props;\r\n const prefersDarkMode: boolean = useMediaQuery(\"(prefers-color-scheme: dark)\");\r\n const [mode, setMode] = useState<PaletteMode | \"system\">(storedMode);\r\n const [leftDrawerOpen, setLeftDrawerOpen] = useState<boolean>(false);\r\n const [authorized, setAuthorized] = useState<boolean>(true);\r\n const [developmentDialogOpen, setDevelopmentDialogOpen] = useState<boolean>(false);\r\n const isFetching = !!useIsFetching();\r\n const isMutating = !!useIsMutating();\r\n const location = useLocation();\r\n const { t, i18n } = useTranslation();\r\n\r\n const theme: Theme = createTheme({\r\n palette: {\r\n mode: mode === \"system\" ? prefersDarkMode ? \"dark\" : \"light\" : mode,\r\n primary: { main: primaryColor },\r\n secondary: { main: secondaryColor },\r\n },\r\n }, i18n.language === \"cs\" ? csCZ : enUS);\r\n\r\n useEffect(() => handleUnauthorized(), [location.pathname, initialized, leftDrawerItems]);\r\n\r\n const handleUnauthorized = () => {\r\n const activePage: LeftDrawerItem | undefined = leftDrawerItems.find(i => i.path === location.pathname);\r\n if (activePage?.hidden)\r\n return setAuthorized(false);\r\n\r\n return setAuthorized(true);\r\n };\r\n\r\n useEffect(() => {\r\n if (user.loggedIn && !hasRole([\"wcz-developers\"]))\r\n toggleDevelopmentDialogOpen();\r\n }, [user.loggedIn]);\r\n\r\n const toggleDevelopmentDialogOpen = useCallback(() => setDevelopmentDialogOpen(!developmentDialogOpen), [developmentDialogOpen]);\r\n\r\n const developmentDialog = (\r\n <Dialog\r\n open={developmentDialogOpen}\r\n onClose={toggleDevelopmentDialogOpen}\r\n title={<TypographyWithIcon variant=\"h6\" startIcon={<Warning />}>{t(\"Layout.DevelopmentDialogTitle\")}</TypographyWithIcon>}\r\n color=\"warning\"\r\n disableAutoClose\r\n actions={[<Button key=\"close\" color=\"warning\" onClick={toggleDevelopmentDialogOpen}>{t(\"Close\")}</Button>]}\r\n >\r\n {t(\"Layout.DevelopmentDialogContent\")}\r\n </Dialog>\r\n );\r\n\r\n const toggleDrawerOpen = useCallback(() => setLeftDrawerOpen(!leftDrawerOpen), [leftDrawerOpen]);\r\n\r\n return (\r\n <ThemeProvider theme={theme}>\r\n <Box sx={{ display: \"flex\", position: \"sticky\" }}>\r\n <CssBaseline />\r\n <AppBar position=\"fixed\" open={leftDrawerOpen}>\r\n <Toolbar>\r\n <IconButton color=\"inherit\" onClick={toggleDrawerOpen} edge=\"start\" sx={{ marginRight: 2, ...(leftDrawerOpen && { display: \"none\" }) }} >\r\n <Menu />\r\n </IconButton>\r\n\r\n <Typography variant=\"h6\" noWrap component=\"div\" sx={{ flexGrow: 1 }}>{title}</Typography>\r\n\r\n {isDevelopment && <Chip variant=\"outlined\" sx={theme => ({ mr: 1.5, color: theme.palette.primary.contrastText })} label=\"Development\" />}\r\n\r\n <AccountMenu mode={mode} setMode={setMode} user={user} />\r\n </Toolbar>\r\n </AppBar>\r\n\r\n <LeftDrawer appVersion={appVersion} items={leftDrawerItems} drawerOpen={leftDrawerOpen} setDrawerOpen={setLeftDrawerOpen} />\r\n\r\n <Box component=\"main\" sx={{ flex: 1, overflow: \"auto\" }}>\r\n <DrawerHeader />\r\n {authorized ? children : <CenteredBox label={t(\"Layout.Unauthorized\")!} />}\r\n </Box>\r\n </Box>\r\n\r\n {developmentDialog}\r\n {(isFetching || isMutating) && <LinearProgress sx={{ position: \"fixed\", top: { xs: 56, sm: 64 }, left: 0, right: 0 }} />}\r\n </ThemeProvider>\r\n );\r\n}\r\n"]}
@@ -1,2 +1,2 @@
1
- /// <reference types="react" />
2
- export declare const LayoutSnackbar: React.FC;
1
+ /// <reference types="react" />
2
+ export declare const LayoutSnackbar: React.FC;
@@ -1,17 +1,17 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Alert, AlertTitle, Snackbar } from "@mui/material";
3
- import { Fragment, useCallback, useContext } from "react";
4
- import { SnackbarContext } from "../contexts/SnackbarContext";
5
- export const LayoutSnackbar = () => {
6
- const { snackbar, setSnackbar } = useContext(SnackbarContext);
7
- const handleOnSnackbarClose = useCallback((_event, reason) => {
8
- if (reason === "clickaway")
9
- return;
10
- setSnackbar({ ...snackbar, message: "" });
11
- }, [snackbar]);
12
- return (_jsx(Snackbar, { open: !!snackbar.message, autoHideDuration: snackbar.autoHideDuration === undefined ? 6000 : snackbar.autoHideDuration, onClose: handleOnSnackbarClose, children: _jsx(Alert, { onClose: handleOnSnackbarClose, severity: snackbar.severity, sx: { width: "100%" }, variant: "filled", children: snackbar.description ?
13
- _jsxs(Fragment, { children: [_jsx(AlertTitle, { children: snackbar.message }), snackbar.description] })
14
- :
15
- snackbar.message }) }));
16
- };
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Alert, AlertTitle, Snackbar } from "@mui/material";
3
+ import { Fragment, useCallback, useContext } from "react";
4
+ import { SnackbarContext } from "../contexts/SnackbarContext";
5
+ export const LayoutSnackbar = () => {
6
+ const { snackbar, setSnackbar } = useContext(SnackbarContext);
7
+ const handleOnSnackbarClose = useCallback((_event, reason) => {
8
+ if (reason === "clickaway")
9
+ return;
10
+ setSnackbar({ ...snackbar, message: "" });
11
+ }, [snackbar]);
12
+ return (_jsx(Snackbar, { open: !!(snackbar === null || snackbar === void 0 ? void 0 : snackbar.message), autoHideDuration: (snackbar === null || snackbar === void 0 ? void 0 : snackbar.autoHideDuration) === undefined ? 6000 : snackbar.autoHideDuration, onClose: handleOnSnackbarClose, children: _jsx(Alert, { onClose: handleOnSnackbarClose, severity: snackbar === null || snackbar === void 0 ? void 0 : snackbar.severity, sx: { width: "100%" }, variant: "filled", children: (snackbar === null || snackbar === void 0 ? void 0 : snackbar.description) ?
13
+ _jsxs(Fragment, { children: [_jsx(AlertTitle, { children: snackbar === null || snackbar === void 0 ? void 0 : snackbar.message }), snackbar.description] })
14
+ :
15
+ snackbar === null || snackbar === void 0 ? void 0 : snackbar.message }) }));
16
+ };
17
17
  //# sourceMappingURL=LayoutSnackbar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LayoutSnackbar.js","sourceRoot":"","sources":["../../../src/components/LayoutSnackbar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAkB,WAAW,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,CAAC,MAAM,cAAc,GAAa,GAAG,EAAE;IACzC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAE9D,MAAM,qBAAqB,GAAG,WAAW,CAAC,CAAC,MAA+B,EAAE,MAAe,EAAE,EAAE;QAC3F,IAAI,MAAM,KAAK,WAAW;YAAE,OAAO;QACnC,WAAW,CAAC,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,OAAO,CACH,KAAC,QAAQ,IAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,EAAE,qBAAqB,YAC5J,KAAC,KAAK,IAAC,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAC,QAAQ,YACtG,QAAQ,CAAC,WAAW,CAAC,CAAC;gBACnB,MAAC,QAAQ,eACL,KAAC,UAAU,cAAE,QAAQ,CAAC,OAAO,GAAc,EAC1C,QAAQ,CAAC,WAAW,IACd;gBACX,CAAC;oBACD,QAAQ,CAAC,OAAO,GAEhB,GACD,CACd,CAAC;AACN,CAAC,CAAC","sourcesContent":["import { Alert, AlertTitle, Snackbar } from \"@mui/material\";\r\nimport { Fragment, SyntheticEvent, useCallback, useContext } from \"react\";\r\nimport { SnackbarContext } from \"../contexts/SnackbarContext\";\r\n\r\nexport const LayoutSnackbar: React.FC = () => {\r\n const { snackbar, setSnackbar } = useContext(SnackbarContext);\r\n\r\n const handleOnSnackbarClose = useCallback((_event?: SyntheticEvent | Event, reason?: string) => {\r\n if (reason === \"clickaway\") return;\r\n setSnackbar({ ...snackbar, message: \"\" });\r\n }, [snackbar]);\r\n\r\n return (\r\n <Snackbar open={!!snackbar.message} autoHideDuration={snackbar.autoHideDuration === undefined ? 6000 : snackbar.autoHideDuration} onClose={handleOnSnackbarClose}>\r\n <Alert onClose={handleOnSnackbarClose} severity={snackbar.severity} sx={{ width: \"100%\" }} variant=\"filled\">\r\n {snackbar.description ?\r\n <Fragment>\r\n <AlertTitle>{snackbar.message}</AlertTitle>\r\n {snackbar.description}\r\n </Fragment>\r\n :\r\n snackbar.message\r\n }\r\n </Alert>\r\n </Snackbar>\r\n );\r\n};"]}
1
+ {"version":3,"file":"LayoutSnackbar.js","sourceRoot":"","sources":["../../../src/components/LayoutSnackbar.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAkB,WAAW,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAE9D,MAAM,CAAC,MAAM,cAAc,GAAa,GAAG,EAAE;IACzC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;IAE9D,MAAM,qBAAqB,GAAG,WAAW,CAAC,CAAC,MAA+B,EAAE,MAAe,EAAE,EAAE;QAC3F,IAAI,MAAM,KAAK,WAAW;YAAE,OAAO;QACnC,WAAW,CAAC,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9C,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,OAAO,CACH,KAAC,QAAQ,IAAC,IAAI,EAAE,CAAC,CAAC,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,CAAA,EAAE,gBAAgB,EAAE,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,gBAAgB,MAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,EAAE,qBAAqB,YAC9J,KAAC,KAAK,IAAC,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAC,QAAQ,YACvG,CAAA,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,WAAW,EAAC,CAAC;gBACpB,MAAC,QAAQ,eACL,KAAC,UAAU,cAAE,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,GAAc,EAC3C,QAAQ,CAAC,WAAW,IACd;gBACX,CAAC;oBACD,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,GAEjB,GACD,CACd,CAAC;AACN,CAAC,CAAC","sourcesContent":["import { Alert, AlertTitle, Snackbar } from \"@mui/material\";\r\nimport { Fragment, SyntheticEvent, useCallback, useContext } from \"react\";\r\nimport { SnackbarContext } from \"../contexts/SnackbarContext\";\r\n\r\nexport const LayoutSnackbar: React.FC = () => {\r\n const { snackbar, setSnackbar } = useContext(SnackbarContext);\r\n\r\n const handleOnSnackbarClose = useCallback((_event?: SyntheticEvent | Event, reason?: string) => {\r\n if (reason === \"clickaway\") return;\r\n setSnackbar({ ...snackbar, message: \"\" });\r\n }, [snackbar]);\r\n\r\n return (\r\n <Snackbar open={!!snackbar?.message} autoHideDuration={snackbar?.autoHideDuration === undefined ? 6000 : snackbar.autoHideDuration} onClose={handleOnSnackbarClose}>\r\n <Alert onClose={handleOnSnackbarClose} severity={snackbar?.severity} sx={{ width: \"100%\" }} variant=\"filled\">\r\n {snackbar?.description ?\r\n <Fragment>\r\n <AlertTitle>{snackbar?.message}</AlertTitle>\r\n {snackbar.description}\r\n </Fragment>\r\n :\r\n snackbar?.message\r\n }\r\n </Alert>\r\n </Snackbar>\r\n );\r\n};"]}
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ import { TypographyProps } from "@mui/material";
3
+ interface TypographyWithIconProps extends TypographyProps {
4
+ startIcon?: React.ReactNode;
5
+ endIcon?: React.ReactNode;
6
+ }
7
+ export declare const TypographyWithIcon: React.FC<TypographyWithIconProps>;
8
+ export {};
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Typography } from "@mui/material";
3
+ export const TypographyWithIcon = ({ startIcon, endIcon, children, ...props }) => {
4
+ return (_jsxs(Typography, { ...props, sx: { ...props.sx, display: "flex", alignItems: "center" }, children: [startIcon && _jsx(Box, { sx: { mr: 1, display: "inherit" }, children: startIcon }), children, endIcon && _jsx(Box, { sx: { ml: 1, display: "inherit" }, children: endIcon })] }));
5
+ };
6
+ //# sourceMappingURL=TypographyWithIcon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TypographyWithIcon.js","sourceRoot":"","sources":["../../../src/components/TypographyWithIcon.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,UAAU,EAAmB,MAAM,eAAe,CAAC;AAOjE,MAAM,CAAC,MAAM,kBAAkB,GAAsC,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE,EAAE,EAAE;IAChH,OAAO,CACH,MAAC,UAAU,OAAK,KAAK,EAAE,EAAE,EAAE,EAAE,GAAG,KAAK,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,aAC5E,SAAS,IAAI,KAAC,GAAG,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,YAAG,SAAS,GAAO,EACtE,QAAQ,EACR,OAAO,IAAI,KAAC,GAAG,IAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,YAAG,OAAO,GAAO,IAC1D,CAChB,CAAC;AACN,CAAC,CAAC","sourcesContent":["import { Box, Typography, TypographyProps } from \"@mui/material\";\r\n\r\ninterface TypographyWithIconProps extends TypographyProps {\r\n startIcon?: React.ReactNode;\r\n endIcon?: React.ReactNode;\r\n}\r\n\r\nexport const TypographyWithIcon: React.FC<TypographyWithIconProps> = ({ startIcon, endIcon, children, ...props }) => {\r\n return (\r\n <Typography {...props} sx={{ ...props.sx, display: \"flex\", alignItems: \"center\" }}>\r\n {startIcon && <Box sx={{ mr: 1, display: \"inherit\" }}>{startIcon}</Box>}\r\n {children}\r\n {endIcon && <Box sx={{ ml: 1, display: \"inherit\" }}>{endIcon}</Box>}\r\n </Typography>\r\n );\r\n};"]}
@@ -1,6 +1,6 @@
1
- interface CenteredBoxProps {
2
- label?: string;
3
- circularProgress?: boolean;
4
- }
5
- export default function CenteredBox(props: CenteredBoxProps): import("react/jsx-runtime").JSX.Element;
6
- export {};
1
+ interface CenteredBoxProps {
2
+ label?: string;
3
+ circularProgress?: boolean;
4
+ }
5
+ export default function CenteredBox(props: CenteredBoxProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -1,13 +1,13 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Box, CircularProgress, Typography } from "@mui/material";
3
- import { useEffect, useState } from "react";
4
- export default function CenteredBox(props) {
5
- const { label, circularProgress } = props;
6
- const [delayedLabel, setDelayedLabel] = useState(undefined);
7
- useEffect(() => {
8
- if (label)
9
- setTimeout(() => setDelayedLabel(label), 1000);
10
- }, [label]);
11
- return (_jsx(Box, { sx: { position: "relative", height: { xs: "calc(100vh - 56px)", sm: "calc(100vh - 64px)" } }, children: _jsxs(Box, { sx: { position: "absolute", top: "50%", left: "50%", transform: "translate(-50%, -50%)" }, children: [delayedLabel && _jsx(Typography, { variant: "h6", children: delayedLabel }), circularProgress && _jsx(CircularProgress, {})] }) }));
12
- }
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, CircularProgress, Typography } from "@mui/material";
3
+ import { useEffect, useState } from "react";
4
+ export default function CenteredBox(props) {
5
+ const { label, circularProgress } = props;
6
+ const [delayedLabel, setDelayedLabel] = useState(undefined);
7
+ useEffect(() => {
8
+ if (label)
9
+ setTimeout(() => setDelayedLabel(label), 1000);
10
+ }, [label]);
11
+ return (_jsx(Box, { sx: { position: "relative", height: { xs: "calc(100vh - 56px)", sm: "calc(100vh - 64px)" } }, children: _jsxs(Box, { sx: { position: "absolute", top: "50%", left: "50%", transform: "translate(-50%, -50%)" }, children: [delayedLabel && _jsx(Typography, { variant: "h6", children: delayedLabel }), circularProgress && _jsx(CircularProgress, {})] }) }));
12
+ }
13
13
  //# sourceMappingURL=CenteredBox.js.map
@@ -1,9 +1,9 @@
1
- import { PaletteMode } from "@mui/material";
2
- import { ExtendedUser } from "../../models/User";
3
- interface AccountMenuProps {
4
- mode: PaletteMode | "system";
5
- setMode: (mode: PaletteMode | "system") => void;
6
- user: ExtendedUser;
7
- }
8
- export default function AccountMenu(props: AccountMenuProps): import("react/jsx-runtime").JSX.Element;
9
- export {};
1
+ import { PaletteMode } from "@mui/material";
2
+ import { ExtendedUser } from "../../models/User";
3
+ interface AccountMenuProps {
4
+ mode: PaletteMode | "system";
5
+ setMode: (mode: PaletteMode | "system") => void;
6
+ user: ExtendedUser;
7
+ }
8
+ export default function AccountMenu(props: AccountMenuProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -1,51 +1,51 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { AccountCircle, ArrowBack, Brightness4, ChevronRight, DarkMode, LightMode, Login, Logout, SettingsBrightness, Translate } from "@mui/icons-material";
3
- import { Avatar, Box, IconButton, List, ListItem, ListItemButton, ListItemIcon, ListItemText, ListSubheader, Menu, Typography } from "@mui/material";
4
- import { grey } from "@mui/material/colors";
5
- import { Fragment, useCallback, useRef, useState } from "react";
6
- import { useTranslation } from "react-i18next";
7
- import { persistStorage } from "../../utils/PersistStorage";
8
- const drawerWidth = 240;
9
- export default function AccountMenu(props) {
10
- const { mode, setMode, user } = props;
11
- const [anchorEl, setAnchorEl] = useState(null);
12
- const [tab, setTab] = useState("settings");
13
- const open = Boolean(anchorEl);
14
- const accountButtonElement = useRef(null);
15
- const { t, i18n } = useTranslation();
16
- const changeLanguage = useCallback((newLanguage) => () => {
17
- i18n.changeLanguage(newLanguage)
18
- .finally(() => closeMenu());
19
- }, []);
20
- const changeMode = useCallback((newMode) => () => {
21
- setMode(newMode);
22
- closeMenu();
23
- persistStorage.set("mode", newMode);
24
- }, []);
25
- const getNameInitials = () => {
26
- const splittedName = user.name.split(" ");
27
- return `${splittedName[0][0]}${splittedName.length > 1 ? splittedName[1][0] : ""}`;
28
- };
29
- const openMenu = useCallback((e) => setAnchorEl(e.currentTarget), []);
30
- const closeMenu = useCallback(() => { setAnchorEl(null); setTimeout(() => setTab("settings"), 300); }, []);
31
- const login = useCallback(() => {
32
- user.login()
33
- .catch(console.error);
34
- }, []);
35
- const logout = useCallback(() => {
36
- user.logout()
37
- .catch(console.error);
38
- }, []);
39
- const changeTab = useCallback((newTab) => () => setTab(newTab), []);
40
- const settings = (_jsxs(List, { component: "nav", subheader: _jsx(ListSubheader, { sx: { backgroundColor: "transparent" }, children: t("Layout.Settings") }), children: [_jsxs(ListItemButton, { onClick: changeTab("theme"), sx: { py: 0.3 }, children: [_jsx(ListItemIcon, { children: _jsx(Brightness4, {}) }), _jsx(ListItemText, { primary: t("Layout.Appearance"), secondary: t(`Layout.${mode.charAt(0).toUpperCase() + mode.slice(1)}`) }), _jsx(ChevronRight, {})] }), _jsxs(ListItemButton, { onClick: changeTab("language"), sx: { py: 0.3 }, children: [_jsx(ListItemIcon, { children: _jsx(Translate, {}) }), _jsx(ListItemText, { primary: t("Layout.Language"), secondary: i18n.resolvedLanguage === "en" ? "English" : "Čeština" }), _jsx(ChevronRight, {})] })] }));
41
- const theme = (_jsxs(List, { subheader: _jsxs(ListSubheader, { onClick: changeTab("settings"), sx: { backgroundColor: "transparent", display: "flex", alignItems: "center", px: 1, cursor: "pointer" }, children: [_jsx(IconButton, { size: "small", sx: { mr: 0.5 }, children: _jsx(ArrowBack, { fontSize: "small" }) }), " ", t("Layout.Appearance")] }), children: [_jsxs(ListItemButton, { onClick: changeMode("light"), disabled: mode === "light", children: [_jsx(ListItemIcon, { children: _jsx(LightMode, {}) }), _jsx(ListItemText, { primary: t("Layout.Light") })] }), _jsxs(ListItemButton, { onClick: changeMode("dark"), disabled: mode === "dark", children: [_jsx(ListItemIcon, { children: _jsx(DarkMode, {}) }), _jsx(ListItemText, { primary: t("Layout.Dark") })] }), _jsxs(ListItemButton, { onClick: changeMode("system"), disabled: mode === "system", children: [_jsx(ListItemIcon, { children: _jsx(SettingsBrightness, {}) }), _jsx(ListItemText, { primary: t("Layout.System") })] })] }));
42
- const language = (_jsxs(List, { subheader: _jsxs(ListSubheader, { onClick: changeTab("settings"), sx: { backgroundColor: "transparent", display: "flex", alignItems: "center", px: 1, cursor: "pointer" }, children: [_jsx(IconButton, { size: "small", sx: { mr: 0.5 }, children: _jsx(ArrowBack, { fontSize: "small" }) }), " ", t("Layout.Language")] }), children: [_jsx(ListItemButton, { onClick: changeLanguage("en"), disabled: i18n.resolvedLanguage === "en", children: _jsx(ListItemText, { primary: "English" }) }), _jsx(ListItemButton, { onClick: changeLanguage("cs"), disabled: i18n.resolvedLanguage === "cs", children: _jsx(ListItemText, { primary: "\u010Ce\u0161tina" }) })] }));
43
- return (_jsxs(Fragment, { children: [_jsx(IconButton, { color: "inherit", onClick: openMenu, edge: "end", ref: accountButtonElement, children: user.name ?
44
- _jsx(Avatar, { sx: { bgcolor: "white", color: grey[800], width: 32, height: 32, }, children: _jsx(Typography, { variant: "subtitle2", sx: { fontWeight: "bold", lineHeight: 0 }, children: getNameInitials() }) })
45
- :
46
- _jsx(AccountCircle, {}) }), _jsx(Menu, { anchorEl: anchorEl, open: open, onClose: closeMenu, children: _jsxs(Box, { sx: { width: drawerWidth }, role: "presentation", children: [_jsx(List, { "aria-labelledby": "account-menu", children: user.name ?
47
- _jsxs(Fragment, { children: [_jsx(ListItem, { children: _jsx(ListItemText, { primary: user.name, secondary: _jsxs("span", { children: [_jsx("span", { children: user.id }), _jsx("br", {}), _jsx("span", { children: user.department })] }) }) }), _jsxs(ListItemButton, { onClick: logout, children: [_jsx(ListItemIcon, { children: _jsx(Logout, { color: "error" }) }), _jsx(ListItemText, { primary: t("Layout.Logout") })] })] })
48
- :
49
- _jsxs(ListItemButton, { onClick: login, children: [_jsx(ListItemIcon, { children: _jsx(Login, { color: "success" }) }), _jsx(ListItemText, { primary: t("Layout.LogIn") })] }) }), tab === "settings" && settings, tab === "theme" && theme, tab === "language" && language] }) })] }));
50
- }
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { AccountCircle, ArrowBack, Brightness4, ChevronRight, DarkMode, LightMode, Login, Logout, SettingsBrightness, Translate } from "@mui/icons-material";
3
+ import { Avatar, Box, IconButton, List, ListItem, ListItemButton, ListItemIcon, ListItemText, ListSubheader, Menu, Typography } from "@mui/material";
4
+ import { grey } from "@mui/material/colors";
5
+ import { Fragment, useCallback, useRef, useState } from "react";
6
+ import { useTranslation } from "react-i18next";
7
+ import { persistStorage } from "../../utils/PersistStorage";
8
+ const drawerWidth = 240;
9
+ export default function AccountMenu(props) {
10
+ const { mode, setMode, user } = props;
11
+ const [anchorEl, setAnchorEl] = useState(null);
12
+ const [tab, setTab] = useState("settings");
13
+ const open = Boolean(anchorEl);
14
+ const accountButtonElement = useRef(null);
15
+ const { t, i18n } = useTranslation();
16
+ const changeLanguage = useCallback((newLanguage) => () => {
17
+ i18n.changeLanguage(newLanguage)
18
+ .finally(() => closeMenu());
19
+ }, []);
20
+ const changeMode = useCallback((newMode) => () => {
21
+ setMode(newMode);
22
+ closeMenu();
23
+ persistStorage.set("mode", newMode);
24
+ }, []);
25
+ const getNameInitials = () => {
26
+ const splittedName = user.name.split(" ");
27
+ return `${splittedName[0][0]}${splittedName.length > 1 ? splittedName[1][0] : ""}`;
28
+ };
29
+ const openMenu = useCallback((e) => setAnchorEl(e.currentTarget), []);
30
+ const closeMenu = useCallback(() => { setAnchorEl(null); setTimeout(() => setTab("settings"), 300); }, []);
31
+ const login = useCallback(() => {
32
+ user.login()
33
+ .catch(console.error);
34
+ }, []);
35
+ const logout = useCallback(() => {
36
+ user.logout()
37
+ .catch(console.error);
38
+ }, []);
39
+ const changeTab = useCallback((newTab) => () => setTab(newTab), []);
40
+ const settings = (_jsxs(List, { component: "nav", subheader: _jsx(ListSubheader, { sx: { backgroundColor: "transparent" }, children: t("Layout.Settings") }), children: [_jsxs(ListItemButton, { onClick: changeTab("theme"), sx: { py: 0.3 }, children: [_jsx(ListItemIcon, { children: _jsx(Brightness4, {}) }), _jsx(ListItemText, { primary: t("Layout.Appearance"), secondary: t(`Layout.${mode.charAt(0).toUpperCase() + mode.slice(1)}`) }), _jsx(ChevronRight, {})] }), _jsxs(ListItemButton, { onClick: changeTab("language"), sx: { py: 0.3 }, children: [_jsx(ListItemIcon, { children: _jsx(Translate, {}) }), _jsx(ListItemText, { primary: t("Layout.Language"), secondary: i18n.resolvedLanguage === "en" ? "English" : "Čeština" }), _jsx(ChevronRight, {})] })] }));
41
+ const theme = (_jsxs(List, { subheader: _jsxs(ListSubheader, { onClick: changeTab("settings"), sx: { backgroundColor: "transparent", display: "flex", alignItems: "center", px: 1, cursor: "pointer" }, children: [_jsx(IconButton, { size: "small", sx: { mr: 0.5 }, children: _jsx(ArrowBack, { fontSize: "small" }) }), " ", t("Layout.Appearance")] }), children: [_jsxs(ListItemButton, { onClick: changeMode("light"), disabled: mode === "light", children: [_jsx(ListItemIcon, { children: _jsx(LightMode, {}) }), _jsx(ListItemText, { primary: t("Layout.Light") })] }), _jsxs(ListItemButton, { onClick: changeMode("dark"), disabled: mode === "dark", children: [_jsx(ListItemIcon, { children: _jsx(DarkMode, {}) }), _jsx(ListItemText, { primary: t("Layout.Dark") })] }), _jsxs(ListItemButton, { onClick: changeMode("system"), disabled: mode === "system", children: [_jsx(ListItemIcon, { children: _jsx(SettingsBrightness, {}) }), _jsx(ListItemText, { primary: t("Layout.System") })] })] }));
42
+ const language = (_jsxs(List, { subheader: _jsxs(ListSubheader, { onClick: changeTab("settings"), sx: { backgroundColor: "transparent", display: "flex", alignItems: "center", px: 1, cursor: "pointer" }, children: [_jsx(IconButton, { size: "small", sx: { mr: 0.5 }, children: _jsx(ArrowBack, { fontSize: "small" }) }), " ", t("Layout.Language")] }), children: [_jsx(ListItemButton, { onClick: changeLanguage("en"), disabled: i18n.resolvedLanguage === "en", children: _jsx(ListItemText, { primary: "English" }) }), _jsx(ListItemButton, { onClick: changeLanguage("cs"), disabled: i18n.resolvedLanguage === "cs", children: _jsx(ListItemText, { primary: "\u010Ce\u0161tina" }) })] }));
43
+ return (_jsxs(Fragment, { children: [_jsx(IconButton, { color: "inherit", onClick: openMenu, edge: "end", ref: accountButtonElement, children: user.name ?
44
+ _jsx(Avatar, { sx: { bgcolor: "white", color: grey[800], width: 32, height: 32, }, children: _jsx(Typography, { variant: "subtitle2", sx: { fontWeight: "bold", lineHeight: 0 }, children: getNameInitials() }) })
45
+ :
46
+ _jsx(AccountCircle, {}) }), _jsx(Menu, { anchorEl: anchorEl, open: open, onClose: closeMenu, children: _jsxs(Box, { sx: { width: drawerWidth }, role: "presentation", children: [_jsx(List, { "aria-labelledby": "account-menu", children: user.name ?
47
+ _jsxs(Fragment, { children: [_jsx(ListItem, { children: _jsx(ListItemText, { primary: user.name, secondary: _jsxs("span", { children: [_jsx("span", { children: user.id }), _jsx("br", {}), _jsx("span", { children: user.department })] }) }) }), _jsxs(ListItemButton, { onClick: logout, children: [_jsx(ListItemIcon, { children: _jsx(Logout, { color: "error" }) }), _jsx(ListItemText, { primary: t("Layout.Logout") })] })] })
48
+ :
49
+ _jsxs(ListItemButton, { onClick: login, children: [_jsx(ListItemIcon, { children: _jsx(Login, { color: "success" }) }), _jsx(ListItemText, { primary: t("Layout.LogIn") })] }) }), tab === "settings" && settings, tab === "theme" && theme, tab === "language" && language] }) })] }));
50
+ }
51
51
  //# sourceMappingURL=AccountMenu.js.map