wcz-layout 5.13.1 → 5.13.2

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.
@@ -2,11 +2,12 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useIsAuthenticated, useMsal } from "@azure/msal-react";
3
3
  import { AccountCircle, ArrowBack, Brightness4, ChevronRight, DarkMode, LightMode, Login, Logout, SettingsBrightness, Translate } from "@mui/icons-material";
4
4
  import { Avatar, Box, IconButton, List, ListItem, ListItemButton, ListItemIcon, ListItemText, ListSubheader, Menu } from "@mui/material";
5
- import { useQuery, useQueryClient } from "@tanstack/react-query";
5
+ import { useQuery } from "@tanstack/react-query";
6
6
  import { Fragment, useCallback, useState } from "react";
7
7
  import { useTranslation } from "react-i18next";
8
8
  import { graphQueries } from "../../hooks/UseUser";
9
9
  import { persistStorage } from "../../utils/PersistStorage";
10
+ import { useUser } from "../../utils/UseUser";
10
11
  const drawerWidth = 240;
11
12
  export default function AccountMenu(props) {
12
13
  const { mode, setMode } = props;
@@ -16,9 +17,8 @@ export default function AccountMenu(props) {
16
17
  const { t, i18n } = useTranslation();
17
18
  const { instance } = useMsal();
18
19
  const isAuthenticated = useIsAuthenticated();
19
- const queryClient = useQueryClient();
20
+ const user = useUser();
20
21
  const { data: userPhoto } = useQuery({ ...graphQueries.sessionUserPhoto(), enabled: isAuthenticated });
21
- const { data: userDetail } = useQuery({ ...graphQueries.sessionUserDetail(), enabled: open && isAuthenticated });
22
22
  const changeLanguage = useCallback((newLanguage) => () => {
23
23
  i18n.changeLanguage(newLanguage)
24
24
  .finally(() => closeMenu());
@@ -38,11 +38,11 @@ export default function AccountMenu(props) {
38
38
  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, {})] })] }));
39
39
  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") })] })] }));
40
40
  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" }) })] }));
41
- return (_jsxs(Fragment, { children: [_jsx(IconButton, { size: "small", edge: "end", onClick: openMenu, onMouseEnter: () => queryClient.prefetchQuery(graphQueries.sessionUserDetail()), children: userPhoto ?
41
+ return (_jsxs(Fragment, { children: [_jsx(IconButton, { size: "small", edge: "end", onClick: openMenu, children: userPhoto ?
42
42
  _jsx(Avatar, { src: userPhoto, sx: { width: { xs: 32, sm: 40 }, height: { xs: 32, sm: 40 } } })
43
43
  :
44
- _jsx(AccountCircle, { sx: { width: { xs: 32, sm: 40 }, height: { xs: 32, sm: 40 } } }) }), _jsx(Menu, { anchorEl: anchorEl, open: open, onClose: closeMenu, children: _jsxs(Box, { sx: { width: drawerWidth }, role: "presentation", children: [_jsx(List, { "aria-labelledby": "account-menu", disablePadding: true, children: userDetail ?
45
- _jsxs(Fragment, { children: [_jsx(ListItem, { children: _jsx(ListItemText, { primary: userDetail.displayName.split("/")[0], secondary: userDetail.jobTitle }) }), _jsxs(ListItemButton, { onClick: logout, children: [_jsx(ListItemIcon, { children: _jsx(Logout, { color: "error" }) }), _jsx(ListItemText, { primary: t("Layout.Logout") })] })] })
44
+ _jsx(AccountCircle, { sx: { width: { xs: 32, sm: 40 }, height: { xs: 32, sm: 40 } } }) }), _jsx(Menu, { anchorEl: anchorEl, open: open, onClose: closeMenu, children: _jsxs(Box, { sx: { width: drawerWidth }, role: "presentation", children: [_jsx(List, { "aria-labelledby": "account-menu", disablePadding: true, children: isAuthenticated ?
45
+ _jsxs(Fragment, { children: [_jsx(ListItem, { children: _jsx(ListItemText, { primary: user.name.split("/")[0], secondary: _jsxs("span", { children: [user.employeeId && _jsx("span", { children: user.employeeId }), user.employeeId && _jsx("br", {}), user.department && _jsx("span", { children: user.department })] }) }) }), _jsxs(ListItemButton, { onClick: logout, children: [_jsx(ListItemIcon, { children: _jsx(Logout, { color: "error" }) }), _jsx(ListItemText, { primary: t("Layout.Logout") })] })] })
46
46
  :
47
47
  _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] }) })] }));
48
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AccountMenu.js","sourceRoot":"","sources":["../../../../src/components/layout/AccountMenu.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useIsAuthenticated, useMsal } from \"@azure/msal-react\";\r\nimport { AccountCircle, ArrowBack, Brightness4, ChevronRight, DarkMode, LightMode, Login, Logout, SettingsBrightness, Translate } from \"@mui/icons-material\";\r\nimport { Avatar, Box, IconButton, List, ListItem, ListItemButton, ListItemIcon, ListItemText, ListSubheader, Menu, PaletteMode } from \"@mui/material\";\r\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\r\nimport { Fragment, useCallback, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { graphQueries } from \"../../hooks/UseUser\";\r\nimport { persistStorage } from \"../../utils/PersistStorage\";\r\n\r\nconst drawerWidth = 240;\r\ntype TabType = \"settings\" | \"theme\" | \"language\";\r\n\r\ninterface AccountMenuProps {\r\n mode: PaletteMode | \"system\",\r\n setMode: (mode: PaletteMode | \"system\") => void,\r\n}\r\n\r\nexport default function AccountMenu(props: AccountMenuProps) {\r\n const { mode, setMode } = props;\r\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\r\n const [tab, setTab] = useState<TabType>(\"settings\");\r\n const open = Boolean(anchorEl);\r\n const { t, i18n } = useTranslation();\r\n const { instance } = useMsal();\r\n const isAuthenticated = useIsAuthenticated();\r\n const queryClient = useQueryClient();\r\n\r\n const { data: userPhoto } = useQuery({ ...graphQueries.sessionUserPhoto(), enabled: isAuthenticated });\r\n const { data: userDetail } = useQuery({ ...graphQueries.sessionUserDetail(), enabled: open && isAuthenticated });\r\n\r\n\r\n const changeLanguage = useCallback((newLanguage: \"en\" | \"cs\") => () => {\r\n i18n.changeLanguage(newLanguage)\r\n .finally(() => closeMenu());\r\n }, []);\r\n\r\n const changeMode = useCallback((newMode: PaletteMode | \"system\") => () => {\r\n setMode(newMode);\r\n closeMenu();\r\n persistStorage.set(\"mode\", newMode);\r\n }, []);\r\n\r\n const openMenu = useCallback((e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => setAnchorEl(e.currentTarget), []);\r\n const closeMenu = useCallback(() => { setAnchorEl(null); setTimeout(() => setTab(\"settings\"), 300); }, []);\r\n\r\n const login = () => instance.loginRedirect();\r\n const logout = () => instance.logoutRedirect({\r\n postLogoutRedirectUri: \"/\",\r\n });\r\n\r\n const changeTab = useCallback((newTab: TabType) => () => setTab(newTab), []);\r\n\r\n const settings = (\r\n <List component=\"nav\" subheader={<ListSubheader sx={{ backgroundColor: \"transparent\" }}>{t(\"Layout.Settings\")}</ListSubheader>}>\r\n <ListItemButton onClick={changeTab(\"theme\")} sx={{ py: 0.3 }}>\r\n <ListItemIcon>\r\n <Brightness4 />\r\n </ListItemIcon>\r\n <ListItemText primary={t(\"Layout.Appearance\")} secondary={t(`Layout.${mode.charAt(0).toUpperCase() + mode.slice(1)}`)} />\r\n <ChevronRight />\r\n </ListItemButton>\r\n\r\n <ListItemButton onClick={changeTab(\"language\")} sx={{ py: 0.3 }}>\r\n <ListItemIcon>\r\n <Translate />\r\n </ListItemIcon>\r\n <ListItemText primary={t(\"Layout.Language\")} secondary={i18n.resolvedLanguage === \"en\" ? \"English\" : \"Čeština\"} />\r\n <ChevronRight />\r\n </ListItemButton>\r\n </List>\r\n );\r\n\r\n const theme = (\r\n <List subheader={\r\n <ListSubheader onClick={changeTab(\"settings\")} sx={{ backgroundColor: \"transparent\", display: \"flex\", alignItems: \"center\", px: 1, cursor: \"pointer\" }}>\r\n <IconButton size=\"small\" sx={{ mr: 0.5 }}>\r\n <ArrowBack fontSize=\"small\" />\r\n </IconButton> {t(\"Layout.Appearance\")}\r\n </ListSubheader>\r\n }>\r\n <ListItemButton onClick={changeMode(\"light\")} disabled={mode === \"light\"}>\r\n <ListItemIcon>\r\n <LightMode />\r\n </ListItemIcon>\r\n <ListItemText primary={t(\"Layout.Light\")} />\r\n </ListItemButton>\r\n <ListItemButton onClick={changeMode(\"dark\")} disabled={mode === \"dark\"}>\r\n <ListItemIcon>\r\n <DarkMode />\r\n </ListItemIcon>\r\n <ListItemText primary={t(\"Layout.Dark\")} />\r\n </ListItemButton>\r\n <ListItemButton onClick={changeMode(\"system\")} disabled={mode === \"system\"}>\r\n <ListItemIcon>\r\n <SettingsBrightness />\r\n </ListItemIcon>\r\n <ListItemText primary={t(\"Layout.System\")} />\r\n </ListItemButton>\r\n </List>\r\n );\r\n\r\n const language = (\r\n <List subheader={\r\n <ListSubheader onClick={changeTab(\"settings\")} sx={{ backgroundColor: \"transparent\", display: \"flex\", alignItems: \"center\", px: 1, cursor: \"pointer\" }}>\r\n <IconButton size=\"small\" sx={{ mr: 0.5 }}>\r\n <ArrowBack fontSize=\"small\" />\r\n </IconButton> {t(\"Layout.Language\")}\r\n </ListSubheader>\r\n }>\r\n <ListItemButton onClick={changeLanguage(\"en\")} disabled={i18n.resolvedLanguage === \"en\"}>\r\n <ListItemText primary=\"English\" />\r\n </ListItemButton>\r\n <ListItemButton onClick={changeLanguage(\"cs\")} disabled={i18n.resolvedLanguage === \"cs\"}>\r\n <ListItemText primary=\"Čeština\" />\r\n </ListItemButton>\r\n </List>\r\n );\r\n\r\n return (\r\n <Fragment>\r\n <IconButton\r\n size=\"small\"\r\n edge=\"end\"\r\n onClick={openMenu}\r\n onMouseEnter={() => queryClient.prefetchQuery(graphQueries.sessionUserDetail())}\r\n >\r\n {userPhoto ?\r\n <Avatar src={userPhoto} sx={{ width: { xs: 32, sm: 40 }, height: { xs: 32, sm: 40 } }} />\r\n :\r\n <AccountCircle sx={{ width: { xs: 32, sm: 40 }, height: { xs: 32, sm: 40 } }} />\r\n }\r\n </IconButton>\r\n\r\n <Menu anchorEl={anchorEl} open={open} onClose={closeMenu}>\r\n <Box sx={{ width: drawerWidth }} role=\"presentation\">\r\n <List aria-labelledby=\"account-menu\" disablePadding>\r\n {userDetail ?\r\n <Fragment>\r\n <ListItem>\r\n <ListItemText primary={userDetail.displayName.split(\"/\")[0]} secondary={userDetail.jobTitle} />\r\n </ListItem>\r\n\r\n <ListItemButton onClick={logout}>\r\n <ListItemIcon><Logout color=\"error\" /></ListItemIcon>\r\n <ListItemText primary={t(\"Layout.Logout\")} />\r\n </ListItemButton>\r\n </Fragment>\r\n :\r\n <ListItemButton onClick={login}>\r\n <ListItemIcon><Login color=\"success\" /></ListItemIcon>\r\n <ListItemText primary={t(\"Layout.LogIn\")} />\r\n </ListItemButton>\r\n }\r\n </List>\r\n\r\n {tab === \"settings\" && settings}\r\n {tab === \"theme\" && theme}\r\n {tab === \"language\" && language}\r\n </Box>\r\n </Menu>\r\n </Fragment>\r\n );\r\n}"]}
1
+ {"version":3,"file":"AccountMenu.js","sourceRoot":"","sources":["../../../../src/components/layout/AccountMenu.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useIsAuthenticated, useMsal } from \"@azure/msal-react\";\r\nimport { AccountCircle, ArrowBack, Brightness4, ChevronRight, DarkMode, LightMode, Login, Logout, SettingsBrightness, Translate } from \"@mui/icons-material\";\r\nimport { Avatar, Box, IconButton, List, ListItem, ListItemButton, ListItemIcon, ListItemText, ListSubheader, Menu, PaletteMode } from \"@mui/material\";\r\nimport { useQuery } from \"@tanstack/react-query\";\r\nimport { Fragment, useCallback, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport { graphQueries } from \"../../hooks/UseUser\";\r\nimport { persistStorage } from \"../../utils/PersistStorage\";\r\nimport { useUser } from \"../../utils/UseUser\";\r\n\r\nconst drawerWidth = 240;\r\ntype TabType = \"settings\" | \"theme\" | \"language\";\r\n\r\ninterface AccountMenuProps {\r\n mode: PaletteMode | \"system\",\r\n setMode: (mode: PaletteMode | \"system\") => void,\r\n}\r\n\r\nexport default function AccountMenu(props: AccountMenuProps) {\r\n const { mode, setMode } = props;\r\n const [anchorEl, setAnchorEl] = useState<null | HTMLElement>(null);\r\n const [tab, setTab] = useState<TabType>(\"settings\");\r\n const open = Boolean(anchorEl);\r\n const { t, i18n } = useTranslation();\r\n const { instance } = useMsal();\r\n const isAuthenticated = useIsAuthenticated();\r\n const user = useUser();\r\n\r\n const { data: userPhoto } = useQuery({ ...graphQueries.sessionUserPhoto(), enabled: isAuthenticated });\r\n\r\n const changeLanguage = useCallback((newLanguage: \"en\" | \"cs\") => () => {\r\n i18n.changeLanguage(newLanguage)\r\n .finally(() => closeMenu());\r\n }, []);\r\n\r\n const changeMode = useCallback((newMode: PaletteMode | \"system\") => () => {\r\n setMode(newMode);\r\n closeMenu();\r\n persistStorage.set(\"mode\", newMode);\r\n }, []);\r\n\r\n const openMenu = useCallback((e: React.MouseEvent<HTMLButtonElement, MouseEvent>) => setAnchorEl(e.currentTarget), []);\r\n const closeMenu = useCallback(() => { setAnchorEl(null); setTimeout(() => setTab(\"settings\"), 300); }, []);\r\n\r\n const login = () => instance.loginRedirect();\r\n const logout = () => instance.logoutRedirect({\r\n postLogoutRedirectUri: \"/\",\r\n });\r\n\r\n const changeTab = useCallback((newTab: TabType) => () => setTab(newTab), []);\r\n\r\n const settings = (\r\n <List component=\"nav\" subheader={<ListSubheader sx={{ backgroundColor: \"transparent\" }}>{t(\"Layout.Settings\")}</ListSubheader>}>\r\n <ListItemButton onClick={changeTab(\"theme\")} sx={{ py: 0.3 }}>\r\n <ListItemIcon>\r\n <Brightness4 />\r\n </ListItemIcon>\r\n <ListItemText primary={t(\"Layout.Appearance\")} secondary={t(`Layout.${mode.charAt(0).toUpperCase() + mode.slice(1)}`)} />\r\n <ChevronRight />\r\n </ListItemButton>\r\n\r\n <ListItemButton onClick={changeTab(\"language\")} sx={{ py: 0.3 }}>\r\n <ListItemIcon>\r\n <Translate />\r\n </ListItemIcon>\r\n <ListItemText primary={t(\"Layout.Language\")} secondary={i18n.resolvedLanguage === \"en\" ? \"English\" : \"Čeština\"} />\r\n <ChevronRight />\r\n </ListItemButton>\r\n </List>\r\n );\r\n\r\n const theme = (\r\n <List subheader={\r\n <ListSubheader onClick={changeTab(\"settings\")} sx={{ backgroundColor: \"transparent\", display: \"flex\", alignItems: \"center\", px: 1, cursor: \"pointer\" }}>\r\n <IconButton size=\"small\" sx={{ mr: 0.5 }}>\r\n <ArrowBack fontSize=\"small\" />\r\n </IconButton> {t(\"Layout.Appearance\")}\r\n </ListSubheader>\r\n }>\r\n <ListItemButton onClick={changeMode(\"light\")} disabled={mode === \"light\"}>\r\n <ListItemIcon>\r\n <LightMode />\r\n </ListItemIcon>\r\n <ListItemText primary={t(\"Layout.Light\")} />\r\n </ListItemButton>\r\n <ListItemButton onClick={changeMode(\"dark\")} disabled={mode === \"dark\"}>\r\n <ListItemIcon>\r\n <DarkMode />\r\n </ListItemIcon>\r\n <ListItemText primary={t(\"Layout.Dark\")} />\r\n </ListItemButton>\r\n <ListItemButton onClick={changeMode(\"system\")} disabled={mode === \"system\"}>\r\n <ListItemIcon>\r\n <SettingsBrightness />\r\n </ListItemIcon>\r\n <ListItemText primary={t(\"Layout.System\")} />\r\n </ListItemButton>\r\n </List>\r\n );\r\n\r\n const language = (\r\n <List subheader={\r\n <ListSubheader onClick={changeTab(\"settings\")} sx={{ backgroundColor: \"transparent\", display: \"flex\", alignItems: \"center\", px: 1, cursor: \"pointer\" }}>\r\n <IconButton size=\"small\" sx={{ mr: 0.5 }}>\r\n <ArrowBack fontSize=\"small\" />\r\n </IconButton> {t(\"Layout.Language\")}\r\n </ListSubheader>\r\n }>\r\n <ListItemButton onClick={changeLanguage(\"en\")} disabled={i18n.resolvedLanguage === \"en\"}>\r\n <ListItemText primary=\"English\" />\r\n </ListItemButton>\r\n <ListItemButton onClick={changeLanguage(\"cs\")} disabled={i18n.resolvedLanguage === \"cs\"}>\r\n <ListItemText primary=\"Čeština\" />\r\n </ListItemButton>\r\n </List>\r\n );\r\n\r\n return (\r\n <Fragment>\r\n <IconButton size=\"small\" edge=\"end\" onClick={openMenu}>\r\n {userPhoto ?\r\n <Avatar src={userPhoto} sx={{ width: { xs: 32, sm: 40 }, height: { xs: 32, sm: 40 } }} />\r\n :\r\n <AccountCircle sx={{ width: { xs: 32, sm: 40 }, height: { xs: 32, sm: 40 } }} />\r\n }\r\n </IconButton>\r\n\r\n <Menu anchorEl={anchorEl} open={open} onClose={closeMenu}>\r\n <Box sx={{ width: drawerWidth }} role=\"presentation\">\r\n <List aria-labelledby=\"account-menu\" disablePadding>\r\n {isAuthenticated ?\r\n <Fragment>\r\n <ListItem>\r\n <ListItemText primary={user.name.split(\"/\")[0]} secondary={\r\n <span>\r\n {user.employeeId && <span>{user.employeeId}</span>}\r\n {user.employeeId &&<br />}\r\n {user.department && <span>{user.department}</span>}\r\n </span>\r\n } />\r\n </ListItem>\r\n\r\n <ListItemButton onClick={logout}>\r\n <ListItemIcon><Logout color=\"error\" /></ListItemIcon>\r\n <ListItemText primary={t(\"Layout.Logout\")} />\r\n </ListItemButton>\r\n </Fragment>\r\n :\r\n <ListItemButton onClick={login}>\r\n <ListItemIcon><Login color=\"success\" /></ListItemIcon>\r\n <ListItemText primary={t(\"Layout.LogIn\")} />\r\n </ListItemButton>\r\n }\r\n </List>\r\n\r\n {tab === \"settings\" && settings}\r\n {tab === \"theme\" && theme}\r\n {tab === \"language\" && language}\r\n </Box>\r\n </Menu>\r\n </Fragment>\r\n );\r\n}"]}
@@ -8,6 +8,8 @@ export interface MicrosoftIdTokenPayload {
8
8
  sub: string;
9
9
  name: string;
10
10
  mail: string;
11
+ department?: string;
12
+ employeeId?: string;
11
13
  groups?: Array<string>;
12
14
  }
13
15
  export declare function decodeJwt<T>(token: string): T;
@@ -23,6 +23,8 @@ export const UserProvider = ({ children, setUser }) => {
23
23
  name: idTokenPayload.name.split("/")[0],
24
24
  email: idTokenPayload.mail,
25
25
  groups: (_a = idTokenPayload.groups) !== null && _a !== void 0 ? _a : [],
26
+ department: idTokenPayload.department || "",
27
+ employeeId: idTokenPayload.employeeId || "",
26
28
  };
27
29
  setUser(userData);
28
30
  window.dispatchEvent(new CustomEvent(USER_DATA_FETCHED_EVENT, { detail: { user: userData } }));
@@ -1 +1 @@
1
- {"version":3,"file":"UserContext.js","sourceRoot":"","sources":["../../../src/contexts/UserContext.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAA4B,SAAS,EAAE,MAAM,OAAO,CAAC;AAE3E,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEpC,MAAM,CAAC,MAAM,uBAAuB,GAAG,iBAAiB,CAAC;AAazD,MAAM,UAAU,SAAS,CAAI,KAAa;IACtC,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACnF,MAAM,OAAO,GAAG,kBAAkB,CAC9B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;SACjB,KAAK,CAAC,EAAE,CAAC;SACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SACjE,IAAI,CAAC,EAAE,CAAC,CAChB,CAAC;IACF,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;AACpC,CAAC;AAOD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAqB,EAAE,EAAE;IACrE,MAAM,OAAO,GAAG,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAEvC,SAAS,CAAC,GAAG,EAAE;;QACX,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,EAAE,CAAC;YACnB,MAAM,cAAc,GAAG,SAAS,CAA0B,OAAO,CAAC,OAAO,CAAC,CAAC;YAC3E,MAAM,QAAQ,GAAS;gBACnB,EAAE,EAAE,cAAc,CAAC,GAAG;gBACtB,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACvC,KAAK,EAAE,cAAc,CAAC,IAAI;gBAC1B,MAAM,EAAE,MAAA,cAAc,CAAC,MAAM,mCAAI,EAAE;aACtC,CAAC;YACF,OAAO,CAAC,QAAQ,CAAC,CAAC;YAClB,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAuB,uBAAuB,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QACzH,CAAC;IACL,CAAC,EAAE,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,CAAC,CAAC,CAAC;IAEvB,OAAO,CACH,KAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,IAAI,YAC5B,QAAQ,GACU,CAC1B,CAAC;AACN,CAAC,CAAC;AAIF,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC","sourcesContent":["import { createContext, Dispatch, SetStateAction, useEffect } from \"react\";\r\nimport { User } from \"../models/User\";\r\nimport { pca } from \"../utils/Auth\";\r\n\r\nexport const USER_DATA_FETCHED_EVENT = \"userDataFetched\";\r\n\r\nexport interface UserDataFetchedEvent {\r\n user: Partial<User>;\r\n}\r\n\r\nexport interface MicrosoftIdTokenPayload {\r\n sub: string;\r\n name: string;\r\n mail: string;\r\n groups?: Array<string>;\r\n}\r\n\r\nexport function decodeJwt<T>(token: string): T {\r\n const base64Payload = token.split(\".\")[1];\r\n const base64 = base64Payload.replace(/-/g, \"+\").replace(/_/g, \"/\");\r\n const padding = base64.length % 4 === 0 ? \"\" : \"=\".repeat(4 - (base64.length % 4));\r\n const payload = decodeURIComponent(\r\n atob(base64 + padding)\r\n .split(\"\")\r\n .map((c) => \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2))\r\n .join(\"\")\r\n );\r\n return JSON.parse(payload) as T;\r\n}\r\n\r\nexport interface UserProviderProps {\r\n setUser: Dispatch<SetStateAction<User>>;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport const UserProvider = ({ children, setUser }: UserProviderProps) => {\r\n const account = pca.getActiveAccount();\r\n\r\n useEffect(() => {\r\n if (account?.idToken) {\r\n const idTokenPayload = decodeJwt<MicrosoftIdTokenPayload>(account.idToken);\r\n const userData: User = {\r\n id: idTokenPayload.sub,\r\n name: idTokenPayload.name.split(\"/\")[0],\r\n email: idTokenPayload.mail,\r\n groups: idTokenPayload.groups ?? [],\r\n };\r\n setUser(userData);\r\n window.dispatchEvent(new CustomEvent<UserDataFetchedEvent>(USER_DATA_FETCHED_EVENT, { detail: { user: userData } }));\r\n }\r\n }, [account?.idToken]);\r\n\r\n return (\r\n <UserContext.Provider value={null}>\r\n {children}\r\n </UserContext.Provider>\r\n );\r\n};\r\n\r\nexport interface UserContextValue { }\r\n\r\nexport const UserContext = createContext(null);"]}
1
+ {"version":3,"file":"UserContext.js","sourceRoot":"","sources":["../../../src/contexts/UserContext.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAA4B,SAAS,EAAE,MAAM,OAAO,CAAC;AAE3E,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEpC,MAAM,CAAC,MAAM,uBAAuB,GAAG,iBAAiB,CAAC;AAezD,MAAM,UAAU,SAAS,CAAI,KAAa;IACtC,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACnE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;IACnF,MAAM,OAAO,GAAG,kBAAkB,CAC9B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC;SACjB,KAAK,CAAC,EAAE,CAAC;SACT,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;SACjE,IAAI,CAAC,EAAE,CAAC,CAChB,CAAC;IACF,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAM,CAAC;AACpC,CAAC;AAOD,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAqB,EAAE,EAAE;IACrE,MAAM,OAAO,GAAG,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAEvC,SAAS,CAAC,GAAG,EAAE;;QACX,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,EAAE,CAAC;YACnB,MAAM,cAAc,GAAG,SAAS,CAA0B,OAAO,CAAC,OAAO,CAAC,CAAC;YAC3E,MAAM,QAAQ,GAAS;gBACnB,EAAE,EAAE,cAAc,CAAC,GAAG;gBACtB,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBACvC,KAAK,EAAE,cAAc,CAAC,IAAI;gBAC1B,MAAM,EAAE,MAAA,cAAc,CAAC,MAAM,mCAAI,EAAE;gBACnC,UAAU,EAAE,cAAc,CAAC,UAAU,IAAI,EAAE;gBAC3C,UAAU,EAAE,cAAc,CAAC,UAAU,IAAI,EAAE;aAC9C,CAAC;YACF,OAAO,CAAC,QAAQ,CAAC,CAAC;YAClB,MAAM,CAAC,aAAa,CAAC,IAAI,WAAW,CAAuB,uBAAuB,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QACzH,CAAC;IACL,CAAC,EAAE,CAAC,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,CAAC,CAAC,CAAC;IAEvB,OAAO,CACH,KAAC,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,IAAI,YAC5B,QAAQ,GACU,CAC1B,CAAC;AACN,CAAC,CAAC;AAIF,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC","sourcesContent":["import { createContext, Dispatch, SetStateAction, useEffect } from \"react\";\r\nimport { User } from \"../models/User\";\r\nimport { pca } from \"../utils/Auth\";\r\n\r\nexport const USER_DATA_FETCHED_EVENT = \"userDataFetched\";\r\n\r\nexport interface UserDataFetchedEvent {\r\n user: Partial<User>;\r\n}\r\n\r\nexport interface MicrosoftIdTokenPayload {\r\n sub: string;\r\n name: string;\r\n mail: string;\r\n department?: string;\r\n employeeId?: string;\r\n groups?: Array<string>;\r\n}\r\n\r\nexport function decodeJwt<T>(token: string): T {\r\n const base64Payload = token.split(\".\")[1];\r\n const base64 = base64Payload.replace(/-/g, \"+\").replace(/_/g, \"/\");\r\n const padding = base64.length % 4 === 0 ? \"\" : \"=\".repeat(4 - (base64.length % 4));\r\n const payload = decodeURIComponent(\r\n atob(base64 + padding)\r\n .split(\"\")\r\n .map((c) => \"%\" + (\"00\" + c.charCodeAt(0).toString(16)).slice(-2))\r\n .join(\"\")\r\n );\r\n return JSON.parse(payload) as T;\r\n}\r\n\r\nexport interface UserProviderProps {\r\n setUser: Dispatch<SetStateAction<User>>;\r\n children?: React.ReactNode;\r\n}\r\n\r\nexport const UserProvider = ({ children, setUser }: UserProviderProps) => {\r\n const account = pca.getActiveAccount();\r\n\r\n useEffect(() => {\r\n if (account?.idToken) {\r\n const idTokenPayload = decodeJwt<MicrosoftIdTokenPayload>(account.idToken);\r\n const userData: User = {\r\n id: idTokenPayload.sub,\r\n name: idTokenPayload.name.split(\"/\")[0],\r\n email: idTokenPayload.mail,\r\n groups: idTokenPayload.groups ?? [],\r\n department: idTokenPayload.department || \"\",\r\n employeeId: idTokenPayload.employeeId || \"\",\r\n };\r\n setUser(userData);\r\n window.dispatchEvent(new CustomEvent<UserDataFetchedEvent>(USER_DATA_FETCHED_EVENT, { detail: { user: userData } }));\r\n }\r\n }, [account?.idToken]);\r\n\r\n return (\r\n <UserContext.Provider value={null}>\r\n {children}\r\n </UserContext.Provider>\r\n );\r\n};\r\n\r\nexport interface UserContextValue { }\r\n\r\nexport const UserContext = createContext(null);"]}
@@ -1,5 +1,3 @@
1
- import { GraphUser } from "../models/User";
2
1
  export declare const graphQueries: {
3
- sessionUserDetail: () => import("@tanstack/react-query").WithRequired<import("@tanstack/react-query").OmitKeyof<import("@tanstack/react-query").UndefinedInitialDataOptions<GraphUser, unknown, GraphUser, string[]>, "suspense" | "useErrorBoundary" | "getPreviousPageParam" | "getNextPageParam">, "queryKey">;
4
2
  sessionUserPhoto: () => import("@tanstack/react-query").WithRequired<import("@tanstack/react-query").OmitKeyof<import("@tanstack/react-query").UndefinedInitialDataOptions<Blob, unknown, string, string[]>, "suspense" | "useErrorBoundary" | "getPreviousPageParam" | "getNextPageParam">, "queryKey">;
5
3
  };
@@ -10,15 +10,6 @@ api.interceptors.request.use(async (config) => {
10
10
  return config;
11
11
  });
12
12
  export const graphQueries = {
13
- sessionUserDetail: () => queryOptions({
14
- queryKey: [QUERY_KEY, "me"],
15
- queryFn: async () => await api.request({
16
- method: "GET",
17
- url: "/me?$select=displayName,jobTitle",
18
- }).then(response => response.data),
19
- staleTime: Infinity,
20
- cacheTime: Infinity,
21
- }),
22
13
  sessionUserPhoto: () => queryOptions({
23
14
  queryKey: [QUERY_KEY, "me", "photo"],
24
15
  queryFn: async () => await api.request({
@@ -1 +1 @@
1
- {"version":3,"file":"UseUser.js","sourceRoot":"","sources":["../../../src/hooks/UseUser.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,SAAS,GAAG,MAAM,CAAC;AAEzB,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IACrB,OAAO,EAAE,mCAAmC;CAC/C,CAAC,CAAC;AAEH,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;IAC1C,MAAM,CAAC,OAAO,CAAC,aAAa,GAAG,UAAU,MAAM,cAAc,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;IAC/E,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG;IACxB,iBAAiB,EAAE,GAAG,EAAE,CACpB,YAAY,CAAC;QACT,QAAQ,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC;QAC3B,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,OAAO,CAAY;YAC9C,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,kCAAkC;SAC1C,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;QAClC,SAAS,EAAE,QAAQ;QACnB,SAAS,EAAE,QAAQ;KACtB,CAAC;IACN,gBAAgB,EAAE,GAAG,EAAE,CACnB,YAAY,CAAC;QACT,QAAQ,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC;QACpC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,OAAO,CAAO;YACzC,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,kBAAkB;YACvB,YAAY,EAAE,MAAM;SACvB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;QAClC,SAAS,EAAE,QAAQ;QACnB,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;KAC5C,CAAC;CACT,CAAC","sourcesContent":["import { queryOptions } from \"@tanstack/react-query\";\r\nimport axios from \"axios\";\r\nimport { GraphUser } from \"../models/User\";\r\nimport { getAccessToken } from \"../utils/Auth\";\r\n\r\nconst QUERY_KEY = \"user\";\r\n\r\nconst api = axios.create({\r\n baseURL: \"https://graph.microsoft.com/v1.0/\",\r\n});\r\n\r\napi.interceptors.request.use(async (config) => {\r\n config.headers.Authorization = `Bearer ${await getAccessToken([\"User.Read\"])}`;\r\n return config;\r\n});\r\n\r\nexport const graphQueries = {\r\n sessionUserDetail: () =>\r\n queryOptions({\r\n queryKey: [QUERY_KEY, \"me\"],\r\n queryFn: async () => await api.request<GraphUser>({\r\n method: \"GET\",\r\n url: \"/me?$select=displayName,jobTitle\",\r\n }).then(response => response.data),\r\n staleTime: Infinity,\r\n cacheTime: Infinity,\r\n }),\r\n sessionUserPhoto: () =>\r\n queryOptions({\r\n queryKey: [QUERY_KEY, \"me\", \"photo\"],\r\n queryFn: async () => await api.request<Blob>({\r\n method: \"GET\",\r\n url: \"/me/photo/$value\",\r\n responseType: \"blob\",\r\n }).then(response => response.data),\r\n staleTime: Infinity,\r\n cacheTime: Infinity,\r\n select: data => URL.createObjectURL(data),\r\n }),\r\n};"]}
1
+ {"version":3,"file":"UseUser.js","sourceRoot":"","sources":["../../../src/hooks/UseUser.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,SAAS,GAAG,MAAM,CAAC;AAEzB,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IACrB,OAAO,EAAE,mCAAmC;CAC/C,CAAC,CAAC;AAEH,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;IAC1C,MAAM,CAAC,OAAO,CAAC,aAAa,GAAG,UAAU,MAAM,cAAc,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC;IAC/E,OAAO,MAAM,CAAC;AAClB,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG;IACxB,gBAAgB,EAAE,GAAG,EAAE,CACnB,YAAY,CAAC;QACT,QAAQ,EAAE,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC;QACpC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,OAAO,CAAO;YACzC,MAAM,EAAE,KAAK;YACb,GAAG,EAAE,kBAAkB;YACvB,YAAY,EAAE,MAAM;SACvB,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC;QAClC,SAAS,EAAE,QAAQ;QACnB,SAAS,EAAE,QAAQ;QACnB,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC;KAC5C,CAAC;CACT,CAAC","sourcesContent":["import { queryOptions } from \"@tanstack/react-query\";\r\nimport axios from \"axios\";\r\nimport { getAccessToken } from \"../utils/Auth\";\r\n\r\nconst QUERY_KEY = \"user\";\r\n\r\nconst api = axios.create({\r\n baseURL: \"https://graph.microsoft.com/v1.0/\",\r\n});\r\n\r\napi.interceptors.request.use(async (config) => {\r\n config.headers.Authorization = `Bearer ${await getAccessToken([\"User.Read\"])}`;\r\n return config;\r\n});\r\n\r\nexport const graphQueries = {\r\n sessionUserPhoto: () =>\r\n queryOptions({\r\n queryKey: [QUERY_KEY, \"me\", \"photo\"],\r\n queryFn: async () => await api.request<Blob>({\r\n method: \"GET\",\r\n url: \"/me/photo/$value\",\r\n responseType: \"blob\",\r\n }).then(response => response.data),\r\n staleTime: Infinity,\r\n cacheTime: Infinity,\r\n select: data => URL.createObjectURL(data),\r\n }),\r\n};"]}
@@ -2,9 +2,7 @@ export type User = {
2
2
  id: string;
3
3
  name: string;
4
4
  email: string;
5
+ department: string;
6
+ employeeId: string;
5
7
  groups: string[];
6
8
  };
7
- export type GraphUser = {
8
- displayName: string;
9
- jobTitle: string;
10
- };
@@ -1 +1 @@
1
- {"version":3,"file":"User.js","sourceRoot":"","sources":["../../../src/models/User.ts"],"names":[],"mappings":"","sourcesContent":["export type User = {\r\n id: string;\r\n name: string;\r\n email: string;\r\n groups: string[];\r\n}\r\n\r\nexport type GraphUser = {\r\n displayName: string;\r\n jobTitle: string;\r\n}"]}
1
+ {"version":3,"file":"User.js","sourceRoot":"","sources":["../../../src/models/User.ts"],"names":[],"mappings":"","sourcesContent":["export type User = {\r\n id: string;\r\n name: string;\r\n email: string;\r\n department: string;\r\n employeeId: string;\r\n groups: string[];\r\n}"]}
@@ -3,6 +3,8 @@ const msalConfig = {
3
3
  auth: {
4
4
  clientId: process.env.REACT_APP_MICROSOFT_CLIENT_ID,
5
5
  authority: `https://login.microsoftonline.com/${process.env.REACT_APP_MICROSOFT_TENANT_ID}`,
6
+ redirectUri: window.location.origin + "/",
7
+ navigateToLoginRequestUrl: false,
6
8
  },
7
9
  };
8
10
  export const pca = new PublicClientApplication(msalConfig);
@@ -1 +1 @@
1
- {"version":3,"file":"Auth.js","sourceRoot":"","sources":["../../../src/utils/Auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAIhF,MAAM,UAAU,GAAkB;IAC9B,IAAI,EAAE;QACF,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,6BAA8B;QACpD,SAAS,EAAE,qCAAqC,OAAO,CAAC,GAAG,CAAC,6BAA8B,EAAE;KAC/F;CACJ,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC,UAAU,CAAC,CAAC;AAE3D,MAAM,OAAO,sBAAuB,SAAQ,gBAAgB;IAGxD,YAAY,QAA0B;QAClC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,GAAW,EAAE,OAA0B;QAC1D,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC7D,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ;AAED,MAAM,UAAU,GAAG,GAAG,EAAE;IACpB,MAAM,OAAO,GAAG,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACvC,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACxE,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,MAAgB,EAAmB,EAAE;IACtE,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,IAAI,CAAC;QACD,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,GAAG,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1E,OAAO,WAAW,CAAC;IACvB,CAAC;IAAC,WAAM,CAAC;QACL,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,GAAG,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACzE,OAAO,WAAW,CAAC;IACvB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAU,EAAE,KAAe,EAAW,EAAE;IAC5D,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1D,CAAC,CAAC","sourcesContent":["import type { Configuration, NavigationOptions } from \"@azure/msal-browser\";\r\nimport { NavigationClient, PublicClientApplication } from \"@azure/msal-browser\";\r\nimport { NavigateFunction } from \"react-router-dom\";\r\nimport { User } from \"../models/User\";\r\n\r\nconst msalConfig: Configuration = {\r\n auth: {\r\n clientId: process.env.REACT_APP_MICROSOFT_CLIENT_ID!,\r\n authority: `https://login.microsoftonline.com/${process.env.REACT_APP_MICROSOFT_TENANT_ID!}`,\r\n },\r\n};\r\n\r\nexport const pca = new PublicClientApplication(msalConfig);\r\n\r\nexport class CustomNavigationClient extends NavigationClient {\r\n private navigate: NavigateFunction;\r\n\r\n constructor(navigate: NavigateFunction) {\r\n super();\r\n this.navigate = navigate;\r\n }\r\n\r\n async navigateInternal(url: string, options: NavigationOptions) {\r\n const relativePath = url.replace(window.location.origin, \"\");\r\n if (options.noHistory) {\r\n this.navigate(relativePath, { replace: true });\r\n } else {\r\n this.navigate(relativePath);\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\nconst getAccount = () => {\r\n const account = pca.getActiveAccount();\r\n if (!account) throw new Error(\"No active account. User not signed in.\");\r\n return account;\r\n};\r\n\r\nexport const getAccessToken = async (scopes: string[]): Promise<string> => {\r\n const account = getAccount();\r\n \r\n try {\r\n const { accessToken } = await pca.acquireTokenSilent({ scopes, account });\r\n return accessToken;\r\n } catch {\r\n const { accessToken } = await pca.acquireTokenPopup({ scopes, account });\r\n return accessToken;\r\n }\r\n};\r\n\r\nexport const hasRole = (user: User, roles: string[]): boolean => {\r\n if (!user.groups || user.groups.length === 0) return false;\r\n return roles.some(role => user.groups.includes(role));\r\n};\r\n"]}
1
+ {"version":3,"file":"Auth.js","sourceRoot":"","sources":["../../../src/utils/Auth.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAIhF,MAAM,UAAU,GAAkB;IAC9B,IAAI,EAAE;QACF,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,6BAA8B;QACpD,SAAS,EAAE,qCAAqC,OAAO,CAAC,GAAG,CAAC,6BAA8B,EAAE;QAC5F,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,GAAG;QACzC,yBAAyB,EAAE,KAAK;KACnC;CACJ,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG,IAAI,uBAAuB,CAAC,UAAU,CAAC,CAAC;AAE3D,MAAM,OAAO,sBAAuB,SAAQ,gBAAgB;IAGxD,YAAY,QAA0B;QAClC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,GAAW,EAAE,OAA0B;QAC1D,MAAM,YAAY,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC7D,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAChC,CAAC;QAED,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ;AAED,MAAM,UAAU,GAAG,GAAG,EAAE;IACpB,MAAM,OAAO,GAAG,GAAG,CAAC,gBAAgB,EAAE,CAAC;IACvC,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IACxE,OAAO,OAAO,CAAC;AACnB,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,MAAgB,EAAmB,EAAE;IACtE,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;IAE7B,IAAI,CAAC;QACD,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,GAAG,CAAC,kBAAkB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1E,OAAO,WAAW,CAAC;IACvB,CAAC;IAAC,WAAM,CAAC;QACL,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,GAAG,CAAC,iBAAiB,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;QACzE,OAAO,WAAW,CAAC;IACvB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAU,EAAE,KAAe,EAAW,EAAE;IAC5D,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3D,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1D,CAAC,CAAC","sourcesContent":["import type { Configuration, NavigationOptions } from \"@azure/msal-browser\";\r\nimport { NavigationClient, PublicClientApplication } from \"@azure/msal-browser\";\r\nimport { NavigateFunction } from \"react-router-dom\";\r\nimport { User } from \"../models/User\";\r\n\r\nconst msalConfig: Configuration = {\r\n auth: {\r\n clientId: process.env.REACT_APP_MICROSOFT_CLIENT_ID!,\r\n authority: `https://login.microsoftonline.com/${process.env.REACT_APP_MICROSOFT_TENANT_ID!}`,\r\n redirectUri: window.location.origin + \"/\", \r\n navigateToLoginRequestUrl: false,\r\n },\r\n};\r\n\r\nexport const pca = new PublicClientApplication(msalConfig);\r\n\r\nexport class CustomNavigationClient extends NavigationClient {\r\n private navigate: NavigateFunction;\r\n\r\n constructor(navigate: NavigateFunction) {\r\n super();\r\n this.navigate = navigate;\r\n }\r\n\r\n async navigateInternal(url: string, options: NavigationOptions) {\r\n const relativePath = url.replace(window.location.origin, \"\");\r\n if (options.noHistory) {\r\n this.navigate(relativePath, { replace: true });\r\n } else {\r\n this.navigate(relativePath);\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\nconst getAccount = () => {\r\n const account = pca.getActiveAccount();\r\n if (!account) throw new Error(\"No active account. User not signed in.\");\r\n return account;\r\n};\r\n\r\nexport const getAccessToken = async (scopes: string[]): Promise<string> => {\r\n const account = getAccount();\r\n \r\n try {\r\n const { accessToken } = await pca.acquireTokenSilent({ scopes, account });\r\n return accessToken;\r\n } catch {\r\n const { accessToken } = await pca.acquireTokenPopup({ scopes, account });\r\n return accessToken;\r\n }\r\n};\r\n\r\nexport const hasRole = (user: User, roles: string[]): boolean => {\r\n if (!user.groups || user.groups.length === 0) return false;\r\n return roles.some(role => user.groups.includes(role));\r\n};\r\n"]}
@@ -1,6 +1,6 @@
1
1
  import { useEffect, useState } from "react";
2
2
  import { USER_DATA_FETCHED_EVENT } from "../contexts/UserContext";
3
- const initialUser = { id: "", name: "", email: "", groups: [] };
3
+ const initialUser = { id: "", name: "", email: "", department: "", employeeId: "", groups: [] };
4
4
  export const useUser = () => {
5
5
  const [user, setUser] = useState(initialUser);
6
6
  useEffect(() => {
@@ -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,uBAAuB,EAAwB,MAAM,yBAAyB,CAAC;AAExF,MAAM,WAAW,GAAS,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAEtE,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,EAAE;IACxB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAO,WAAW,CAAC,CAAC;IAEpD,SAAS,CAAC,GAAG,EAAE;QACX,MAAM,qBAAqB,GAAG,CAAC,KAAwC,EAAE,EAAE;;YACvE,IAAI,MAAA,KAAK,CAAC,MAAM,0CAAE,IAAI,EAAE,CAAC;gBACrB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAY,CAAC,CAAC;YACvC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,uBAAuB,EAAE,qBAAsC,CAAC,CAAC;QACzF,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,uBAAuB,EAAE,qBAAsC,CAAC,CAAC;IAC7G,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC","sourcesContent":["import { useEffect, useState } from \"react\";\r\nimport { User } from \"../models/User\";\r\nimport { USER_DATA_FETCHED_EVENT, UserDataFetchedEvent } from \"../contexts/UserContext\";\r\n\r\nconst initialUser: User = { id: \"\", name: \"\", email: \"\", groups: [] };\r\n\r\nexport const useUser = () => {\r\n const [user, setUser] = useState<User>(initialUser);\r\n\r\n useEffect(() => {\r\n const handleUserDataFetched = (event: CustomEvent<UserDataFetchedEvent>) => {\r\n if (event.detail?.user) {\r\n setUser(event.detail.user as User);\r\n }\r\n };\r\n\r\n window.addEventListener(USER_DATA_FETCHED_EVENT, handleUserDataFetched as EventListener);\r\n return () => window.removeEventListener(USER_DATA_FETCHED_EVENT, handleUserDataFetched as EventListener);\r\n }, []);\r\n\r\n return user;\r\n};"]}
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,uBAAuB,EAAwB,MAAM,yBAAyB,CAAC;AAExF,MAAM,WAAW,GAAS,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAEtG,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,EAAE;IACxB,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAO,WAAW,CAAC,CAAC;IAEpD,SAAS,CAAC,GAAG,EAAE;QACX,MAAM,qBAAqB,GAAG,CAAC,KAAwC,EAAE,EAAE;;YACvE,IAAI,MAAA,KAAK,CAAC,MAAM,0CAAE,IAAI,EAAE,CAAC;gBACrB,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAY,CAAC,CAAC;YACvC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,CAAC,gBAAgB,CAAC,uBAAuB,EAAE,qBAAsC,CAAC,CAAC;QACzF,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,mBAAmB,CAAC,uBAAuB,EAAE,qBAAsC,CAAC,CAAC;IAC7G,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC","sourcesContent":["import { useEffect, useState } from \"react\";\r\nimport { User } from \"../models/User\";\r\nimport { USER_DATA_FETCHED_EVENT, UserDataFetchedEvent } from \"../contexts/UserContext\";\r\n\r\nconst initialUser: User = { id: \"\", name: \"\", email: \"\", department: \"\", employeeId: \"\", groups: [] };\r\n\r\nexport const useUser = () => {\r\n const [user, setUser] = useState<User>(initialUser);\r\n\r\n useEffect(() => {\r\n const handleUserDataFetched = (event: CustomEvent<UserDataFetchedEvent>) => {\r\n if (event.detail?.user) {\r\n setUser(event.detail.user as User);\r\n }\r\n };\r\n\r\n window.addEventListener(USER_DATA_FETCHED_EVENT, handleUserDataFetched as EventListener);\r\n return () => window.removeEventListener(USER_DATA_FETCHED_EVENT, handleUserDataFetched as EventListener);\r\n }, []);\r\n\r\n return user;\r\n};"]}