wcz-layout 5.3.1 → 5.4.0
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/dist/src/components/layout/LeftDrawer.js +6 -3
- package/dist/src/components/layout/LeftDrawer.js.map +1 -1
- package/dist/src/contexts/LayoutContext.js +3 -18
- package/dist/src/contexts/LayoutContext.js.map +1 -1
- package/dist/src/models/LeftDrawerItem.d.ts +1 -0
- package/dist/src/models/LeftDrawerItem.js.map +1 -1
- package/dist/src/models/User.js.map +1 -1
- package/dist/src/utils/UseUser.d.ts +2 -2
- package/dist/src/utils/UseUser.js +10 -2
- package/dist/src/utils/UseUser.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/components/layout/LeftDrawer.tsx +19 -10
- package/src/contexts/LayoutContext.tsx +4 -21
- package/src/models/LeftDrawerItem.ts +7 -6
- package/src/models/User.ts +12 -12
- package/src/utils/UseUser.tsx +13 -4
|
@@ -47,6 +47,7 @@ const Drawer = styled(MuiDrawer, { shouldForwardProp: (prop) => prop !== 'open'
|
|
|
47
47
|
'& .MuiDrawer-paper': closedMixin(theme),
|
|
48
48
|
}),
|
|
49
49
|
}));
|
|
50
|
+
const isExternalUrl = (url) => url.startsWith('http://') || url.startsWith('https://');
|
|
50
51
|
export default function LeftDrawer(props) {
|
|
51
52
|
const { appVersion, drawerOpen, setDrawerOpen, items } = props;
|
|
52
53
|
const theme = useTheme();
|
|
@@ -56,12 +57,14 @@ export default function LeftDrawer(props) {
|
|
|
56
57
|
const openDrawer = useCallback(() => setDrawerOpen(true), []);
|
|
57
58
|
const closeDrawer = useCallback(() => setDrawerOpen(false), []);
|
|
58
59
|
const handleMenuItemClick = useCallback((path) => () => {
|
|
59
|
-
|
|
60
|
+
setDrawerOpen(false);
|
|
60
61
|
if (location.pathname === path)
|
|
61
62
|
return window.location.reload();
|
|
62
|
-
|
|
63
|
+
if (isExternalUrl(path))
|
|
64
|
+
return window.open(path, '_blank');
|
|
65
|
+
navigate(path);
|
|
63
66
|
}, [location.pathname]);
|
|
64
|
-
const menuItems = (_jsx(List, { children: items.filter(item => !item.hidden).map(item => _jsx(ListItem, { disablePadding: true, sx: { display: 'block' }, onClick: handleMenuItemClick(item.path), children: _jsxs(ListItemButton, { selected: location.pathname === item.path, children: [_jsx(ListItemIcon, { children: item.icon }), _jsx(ListItemText, { primary: t(item.title) })] }) }, item.path)) }));
|
|
67
|
+
const menuItems = (_jsx(List, { children: items.filter(item => !item.hidden).map(item => _jsxs(Fragment, { children: [_jsx(ListItem, { disablePadding: true, sx: { display: 'block' }, onClick: handleMenuItemClick(item.path), children: _jsxs(ListItemButton, { selected: location.pathname === item.path, children: [_jsx(ListItemIcon, { children: item.icon }), _jsx(ListItemText, { primary: t(item.title) })] }) }), item.divider && _jsx(Divider, { sx: { my: 1 } })] }, item.path)) }));
|
|
65
68
|
const hasItems = useMemo(() => (items.filter(item => !item.hidden).length > 1), [items]);
|
|
66
69
|
return (_jsxs(Fragment, { children: [_jsxs(Drawer, { variant: "permanent", open: drawerOpen, sx: { display: { xs: 'none', sm: hasItems ? 'inherit' : 'none' } }, children: [_jsxs(DrawerHeader, { children: [_jsxs(Typography, { sx: { flexGrow: 1, textAlign: 'center', marginLeft: 3 }, children: [t("Layout.Version"), ": ", appVersion] }), _jsx(IconButton, { onClick: closeDrawer, children: theme.direction === 'rtl' ? _jsx(ChevronRight, {}) : _jsx(ChevronLeft, {}) })] }), _jsx(Divider, {}), menuItems] }), _jsx(SwipeableDrawer, { anchor: "left", open: drawerOpen, onClose: closeDrawer, onOpen: openDrawer, sx: { display: { xs: 'inherit', sm: hasItems ? 'none' : 'inherit' } }, children: _jsxs(Box, { sx: { width: drawerWidth }, role: "presentation", children: [_jsxs(Typography, { sx: { textAlign: 'center', my: 1.5 }, children: [t("Layout.Version"), ": ", appVersion] }), menuItems] }) })] }));
|
|
67
70
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LeftDrawer.js","sourceRoot":"","sources":["../../../../src/components/layout/LeftDrawer.tsx"],"names":[],"mappings":"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","sourcesContent":["import { ChevronLeft, ChevronRight } from '@mui/icons-material';\r\nimport { Box, Divider, Drawer as MuiDrawer, IconButton, List, ListItem, ListItemButton, ListItemIcon, ListItemText, SwipeableDrawer, Typography } from '@mui/material';\r\nimport { CSSObject, styled, Theme, useTheme } from '@mui/material/styles';\r\nimport { Fragment, useCallback, useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useLocation, useNavigate } from 'react-router-dom';\r\nimport { LeftDrawerItem as LeftDrawerItemModel } from '../../models/LeftDrawerItem';\r\n\r\nconst drawerWidth = 240;\r\n\r\nconst openedMixin = (theme: Theme): CSSObject => ({\r\n width: drawerWidth,\r\n transition: theme.transitions.create('width', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n overflowX: 'hidden',\r\n});\r\n\r\nconst closedMixin = (theme: Theme): CSSObject => ({\r\n transition: theme.transitions.create('width', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n overflowX: 'hidden',\r\n width: `calc(${theme.spacing(7)} + 1px)`,\r\n [theme.breakpoints.up('sm')]: {\r\n width: `calc(${theme.spacing(8.4)} + 1px)`,\r\n },\r\n});\r\n\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\nconst Drawer = styled(MuiDrawer, { shouldForwardProp: (prop) => prop !== 'open' })(\r\n ({ theme, open }) => ({\r\n width: drawerWidth,\r\n flexShrink: 0,\r\n whiteSpace: 'nowrap',\r\n boxSizing: 'border-box',\r\n ...(open && {\r\n ...openedMixin(theme),\r\n '& .MuiDrawer-paper': openedMixin(theme),\r\n }),\r\n ...(!open && {\r\n ...closedMixin(theme),\r\n '& .MuiDrawer-paper': closedMixin(theme),\r\n }),\r\n }),\r\n);\r\n\r\ninterface LeftDrawerProps {\r\n appVersion: string,\r\n drawerOpen: boolean,\r\n setDrawerOpen: (drawerOpen: boolean) => void,\r\n items: LeftDrawerItemModel[]\r\n}\r\n\r\nexport default function LeftDrawer(props: LeftDrawerProps) {\r\n const { appVersion, drawerOpen, setDrawerOpen, items } = props;\r\n const theme = useTheme();\r\n const { t } = useTranslation();\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n\r\n const openDrawer = useCallback(() => setDrawerOpen(true), []);\r\n const closeDrawer = useCallback(() => setDrawerOpen(false), []);\r\n\r\n const handleMenuItemClick = useCallback((path: string) => () => {\r\n navigate(path);\r\n\r\n if (location.pathname === path)\r\n return window.location.reload();\r\n\r\n setDrawerOpen(false);\r\n }, [location.pathname]);\r\n\r\n const menuItems = (\r\n <List>\r\n {items.filter(item => !item.hidden).map(item =>\r\n <ListItem key={item.path} disablePadding sx={{ display: 'block' }} onClick={handleMenuItemClick(item.path)}>\r\n <ListItemButton selected={location.pathname === item.path} >\r\n <ListItemIcon>\r\n {item.icon}\r\n </ListItemIcon>\r\n <ListItemText primary={t(item.title)} />\r\n </ListItemButton>\r\n </ListItem>\r\n )}\r\n </List>\r\n );\r\n\r\n const hasItems: boolean = useMemo(() => (items.filter(item => !item.hidden).length > 1), [items]);\r\n return (\r\n <Fragment>\r\n <Drawer variant=\"permanent\" open={drawerOpen} sx={{ display: { xs: 'none', sm: hasItems ? 'inherit' : 'none' } }}>\r\n <DrawerHeader>\r\n <Typography sx={{ flexGrow: 1, textAlign: 'center', marginLeft: 3 }}>{t(\"Layout.Version\")}: {appVersion}</Typography>\r\n <IconButton onClick={closeDrawer}>\r\n {theme.direction === 'rtl' ? <ChevronRight /> : <ChevronLeft />}\r\n </IconButton>\r\n </DrawerHeader>\r\n <Divider />\r\n {menuItems}\r\n </Drawer>\r\n\r\n <SwipeableDrawer anchor=\"left\" open={drawerOpen} onClose={closeDrawer} onOpen={openDrawer} sx={{ display: { xs: 'inherit', sm: hasItems ? 'none' : 'inherit' } }}>\r\n <Box sx={{ width: drawerWidth }} role=\"presentation\">\r\n <Typography sx={{ textAlign: 'center', my: 1.5 }}>{t(\"Layout.Version\")}: {appVersion}</Typography>\r\n {menuItems}\r\n </Box>\r\n </SwipeableDrawer>\r\n </Fragment>\r\n );\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"LeftDrawer.js","sourceRoot":"","sources":["../../../../src/components/layout/LeftDrawer.tsx"],"names":[],"mappings":"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","sourcesContent":["import { ChevronLeft, ChevronRight } from '@mui/icons-material';\r\nimport { Box, Divider, Drawer as MuiDrawer, IconButton, List, ListItem, ListItemButton, ListItemIcon, ListItemText, SwipeableDrawer, Typography } from '@mui/material';\r\nimport { CSSObject, styled, Theme, useTheme } from '@mui/material/styles';\r\nimport { Fragment, useCallback, useMemo } from 'react';\r\nimport { useTranslation } from 'react-i18next';\r\nimport { useLocation, useNavigate } from 'react-router-dom';\r\nimport { LeftDrawerItem as LeftDrawerItemModel } from '../../models/LeftDrawerItem';\r\n\r\nconst drawerWidth = 240;\r\n\r\nconst openedMixin = (theme: Theme): CSSObject => ({\r\n width: drawerWidth,\r\n transition: theme.transitions.create('width', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.enteringScreen,\r\n }),\r\n overflowX: 'hidden',\r\n});\r\n\r\nconst closedMixin = (theme: Theme): CSSObject => ({\r\n transition: theme.transitions.create('width', {\r\n easing: theme.transitions.easing.sharp,\r\n duration: theme.transitions.duration.leavingScreen,\r\n }),\r\n overflowX: 'hidden',\r\n width: `calc(${theme.spacing(7)} + 1px)`,\r\n [theme.breakpoints.up('sm')]: {\r\n width: `calc(${theme.spacing(8.4)} + 1px)`,\r\n },\r\n});\r\n\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\nconst Drawer = styled(MuiDrawer, { shouldForwardProp: (prop) => prop !== 'open' })(\r\n ({ theme, open }) => ({\r\n width: drawerWidth,\r\n flexShrink: 0,\r\n whiteSpace: 'nowrap',\r\n boxSizing: 'border-box',\r\n ...(open && {\r\n ...openedMixin(theme),\r\n '& .MuiDrawer-paper': openedMixin(theme),\r\n }),\r\n ...(!open && {\r\n ...closedMixin(theme),\r\n '& .MuiDrawer-paper': closedMixin(theme),\r\n }),\r\n }),\r\n);\r\n\r\nconst isExternalUrl = (url: string) => url.startsWith('http://') || url.startsWith('https://');\r\n\r\ninterface LeftDrawerProps {\r\n appVersion: string,\r\n drawerOpen: boolean,\r\n setDrawerOpen: (drawerOpen: boolean) => void,\r\n items: LeftDrawerItemModel[]\r\n}\r\n\r\nexport default function LeftDrawer(props: LeftDrawerProps) {\r\n const { appVersion, drawerOpen, setDrawerOpen, items } = props;\r\n const theme = useTheme();\r\n const { t } = useTranslation();\r\n const navigate = useNavigate();\r\n const location = useLocation();\r\n\r\n const openDrawer = useCallback(() => setDrawerOpen(true), []);\r\n const closeDrawer = useCallback(() => setDrawerOpen(false), []);\r\n\r\n const handleMenuItemClick = useCallback((path: string) => () => {\r\n setDrawerOpen(false);\r\n\r\n if (location.pathname === path)\r\n return window.location.reload();\r\n\r\n if (isExternalUrl(path))\r\n return window.open(path, '_blank');\r\n\r\n navigate(path);\r\n }, [location.pathname]);\r\n\r\n const menuItems = (\r\n <List>\r\n {items.filter(item => !item.hidden).map(item =>\r\n <Fragment key={item.path}>\r\n <ListItem disablePadding sx={{ display: 'block' }} onClick={handleMenuItemClick(item.path)}>\r\n <ListItemButton selected={location.pathname === item.path}>\r\n <ListItemIcon>\r\n {item.icon}\r\n </ListItemIcon>\r\n <ListItemText primary={t(item.title)} />\r\n </ListItemButton>\r\n </ListItem>\r\n\r\n {item.divider && <Divider sx={{ my: 1 }} />}\r\n </Fragment>\r\n )}\r\n </List>\r\n );\r\n\r\n const hasItems: boolean = useMemo(() => (items.filter(item => !item.hidden).length > 1), [items]);\r\n return (\r\n <Fragment>\r\n <Drawer variant=\"permanent\" open={drawerOpen} sx={{ display: { xs: 'none', sm: hasItems ? 'inherit' : 'none' } }}>\r\n <DrawerHeader>\r\n <Typography sx={{ flexGrow: 1, textAlign: 'center', marginLeft: 3 }}>{t(\"Layout.Version\")}: {appVersion}</Typography>\r\n <IconButton onClick={closeDrawer}>\r\n {theme.direction === 'rtl' ? <ChevronRight /> : <ChevronLeft />}\r\n </IconButton>\r\n </DrawerHeader>\r\n <Divider />\r\n {menuItems}\r\n </Drawer>\r\n\r\n <SwipeableDrawer anchor=\"left\" open={drawerOpen} onClose={closeDrawer} onOpen={openDrawer} sx={{ display: { xs: 'inherit', sm: hasItems ? 'none' : 'inherit' } }}>\r\n <Box sx={{ width: drawerWidth }} role=\"presentation\">\r\n <Typography sx={{ textAlign: 'center', my: 1.5 }}>{t(\"Layout.Version\")}: {appVersion}</Typography>\r\n {menuItems}\r\n </Box>\r\n </SwipeableDrawer>\r\n </Fragment>\r\n );\r\n}\r\n"]}
|
|
@@ -10,11 +10,11 @@ import { initReactI18next, useTranslation } from 'react-i18next';
|
|
|
10
10
|
import CenteredBox from '../components/common/CenteredBox';
|
|
11
11
|
import Layout from '../components/Layout';
|
|
12
12
|
import { persistStorage } from '../utils/PersistStorage';
|
|
13
|
-
import {
|
|
13
|
+
import { initKeycloak } from '../utils/UserService';
|
|
14
|
+
import { useUser } from '../utils/UseUser';
|
|
14
15
|
export const LayoutContext = createContext({});
|
|
15
16
|
//User
|
|
16
17
|
initKeycloak();
|
|
17
|
-
const initialUser = { login: doLogin, logout: doLogout, loggedIn: loggedIn(), department: "", id: "", name: "" };
|
|
18
18
|
//QueryClient
|
|
19
19
|
const queryClient = new QueryClient({ defaultOptions: { queries: { enabled: false } } });
|
|
20
20
|
//Localization
|
|
@@ -35,26 +35,11 @@ moment.fn.formatDateTime = function () {
|
|
|
35
35
|
return this.format("YYYY-MM-DD HH:mm");
|
|
36
36
|
};
|
|
37
37
|
export function LayoutProvider(props) {
|
|
38
|
-
const [user, setUser] = useState(initialUser);
|
|
39
38
|
const [title, setTitle] = useState(props.title);
|
|
40
39
|
const [snackbar, setSnackbar] = useState({});
|
|
41
40
|
const [initialized, setInitialized] = useState(false);
|
|
42
41
|
const { t, i18n } = useTranslation();
|
|
43
|
-
|
|
44
|
-
window.addEventListener('user', initUserInfo);
|
|
45
|
-
return () => window.removeEventListener('user', initUserInfo);
|
|
46
|
-
}, []);
|
|
47
|
-
const initUserInfo = () => {
|
|
48
|
-
const userInfo = persistStorage.getObject("user");
|
|
49
|
-
if (userInfo)
|
|
50
|
-
setUser({
|
|
51
|
-
...user,
|
|
52
|
-
id: userInfo.id,
|
|
53
|
-
department: userInfo.department,
|
|
54
|
-
name: userInfo.name,
|
|
55
|
-
loggedIn: loggedIn()
|
|
56
|
-
});
|
|
57
|
-
};
|
|
42
|
+
const user = useUser();
|
|
58
43
|
useEffect(() => setQueryClientDefaultOptions(), [user.loggedIn]);
|
|
59
44
|
const setQueryClientDefaultOptions = () => {
|
|
60
45
|
const storedKeycloak = persistStorage.getObject("keycloak");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LayoutContext.js","sourceRoot":"","sources":["../../../src/contexts/LayoutContext.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Alert, Snackbar, Stack } from '@mui/material';\r\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\r\nimport i18next, { i18n, TFunction } from 'i18next';\r\nimport LanguageDetector from 'i18next-browser-languagedetector';\r\nimport I18NextHttpBackend from 'i18next-http-backend';\r\nimport moment from 'moment';\r\nimport { createContext, ReactNode, SyntheticEvent, useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { initReactI18next, useTranslation } from 'react-i18next';\r\nimport CenteredBox from '../components/common/CenteredBox';\r\nimport Layout from '../components/Layout';\r\nimport KeycloakExtendedConfig from '../models/KeycloakExtendedConfig';\r\nimport { LeftDrawerItem } from '../models/LeftDrawerItem';\r\nimport SnackbarModel from '../models/SnackbarModel';\r\nimport { ExtendedUser, User } from '../models/User';\r\nimport { persistStorage } from '../utils/PersistStorage';\r\nimport { doLogin, doLogout, initKeycloak, loggedIn } from '../utils/UserService';\r\n\r\ninterface LayoutContextInterface {\r\n changeTitle: (title: string) => void,\r\n snackbar: (snackbar: SnackbarModel) => void,\r\n user: User,\r\n t: TFunction<\"translation\", undefined>,\r\n i18n: i18n\r\n}\r\n\r\nexport const LayoutContext = createContext({} as LayoutContextInterface);\r\n\r\n//User\r\ninitKeycloak();\r\nconst initialUser: ExtendedUser = { login: doLogin, logout: doLogout, loggedIn: loggedIn(), department: \"\", id: \"\", name: \"\" };\r\n\r\n//QueryClient\r\nconst queryClient = new QueryClient({ defaultOptions: { queries: { enabled: false } } });\r\n\r\n//Localization\r\ni18next\r\n .use(initReactI18next)\r\n .use(LanguageDetector)\r\n .use(I18NextHttpBackend)\r\n .init({ fallbackLng: 'en' });\r\n\r\nmoment.defaultFormat = 'YYYY-MM-DD';\r\n\r\ndeclare module \"moment\" {\r\n interface Moment {\r\n formatDate(): string;\r\n formatDateTime(): string;\r\n }\r\n}\r\n\r\nmoment.fn.formatDate = function (): string {\r\n if (!this.isValid()) return \"\";\r\n return this.format();\r\n};\r\n\r\nmoment.fn.formatDateTime = function (): string {\r\n if (!this.isValid()) return \"\";\r\n return this.format(\"YYYY-MM-DD HH:mm\");\r\n};\r\n\r\ninterface LayoutProviderProps {\r\n title: string,\r\n appVersion: string,\r\n leftDrawerItems: LeftDrawerItem[],\r\n primaryColor: string,\r\n secondaryColor: string,\r\n children: ReactNode\r\n}\r\n\r\nexport function LayoutProvider(props: LayoutProviderProps) {\r\n const [user, setUser] = useState<ExtendedUser>(initialUser);\r\n const [title, setTitle] = useState(props.title);\r\n const [snackbar, setSnackbar] = useState({} as SnackbarModel);\r\n const [initialized, setInitialized] = useState<boolean>(false);\r\n const { t, i18n } = useTranslation();\r\n\r\n useEffect(() => {\r\n window.addEventListener('user', initUserInfo);\r\n return () => window.removeEventListener('user', initUserInfo);\r\n }, []);\r\n\r\n const initUserInfo = () => {\r\n const userInfo: User | null = persistStorage.getObject<User>(\"user\");\r\n if (userInfo)\r\n setUser({\r\n ...user,\r\n id: userInfo.id,\r\n department: userInfo.department,\r\n name: userInfo.name,\r\n loggedIn: loggedIn()\r\n });\r\n };\r\n\r\n useEffect(() => setQueryClientDefaultOptions(), [user.loggedIn]);\r\n\r\n const setQueryClientDefaultOptions = () => {\r\n const storedKeycloak: KeycloakExtendedConfig | null = persistStorage.getObject<KeycloakExtendedConfig>(\"keycloak\");\r\n const enabled = storedKeycloak ? (storedKeycloak.autoLogin && user.loggedIn) || !storedKeycloak.autoLogin : false;\r\n setInitialized(enabled);\r\n\r\n queryClient.setDefaultOptions({\r\n queries: {\r\n enabled: enabled,\r\n refetchOnWindowFocus: false,\r\n onError: message => setSnackbar({ message: String(message), severity: \"error\" }),\r\n retry: false\r\n },\r\n mutations: {\r\n onError: message => setSnackbar({ message: String(message), severity: \"error\" }),\r\n }\r\n });\r\n };\r\n\r\n const changeTitle = useCallback((newTitle: string) => {\r\n document.title = newTitle;\r\n setTitle(newTitle);\r\n }, []);\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 }, []);\r\n\r\n const providerValue: LayoutContextInterface = useMemo(() => ({ changeTitle: changeTitle, snackbar: setSnackbar, user: user, t: t, i18n: i18n }), [changeTitle, setSnackbar, user, t, i18n]);\r\n\r\n return (\r\n <QueryClientProvider client={queryClient}>\r\n <LayoutContext.Provider value={providerValue}>\r\n <Layout title={title} appVersion={props.appVersion} primaryColor={props.primaryColor} secondaryColor={props.secondaryColor} leftDrawerItems={props.leftDrawerItems} user={user} initialized={initialized}>\r\n {initialized ? props.children : <CenteredBox circularProgress />}\r\n\r\n <Stack spacing={2} sx={{ width: '100%' }}>\r\n <Snackbar open={!!snackbar.message} autoHideDuration={6000} onClose={handleOnSnackbarClose}>\r\n <Alert onClose={handleOnSnackbarClose} severity={snackbar.severity} sx={{ width: '100%' }} variant=\"filled\">{snackbar.message}</Alert>\r\n </Snackbar>\r\n </Stack>\r\n </Layout>\r\n </LayoutContext.Provider>\r\n </QueryClientProvider>\r\n );\r\n}"]}
|
|
1
|
+
{"version":3,"file":"LayoutContext.js","sourceRoot":"","sources":["../../../src/contexts/LayoutContext.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Alert, Snackbar, Stack } from '@mui/material';\r\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\r\nimport i18next, { i18n, TFunction } from 'i18next';\r\nimport LanguageDetector from 'i18next-browser-languagedetector';\r\nimport I18NextHttpBackend from 'i18next-http-backend';\r\nimport moment from 'moment';\r\nimport { createContext, ReactNode, SyntheticEvent, useCallback, useEffect, useMemo, useState } from 'react';\r\nimport { initReactI18next, useTranslation } from 'react-i18next';\r\nimport CenteredBox from '../components/common/CenteredBox';\r\nimport Layout from '../components/Layout';\r\nimport KeycloakExtendedConfig from '../models/KeycloakExtendedConfig';\r\nimport { LeftDrawerItem } from '../models/LeftDrawerItem';\r\nimport SnackbarModel from '../models/SnackbarModel';\r\nimport { User } from '../models/User';\r\nimport { persistStorage } from '../utils/PersistStorage';\r\nimport { initKeycloak } from '../utils/UserService';\r\nimport { useUser } from '../utils/UseUser';\r\n\r\ninterface LayoutContextInterface {\r\n changeTitle: (title: string) => void,\r\n snackbar: (snackbar: SnackbarModel) => void,\r\n user: User,\r\n t: TFunction<\"translation\", undefined>,\r\n i18n: i18n\r\n}\r\n\r\nexport const LayoutContext = createContext({} as LayoutContextInterface);\r\n\r\n//User\r\ninitKeycloak();\r\n\r\n//QueryClient\r\nconst queryClient = new QueryClient({ defaultOptions: { queries: { enabled: false } } });\r\n\r\n//Localization\r\ni18next\r\n .use(initReactI18next)\r\n .use(LanguageDetector)\r\n .use(I18NextHttpBackend)\r\n .init({ fallbackLng: 'en' });\r\n\r\nmoment.defaultFormat = 'YYYY-MM-DD';\r\n\r\ndeclare module \"moment\" {\r\n interface Moment {\r\n formatDate(): string;\r\n formatDateTime(): string;\r\n }\r\n}\r\n\r\nmoment.fn.formatDate = function (): string {\r\n if (!this.isValid()) return \"\";\r\n return this.format();\r\n};\r\n\r\nmoment.fn.formatDateTime = function (): string {\r\n if (!this.isValid()) return \"\";\r\n return this.format(\"YYYY-MM-DD HH:mm\");\r\n};\r\n\r\ninterface LayoutProviderProps {\r\n title: string,\r\n appVersion: string,\r\n leftDrawerItems: LeftDrawerItem[],\r\n primaryColor: string,\r\n secondaryColor: string,\r\n children: ReactNode\r\n}\r\n\r\nexport function LayoutProvider(props: LayoutProviderProps) {\r\n const [title, setTitle] = useState(props.title);\r\n const [snackbar, setSnackbar] = useState({} as SnackbarModel);\r\n const [initialized, setInitialized] = useState<boolean>(false);\r\n const { t, i18n } = useTranslation();\r\n const user = useUser();\r\n\r\n useEffect(() => setQueryClientDefaultOptions(), [user.loggedIn]);\r\n\r\n const setQueryClientDefaultOptions = () => {\r\n const storedKeycloak: KeycloakExtendedConfig | null = persistStorage.getObject<KeycloakExtendedConfig>(\"keycloak\");\r\n const enabled = storedKeycloak ? (storedKeycloak.autoLogin && user.loggedIn) || !storedKeycloak.autoLogin : false;\r\n setInitialized(enabled);\r\n\r\n queryClient.setDefaultOptions({\r\n queries: {\r\n enabled: enabled,\r\n refetchOnWindowFocus: false,\r\n onError: message => setSnackbar({ message: String(message), severity: \"error\" }),\r\n retry: false\r\n },\r\n mutations: {\r\n onError: message => setSnackbar({ message: String(message), severity: \"error\" }),\r\n }\r\n });\r\n };\r\n\r\n const changeTitle = useCallback((newTitle: string) => {\r\n document.title = newTitle;\r\n setTitle(newTitle);\r\n }, []);\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 }, []);\r\n\r\n const providerValue: LayoutContextInterface = useMemo(() => ({ changeTitle: changeTitle, snackbar: setSnackbar, user: user, t: t, i18n: i18n }), [changeTitle, setSnackbar, user, t, i18n]);\r\n\r\n return (\r\n <QueryClientProvider client={queryClient}>\r\n <LayoutContext.Provider value={providerValue}>\r\n <Layout title={title} appVersion={props.appVersion} primaryColor={props.primaryColor} secondaryColor={props.secondaryColor} leftDrawerItems={props.leftDrawerItems} user={user} initialized={initialized}>\r\n {initialized ? props.children : <CenteredBox circularProgress />}\r\n\r\n <Stack spacing={2} sx={{ width: '100%' }}>\r\n <Snackbar open={!!snackbar.message} autoHideDuration={6000} onClose={handleOnSnackbarClose}>\r\n <Alert onClose={handleOnSnackbarClose} severity={snackbar.severity} sx={{ width: '100%' }} variant=\"filled\">{snackbar.message}</Alert>\r\n </Snackbar>\r\n </Stack>\r\n </Layout>\r\n </LayoutContext.Provider>\r\n </QueryClientProvider>\r\n );\r\n}"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LeftDrawerItem.js","sourceRoot":"","sources":["../../../src/models/LeftDrawerItem.ts"],"names":[],"mappings":"","sourcesContent":["export interface LeftDrawerItem {\n title: string,\n path: string,\n icon: React.ReactNode,\n hidden?: boolean\n}\n"]}
|
|
1
|
+
{"version":3,"file":"LeftDrawerItem.js","sourceRoot":"","sources":["../../../src/models/LeftDrawerItem.ts"],"names":[],"mappings":"","sourcesContent":["export interface LeftDrawerItem {\r\n title: string,\r\n path: string,\r\n icon: React.ReactNode,\r\n hidden?: boolean,\r\n divider?: boolean,\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"User.js","sourceRoot":"","sources":["../../../src/models/User.ts"],"names":[],"mappings":"","sourcesContent":["import { KeycloakPromise } from \"keycloak-js\";\n\nexport interface User {\n id: string,\n name: string,\n department: string\n}\n\nexport interface ExtendedUser extends User {\n loggedIn: boolean,\n login: () => KeycloakPromise<void, void>,\n logout: () => KeycloakPromise<void, void> \n}"]}
|
|
1
|
+
{"version":3,"file":"User.js","sourceRoot":"","sources":["../../../src/models/User.ts"],"names":[],"mappings":"","sourcesContent":["import { KeycloakPromise } from \"keycloak-js\";\r\n\r\nexport interface User {\r\n id: string,\r\n name: string,\r\n department: string\r\n}\r\n\r\nexport interface ExtendedUser extends User {\r\n loggedIn: boolean,\r\n login: () => KeycloakPromise<void, void>,\r\n logout: () => KeycloakPromise<void, void> \r\n}"]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export declare const useUser: () =>
|
|
1
|
+
import { ExtendedUser } from "../models/User";
|
|
2
|
+
export declare const useUser: () => ExtendedUser;
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { useEffect, useState } from "react";
|
|
2
2
|
import { persistStorage } from "./PersistStorage";
|
|
3
|
+
import { doLogin, doLogout, loggedIn } from "./UserService";
|
|
4
|
+
const initialUser = { login: doLogin, logout: doLogout, loggedIn: loggedIn(), department: "", id: "", name: "" };
|
|
3
5
|
export const useUser = () => {
|
|
4
|
-
const [user, setUser] = useState(
|
|
6
|
+
const [user, setUser] = useState(initialUser);
|
|
5
7
|
useEffect(() => {
|
|
6
8
|
window.addEventListener('user', initUser);
|
|
7
9
|
return () => window.removeEventListener('user', initUser);
|
|
@@ -9,7 +11,13 @@ export const useUser = () => {
|
|
|
9
11
|
const initUser = () => {
|
|
10
12
|
const storedUser = persistStorage.getObject("user");
|
|
11
13
|
if (storedUser)
|
|
12
|
-
setUser(
|
|
14
|
+
setUser({
|
|
15
|
+
...user,
|
|
16
|
+
id: storedUser.id,
|
|
17
|
+
department: storedUser.department,
|
|
18
|
+
name: storedUser.name,
|
|
19
|
+
loggedIn: loggedIn()
|
|
20
|
+
});
|
|
13
21
|
};
|
|
14
22
|
return user;
|
|
15
23
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UseUser.js","sourceRoot":"","sources":["../../../src/utils/UseUser.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"UseUser.js","sourceRoot":"","sources":["../../../src/utils/UseUser.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAE5D,MAAM,WAAW,GAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AAE/H,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,EAAE;IACxB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAe,WAAW,CAAC,CAAC;IAE5D,SAAS,CAAC,GAAG,EAAE;QACX,MAAM,CAAC,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9D,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,QAAQ,GAAG,GAAG,EAAE;QAClB,MAAM,UAAU,GAAgB,cAAc,CAAC,SAAS,CAAO,MAAM,CAAC,CAAC;QACvE,IAAI,UAAU;YACV,OAAO,CAAC;gBACJ,GAAG,IAAI;gBACP,EAAE,EAAE,UAAU,CAAC,EAAE;gBACjB,UAAU,EAAE,UAAU,CAAC,UAAU;gBACjC,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,QAAQ,EAAE,QAAQ,EAAE;aACvB,CAAC,CAAC;IACX,CAAC,CAAC;IAEF,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC","sourcesContent":["import { useEffect, useState } from \"react\";\r\nimport { ExtendedUser, User } from \"../models/User\";\r\nimport { persistStorage } from \"./PersistStorage\";\r\nimport { doLogin, doLogout, loggedIn } from \"./UserService\";\r\n\r\nconst initialUser: ExtendedUser = { login: doLogin, logout: doLogout, loggedIn: loggedIn(), department: \"\", id: \"\", name: \"\" };\r\n\r\nexport const useUser = () => {\r\n const [user, setUser] = useState<ExtendedUser>(initialUser);\r\n\r\n useEffect(() => {\r\n window.addEventListener('user', initUser);\r\n return () => window.removeEventListener('user', initUser);\r\n }, []);\r\n\r\n const initUser = () => {\r\n const storedUser: User | null = persistStorage.getObject<User>(\"user\");\r\n if (storedUser)\r\n setUser({\r\n ...user,\r\n id: storedUser.id,\r\n department: storedUser.department,\r\n name: storedUser.name,\r\n loggedIn: loggedIn()\r\n });\r\n };\r\n\r\n return user;\r\n};"]}
|