wcz-test 6.20.0 → 6.22.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/{DialogsHooks-Bi8dZoyu.js → DialogsContext-DMZRefiY.js} +3 -35
- package/dist/DialogsContext-DMZRefiY.js.map +1 -0
- package/dist/DialogsHooks-DBK6rBoU.js +37 -0
- package/dist/DialogsHooks-DBK6rBoU.js.map +1 -0
- package/dist/{FileHooks-hWKTwLCr.js → FileHooks-BM2Oyvh6.js} +2 -3
- package/dist/FileHooks-BM2Oyvh6.js.map +1 -0
- package/dist/{RouterListItemButton-CHS7rofI.js → RouterListItemButton-Vj6OoqkV.js} +2 -2
- package/dist/{RouterListItemButton-CHS7rofI.js.map → RouterListItemButton-Vj6OoqkV.js.map} +1 -1
- package/dist/UseHook-DB7btKDE.js +11 -0
- package/dist/UseHook-DB7btKDE.js.map +1 -0
- package/dist/client.d.ts +0 -705
- package/dist/client.js +2 -4
- package/dist/client.js.map +1 -1
- package/dist/components.js +4 -3
- package/dist/components.js.map +1 -1
- package/dist/hooks.d.ts +15 -0
- package/dist/hooks.js +5 -3
- package/dist/hooks.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +145 -54
- package/dist/index.js.map +1 -1
- package/dist/models.d.ts +0 -9
- package/dist/queries.js +2 -3
- package/dist/queries.js.map +1 -1
- package/dist/server.d.ts +0 -36
- package/dist/server.js +1 -8732
- package/dist/server.js.map +1 -1
- package/dist/{utils-DKyKGba7.js → utils-CKW5pi6k.js} +21 -2
- package/dist/utils-CKW5pi6k.js.map +1 -0
- package/dist/utils.js +1 -1
- package/package.json +117 -120
- package/dist/DialogsHooks-Bi8dZoyu.js.map +0 -1
- package/dist/FileHooks-hWKTwLCr.js.map +0 -1
- package/dist/auth-client-B6cIXYDV.js +0 -1417
- package/dist/auth-client-B6cIXYDV.js.map +0 -1
- package/dist/env-CoxTjaDr.js +0 -27
- package/dist/env-CoxTjaDr.js.map +0 -1
- package/dist/error-BhAKg8LX-X0sdNXNa.js +0 -195
- package/dist/error-BhAKg8LX-X0sdNXNa.js.map +0 -1
- package/dist/server-mxQ3s5dx-CC81W42s.js +0 -644
- package/dist/server-mxQ3s5dx-CC81W42s.js.map +0 -1
- package/dist/utils-DKyKGba7.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { j as jsxRuntimeExports, D as DialogsContext
|
|
1
|
+
import { j as jsxRuntimeExports, D as DialogsContext } from "./DialogsContext-DMZRefiY.js";
|
|
2
|
+
import { useMsalAuthentication, useMsal, AuthenticatedTemplate, MsalProvider } from "@azure/msal-react";
|
|
2
3
|
import { Stack, Typography, Collapse, useMediaQuery, useColorScheme, List as List$1, ListItemButton as ListItemButton$1, ListItemIcon as ListItemIcon$1, ListItemText as ListItemText$1, ListSubheader as ListSubheader$1, IconButton, Avatar as Avatar$1, Menu, Box as Box$1, ListItem as ListItem$1, InitColorSchemeScript, CssBaseline, AppBar, Toolbar, LinearProgress, ThemeProvider } from "@mui/material";
|
|
3
4
|
import { LocalizationProvider } from "@mui/x-date-pickers";
|
|
4
5
|
import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs";
|
|
@@ -7,17 +8,20 @@ import { getCookie } from "@tanstack/react-start/server";
|
|
|
7
8
|
import dayjs from "dayjs";
|
|
8
9
|
import i18n from "i18next";
|
|
9
10
|
import LanguageDetector from "i18next-browser-languagedetector";
|
|
10
|
-
import { useState, useId, useRef,
|
|
11
|
+
import { useState, useId, useRef, useEffect, Fragment, useEffectEvent } from "react";
|
|
11
12
|
import { useTranslation, initReactI18next } from "react-i18next";
|
|
12
13
|
import { resources } from "virtual:wcz-layout";
|
|
13
14
|
import z__default from "zod";
|
|
14
15
|
import useEventCallback from "@mui/utils/useEventCallback";
|
|
15
|
-
import {
|
|
16
|
+
import { PublicClientApplication, EventType, InteractionType } from "@azure/msal-browser";
|
|
17
|
+
import { U as UserContext, u as useUser } from "./UseHook-DB7btKDE.js";
|
|
18
|
+
import { useQuery, useIsFetching, useIsMutating } from "@tanstack/react-query";
|
|
19
|
+
import axios from "axios";
|
|
20
|
+
import { c as clientEnv } from "./utils-CKW5pi6k.js";
|
|
21
|
+
import { r } from "./utils-CKW5pi6k.js";
|
|
16
22
|
import Menu$1 from "@mui/icons-material/Menu";
|
|
17
23
|
import MenuOpen from "@mui/icons-material/MenuOpen";
|
|
18
24
|
import { styled, useTheme } from "@mui/material/styles";
|
|
19
|
-
import { useIsFetching, useIsMutating } from "@tanstack/react-query";
|
|
20
|
-
import { c as clientEnv } from "./env-CoxTjaDr.js";
|
|
21
25
|
import Box from "@mui/material/Box";
|
|
22
26
|
import Drawer from "@mui/material/Drawer";
|
|
23
27
|
import { useNavigate, useRouterState } from "@tanstack/react-router";
|
|
@@ -33,20 +37,18 @@ import ListItemText from "@mui/material/ListItemText";
|
|
|
33
37
|
import Paper from "@mui/material/Paper";
|
|
34
38
|
import Popper from "@mui/material/Popper";
|
|
35
39
|
import Typography$1 from "@mui/material/Typography";
|
|
36
|
-
import { R as RouterListItemButton } from "./RouterListItemButton-
|
|
37
|
-
import "@mui/icons-material/AccountCircle";
|
|
40
|
+
import { R as RouterListItemButton } from "./RouterListItemButton-Vj6OoqkV.js";
|
|
41
|
+
import AccountCircle from "@mui/icons-material/AccountCircle";
|
|
38
42
|
import ArrowBack from "@mui/icons-material/ArrowBack";
|
|
39
43
|
import Brightness4 from "@mui/icons-material/Brightness4";
|
|
40
44
|
import ChevronRight from "@mui/icons-material/ChevronRight";
|
|
41
45
|
import DarkMode from "@mui/icons-material/DarkMode";
|
|
46
|
+
import Done from "@mui/icons-material/Done";
|
|
42
47
|
import LightMode from "@mui/icons-material/LightMode";
|
|
43
|
-
import Login from "@mui/icons-material/Login";
|
|
44
48
|
import Logout from "@mui/icons-material/Logout";
|
|
45
49
|
import SettingsBrightness from "@mui/icons-material/SettingsBrightness";
|
|
46
50
|
import Translate from "@mui/icons-material/Translate";
|
|
47
|
-
|
|
48
|
-
import { r } from "./utils-DKyKGba7.js";
|
|
49
|
-
function DialogsProvider({ children, unmountAfter = 1e3 }) {
|
|
51
|
+
function DialogsProvider({ children }) {
|
|
50
52
|
const [stack, setStack] = useState([]);
|
|
51
53
|
const keyPrefix = useId();
|
|
52
54
|
const nextId = useRef(0);
|
|
@@ -81,7 +83,7 @@ function DialogsProvider({ children, unmountAfter = 1e3 }) {
|
|
|
81
83
|
setStack(
|
|
82
84
|
(previousStack) => previousStack.map((entry) => entry.promise === dialog ? { ...entry, open: false } : entry)
|
|
83
85
|
);
|
|
84
|
-
setTimeout(() => removeDialogFromStack(dialog),
|
|
86
|
+
setTimeout(() => removeDialogFromStack(dialog), 1e3);
|
|
85
87
|
});
|
|
86
88
|
const closeDialog = useEventCallback(async function closeDialog2(dialog, result) {
|
|
87
89
|
const entryToClose = dialogMetadata.current.get(dialog);
|
|
@@ -111,6 +113,116 @@ function DialogsProvider({ children, unmountAfter = 1e3 }) {
|
|
|
111
113
|
))
|
|
112
114
|
] });
|
|
113
115
|
}
|
|
116
|
+
const msalConfig = {
|
|
117
|
+
auth: {
|
|
118
|
+
clientId: clientEnv.VITE_MICROSOFT_CLIENT_ID,
|
|
119
|
+
authority: `https://login.microsoftonline.com/${clientEnv.VITE_MICROSOFT_TENANT_ID}`
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
const msalInstance = new PublicClientApplication(msalConfig);
|
|
123
|
+
msalInstance.initialize().then(() => {
|
|
124
|
+
if (!msalInstance.getActiveAccount() && msalInstance.getAllAccounts().length > 0) {
|
|
125
|
+
msalInstance.setActiveAccount(msalInstance.getAllAccounts()[0]);
|
|
126
|
+
}
|
|
127
|
+
msalInstance.enableAccountStorageEvents();
|
|
128
|
+
msalInstance.addEventCallback((event) => {
|
|
129
|
+
if (event.eventType === EventType.LOGIN_SUCCESS && event.payload) {
|
|
130
|
+
const payload = event.payload;
|
|
131
|
+
const account = payload.account;
|
|
132
|
+
msalInstance.setActiveAccount(account);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
const acquireAccessToken = async () => {
|
|
137
|
+
const account = msalInstance.getActiveAccount();
|
|
138
|
+
if (!account) {
|
|
139
|
+
throw new Error("No active account! Verify a user has been signed in and setActiveAccount has been called.");
|
|
140
|
+
}
|
|
141
|
+
const response = await msalInstance.acquireTokenSilent({
|
|
142
|
+
scopes: ["User.Read"],
|
|
143
|
+
account
|
|
144
|
+
});
|
|
145
|
+
return response.accessToken;
|
|
146
|
+
};
|
|
147
|
+
const QUERY_KEY = "user";
|
|
148
|
+
const DAY = 1e3 * 60 * 60 * 24;
|
|
149
|
+
const api = axios.create({
|
|
150
|
+
baseURL: "https://graph.microsoft.com/v1.0/"
|
|
151
|
+
});
|
|
152
|
+
api.interceptors.request.use(async (config) => {
|
|
153
|
+
config.headers.Authorization = `Bearer ${await acquireAccessToken()}`;
|
|
154
|
+
return config;
|
|
155
|
+
});
|
|
156
|
+
const useGetUser = (enabled = true) => {
|
|
157
|
+
return useQuery({
|
|
158
|
+
queryKey: [QUERY_KEY, "me"],
|
|
159
|
+
queryFn: ({ signal }) => api.request({
|
|
160
|
+
method: "GET",
|
|
161
|
+
url: "me?$select=id,displayName,jobTitle,mail,mobilePhone",
|
|
162
|
+
signal
|
|
163
|
+
}),
|
|
164
|
+
select: (response) => ({
|
|
165
|
+
id: response.data.id,
|
|
166
|
+
name: response.data.displayName.split("/")[0],
|
|
167
|
+
jobTitle: response.data.jobTitle,
|
|
168
|
+
email: response.data.mail,
|
|
169
|
+
mobilePhone: response.data.mobilePhone,
|
|
170
|
+
photo: null,
|
|
171
|
+
groups: []
|
|
172
|
+
}),
|
|
173
|
+
staleTime: DAY,
|
|
174
|
+
gcTime: DAY,
|
|
175
|
+
refetchOnWindowFocus: false,
|
|
176
|
+
enabled
|
|
177
|
+
});
|
|
178
|
+
};
|
|
179
|
+
const useGetUserPhoto = (enabled = true) => {
|
|
180
|
+
return useQuery({
|
|
181
|
+
queryKey: [QUERY_KEY, "me", "photo"],
|
|
182
|
+
queryFn: ({ signal }) => api.request({
|
|
183
|
+
method: "GET",
|
|
184
|
+
url: "me/photo/$value",
|
|
185
|
+
signal,
|
|
186
|
+
responseType: "blob"
|
|
187
|
+
}),
|
|
188
|
+
select: (response) => URL.createObjectURL(response.data),
|
|
189
|
+
staleTime: DAY,
|
|
190
|
+
gcTime: DAY,
|
|
191
|
+
refetchOnWindowFocus: false,
|
|
192
|
+
enabled
|
|
193
|
+
});
|
|
194
|
+
};
|
|
195
|
+
const useGetUserGroups = (enabled = true) => {
|
|
196
|
+
return useQuery({
|
|
197
|
+
queryKey: [QUERY_KEY, "me", "memberOf"],
|
|
198
|
+
queryFn: ({ signal }) => api.request({
|
|
199
|
+
method: "GET",
|
|
200
|
+
url: "me/memberOf?$select=displayName",
|
|
201
|
+
signal
|
|
202
|
+
}),
|
|
203
|
+
select: (response) => response.data.value.map((group) => group.displayName),
|
|
204
|
+
staleTime: DAY,
|
|
205
|
+
gcTime: DAY,
|
|
206
|
+
refetchOnWindowFocus: false,
|
|
207
|
+
enabled
|
|
208
|
+
});
|
|
209
|
+
};
|
|
210
|
+
function UserProvider({ children }) {
|
|
211
|
+
const { result } = useMsalAuthentication(InteractionType.Redirect);
|
|
212
|
+
const [user, setUser] = useState({});
|
|
213
|
+
const { data } = useGetUser(!!result);
|
|
214
|
+
const { data: photo } = useGetUserPhoto(!!result);
|
|
215
|
+
const { data: groups } = useGetUserGroups(!!result);
|
|
216
|
+
useEffect(() => {
|
|
217
|
+
setUser((prevUser) => ({
|
|
218
|
+
...data,
|
|
219
|
+
...photo && { photo },
|
|
220
|
+
...groups && { groups },
|
|
221
|
+
...prevUser
|
|
222
|
+
}));
|
|
223
|
+
}, [data, photo, groups]);
|
|
224
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(UserContext.Provider, { value: { user, setUser }, children });
|
|
225
|
+
}
|
|
114
226
|
const AppTitle = () => {
|
|
115
227
|
return /* @__PURE__ */ jsxRuntimeExports.jsxs(Stack, { direction: "row", alignItems: "center", spacing: 2, flexGrow: 1, children: [
|
|
116
228
|
/* @__PURE__ */ jsxRuntimeExports.jsx("img", { src: "/favicon-32x32.png", alt: "app-logo", loading: "lazy" }),
|
|
@@ -423,7 +535,7 @@ const NavigationRail = ({ navigation, expanded, setExpanded }) => {
|
|
|
423
535
|
height: `calc(100% - ${TOOLBAR_HEIGHT}px)`,
|
|
424
536
|
width: expanded ? EXPANDED_WIDTH : MINI_WIDTH,
|
|
425
537
|
borderTop: "1px solid",
|
|
426
|
-
borderColor:
|
|
538
|
+
borderColor: "var(--mui-palette-divider)"
|
|
427
539
|
}
|
|
428
540
|
},
|
|
429
541
|
children: drawerContent(!expanded)
|
|
@@ -438,8 +550,8 @@ const ToolbarAccount = () => {
|
|
|
438
550
|
const open = Boolean(anchorElement);
|
|
439
551
|
const { t, i18n: i18n2 } = useTranslation();
|
|
440
552
|
const { mode, setMode } = useColorScheme();
|
|
441
|
-
const {
|
|
442
|
-
const
|
|
553
|
+
const { instance } = useMsal();
|
|
554
|
+
const user = useUser();
|
|
443
555
|
const supportedLanguages = (Array.isArray(i18n2.options.supportedLngs) ? i18n2.options.supportedLngs : []).filter((lng) => lng !== "cimode");
|
|
444
556
|
const languageDisplayNames = new Intl.DisplayNames([i18n2.language], { type: "language" });
|
|
445
557
|
const colorModes = [
|
|
@@ -447,15 +559,6 @@ const ToolbarAccount = () => {
|
|
|
447
559
|
{ mode: "dark", icon: DarkMode, label: t("Layout.Dark") },
|
|
448
560
|
{ mode: "system", icon: SettingsBrightness, label: t("Layout.System") }
|
|
449
561
|
];
|
|
450
|
-
const user = {
|
|
451
|
-
name: "Dalibor Homola",
|
|
452
|
-
employeeId: "C2503017",
|
|
453
|
-
department: "IT"
|
|
454
|
-
};
|
|
455
|
-
const usernameInitials = () => {
|
|
456
|
-
const splittedName = user.name.split(" ");
|
|
457
|
-
return `${splittedName[0][0]}${splittedName.length > 1 ? splittedName[1][0] : ""}`;
|
|
458
|
-
};
|
|
459
562
|
const openMenu = (event) => setAnchorElement(event.currentTarget);
|
|
460
563
|
const closeMenu = () => {
|
|
461
564
|
setAnchorElement(void 0);
|
|
@@ -512,20 +615,21 @@ const ToolbarAccount = () => {
|
|
|
512
615
|
)
|
|
513
616
|
) });
|
|
514
617
|
return /* @__PURE__ */ jsxRuntimeExports.jsxs(Fragment, { children: [
|
|
515
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(IconButton, { size: "small", edge: "end", onClick: openMenu, children:
|
|
618
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(IconButton, { size: "small", edge: "end", onClick: openMenu, children: user.photo ? /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
619
|
+
Avatar$1,
|
|
620
|
+
{
|
|
621
|
+
src: user.photo,
|
|
622
|
+
sx: { width: { xs: 32, sm: 40 }, height: { xs: 32, sm: 40 } }
|
|
623
|
+
}
|
|
624
|
+
) : /* @__PURE__ */ jsxRuntimeExports.jsx(AccountCircle, { sx: { width: { xs: 32, sm: 40 }, height: { xs: 32, sm: 40 } } }) }),
|
|
516
625
|
/* @__PURE__ */ jsxRuntimeExports.jsx(Menu, { anchorEl: anchorElement, open, onClose: closeMenu, children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Box$1, { sx: { width: 240 }, children: [
|
|
517
|
-
/* @__PURE__ */ jsxRuntimeExports.
|
|
518
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(ListItem$1, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(ListItemText$1, { primary: user.name, secondary:
|
|
519
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: user.employeeId }),
|
|
520
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("br", {}),
|
|
521
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx("span", { children: user.department })
|
|
522
|
-
] }) }) }),
|
|
626
|
+
/* @__PURE__ */ jsxRuntimeExports.jsxs(List$1, { disablePadding: true, children: [
|
|
627
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(ListItem$1, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(ListItemText$1, { primary: user.name, secondary: user.jobTitle }) }),
|
|
523
628
|
/* @__PURE__ */ jsxRuntimeExports.jsxs(
|
|
524
629
|
ListItemButton$1,
|
|
525
630
|
{
|
|
526
|
-
onClick: () =>
|
|
527
|
-
|
|
528
|
-
onError: ({ error }) => alert(error.message)
|
|
631
|
+
onClick: () => instance.logoutRedirect({
|
|
632
|
+
postLogoutRedirectUri: "/"
|
|
529
633
|
}),
|
|
530
634
|
children: [
|
|
531
635
|
/* @__PURE__ */ jsxRuntimeExports.jsx(ListItemIcon$1, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Logout, { color: "error" }) }),
|
|
@@ -533,19 +637,7 @@ const ToolbarAccount = () => {
|
|
|
533
637
|
]
|
|
534
638
|
}
|
|
535
639
|
)
|
|
536
|
-
] })
|
|
537
|
-
ListItemButton$1,
|
|
538
|
-
{
|
|
539
|
-
onClick: () => authClient.signIn.social({ provider: "microsoft" }, {
|
|
540
|
-
onSuccess: () => closeMenu(),
|
|
541
|
-
onError: ({ error }) => alert(error.message)
|
|
542
|
-
}),
|
|
543
|
-
children: [
|
|
544
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(ListItemIcon$1, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Login, { color: "success" }) }),
|
|
545
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(ListItemText$1, { primary: t("Layout.LogIn") })
|
|
546
|
-
]
|
|
547
|
-
}
|
|
548
|
-
) }),
|
|
640
|
+
] }),
|
|
549
641
|
tab === "settings" && settings,
|
|
550
642
|
tab === "theme" && theme,
|
|
551
643
|
tab === "language" && language
|
|
@@ -580,11 +672,11 @@ const Layout = (props) => {
|
|
|
580
672
|
{
|
|
581
673
|
color: "transparent",
|
|
582
674
|
position: "fixed",
|
|
583
|
-
sx:
|
|
675
|
+
sx: {
|
|
584
676
|
borderBottom: "1px solid",
|
|
585
|
-
borderColor:
|
|
677
|
+
borderColor: "var(--mui-palette-divider)",
|
|
586
678
|
boxShadow: "none"
|
|
587
|
-
}
|
|
679
|
+
},
|
|
588
680
|
children: /* @__PURE__ */ jsxRuntimeExports.jsxs(Toolbar, { children: [
|
|
589
681
|
props.navigation && /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
590
682
|
IconButton,
|
|
@@ -618,7 +710,7 @@ const Layout = (props) => {
|
|
|
618
710
|
),
|
|
619
711
|
/* @__PURE__ */ jsxRuntimeExports.jsxs(Box$1, { component: "main", sx: { flexGrow: 1, display: "flex", flexDirection: "column", minWidth: 0, height: "100%", overflow: "hidden" }, children: [
|
|
620
712
|
/* @__PURE__ */ jsxRuntimeExports.jsx(DrawerHeader, {}),
|
|
621
|
-
/* @__PURE__ */ jsxRuntimeExports.jsx(Box$1, { sx: { flex: 1, overflow: "auto", position: "relative" }, children: props.children })
|
|
713
|
+
/* @__PURE__ */ jsxRuntimeExports.jsx(Box$1, { sx: { flex: 1, overflow: "auto", position: "relative" }, children: /* @__PURE__ */ jsxRuntimeExports.jsx(AuthenticatedTemplate, { children: props.children }) })
|
|
622
714
|
] })
|
|
623
715
|
] }),
|
|
624
716
|
(isFetching || isMutating) && /* @__PURE__ */ jsxRuntimeExports.jsx(LinearProgress, { sx: { position: "fixed", top: { xs: 56, sm: 64 }, left: 0, right: 0 } })
|
|
@@ -636,7 +728,6 @@ i18n.use(LanguageDetector).use(initReactI18next).init({
|
|
|
636
728
|
interpolation: { escapeValue: false }
|
|
637
729
|
});
|
|
638
730
|
const LayoutProvider = ({ navigation, theme, children }) => {
|
|
639
|
-
const createdTheme = useGetTheme(theme);
|
|
640
731
|
const languageChangedHandler = useEffectEvent(() => {
|
|
641
732
|
z__default.config(z__default.core.locales[i18n.language]());
|
|
642
733
|
dayjs.locale(i18n.language);
|
|
@@ -648,12 +739,12 @@ const LayoutProvider = ({ navigation, theme, children }) => {
|
|
|
648
739
|
i18n.off("languageChanged", languageChangedHandler);
|
|
649
740
|
};
|
|
650
741
|
}, []);
|
|
651
|
-
return /* @__PURE__ */ jsxRuntimeExports.jsx(
|
|
742
|
+
return /* @__PURE__ */ jsxRuntimeExports.jsx(MsalProvider, { instance: msalInstance, children: /* @__PURE__ */ jsxRuntimeExports.jsx(UserProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(ThemeProvider, { theme, children: /* @__PURE__ */ jsxRuntimeExports.jsx(LocalizationProvider, { dateAdapter: AdapterDayjs, adapterLocale: i18n.language, children: /* @__PURE__ */ jsxRuntimeExports.jsx(DialogsProvider, { children: /* @__PURE__ */ jsxRuntimeExports.jsx(Layout, { navigation, children }) }) }, i18n.language) }) }) });
|
|
652
743
|
};
|
|
653
744
|
const setSSRLanguage = createServerFn().handler(async () => {
|
|
654
745
|
const language = getCookie(i18n.services.languageDetector.options.lookupCookie) || "en";
|
|
655
|
-
dayjs.locale(language);
|
|
656
746
|
z__default.config(z__default.core.locales[language]());
|
|
747
|
+
dayjs.locale(language);
|
|
657
748
|
await i18n.changeLanguage(language);
|
|
658
749
|
});
|
|
659
750
|
export {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../src/providers/DialogsProvider.tsx","../src/components/core/AppTitle.tsx","../src/components/core/navigation/NavigationListItem.tsx","../src/components/core/navigation/NavigationList.tsx","../src/components/core/navigation/NavigationRail.tsx","../src/components/core/ToolbarAccount.tsx","../src/components/core/Layout.tsx","../src/providers/LayoutProvider.tsx"],"sourcesContent":["import useEventCallback from \"@mui/utils/useEventCallback\";\nimport { useId, useRef, useState } from \"react\";\nimport { DialogsContext } from \"../contexts/DialogsContext\";\nimport type { DialogComponent, OpenDialog, OpenDialogOptions } from \"../hooks/DialogsHooks\";\n\ninterface DialogStackEntry<TPayload, TResult> {\n key: string;\n open: boolean;\n promise: Promise<TResult>;\n Component: DialogComponent<TPayload, TResult>;\n payload: TPayload;\n onClose: (result: TResult) => Promise<void>;\n resolve: (result: TResult) => void;\n}\n\nexport interface DialogProviderProps {\n children?: React.ReactNode;\n unmountAfter?: number;\n}\n\nfunction DialogsProvider({ children, unmountAfter = 1000 }: Readonly<DialogProviderProps>) {\n const [stack, setStack] = useState<Array<DialogStackEntry<any, any>>>([]);\n const keyPrefix = useId();\n const nextId = useRef(0);\n const dialogMetadata = useRef(new WeakMap<Promise<any>, DialogStackEntry<any, any>>());\n\n const requestDialog = useEventCallback<OpenDialog>(function open<TPayload, TResult>(\n Component: DialogComponent<TPayload, TResult>,\n payload: TPayload,\n options: OpenDialogOptions<TResult> = {},\n ) {\n const { onClose = async () => { } } = options;\n\n let resolve: (result: TResult) => void;\n const promise = new Promise<TResult>((resolveImpl) => {\n resolve = resolveImpl;\n });\n\n const key = `${keyPrefix}-${nextId.current}`;\n nextId.current += 1;\n\n const newEntry: DialogStackEntry<TPayload, TResult> = {\n key,\n open: true,\n promise,\n Component,\n payload,\n onClose,\n resolve: resolve!,\n };\n\n dialogMetadata.current.set(promise, newEntry);\n\n setStack((previousStack) => [...previousStack, newEntry]);\n\n return promise;\n });\n\n const removeDialogFromStack = (dialog: Promise<any>) => {\n setStack((previousStack) => previousStack.filter((entry) => entry.promise !== dialog));\n dialogMetadata.current.delete(dialog);\n };\n\n const closeDialogUi = useEventCallback(function closeDialogUi<TResult>(dialog: Promise<TResult>) {\n setStack((previousStack) =>\n previousStack.map((entry) => (entry.promise === dialog ? { ...entry, open: false } : entry)),\n );\n\n setTimeout(() => removeDialogFromStack(dialog), unmountAfter);\n });\n\n const closeDialog = useEventCallback(async function closeDialog<TResult>(\n dialog: Promise<TResult>,\n result: TResult,\n ) {\n const entryToClose = dialogMetadata.current.get(dialog);\n if (!entryToClose) {\n throw new Error(\"Dialog not found in stack\");\n }\n\n try {\n await entryToClose.onClose(result);\n } finally {\n entryToClose.resolve(result);\n closeDialogUi(dialog);\n }\n\n return dialog;\n });\n\n return (\n <DialogsContext.Provider value={{ open: requestDialog, close: closeDialog }}>\n {children}\n {stack.map(({ key, open, Component, payload, promise }) => (\n <Component\n key={key}\n payload={payload}\n open={open}\n onClose={async (result) => {\n await closeDialog(promise, result);\n }}\n />\n ))}\n </DialogsContext.Provider>\n );\n}\n\nexport { DialogsProvider };\n\n","import { Chip, Stack, Typography } from \"@mui/material\";\nimport type { FC } from \"react\";\nimport { clientEnv } from \"~/env\";\n\nexport const AppTitle: FC = () => {\n return (\n <Stack direction=\"row\" alignItems=\"center\" spacing={2} flexGrow={1}>\n <img src=\"/favicon-32x32.png\" alt=\"app-logo\" loading=\"lazy\" />\n <Typography variant=\"h6\">{clientEnv.VITE_APP_TITLE}</Typography>\n {import.meta.env.DEV && <Chip size=\"small\" label=\"TEST\" color=\"info\" />}\n </Stack>\n );\n};\n","import ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\nimport { Collapse } from \"@mui/material\";\nimport Avatar from \"@mui/material/Avatar\";\nimport Box from \"@mui/material/Box\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemButton from \"@mui/material/ListItemButton\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport Paper from \"@mui/material/Paper\";\nimport Popper from \"@mui/material/Popper\";\nimport { styled } from \"@mui/material/styles\";\nimport Typography from \"@mui/material/Typography\";\nimport { Fragment, useState } from \"react\";\nimport { MINI_WIDTH } from \"./NavigationRail\";\nimport type { NavigationItem, NavigationPageItem } from \"~/models/Navigation\";\nimport type { FC, ReactNode } from \"react\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport { RouterListItemButton } from \"~/components/router/RouterListItemButton\";\n\nconst ICON_SIZE = 34;\n\nconst StyledNavButton = styled(ListItemButton)(({ theme }) => ({\n borderRadius: 8,\n \"&.Mui-selected\": {\n \"& .MuiListItemIcon-root, & .MuiTypography-root, & .MuiSvgIcon-root\": {\n color: (theme.vars ?? theme).palette.primary.dark,\n },\n \"& .MuiAvatar-root\": {\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\n },\n \"& .MuiTouchRipple-child\": {\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\n },\n },\n \"& .MuiSvgIcon-root\": {\n color: (theme.vars ?? theme).palette.action.active,\n },\n \"& .MuiAvatar-root\": {\n backgroundColor: (theme.vars ?? theme).palette.action.active,\n },\n}));\n\nconst StyledRouterButton = styled(RouterListItemButton)(({ theme }) => ({\n borderRadius: 8,\n \"&.Mui-selected\": {\n \"& .MuiListItemIcon-root, & .MuiTypography-root, & .MuiSvgIcon-root\": {\n color: (theme.vars ?? theme).palette.primary.dark,\n },\n \"& .MuiAvatar-root\": {\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\n },\n \"& .MuiTouchRipple-child\": {\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\n },\n },\n \"& .MuiSvgIcon-root\": {\n color: (theme.vars ?? theme).palette.action.active,\n },\n \"& .MuiAvatar-root\": {\n backgroundColor: (theme.vars ?? theme).palette.action.active,\n },\n}));\n\nconst IconOrAvatar: FC<{ item: NavigationPageItem; collapsed?: boolean }> = ({ item, collapsed }) => {\n if (item.icon || collapsed) {\n return (\n <Box sx={collapsed ? { position: \"absolute\", left: \"50%\", top: \"calc(50% - 6px)\", transform: \"translate(-50%, -50%)\" } : {}}>\n <ListItemIcon sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", minWidth: ICON_SIZE }}>\n {item.icon ?? null}\n {!item.icon && collapsed ? (\n <Avatar sx={{ width: ICON_SIZE - 7, height: ICON_SIZE - 7, fontSize: 12 }}>{item.title}</Avatar>\n ) : null}\n </ListItemIcon>\n {collapsed ? (\n <Typography\n variant=\"caption\"\n sx={{\n position: \"absolute\",\n bottom: -18,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n fontSize: 10,\n fontWeight: 500,\n textAlign: \"center\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n maxWidth: MINI_WIDTH - 28,\n }}\n >\n {item.title}\n </Typography>\n ) : null}\n </Box>\n );\n }\n return null;\n};\n\ninterface MiniPopoverProps {\n open: boolean;\n anchorEl: HTMLElement | null;\n children?: ReactNode;\n}\n\nconst MiniPopover: FC<MiniPopoverProps> = ({ open, anchorEl, children }) => (\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement=\"right-start\"\n modifiers={[\n { name: \"offset\", options: { offset: [6, 0] } },\n { name: \"preventOverflow\", options: { padding: 8 } },\n { name: \"flip\", options: { fallbackPlacements: [\"right-end\", \"left-start\"] } },\n ]}\n >\n <Paper\n sx={{\n pt: 0.5,\n pb: 0.5,\n maxHeight: \"min(calc(100vh - 100px), 560px)\",\n overflowY: \"auto\",\n overscrollBehavior: \"contain\",\n }}\n >\n {children}\n </Paper>\n </Popper>\n);\n\ninterface NavigationListItemProps {\n item: NavigationPageItem;\n isOpen?: boolean;\n selected?: boolean;\n disabled?: boolean;\n collapsed?: boolean;\n isSidebarFullyExpanded?: boolean;\n isSidebarFullyCollapsed?: boolean;\n onClick?: (item: NavigationPageItem) => void;\n renderNested?: (sub: Array<NavigationItem>) => ReactNode;\n onClose?: () => void;\n}\n\nexport const NavigationListItem: FC<NavigationListItemProps> = ({ item, isOpen, selected, disabled, collapsed, isSidebarFullyExpanded = true, isSidebarFullyCollapsed, onClick, renderNested, onClose }) => {\n const [hoveredPopoverItem, setHoveredPopoverItem] = useState<string | null>(null);\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n\n const chevronSx: SxProps<Theme> = () => {\n if (collapsed && isSidebarFullyCollapsed && item.children) {\n return {\n fontSize: 18,\n position: \"absolute\",\n top: \"41.5%\",\n right: \"2px\",\n transform: \"translateY(-50%) rotate(-90deg)\",\n };\n }\n if (!collapsed && isSidebarFullyExpanded && item.children) {\n return {\n ml: 0.5,\n transform: `rotate(${isOpen ? 0 : -90}deg)`,\n };\n }\n return { display: \"none\" };\n };\n\n const shouldJustExpand = item.children && !collapsed;\n\n const buttonProps = {\n selected,\n disabled,\n sx: { px: 1.4, height: collapsed ? 60 : 48 }\n };\n\n const buttonContent = (\n <>\n <IconOrAvatar item={item} collapsed={collapsed} />\n {!collapsed && (\n <ListItemText\n primary={item.title}\n slotProps={{ primary: { noWrap: true, title: item.title } }}\n sx={{ ml: 1.2, flex: 1, minWidth: 0, \"& .MuiTypography-root\": { whiteSpace: \"nowrap\", overflow: \"hidden\", textOverflow: \"ellipsis\" } }}\n />\n )}\n {item.children ? <ExpandMoreIcon sx={chevronSx} /> : null}\n </>\n );\n\n const listItem = (\n <ListItem\n {...(item.children && collapsed\n ? {\n onMouseEnter: (event: React.MouseEvent<HTMLElement>) => {\n setAnchorElement(event.currentTarget);\n setHoveredPopoverItem(item.title);\n },\n onMouseLeave: () => {\n setHoveredPopoverItem(null);\n },\n }\n : {})}\n sx={{ py: 0, px: 1, overflowX: \"hidden\" }}\n >\n {shouldJustExpand ? (\n <StyledNavButton {...buttonProps} onClick={() => onClick?.(item)}>\n {buttonContent}\n </StyledNavButton>\n ) : (\n <StyledRouterButton\n {...buttonProps}\n to={item.to}\n href={item.href}\n params={item.params as any}\n search={item.search as any}\n onClick={onClose}\n >\n {buttonContent}\n </StyledRouterButton>\n )}\n\n {item.children && collapsed ? (\n <MiniPopover open={item.title === hoveredPopoverItem} anchorEl={anchorElement}>\n {renderNested?.(item.children)}\n </MiniPopover>\n ) : null}\n </ListItem>\n );\n\n return (\n <Fragment key={item.to}>\n {listItem}\n {item.children && !collapsed ? (\n <Collapse in={isOpen} timeout=\"auto\" unmountOnExit>\n {renderNested?.(item.children)}\n </Collapse>\n ) : null}\n </Fragment>\n );\n};\n","import Divider from \"@mui/material/Divider\";\nimport List from \"@mui/material/List\";\nimport ListSubheader from \"@mui/material/ListSubheader\";\nimport { Fragment, useEffect, useState } from \"react\";\nimport { NavigationListItem } from \"./NavigationListItem\";\nimport { EXPANDED_WIDTH, MINI_WIDTH } from \"./NavigationRail\";\nimport type { FC, ReactNode } from \"react\";\nimport type { Navigation, NavigationDivider, NavigationHeader, NavigationItem, NavigationPageItem } from \"~/models/Navigation\";\n\nexport const isPageItem = (item: NavigationItem): item is NavigationPageItem => !(\"kind\" in item);\nexport const isDivider = (item: NavigationItem): item is NavigationDivider => \"kind\" in item && item.kind === \"divider\";\nexport const isHeader = (item: NavigationItem): item is NavigationHeader => \"kind\" in item && item.kind === \"header\";\n\ninterface NavigationListProps {\n subNavigation: Navigation;\n depth?: number;\n collapsed?: boolean;\n isPopover?: boolean;\n isSidebarFullyExpanded?: boolean;\n isSidebarFullyCollapsed?: boolean;\n expandedWidth: number | string;\n renderItem?: (item: NavigationPageItem, context: { collapsed: boolean }) => ReactNode;\n activePath?: string | null;\n onNavigate: (item: NavigationPageItem) => void;\n onClose?: () => void;\n}\n\nexport const NavigationList: FC<NavigationListProps> = ({ subNavigation, depth = 0, collapsed, isPopover, isSidebarFullyExpanded = true, isSidebarFullyCollapsed, expandedWidth, renderItem, activePath, onNavigate, onClose }) => {\n const [openKeys, setOpenKeys] = useState<Array<string>>([]);\n\n useEffect(() => {\n if (collapsed) setOpenKeys([]);\n }, [collapsed]);\n\n const toggleKey = (key: string) =>\n setOpenKeys((previous) => (previous.includes(key) ? previous.filter((k) => k !== key) : [...previous, key]));\n\n const renderNested = (children: Array<NavigationItem>) => <NavigationList\n subNavigation={children}\n depth={depth + 1}\n isPopover={collapsed}\n expandedWidth={expandedWidth}\n activePath={activePath}\n onNavigate={onNavigate}\n onClose={onClose}\n />;\n\n const filteredNavigation = subNavigation.filter(nav => !nav.hidden);\n\n return (\n <List\n sx={{\n padding: 0,\n mt: isPopover && depth === 1 ? 0.5 : 0,\n mb: depth === 0 && !isPopover ? 4 : 0.5,\n pl: (isPopover ? 1 : 2) * (isPopover ? depth - 1 : depth),\n minWidth: isPopover && depth === 1 ? EXPANDED_WIDTH : \"auto\",\n width: collapsed ? MINI_WIDTH : \"auto\",\n }}\n >\n {filteredNavigation.map((navItem, index) => {\n if (isHeader(navItem)) {\n return (\n <ListSubheader\n key={`subheader-${depth}-${index}`}\n sx={{\n fontSize: 12,\n fontWeight: \"700\",\n height: collapsed ? 0 : 40,\n px: 2,\n minWidth: expandedWidth,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n zIndex: 2,\n bgcolor: \"transparent\",\n position: \"static\"\n }}\n >\n {navItem.title}\n </ListSubheader>\n );\n }\n\n if (isDivider(navItem)) {\n const nextItem = filteredNavigation[index + 1];\n return (\n <li key={`divider-${depth}-${index}`}>\n <Divider sx={{ mx: 1, mt: 1, mb: isHeader(nextItem) && !collapsed ? 0 : 1 }} />\n </li>\n );\n }\n\n if (!isPageItem(navItem)) return null;\n\n const key = `item-${depth}-${index}`;\n const uniqueItemKey = `${depth}-${index}-${navItem.title}`;\n\n if (renderItem) return <Fragment key={key}>{renderItem(navItem, { collapsed: !!collapsed })}</Fragment>;\n\n return <NavigationListItem\n key={key}\n item={navItem}\n isOpen={openKeys.includes(uniqueItemKey)}\n selected={activePath === navItem.to}\n collapsed={collapsed}\n isSidebarFullyExpanded={isSidebarFullyExpanded}\n isSidebarFullyCollapsed={isSidebarFullyCollapsed}\n onClick={navItem.children && !collapsed ? () => toggleKey(uniqueItemKey) : undefined}\n renderNested={renderNested}\n onClose={onClose}\n />;\n })}\n </List>\n );\n};","import { useMediaQuery } from \"@mui/material\";\nimport Box from \"@mui/material/Box\";\nimport Drawer from \"@mui/material/Drawer\";\nimport { useTheme } from \"@mui/material/styles\";\nimport { useNavigate, useRouterState } from \"@tanstack/react-router\";\nimport { NavigationList, isHeader } from \"./NavigationList\";\nimport type { FC } from \"react\";\nimport type { Navigation } from \"~/models/Navigation\";\n\nexport const MINI_WIDTH = 84;\nexport const EXPANDED_WIDTH = 320;\nexport const TOOLBAR_HEIGHT = 64;\n\ninterface NavigationRailProps {\n navigation: Navigation;\n expanded: boolean;\n setExpanded: (open: boolean) => void;\n}\n\nexport const NavigationRail: FC<NavigationRailProps> = ({ navigation, expanded, setExpanded }) => {\n const navigate = useNavigate();\n const routerState = useRouterState();\n const theme = useTheme();\n const showPermanent = useMediaQuery(theme.breakpoints.up(\"sm\"));\n\n const drawerContent = (collapsed: boolean) => (\n <Box\n component=\"nav\"\n sx={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"space-between\",\n overflow: \"auto\",\n scrollbarGutter: collapsed ? \"stable\" : \"auto\",\n overflowX: \"hidden\",\n pt: navigation[0] && isHeader(navigation[0]) && !collapsed ? 0 : 2,\n }}\n >\n <NavigationList\n subNavigation={navigation}\n collapsed={collapsed}\n isSidebarFullyExpanded={expanded}\n isSidebarFullyCollapsed={!expanded}\n expandedWidth={EXPANDED_WIDTH}\n activePath={routerState.location.pathname}\n onNavigate={navigate}\n onClose={!showPermanent ? () => setExpanded(false) : undefined}\n />\n </Box>\n );\n\n if (showPermanent)\n return (\n <Drawer\n variant=\"permanent\"\n sx={{\n width: expanded ? EXPANDED_WIDTH : MINI_WIDTH,\n [\"& .MuiDrawer-paper\"]: {\n position: \"absolute\",\n top: `${TOOLBAR_HEIGHT}px`,\n height: `calc(100% - ${TOOLBAR_HEIGHT}px)`,\n width: expanded ? EXPANDED_WIDTH : MINI_WIDTH,\n borderTop: \"1px solid\",\n borderColor: theme.vars?.palette.divider,\n },\n }}\n >\n {drawerContent(!expanded)}\n </Drawer>\n );\n\n return (\n <Drawer open={expanded} onClose={() => setExpanded(false)}>\n {drawerContent(!expanded)}\n </Drawer>\n );\n};\n","import AccountCircle from \"@mui/icons-material/AccountCircle\";\nimport ArrowBack from \"@mui/icons-material/ArrowBack\";\nimport Brightness4 from \"@mui/icons-material/Brightness4\";\nimport ChevronRight from \"@mui/icons-material/ChevronRight\";\nimport DarkMode from \"@mui/icons-material/DarkMode\";\nimport LightMode from \"@mui/icons-material/LightMode\";\nimport Login from \"@mui/icons-material/Login\";\nimport Logout from \"@mui/icons-material/Logout\";\nimport SettingsBrightness from \"@mui/icons-material/SettingsBrightness\";\nimport Translate from \"@mui/icons-material/Translate\";\nimport { Avatar, Box, IconButton, List, ListItem, ListItemButton, ListItemIcon, ListItemText, ListSubheader, Menu, Typography, useColorScheme } from \"@mui/material\";\nimport { Fragment, useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport Done from \"@mui/icons-material/Done\";\nimport type { FC } from \"react\";\nimport type { User } from \"~/models/User\";\nimport { authClient } from \"~/lib/auth/auth-client\";\nimport { useDialogs } from \"~/hooks/DialogsHooks\";\n\ntype TabType = \"settings\" | \"theme\" | \"language\";\n\nconst capitalize = (value: string | undefined) => value && value.charAt(0).toUpperCase() + value.slice(1);\n\nexport const ToolbarAccount: FC = () => {\n const [anchorElement, setAnchorElement] = useState<HTMLElement>();\n const [tab, setTab] = useState<TabType>(\"settings\");\n const open = Boolean(anchorElement);\n const { t, i18n } = useTranslation();\n const { mode, setMode } = useColorScheme();\n const { data: session } = authClient.useSession();\n const { alert } = useDialogs();\n\n const supportedLanguages = (Array.isArray(i18n.options.supportedLngs) ? i18n.options.supportedLngs : []).filter(lng => lng !== \"cimode\");\n const languageDisplayNames = new Intl.DisplayNames([i18n.language], { type: \"language\" });\n\n const colorModes: Array<{ mode: \"light\" | \"dark\" | \"system\"; icon: typeof LightMode; label: string }> = [\n { mode: \"light\", icon: LightMode, label: t(\"Layout.Light\") },\n { mode: \"dark\", icon: DarkMode, label: t(\"Layout.Dark\") },\n { mode: \"system\", icon: SettingsBrightness, label: t(\"Layout.System\") },\n ];\n\n const user = {\n name: \"Dalibor Homola\",\n employeeId: \"C2503017\",\n department: \"IT\",\n } as User;\n\n const usernameInitials = () => {\n if (!user.name) return \"\";\n const splittedName: Array<string> = user.name.split(\" \");\n return `${splittedName[0][0]}${splittedName.length > 1 ? splittedName[1][0] : \"\"}`;\n };\n\n const openMenu = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => setAnchorElement(event.currentTarget);\n const closeMenu = () => { setAnchorElement(undefined); setTimeout(() => setTab(\"settings\"), 300); };\n\n const changeTab = (newTab: TabType) => () => setTab(newTab);\n\n const settings = (\n <List component=\"nav\" subheader={<ListSubheader sx={{ backgroundColor: \"transparent\" }}>{t(\"Layout.Settings\")}</ListSubheader>}>\n <ListItemButton onClick={changeTab(\"theme\")} sx={{ py: 0.3 }}>\n <ListItemIcon>\n <Brightness4 />\n </ListItemIcon>\n <ListItemText primary={t(\"Layout.Appearance\")} secondary={colorModes.find((m) => m.mode === mode)?.label} />\n <ChevronRight />\n </ListItemButton>\n\n <ListItemButton onClick={changeTab(\"language\")} sx={{ py: 0.3 }}>\n <ListItemIcon>\n <Translate />\n </ListItemIcon>\n <ListItemText primary={t(\"Layout.Language\")} secondary={capitalize(languageDisplayNames.of(i18n.language))} />\n <ChevronRight />\n </ListItemButton>\n </List>\n );\n\n const theme = (\n <List subheader={\n <ListSubheader onClick={changeTab(\"settings\")} sx={{ backgroundColor: \"transparent\", display: \"flex\", alignItems: \"center\", px: 1, cursor: \"pointer\" }}>\n <IconButton size=\"small\" sx={{ mr: 0.5 }}>\n <ArrowBack fontSize=\"small\" />\n </IconButton> {t(\"Layout.Appearance\")}\n </ListSubheader>\n }>\n {colorModes.map(({ mode: modeValue, icon: Icon, label }) => (\n <ListItemButton\n key={modeValue}\n onClick={() => {\n setMode(modeValue);\n closeMenu();\n }}\n selected={mode === modeValue}\n >\n <ListItemIcon>\n <Icon />\n </ListItemIcon>\n <ListItemText primary={label} />\n </ListItemButton>\n ))}\n </List>\n );\n\n const language = (\n <List subheader={\n <ListSubheader onClick={changeTab(\"settings\")} sx={{ backgroundColor: \"transparent\", display: \"flex\", alignItems: \"center\", px: 1, cursor: \"pointer\" }}>\n <IconButton size=\"small\" sx={{ mr: 0.5 }}>\n <ArrowBack fontSize=\"small\" />\n </IconButton> {t(\"Layout.Language\")}\n </ListSubheader>\n }>\n {supportedLanguages.map((languageCode) =>\n <ListItemButton\n key={languageCode}\n onClick={() => i18n.changeLanguage(languageCode).finally(() => closeMenu())}\n selected={i18n.resolvedLanguage === languageCode}\n >\n <ListItemIcon>\n {i18n.resolvedLanguage === languageCode && <Done />}\n </ListItemIcon>\n <ListItemText primary={capitalize(languageDisplayNames.of(languageCode))} />\n </ListItemButton>\n )}\n </List>\n );\n\n return (\n <Fragment>\n <IconButton size=\"small\" edge=\"end\" onClick={openMenu}>\n {user.name ?\n <Avatar sx={{ width: { xs: 32, sm: 40 }, height: { xs: 32, sm: 40 }, bgcolor: \"primary.main\" }}>\n <Typography variant=\"subtitle2\" sx={{ fontWeight: \"bold\", lineHeight: 0 }}>\n {usernameInitials()}\n </Typography>\n </Avatar>\n :\n <AccountCircle fontSize=\"large\" />\n }\n </IconButton>\n\n <Menu anchorEl={anchorElement} open={open} onClose={closeMenu}>\n <Box sx={{ width: 240 }}>\n <List>\n {session ?\n <Fragment>\n <ListItem>\n <ListItemText primary={user.name} secondary={\n <span>\n <span>{user.employeeId}</span>\n <br />\n <span>{user.department}</span>\n </span>\n } />\n </ListItem>\n\n <ListItemButton\n onClick={() =>\n authClient.signOut({}, {\n onSuccess: () => closeMenu(),\n onError: ({ error }) => alert(error.message)\n })\n }\n >\n <ListItemIcon><Logout color=\"error\" /></ListItemIcon>\n <ListItemText primary={t(\"Layout.Logout\")} />\n </ListItemButton>\n </Fragment>\n :\n <ListItemButton\n onClick={() =>\n authClient.signIn.social({ provider: \"microsoft\" }, {\n onSuccess: () => closeMenu(),\n onError: ({ error }) => alert(error.message)\n })\n }\n >\n <ListItemIcon><Login color=\"success\" /></ListItemIcon>\n <ListItemText primary={t(\"Layout.LogIn\")} />\n </ListItemButton>\n }\n </List>\n\n {tab === \"settings\" && settings}\n {tab === \"theme\" && theme}\n {tab === \"language\" && language}\n </Box>\n </Menu>\n </Fragment>\n );\n};\n","import Menu from \"@mui/icons-material/Menu\";\nimport MenuOpen from \"@mui/icons-material/MenuOpen\";\nimport { AppBar, Box, CssBaseline, IconButton, InitColorSchemeScript, LinearProgress, Toolbar } from \"@mui/material\";\nimport { styled } from \"@mui/material/styles\";\nimport { useIsFetching, useIsMutating } from \"@tanstack/react-query\";\nimport { Fragment, useState } from \"react\";\nimport { createIsomorphicFn } from \"@tanstack/react-start\";\nimport { getCookie } from \"@tanstack/react-start/server\";\nimport { AppTitle } from \"./AppTitle\";\nimport { NavigationRail } from \"./navigation/NavigationRail\";\nimport { ToolbarAccount } from \"./ToolbarAccount\";\nimport type { FC, ReactNode } from \"react\";\nimport type { Navigation } from \"~/models/Navigation\";\n\nconst YEAR_IN_SECONDS = 60 * 60 * 24 * 365;\n\nconst getNavigationOpenStatus = createIsomorphicFn()\n .server(() => {\n const cookie = getCookie(\"navigationOpen\");\n return cookie === \"true\";\n })\n .client(() => {\n const cookie = document.cookie\n .split(\"; \")\n .find(row => row.startsWith(\"navigationOpen=\"));\n return cookie ? cookie.split(\"=\")[1] === \"true\" : false;\n });\n\nconst DrawerHeader = styled(\"div\")(({ theme }) => ({\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"flex-end\",\n padding: theme.spacing(0, 1),\n ...theme.mixins.toolbar,\n}));\n\ninterface LayoutProps {\n navigation: Navigation | undefined;\n children: ReactNode;\n}\n\nexport const Layout: FC<LayoutProps> = (props) => {\n const [navigationOpen, setNavigationOpen] = useState(getNavigationOpenStatus);\n const isFetching = !!useIsFetching();\n const isMutating = !!useIsMutating();\n\n return (\n <Fragment>\n <InitColorSchemeScript />\n <CssBaseline />\n\n <Box sx={{ display: \"flex\", height: \"100dvh\", maxHeight: \"100dvh\", overflow: \"hidden\", width: \"100%\" }}>\n <AppBar\n color=\"transparent\"\n position=\"fixed\"\n sx={theme => ({\n borderBottom: \"1px solid\",\n borderColor: theme.vars?.palette.divider,\n boxShadow: \"none\",\n })}>\n <Toolbar>\n {props.navigation &&\n <IconButton\n onClick={() => {\n setNavigationOpen(previous => {\n const newValue = !previous;\n document.cookie = `navigationOpen=${newValue}; max-age=${YEAR_IN_SECONDS}; path=/`;\n return newValue;\n });\n }}\n sx={{ marginRight: 2 }}\n >\n {navigationOpen ? <MenuOpen /> : <Menu />}\n </IconButton>\n }\n\n <AppTitle />\n\n <ToolbarAccount />\n </Toolbar>\n </AppBar>\n\n {props.navigation &&\n <NavigationRail\n navigation={props.navigation}\n expanded={navigationOpen}\n setExpanded={newValue => {\n setNavigationOpen(newValue);\n document.cookie = `navigationOpen=${newValue}; max-age=${YEAR_IN_SECONDS}; path=/`;\n }}\n />\n }\n\n <Box component=\"main\" sx={{ flexGrow: 1, display: \"flex\", flexDirection: \"column\", minWidth: 0, height: \"100%\", overflow: \"hidden\" }}>\n <DrawerHeader />\n <Box sx={{ flex: 1, overflow: \"auto\", position: \"relative\" }}>\n {props.children}\n </Box>\n </Box>\n </Box>\n\n {(isFetching || isMutating) && <LinearProgress sx={{ position: \"fixed\", top: { xs: 56, sm: 64 }, left: 0, right: 0 }} />}\n </Fragment>\n );\n};\n","import { ThemeProvider } from \"@mui/material\";\nimport { LocalizationProvider } from \"@mui/x-date-pickers\";\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\nimport { createServerFn } from \"@tanstack/react-start\";\nimport { getCookie } from \"@tanstack/react-start/server\";\nimport dayjs from \"dayjs\";\nimport i18n from \"i18next\";\nimport LanguageDetector from \"i18next-browser-languagedetector\";\nimport { useEffect, useEffectEvent } from \"react\";\nimport { initReactI18next } from \"react-i18next\";\nimport { resources } from \"virtual:wcz-layout\";\nimport z from \"zod\";\nimport { DialogsProvider } from \"./DialogsProvider\";\nimport type { CssVarsThemeOptions } from \"@mui/material\";\nimport type { Navigation } from \"~/models/Navigation\";\nimport type { FC, ReactNode } from \"react\";\nimport { useGetTheme } from \"~/hooks/ThemeHook\";\nimport { Layout } from \"~/components/core/Layout\";\n\nconst YEAR_IN_MINUTES = 60 * 24 * 365;\n\ni18n\n .use(LanguageDetector)\n .use(initReactI18next)\n .init({\n resources,\n fallbackLng: \"en\",\n supportedLngs: Object.keys(resources),\n detection: {\n caches: [\"cookie\"],\n cookieMinutes: YEAR_IN_MINUTES,\n },\n interpolation: { escapeValue: false },\n });\n\ninterface ProvidersProps {\n navigation?: Navigation;\n theme?: Pick<CssVarsThemeOptions, \"colorSchemes\" | \"components\">;\n children: ReactNode;\n}\n\nexport const LayoutProvider: FC<ProvidersProps> = ({ navigation, theme, children }) => {\n const createdTheme = useGetTheme(theme);\n\n const languageChangedHandler = useEffectEvent(() => {\n z.config(z.core.locales[i18n.language as keyof typeof z.core.locales]());\n dayjs.locale(i18n.language);\n });\n\n useEffect(() => {\n languageChangedHandler();\n\n i18n.on(\"languageChanged\", languageChangedHandler);\n return () => { i18n.off(\"languageChanged\", languageChangedHandler); };\n }, []);\n\n return (\n <ThemeProvider theme={createdTheme}>\n <LocalizationProvider key={i18n.language} dateAdapter={AdapterDayjs} adapterLocale={i18n.language}>\n <DialogsProvider>\n <Layout navigation={navigation}>\n {children}\n </Layout>\n </DialogsProvider>\n </LocalizationProvider>\n </ThemeProvider>\n );\n};\n\nexport const setSSRLanguage = createServerFn().handler(async () => {\n const language = getCookie(i18n.services.languageDetector.options.lookupCookie) || \"en\";\n dayjs.locale(language);\n z.config(z.core.locales[language as keyof typeof z.core.locales]());\n await i18n.changeLanguage(language);\n});\n"],"names":["closeDialogUi","closeDialog","jsxs","jsx","Typography","Fragment","i18n","List","ListSubheader","ListItemButton","ListItemIcon","ListItemText","Avatar","Box","ListItem","Menu","z"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/providers/DialogsProvider.tsx","../src/lib/auth/index.ts","../src/queries/UserHooks.ts","../src/providers/UserProvider.tsx","../src/components/core/AppTitle.tsx","../src/components/core/navigation/NavigationListItem.tsx","../src/components/core/navigation/NavigationList.tsx","../src/components/core/navigation/NavigationRail.tsx","../src/components/core/ToolbarAccount.tsx","../src/components/core/Layout.tsx","../src/providers/LayoutProvider.tsx"],"sourcesContent":["import useEventCallback from \"@mui/utils/useEventCallback\";\nimport { useId, useRef, useState } from \"react\";\nimport { DialogsContext } from \"../contexts/DialogsContext\";\nimport type { DialogComponent, OpenDialog, OpenDialogOptions } from \"../hooks/DialogsHooks\";\n\ninterface DialogStackEntry<TPayload, TResult> {\n key: string;\n open: boolean;\n promise: Promise<TResult>;\n Component: DialogComponent<TPayload, TResult>;\n payload: TPayload;\n onClose: (result: TResult) => Promise<void>;\n resolve: (result: TResult) => void;\n}\n\nexport interface DialogProviderProps {\n children?: React.ReactNode;\n}\n\nfunction DialogsProvider({ children }: Readonly<DialogProviderProps>) {\n const [stack, setStack] = useState<Array<DialogStackEntry<any, any>>>([]);\n const keyPrefix = useId();\n const nextId = useRef(0);\n const dialogMetadata = useRef(new WeakMap<Promise<any>, DialogStackEntry<any, any>>());\n\n const requestDialog = useEventCallback<OpenDialog>(function open<TPayload, TResult>(\n Component: DialogComponent<TPayload, TResult>,\n payload: TPayload,\n options: OpenDialogOptions<TResult> = {},\n ) {\n const { onClose = async () => { } } = options;\n\n let resolve: (result: TResult) => void;\n const promise = new Promise<TResult>((resolveImpl) => {\n resolve = resolveImpl;\n });\n\n const key = `${keyPrefix}-${nextId.current}`;\n nextId.current += 1;\n\n const newEntry: DialogStackEntry<TPayload, TResult> = {\n key,\n open: true,\n promise,\n Component,\n payload,\n onClose,\n resolve: resolve!,\n };\n\n dialogMetadata.current.set(promise, newEntry);\n\n setStack((previousStack) => [...previousStack, newEntry]);\n\n return promise;\n });\n\n const removeDialogFromStack = (dialog: Promise<any>) => {\n setStack((previousStack) => previousStack.filter((entry) => entry.promise !== dialog));\n dialogMetadata.current.delete(dialog);\n };\n\n const closeDialogUi = useEventCallback(function closeDialogUi<TResult>(dialog: Promise<TResult>) {\n setStack((previousStack) =>\n previousStack.map((entry) => (entry.promise === dialog ? { ...entry, open: false } : entry)),\n );\n\n setTimeout(() => removeDialogFromStack(dialog), 1000);\n });\n\n const closeDialog = useEventCallback(async function closeDialog<TResult>(\n dialog: Promise<TResult>,\n result: TResult,\n ) {\n const entryToClose = dialogMetadata.current.get(dialog);\n if (!entryToClose) {\n throw new Error(\"Dialog not found in stack\");\n }\n\n try {\n await entryToClose.onClose(result);\n } finally {\n entryToClose.resolve(result);\n closeDialogUi(dialog);\n }\n\n return dialog;\n });\n\n return (\n <DialogsContext.Provider value={{ open: requestDialog, close: closeDialog }}>\n {children}\n {stack.map(({ key, open, Component, payload, promise }) => (\n <Component\n key={key}\n payload={payload}\n open={open}\n onClose={async (result) => {\n await closeDialog(promise, result);\n }}\n />\n ))}\n </DialogsContext.Provider>\n );\n}\n\nexport { DialogsProvider };\n\n","import { EventType, NavigationClient, PublicClientApplication } from \"@azure/msal-browser\";\r\nimport type { AuthenticationResult, Configuration, EventMessage, NavigationOptions } from \"@azure/msal-browser\";\r\nimport type { UseNavigateResult } from \"@tanstack/react-router\";\r\nimport { clientEnv } from \"~/env\";\r\n\r\nconst msalConfig: Configuration = {\r\n auth: {\r\n clientId: clientEnv.VITE_MICROSOFT_CLIENT_ID,\r\n authority: `https://login.microsoftonline.com/${clientEnv.VITE_MICROSOFT_TENANT_ID}`,\r\n },\r\n};\r\n\r\nexport const msalInstance = new PublicClientApplication(msalConfig);\r\n\r\nmsalInstance.initialize().then(() => {\r\n if (!msalInstance.getActiveAccount() && msalInstance.getAllAccounts().length > 0) {\r\n msalInstance.setActiveAccount(msalInstance.getAllAccounts()[0]);\r\n }\r\n\r\n msalInstance.enableAccountStorageEvents();\r\n\r\n msalInstance.addEventCallback((event: EventMessage) => {\r\n if (event.eventType === EventType.LOGIN_SUCCESS && event.payload) {\r\n const payload = event.payload as AuthenticationResult;\r\n const account = payload.account;\r\n msalInstance.setActiveAccount(account);\r\n }\r\n });\r\n});\r\n\r\nexport class CustomNavigationClient extends NavigationClient {\r\n private readonly navigate: UseNavigateResult<string>;\r\n\r\n constructor(navigate: UseNavigateResult<string>) {\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(location.origin, \"\");\r\n if (options.noHistory) {\r\n this.navigate({ to: relativePath, replace: true });\r\n } else {\r\n this.navigate({ to: relativePath });\r\n }\r\n\r\n return false;\r\n }\r\n}\r\n\r\nexport const acquireAccessToken = async () => {\r\n const account = msalInstance.getActiveAccount();\r\n if (!account) {\r\n throw new Error(\"No active account! Verify a user has been signed in and setActiveAccount has been called.\");\r\n }\r\n\r\n const response = await msalInstance.acquireTokenSilent({\r\n scopes: [\"User.Read\"],\r\n account: account\r\n });\r\n\r\n return response.accessToken;\r\n};\r\n","import { useQuery } from \"@tanstack/react-query\";\r\nimport axios from \"axios\";\r\nimport type { User } from \"~/models/User\";\r\nimport { acquireAccessToken } from \"~/lib/auth\";\r\n\r\nconst QUERY_KEY = \"user\";\r\nconst DAY = 1000 * 60 * 60 * 24;\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 acquireAccessToken()}`;\r\n return config;\r\n});\r\n\r\ninterface GraphUserResponse {\r\n data: {\r\n id: string;\r\n displayName: string;\r\n jobTitle: string;\r\n mail: string;\r\n mobilePhone: string;\r\n };\r\n}\r\n\r\nexport const useGetUser = (enabled: boolean = true) => {\r\n return useQuery<GraphUserResponse, Error, User>({\r\n queryKey: [QUERY_KEY, \"me\"],\r\n queryFn: ({ signal }) => api.request({\r\n method: \"GET\",\r\n url: \"me?$select=id,displayName,jobTitle,mail,mobilePhone\",\r\n signal,\r\n }),\r\n select: response => ({\r\n id: response.data.id,\r\n name: response.data.displayName.split(\"/\")[0],\r\n jobTitle: response.data.jobTitle,\r\n email: response.data.mail,\r\n mobilePhone: response.data.mobilePhone,\r\n photo: null,\r\n groups: [],\r\n }),\r\n staleTime: DAY,\r\n gcTime: DAY,\r\n refetchOnWindowFocus: false,\r\n enabled,\r\n });\r\n};\r\n\r\nexport const useGetUserPhoto = (enabled: boolean = true) => {\r\n return useQuery<{ data: Blob }, Error, string>({\r\n queryKey: [QUERY_KEY, \"me\", \"photo\"],\r\n queryFn: ({ signal }) => api.request({\r\n method: \"GET\",\r\n url: \"me/photo/$value\",\r\n signal,\r\n responseType: \"blob\",\r\n }),\r\n select: response => URL.createObjectURL(response.data),\r\n staleTime: DAY,\r\n gcTime: DAY,\r\n refetchOnWindowFocus: false,\r\n enabled,\r\n });\r\n};\r\n\r\ninterface GraphGroupsResponse {\r\n data: {\r\n value: Array<{ displayName: string }>;\r\n };\r\n}\r\n\r\nexport const useGetUserGroups = (enabled: boolean = true) => {\r\n return useQuery<GraphGroupsResponse, Error, Array<string>>({\r\n queryKey: [QUERY_KEY, \"me\", \"memberOf\"],\r\n queryFn: ({ signal }) => api.request({\r\n method: \"GET\",\r\n url: \"me/memberOf?$select=displayName\",\r\n signal,\r\n }),\r\n select: response => response.data.value.map((group) => group.displayName),\r\n staleTime: DAY,\r\n gcTime: DAY,\r\n refetchOnWindowFocus: false,\r\n enabled,\r\n });\r\n};\r\n","import { InteractionType } from \"@azure/msal-browser\";\r\nimport { useMsalAuthentication } from \"@azure/msal-react\";\r\nimport { useEffect, useState } from \"react\";\r\nimport type { User } from \"~/models/User\";\r\nimport { UserContext } from \"~/contexts/UserContext\";\r\nimport { useGetUser, useGetUserGroups, useGetUserPhoto } from \"~/queries/UserHooks\";\r\n\r\nexport interface UserProviderProps {\r\n children?: React.ReactNode;\r\n}\r\n\r\nfunction UserProvider({ children }: Readonly<UserProviderProps>) {\r\n const { result } = useMsalAuthentication(InteractionType.Redirect);\r\n const [user, setUser] = useState<User>({} as User);\r\n\r\n const { data } = useGetUser(!!result);\r\n const { data: photo } = useGetUserPhoto(!!result);\r\n const { data: groups } = useGetUserGroups(!!result);\r\n\r\n useEffect(() => {\r\n setUser(prevUser => ({\r\n ...data,\r\n ...(photo && { photo }),\r\n ...(groups && { groups }),\r\n ...prevUser,\r\n }));\r\n }, [data, photo, groups]);\r\n\r\n return (\r\n <UserContext.Provider value={{ user, setUser }}>\r\n {children}\r\n </UserContext.Provider>\r\n );\r\n}\r\n\r\nexport { UserProvider };\r\n\r\n","import { Chip, Stack, Typography } from \"@mui/material\";\nimport type { FC } from \"react\";\nimport { clientEnv } from \"~/env\";\n\nexport const AppTitle: FC = () => {\n return (\n <Stack direction=\"row\" alignItems=\"center\" spacing={2} flexGrow={1}>\n <img src=\"/favicon-32x32.png\" alt=\"app-logo\" loading=\"lazy\" />\n <Typography variant=\"h6\">{clientEnv.VITE_APP_TITLE}</Typography>\n {import.meta.env.DEV && <Chip size=\"small\" label=\"TEST\" color=\"info\" />}\n </Stack>\n );\n};\n","import ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\nimport { Collapse } from \"@mui/material\";\nimport Avatar from \"@mui/material/Avatar\";\nimport Box from \"@mui/material/Box\";\nimport ListItem from \"@mui/material/ListItem\";\nimport ListItemButton from \"@mui/material/ListItemButton\";\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\nimport ListItemText from \"@mui/material/ListItemText\";\nimport Paper from \"@mui/material/Paper\";\nimport Popper from \"@mui/material/Popper\";\nimport { styled } from \"@mui/material/styles\";\nimport Typography from \"@mui/material/Typography\";\nimport { Fragment, useState } from \"react\";\nimport { MINI_WIDTH } from \"./NavigationRail\";\nimport type { NavigationItem, NavigationPageItem } from \"~/models/Navigation\";\nimport type { FC, ReactNode } from \"react\";\nimport type { SxProps, Theme } from \"@mui/material/styles\";\nimport { RouterListItemButton } from \"~/components/router/RouterListItemButton\";\n\nconst ICON_SIZE = 34;\n\nconst StyledNavButton = styled(ListItemButton)(({ theme }) => ({\n borderRadius: 8,\n \"&.Mui-selected\": {\n \"& .MuiListItemIcon-root, & .MuiTypography-root, & .MuiSvgIcon-root\": {\n color: (theme.vars ?? theme).palette.primary.dark,\n },\n \"& .MuiAvatar-root\": {\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\n },\n \"& .MuiTouchRipple-child\": {\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\n },\n },\n \"& .MuiSvgIcon-root\": {\n color: (theme.vars ?? theme).palette.action.active,\n },\n \"& .MuiAvatar-root\": {\n backgroundColor: (theme.vars ?? theme).palette.action.active,\n },\n}));\n\nconst StyledRouterButton = styled(RouterListItemButton)(({ theme }) => ({\n borderRadius: 8,\n \"&.Mui-selected\": {\n \"& .MuiListItemIcon-root, & .MuiTypography-root, & .MuiSvgIcon-root\": {\n color: (theme.vars ?? theme).palette.primary.dark,\n },\n \"& .MuiAvatar-root\": {\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\n },\n \"& .MuiTouchRipple-child\": {\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\n },\n },\n \"& .MuiSvgIcon-root\": {\n color: (theme.vars ?? theme).palette.action.active,\n },\n \"& .MuiAvatar-root\": {\n backgroundColor: (theme.vars ?? theme).palette.action.active,\n },\n}));\n\nconst IconOrAvatar: FC<{ item: NavigationPageItem; collapsed?: boolean }> = ({ item, collapsed }) => {\n if (item.icon || collapsed) {\n return (\n <Box sx={collapsed ? { position: \"absolute\", left: \"50%\", top: \"calc(50% - 6px)\", transform: \"translate(-50%, -50%)\" } : {}}>\n <ListItemIcon sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", minWidth: ICON_SIZE }}>\n {item.icon ?? null}\n {!item.icon && collapsed ? (\n <Avatar sx={{ width: ICON_SIZE - 7, height: ICON_SIZE - 7, fontSize: 12 }}>{item.title}</Avatar>\n ) : null}\n </ListItemIcon>\n {collapsed ? (\n <Typography\n variant=\"caption\"\n sx={{\n position: \"absolute\",\n bottom: -18,\n left: \"50%\",\n transform: \"translateX(-50%)\",\n fontSize: 10,\n fontWeight: 500,\n textAlign: \"center\",\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n maxWidth: MINI_WIDTH - 28,\n }}\n >\n {item.title}\n </Typography>\n ) : null}\n </Box>\n );\n }\n return null;\n};\n\ninterface MiniPopoverProps {\n open: boolean;\n anchorEl: HTMLElement | null;\n children?: ReactNode;\n}\n\nconst MiniPopover: FC<MiniPopoverProps> = ({ open, anchorEl, children }) => (\n <Popper\n open={open}\n anchorEl={anchorEl}\n placement=\"right-start\"\n modifiers={[\n { name: \"offset\", options: { offset: [6, 0] } },\n { name: \"preventOverflow\", options: { padding: 8 } },\n { name: \"flip\", options: { fallbackPlacements: [\"right-end\", \"left-start\"] } },\n ]}\n >\n <Paper\n sx={{\n pt: 0.5,\n pb: 0.5,\n maxHeight: \"min(calc(100vh - 100px), 560px)\",\n overflowY: \"auto\",\n overscrollBehavior: \"contain\",\n }}\n >\n {children}\n </Paper>\n </Popper>\n);\n\ninterface NavigationListItemProps {\n item: NavigationPageItem;\n isOpen?: boolean;\n selected?: boolean;\n disabled?: boolean;\n collapsed?: boolean;\n isSidebarFullyExpanded?: boolean;\n isSidebarFullyCollapsed?: boolean;\n onClick?: (item: NavigationPageItem) => void;\n renderNested?: (sub: Array<NavigationItem>) => ReactNode;\n onClose?: () => void;\n}\n\nexport const NavigationListItem: FC<NavigationListItemProps> = ({ item, isOpen, selected, disabled, collapsed, isSidebarFullyExpanded = true, isSidebarFullyCollapsed, onClick, renderNested, onClose }) => {\n const [hoveredPopoverItem, setHoveredPopoverItem] = useState<string | null>(null);\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\n\n const chevronSx: SxProps<Theme> = () => {\n if (collapsed && isSidebarFullyCollapsed && item.children) {\n return {\n fontSize: 18,\n position: \"absolute\",\n top: \"41.5%\",\n right: \"2px\",\n transform: \"translateY(-50%) rotate(-90deg)\",\n };\n }\n if (!collapsed && isSidebarFullyExpanded && item.children) {\n return {\n ml: 0.5,\n transform: `rotate(${isOpen ? 0 : -90}deg)`,\n };\n }\n return { display: \"none\" };\n };\n\n const shouldJustExpand = item.children && !collapsed;\n\n const buttonProps = {\n selected,\n disabled,\n sx: { px: 1.4, height: collapsed ? 60 : 48 }\n };\n\n const buttonContent = (\n <>\n <IconOrAvatar item={item} collapsed={collapsed} />\n {!collapsed && (\n <ListItemText\n primary={item.title}\n slotProps={{ primary: { noWrap: true, title: item.title } }}\n sx={{ ml: 1.2, flex: 1, minWidth: 0, \"& .MuiTypography-root\": { whiteSpace: \"nowrap\", overflow: \"hidden\", textOverflow: \"ellipsis\" } }}\n />\n )}\n {item.children ? <ExpandMoreIcon sx={chevronSx} /> : null}\n </>\n );\n\n const listItem = (\n <ListItem\n {...(item.children && collapsed\n ? {\n onMouseEnter: (event: React.MouseEvent<HTMLElement>) => {\n setAnchorElement(event.currentTarget);\n setHoveredPopoverItem(item.title);\n },\n onMouseLeave: () => {\n setHoveredPopoverItem(null);\n },\n }\n : {})}\n sx={{ py: 0, px: 1, overflowX: \"hidden\" }}\n >\n {shouldJustExpand ? (\n <StyledNavButton {...buttonProps} onClick={() => onClick?.(item)}>\n {buttonContent}\n </StyledNavButton>\n ) : (\n <StyledRouterButton\n {...buttonProps}\n to={item.to}\n href={item.href}\n params={item.params as any}\n search={item.search as any}\n onClick={onClose}\n >\n {buttonContent}\n </StyledRouterButton>\n )}\n\n {item.children && collapsed ? (\n <MiniPopover open={item.title === hoveredPopoverItem} anchorEl={anchorElement}>\n {renderNested?.(item.children)}\n </MiniPopover>\n ) : null}\n </ListItem>\n );\n\n return (\n <Fragment key={item.to}>\n {listItem}\n {item.children && !collapsed ? (\n <Collapse in={isOpen} timeout=\"auto\" unmountOnExit>\n {renderNested?.(item.children)}\n </Collapse>\n ) : null}\n </Fragment>\n );\n};\n","import Divider from \"@mui/material/Divider\";\nimport List from \"@mui/material/List\";\nimport ListSubheader from \"@mui/material/ListSubheader\";\nimport { Fragment, useEffect, useState } from \"react\";\nimport { NavigationListItem } from \"./NavigationListItem\";\nimport { EXPANDED_WIDTH, MINI_WIDTH } from \"./NavigationRail\";\nimport type { FC, ReactNode } from \"react\";\nimport type { Navigation, NavigationDivider, NavigationHeader, NavigationItem, NavigationPageItem } from \"~/models/Navigation\";\n\nexport const isPageItem = (item: NavigationItem): item is NavigationPageItem => !(\"kind\" in item);\nexport const isDivider = (item: NavigationItem): item is NavigationDivider => \"kind\" in item && item.kind === \"divider\";\nexport const isHeader = (item: NavigationItem): item is NavigationHeader => \"kind\" in item && item.kind === \"header\";\n\ninterface NavigationListProps {\n subNavigation: Navigation;\n depth?: number;\n collapsed?: boolean;\n isPopover?: boolean;\n isSidebarFullyExpanded?: boolean;\n isSidebarFullyCollapsed?: boolean;\n expandedWidth: number | string;\n renderItem?: (item: NavigationPageItem, context: { collapsed: boolean }) => ReactNode;\n activePath?: string | null;\n onNavigate: (item: NavigationPageItem) => void;\n onClose?: () => void;\n}\n\nexport const NavigationList: FC<NavigationListProps> = ({ subNavigation, depth = 0, collapsed, isPopover, isSidebarFullyExpanded = true, isSidebarFullyCollapsed, expandedWidth, renderItem, activePath, onNavigate, onClose }) => {\n const [openKeys, setOpenKeys] = useState<Array<string>>([]);\n\n useEffect(() => {\n if (collapsed) setOpenKeys([]);\n }, [collapsed]);\n\n const toggleKey = (key: string) =>\n setOpenKeys((previous) => (previous.includes(key) ? previous.filter((k) => k !== key) : [...previous, key]));\n\n const renderNested = (children: Array<NavigationItem>) => <NavigationList\n subNavigation={children}\n depth={depth + 1}\n isPopover={collapsed}\n expandedWidth={expandedWidth}\n activePath={activePath}\n onNavigate={onNavigate}\n onClose={onClose}\n />;\n\n const filteredNavigation = subNavigation.filter(nav => !nav.hidden);\n\n return (\n <List\n sx={{\n padding: 0,\n mt: isPopover && depth === 1 ? 0.5 : 0,\n mb: depth === 0 && !isPopover ? 4 : 0.5,\n pl: (isPopover ? 1 : 2) * (isPopover ? depth - 1 : depth),\n minWidth: isPopover && depth === 1 ? EXPANDED_WIDTH : \"auto\",\n width: collapsed ? MINI_WIDTH : \"auto\",\n }}\n >\n {filteredNavigation.map((navItem, index) => {\n if (isHeader(navItem)) {\n return (\n <ListSubheader\n key={`subheader-${depth}-${index}`}\n sx={{\n fontSize: 12,\n fontWeight: \"700\",\n height: collapsed ? 0 : 40,\n px: 2,\n minWidth: expandedWidth,\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n zIndex: 2,\n bgcolor: \"transparent\",\n position: \"static\"\n }}\n >\n {navItem.title}\n </ListSubheader>\n );\n }\n\n if (isDivider(navItem)) {\n const nextItem = filteredNavigation[index + 1];\n return (\n <li key={`divider-${depth}-${index}`}>\n <Divider sx={{ mx: 1, mt: 1, mb: isHeader(nextItem) && !collapsed ? 0 : 1 }} />\n </li>\n );\n }\n\n if (!isPageItem(navItem)) return null;\n\n const key = `item-${depth}-${index}`;\n const uniqueItemKey = `${depth}-${index}-${navItem.title}`;\n\n if (renderItem) return <Fragment key={key}>{renderItem(navItem, { collapsed: !!collapsed })}</Fragment>;\n\n return <NavigationListItem\n key={key}\n item={navItem}\n isOpen={openKeys.includes(uniqueItemKey)}\n selected={activePath === navItem.to}\n collapsed={collapsed}\n isSidebarFullyExpanded={isSidebarFullyExpanded}\n isSidebarFullyCollapsed={isSidebarFullyCollapsed}\n onClick={navItem.children && !collapsed ? () => toggleKey(uniqueItemKey) : undefined}\n renderNested={renderNested}\n onClose={onClose}\n />;\n })}\n </List>\n );\n};","import { useMediaQuery } from \"@mui/material\";\nimport Box from \"@mui/material/Box\";\nimport Drawer from \"@mui/material/Drawer\";\nimport { useTheme } from \"@mui/material/styles\";\nimport { useNavigate, useRouterState } from \"@tanstack/react-router\";\nimport { NavigationList, isHeader } from \"./NavigationList\";\nimport type { FC } from \"react\";\nimport type { Navigation } from \"~/models/Navigation\";\n\nexport const MINI_WIDTH = 84;\nexport const EXPANDED_WIDTH = 320;\nexport const TOOLBAR_HEIGHT = 64;\n\ninterface NavigationRailProps {\n navigation: Navigation;\n expanded: boolean;\n setExpanded: (open: boolean) => void;\n}\n\nexport const NavigationRail: FC<NavigationRailProps> = ({ navigation, expanded, setExpanded }) => {\n const navigate = useNavigate();\n const routerState = useRouterState();\n const theme = useTheme();\n const showPermanent = useMediaQuery(theme.breakpoints.up(\"sm\"));\n\n const drawerContent = (collapsed: boolean) => (\n <Box\n component=\"nav\"\n sx={{\n height: \"100%\",\n display: \"flex\",\n flexDirection: \"column\",\n justifyContent: \"space-between\",\n overflow: \"auto\",\n scrollbarGutter: collapsed ? \"stable\" : \"auto\",\n overflowX: \"hidden\",\n pt: navigation[0] && isHeader(navigation[0]) && !collapsed ? 0 : 2,\n }}\n >\n <NavigationList\n subNavigation={navigation}\n collapsed={collapsed}\n isSidebarFullyExpanded={expanded}\n isSidebarFullyCollapsed={!expanded}\n expandedWidth={EXPANDED_WIDTH}\n activePath={routerState.location.pathname}\n onNavigate={navigate}\n onClose={!showPermanent ? () => setExpanded(false) : undefined}\n />\n </Box>\n );\n\n if (showPermanent)\n return (\n <Drawer\n variant=\"permanent\"\n sx={{\n width: expanded ? EXPANDED_WIDTH : MINI_WIDTH,\n [\"& .MuiDrawer-paper\"]: {\n position: \"absolute\",\n top: `${TOOLBAR_HEIGHT}px`,\n height: `calc(100% - ${TOOLBAR_HEIGHT}px)`,\n width: expanded ? EXPANDED_WIDTH : MINI_WIDTH,\n borderTop: \"1px solid\",\n borderColor: \"var(--mui-palette-divider)\",\n },\n }}\n >\n {drawerContent(!expanded)}\n </Drawer>\n );\n\n return (\n <Drawer open={expanded} onClose={() => setExpanded(false)}>\n {drawerContent(!expanded)}\n </Drawer>\n );\n};\n","import { useMsal } from \"@azure/msal-react\";\r\nimport AccountCircle from \"@mui/icons-material/AccountCircle\";\r\nimport ArrowBack from \"@mui/icons-material/ArrowBack\";\r\nimport Brightness4 from \"@mui/icons-material/Brightness4\";\r\nimport ChevronRight from \"@mui/icons-material/ChevronRight\";\r\nimport DarkMode from \"@mui/icons-material/DarkMode\";\r\nimport Done from \"@mui/icons-material/Done\";\r\nimport LightMode from \"@mui/icons-material/LightMode\";\r\nimport Logout from \"@mui/icons-material/Logout\";\r\nimport SettingsBrightness from \"@mui/icons-material/SettingsBrightness\";\r\nimport Translate from \"@mui/icons-material/Translate\";\r\nimport { Avatar, Box, IconButton, List, ListItem, ListItemButton, ListItemIcon, ListItemText, ListSubheader, Menu, useColorScheme } from \"@mui/material\";\r\nimport { Fragment, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport type { FC } from \"react\";\r\nimport { useUser } from \"~/hooks/UseHook\";\r\n\r\ntype TabType = \"settings\" | \"theme\" | \"language\";\r\n\r\nconst capitalize = (value: string | undefined) => value && value.charAt(0).toUpperCase() + value.slice(1);\r\n\r\nexport const ToolbarAccount: FC = () => {\r\n const [anchorElement, setAnchorElement] = useState<HTMLElement>();\r\n const [tab, setTab] = useState<TabType>(\"settings\");\r\n const open = Boolean(anchorElement);\r\n const { t, i18n } = useTranslation();\r\n const { mode, setMode } = useColorScheme();\r\n const { instance } = useMsal();\r\n const user = useUser();\r\n\r\n const supportedLanguages = (Array.isArray(i18n.options.supportedLngs) ? i18n.options.supportedLngs : []).filter(lng => lng !== \"cimode\");\r\n const languageDisplayNames = new Intl.DisplayNames([i18n.language], { type: \"language\" });\r\n\r\n const colorModes: Array<{ mode: \"light\" | \"dark\" | \"system\"; icon: typeof LightMode; label: string }> = [\r\n { mode: \"light\", icon: LightMode, label: t(\"Layout.Light\") },\r\n { mode: \"dark\", icon: DarkMode, label: t(\"Layout.Dark\") },\r\n { mode: \"system\", icon: SettingsBrightness, label: t(\"Layout.System\") },\r\n ];\r\n\r\n const openMenu = (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => setAnchorElement(event.currentTarget);\r\n const closeMenu = () => { setAnchorElement(undefined); setTimeout(() => setTab(\"settings\"), 300); };\r\n\r\n const changeTab = (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={colorModes.find((m) => m.mode === mode)?.label} />\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={capitalize(languageDisplayNames.of(i18n.language))} />\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 {colorModes.map(({ mode: modeValue, icon: Icon, label }) => (\r\n <ListItemButton\r\n key={modeValue}\r\n onClick={() => {\r\n setMode(modeValue);\r\n closeMenu();\r\n }}\r\n selected={mode === modeValue}\r\n >\r\n <ListItemIcon>\r\n <Icon />\r\n </ListItemIcon>\r\n <ListItemText primary={label} />\r\n </ListItemButton>\r\n ))}\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 {supportedLanguages.map((languageCode) =>\r\n <ListItemButton\r\n key={languageCode}\r\n onClick={() => i18n.changeLanguage(languageCode).finally(() => closeMenu())}\r\n selected={i18n.resolvedLanguage === languageCode}\r\n >\r\n <ListItemIcon>\r\n {i18n.resolvedLanguage === languageCode && <Done />}\r\n </ListItemIcon>\r\n <ListItemText primary={capitalize(languageDisplayNames.of(languageCode))} />\r\n </ListItemButton>\r\n )}\r\n </List>\r\n );\r\n\r\n return (\r\n <Fragment>\r\n <IconButton size=\"small\" edge=\"end\" onClick={openMenu}>\r\n {user.photo ?\r\n <Avatar\r\n src={user.photo}\r\n sx={{ width: { xs: 32, sm: 40 }, height: { xs: 32, sm: 40 } }}\r\n />\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={anchorElement} open={open} onClose={closeMenu}>\r\n <Box sx={{ width: 240 }}>\r\n <List disablePadding>\r\n <ListItem>\r\n <ListItemText primary={user.name} secondary={user.jobTitle} />\r\n </ListItem>\r\n\r\n <ListItemButton\r\n onClick={() =>\r\n instance.logoutRedirect({\r\n postLogoutRedirectUri: \"/\",\r\n })\r\n }\r\n >\r\n <ListItemIcon><Logout color=\"error\" /></ListItemIcon>\r\n <ListItemText primary={t(\"Layout.Logout\")} />\r\n </ListItemButton>\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};\r\n","import { AuthenticatedTemplate } from \"@azure/msal-react\";\r\nimport Menu from \"@mui/icons-material/Menu\";\r\nimport MenuOpen from \"@mui/icons-material/MenuOpen\";\r\nimport { AppBar, Box, CssBaseline, IconButton, InitColorSchemeScript, LinearProgress, Toolbar } from \"@mui/material\";\r\nimport { styled } from \"@mui/material/styles\";\r\nimport { useIsFetching, useIsMutating } from \"@tanstack/react-query\";\r\nimport { createIsomorphicFn } from \"@tanstack/react-start\";\r\nimport { getCookie } from \"@tanstack/react-start/server\";\r\nimport { Fragment, useState } from \"react\";\r\nimport { AppTitle } from \"./AppTitle\";\r\nimport { NavigationRail } from \"./navigation/NavigationRail\";\r\nimport { ToolbarAccount } from \"./ToolbarAccount\";\r\nimport type { Navigation } from \"~/models/Navigation\";\r\nimport type { FC, ReactNode } from \"react\";\r\n\r\nconst YEAR_IN_SECONDS = 60 * 60 * 24 * 365;\r\n\r\nconst getNavigationOpenStatus = createIsomorphicFn()\r\n .server(() => {\r\n const cookie = getCookie(\"navigationOpen\");\r\n return cookie === \"true\";\r\n })\r\n .client(() => {\r\n const cookie = document.cookie\r\n .split(\"; \")\r\n .find(row => row.startsWith(\"navigationOpen=\"));\r\n return cookie ? cookie.split(\"=\")[1] === \"true\" : false;\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 ...theme.mixins.toolbar,\r\n}));\r\n\r\ninterface LayoutProps {\r\n navigation: Navigation | undefined;\r\n children: ReactNode;\r\n}\r\n\r\nexport const Layout: FC<LayoutProps> = (props) => {\r\n const [navigationOpen, setNavigationOpen] = useState(getNavigationOpenStatus);\r\n const isFetching = !!useIsFetching();\r\n const isMutating = !!useIsMutating();\r\n\r\n return (\r\n <Fragment>\r\n <InitColorSchemeScript />\r\n <CssBaseline />\r\n\r\n <Box sx={{ display: \"flex\", height: \"100dvh\", maxHeight: \"100dvh\", overflow: \"hidden\", width: \"100%\" }}>\r\n <AppBar\r\n color=\"transparent\"\r\n position=\"fixed\"\r\n sx={{\r\n borderBottom: \"1px solid\",\r\n borderColor: \"var(--mui-palette-divider)\",\r\n boxShadow: \"none\",\r\n }}>\r\n <Toolbar>\r\n {props.navigation &&\r\n <IconButton\r\n onClick={() => {\r\n setNavigationOpen(previous => {\r\n const newValue = !previous;\r\n document.cookie = `navigationOpen=${newValue}; max-age=${YEAR_IN_SECONDS}; path=/`;\r\n return newValue;\r\n });\r\n }}\r\n sx={{ marginRight: 2 }}\r\n >\r\n {navigationOpen ? <MenuOpen /> : <Menu />}\r\n </IconButton>\r\n }\r\n\r\n <AppTitle />\r\n\r\n <ToolbarAccount />\r\n </Toolbar>\r\n </AppBar>\r\n\r\n {props.navigation &&\r\n <NavigationRail\r\n navigation={props.navigation}\r\n expanded={navigationOpen}\r\n setExpanded={newValue => {\r\n setNavigationOpen(newValue);\r\n document.cookie = `navigationOpen=${newValue}; max-age=${YEAR_IN_SECONDS}; path=/`;\r\n }}\r\n />\r\n }\r\n\r\n <Box component=\"main\" sx={{ flexGrow: 1, display: \"flex\", flexDirection: \"column\", minWidth: 0, height: \"100%\", overflow: \"hidden\" }}>\r\n <DrawerHeader />\r\n <Box sx={{ flex: 1, overflow: \"auto\", position: \"relative\" }}>\r\n <AuthenticatedTemplate>\r\n {props.children}\r\n </AuthenticatedTemplate>\r\n </Box>\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 </Fragment>\r\n );\r\n};\r\n","import { MsalProvider } from \"@azure/msal-react\";\r\nimport { ThemeProvider } from \"@mui/material\";\r\nimport { LocalizationProvider } from \"@mui/x-date-pickers\";\r\nimport { AdapterDayjs } from \"@mui/x-date-pickers/AdapterDayjs\";\r\nimport { createServerFn } from \"@tanstack/react-start\";\r\nimport { getCookie } from \"@tanstack/react-start/server\";\r\nimport dayjs from \"dayjs\";\r\nimport i18n from \"i18next\";\r\nimport LanguageDetector from \"i18next-browser-languagedetector\";\r\nimport { useEffect, useEffectEvent } from \"react\";\r\nimport { initReactI18next } from \"react-i18next\";\r\nimport { resources } from \"virtual:wcz-layout\";\r\nimport z from \"zod\";\r\nimport { DialogsProvider } from \"./DialogsProvider\";\r\nimport { UserProvider } from \"./UserProvider\";\r\nimport type { Navigation } from \"~/models/Navigation\";\r\nimport type { FC, ReactNode } from \"react\";\r\nimport type { Theme } from \"@mui/material\";\r\nimport { msalInstance } from \"~/lib/auth\";\r\nimport { Layout } from \"~/components/core/Layout\";\r\n\r\nconst YEAR_IN_MINUTES = 60 * 24 * 365;\r\n\r\ni18n\r\n .use(LanguageDetector)\r\n .use(initReactI18next)\r\n .init({\r\n resources,\r\n fallbackLng: \"en\",\r\n supportedLngs: Object.keys(resources),\r\n detection: {\r\n caches: [\"cookie\"],\r\n cookieMinutes: YEAR_IN_MINUTES,\r\n },\r\n interpolation: { escapeValue: false },\r\n });\r\n\r\ninterface ProvidersProps {\r\n navigation?: Navigation;\r\n theme: Theme;\r\n children: ReactNode;\r\n}\r\n\r\nexport const LayoutProvider: FC<ProvidersProps> = ({ navigation, theme, children }) => {\r\n\r\n const languageChangedHandler = useEffectEvent(() => {\r\n z.config(z.core.locales[i18n.language as keyof typeof z.core.locales]());\r\n dayjs.locale(i18n.language);\r\n });\r\n\r\n useEffect(() => {\r\n languageChangedHandler();\r\n\r\n i18n.on(\"languageChanged\", languageChangedHandler);\r\n return () => { i18n.off(\"languageChanged\", languageChangedHandler); };\r\n }, []);\r\n\r\n return (\r\n <MsalProvider instance={msalInstance}>\r\n <UserProvider>\r\n <ThemeProvider theme={theme}>\r\n <LocalizationProvider key={i18n.language} dateAdapter={AdapterDayjs} adapterLocale={i18n.language}>\r\n <DialogsProvider>\r\n <Layout navigation={navigation}>\r\n {children}\r\n </Layout>\r\n </DialogsProvider>\r\n </LocalizationProvider>\r\n </ThemeProvider>\r\n </UserProvider>\r\n </MsalProvider>\r\n );\r\n};\r\n\r\nexport const setSSRLanguage = createServerFn().handler(async () => {\r\n const language = getCookie(i18n.services.languageDetector.options.lookupCookie) || \"en\";\r\n z.config(z.core.locales[language as keyof typeof z.core.locales]());\r\n dayjs.locale(language);\r\n await i18n.changeLanguage(language);\r\n});\r\n"],"names":["closeDialogUi","closeDialog","jsxs","jsx","Typography","Fragment","i18n","List","ListSubheader","ListItemButton","ListItemIcon","ListItemText","Avatar","Box","ListItem","Menu","z"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,SAAS,gBAAgB,EAAE,YAA2C;AAClE,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA4C,CAAA,CAAE;AACxE,QAAM,YAAY,MAAA;AAClB,QAAM,SAAS,OAAO,CAAC;AACvB,QAAM,iBAAiB,OAAO,oBAAI,SAAmD;AAErF,QAAM,gBAAgB,iBAA6B,SAAS,KACxD,WACA,SACA,UAAsC,IACxC;AACE,UAAM,EAAE,UAAU,YAAY;AAAA,IAAE,MAAM;AAEtC,QAAI;AACJ,UAAM,UAAU,IAAI,QAAiB,CAAC,gBAAgB;AAClD,gBAAU;AAAA,IACd,CAAC;AAED,UAAM,MAAM,GAAG,SAAS,IAAI,OAAO,OAAO;AAC1C,WAAO,WAAW;AAElB,UAAM,WAAgD;AAAA,MAClD;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAGJ,mBAAe,QAAQ,IAAI,SAAS,QAAQ;AAE5C,aAAS,CAAC,kBAAkB,CAAC,GAAG,eAAe,QAAQ,CAAC;AAExD,WAAO;AAAA,EACX,CAAC;AAED,QAAM,wBAAwB,CAAC,WAAyB;AACpD,aAAS,CAAC,kBAAkB,cAAc,OAAO,CAAC,UAAU,MAAM,YAAY,MAAM,CAAC;AACrF,mBAAe,QAAQ,OAAO,MAAM;AAAA,EACxC;AAEA,QAAM,gBAAgB,iBAAiB,SAASA,eAAuB,QAA0B;AAC7F;AAAA,MAAS,CAAC,kBACN,cAAc,IAAI,CAAC,UAAW,MAAM,YAAY,SAAS,EAAE,GAAG,OAAO,MAAM,MAAA,IAAU,KAAM;AAAA,IAAA;AAG/F,eAAW,MAAM,sBAAsB,MAAM,GAAG,GAAI;AAAA,EACxD,CAAC;AAED,QAAM,cAAc,iBAAiB,eAAeC,aAChD,QACA,QACF;AACE,UAAM,eAAe,eAAe,QAAQ,IAAI,MAAM;AACtD,QAAI,CAAC,cAAc;AACf,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC/C;AAEA,QAAI;AACA,YAAM,aAAa,QAAQ,MAAM;AAAA,IACrC,UAAA;AACI,mBAAa,QAAQ,MAAM;AAC3B,oBAAc,MAAM;AAAA,IACxB;AAEA,WAAO;AAAA,EACX,CAAC;AAED,SACIC,uCAAC,eAAe,UAAf,EAAwB,OAAO,EAAE,MAAM,eAAe,OAAO,YAAA,GACzD,UAAA;AAAA,IAAA;AAAA,IACA,MAAM,IAAI,CAAC,EAAE,KAAK,MAAM,WAAW,SAAS,QAAA,MACzCC,kCAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QAEG;AAAA,QACA;AAAA,QACA,SAAS,OAAO,WAAW;AACvB,gBAAM,YAAY,SAAS,MAAM;AAAA,QACrC;AAAA,MAAA;AAAA,MALK;AAAA,IAAA,CAOZ;AAAA,EAAA,GACL;AAER;ACnGA,MAAM,aAA4B;AAAA,EAC9B,MAAM;AAAA,IACF,UAAU,UAAU;AAAA,IACpB,WAAW,qCAAqC,UAAU,wBAAwB;AAAA,EAAA;AAE1F;AAEO,MAAM,eAAe,IAAI,wBAAwB,UAAU;AAElE,aAAa,WAAA,EAAa,KAAK,MAAM;AACjC,MAAI,CAAC,aAAa,iBAAA,KAAsB,aAAa,eAAA,EAAiB,SAAS,GAAG;AAC9E,iBAAa,iBAAiB,aAAa,eAAA,EAAiB,CAAC,CAAC;AAAA,EAClE;AAEA,eAAa,2BAAA;AAEb,eAAa,iBAAiB,CAAC,UAAwB;AACnD,QAAI,MAAM,cAAc,UAAU,iBAAiB,MAAM,SAAS;AAC9D,YAAM,UAAU,MAAM;AACtB,YAAM,UAAU,QAAQ;AACxB,mBAAa,iBAAiB,OAAO;AAAA,IACzC;AAAA,EACJ,CAAC;AACL,CAAC;AAsBM,MAAM,qBAAqB,YAAY;AAC1C,QAAM,UAAU,aAAa,iBAAA;AAC7B,MAAI,CAAC,SAAS;AACV,UAAM,IAAI,MAAM,2FAA2F;AAAA,EAC/G;AAEA,QAAM,WAAW,MAAM,aAAa,mBAAmB;AAAA,IACnD,QAAQ,CAAC,WAAW;AAAA,IACpB;AAAA,EAAA,CACH;AAED,SAAO,SAAS;AACpB;ACzDA,MAAM,YAAY;AAClB,MAAM,MAAM,MAAO,KAAK,KAAK;AAE7B,MAAM,MAAM,MAAM,OAAO;AAAA,EACrB,SAAS;AACb,CAAC;AAED,IAAI,aAAa,QAAQ,IAAI,OAAO,WAAW;AAC3C,SAAO,QAAQ,gBAAgB,UAAU,MAAM,oBAAoB;AACnE,SAAO;AACX,CAAC;AAYM,MAAM,aAAa,CAAC,UAAmB,SAAS;AACnD,SAAO,SAAyC;AAAA,IAC5C,UAAU,CAAC,WAAW,IAAI;AAAA,IAC1B,SAAS,CAAC,EAAE,aAAa,IAAI,QAAQ;AAAA,MACjC,QAAQ;AAAA,MACR,KAAK;AAAA,MACL;AAAA,IAAA,CACH;AAAA,IACD,QAAQ,CAAA,cAAa;AAAA,MACjB,IAAI,SAAS,KAAK;AAAA,MAClB,MAAM,SAAS,KAAK,YAAY,MAAM,GAAG,EAAE,CAAC;AAAA,MAC5C,UAAU,SAAS,KAAK;AAAA,MACxB,OAAO,SAAS,KAAK;AAAA,MACrB,aAAa,SAAS,KAAK;AAAA,MAC3B,OAAO;AAAA,MACP,QAAQ,CAAA;AAAA,IAAC;AAAA,IAEb,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,sBAAsB;AAAA,IACtB;AAAA,EAAA,CACH;AACL;AAEO,MAAM,kBAAkB,CAAC,UAAmB,SAAS;AACxD,SAAO,SAAwC;AAAA,IAC3C,UAAU,CAAC,WAAW,MAAM,OAAO;AAAA,IACnC,SAAS,CAAC,EAAE,aAAa,IAAI,QAAQ;AAAA,MACjC,QAAQ;AAAA,MACR,KAAK;AAAA,MACL;AAAA,MACA,cAAc;AAAA,IAAA,CACjB;AAAA,IACD,QAAQ,CAAA,aAAY,IAAI,gBAAgB,SAAS,IAAI;AAAA,IACrD,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,sBAAsB;AAAA,IACtB;AAAA,EAAA,CACH;AACL;AAQO,MAAM,mBAAmB,CAAC,UAAmB,SAAS;AACzD,SAAO,SAAoD;AAAA,IACvD,UAAU,CAAC,WAAW,MAAM,UAAU;AAAA,IACtC,SAAS,CAAC,EAAE,aAAa,IAAI,QAAQ;AAAA,MACjC,QAAQ;AAAA,MACR,KAAK;AAAA,MACL;AAAA,IAAA,CACH;AAAA,IACD,QAAQ,cAAY,SAAS,KAAK,MAAM,IAAI,CAAC,UAAU,MAAM,WAAW;AAAA,IACxE,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,sBAAsB;AAAA,IACtB;AAAA,EAAA,CACH;AACL;AC7EA,SAAS,aAAa,EAAE,YAAyC;AAC7D,QAAM,EAAE,OAAA,IAAW,sBAAsB,gBAAgB,QAAQ;AACjE,QAAM,CAAC,MAAM,OAAO,IAAI,SAAe,CAAA,CAAU;AAEjD,QAAM,EAAE,KAAA,IAAS,WAAW,CAAC,CAAC,MAAM;AACpC,QAAM,EAAE,MAAM,MAAA,IAAU,gBAAgB,CAAC,CAAC,MAAM;AAChD,QAAM,EAAE,MAAM,OAAA,IAAW,iBAAiB,CAAC,CAAC,MAAM;AAElD,YAAU,MAAM;AACZ,YAAQ,CAAA,cAAa;AAAA,MACjB,GAAG;AAAA,MACH,GAAI,SAAS,EAAE,MAAA;AAAA,MACf,GAAI,UAAU,EAAE,OAAA;AAAA,MAChB,GAAG;AAAA,IAAA,EACL;AAAA,EACN,GAAG,CAAC,MAAM,OAAO,MAAM,CAAC;AAExB,SACIA,kCAAAA,IAAC,YAAY,UAAZ,EAAqB,OAAO,EAAE,MAAM,WAChC,UACL;AAER;AC7BO,MAAM,WAAe,MAAM;AAC9B,SACID,uCAAC,SAAM,WAAU,OAAM,YAAW,UAAS,SAAS,GAAG,UAAU,GAC7D,UAAA;AAAA,IAAAC,sCAAC,SAAI,KAAI,sBAAqB,KAAI,YAAW,SAAQ,QAAO;AAAA,IAC5DA,kCAAAA,IAAC,YAAA,EAAW,SAAQ,MAAM,oBAAU,gBAAe;AAAA,IAClD;AAAA,EAAA,GACL;AAER;ACOA,MAAM,YAAY;AAElB,MAAM,kBAAkB,OAAO,cAAc,EAAE,CAAC,EAAE,aAAa;AAAA,EAC3D,cAAc;AAAA,EACd,kBAAkB;AAAA,IACd,sEAAsE;AAAA,MAClE,QAAQ,MAAM,QAAQ,OAAO,QAAQ,QAAQ;AAAA,IAAA;AAAA,IAEjD,qBAAqB;AAAA,MACjB,kBAAkB,MAAM,QAAQ,OAAO,QAAQ,QAAQ;AAAA,IAAA;AAAA,IAE3D,2BAA2B;AAAA,MACvB,kBAAkB,MAAM,QAAQ,OAAO,QAAQ,QAAQ;AAAA,IAAA;AAAA,EAC3D;AAAA,EAEJ,sBAAsB;AAAA,IAClB,QAAQ,MAAM,QAAQ,OAAO,QAAQ,OAAO;AAAA,EAAA;AAAA,EAEhD,qBAAqB;AAAA,IACjB,kBAAkB,MAAM,QAAQ,OAAO,QAAQ,OAAO;AAAA,EAAA;AAE9D,EAAE;AAEF,MAAM,qBAAqB,OAAO,oBAAoB,EAAE,CAAC,EAAE,aAAa;AAAA,EACpE,cAAc;AAAA,EACd,kBAAkB;AAAA,IACd,sEAAsE;AAAA,MAClE,QAAQ,MAAM,QAAQ,OAAO,QAAQ,QAAQ;AAAA,IAAA;AAAA,IAEjD,qBAAqB;AAAA,MACjB,kBAAkB,MAAM,QAAQ,OAAO,QAAQ,QAAQ;AAAA,IAAA;AAAA,IAE3D,2BAA2B;AAAA,MACvB,kBAAkB,MAAM,QAAQ,OAAO,QAAQ,QAAQ;AAAA,IAAA;AAAA,EAC3D;AAAA,EAEJ,sBAAsB;AAAA,IAClB,QAAQ,MAAM,QAAQ,OAAO,QAAQ,OAAO;AAAA,EAAA;AAAA,EAEhD,qBAAqB;AAAA,IACjB,kBAAkB,MAAM,QAAQ,OAAO,QAAQ,OAAO;AAAA,EAAA;AAE9D,EAAE;AAEF,MAAM,eAAsE,CAAC,EAAE,MAAM,gBAAgB;AACjG,MAAI,KAAK,QAAQ,WAAW;AACxB,WACID,kCAAAA,KAAC,KAAA,EAAI,IAAI,YAAY,EAAE,UAAU,YAAY,MAAM,OAAO,KAAK,mBAAmB,WAAW,wBAAA,IAA4B,CAAA,GACrH,UAAA;AAAA,MAAAA,kCAAAA,KAAC,cAAA,EAAa,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,UAAU,UAAU,UAAA,GAC1F,UAAA;AAAA,QAAA,KAAK,QAAQ;AAAA,QACb,CAAC,KAAK,QAAQ,YACXC,kCAAAA,IAAC,QAAA,EAAO,IAAI,EAAE,OAAO,YAAY,GAAG,QAAQ,YAAY,GAAG,UAAU,MAAO,UAAA,KAAK,OAAM,IACvF;AAAA,MAAA,GACR;AAAA,MACC,YACGA,kCAAAA;AAAAA,QAACC;AAAAA,QAAA;AAAA,UACG,SAAQ;AAAA,UACR,IAAI;AAAA,YACA,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,MAAM;AAAA,YACN,WAAW;AAAA,YACX,UAAU;AAAA,YACV,YAAY;AAAA,YACZ,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,cAAc;AAAA,YACd,UAAU,aAAa;AAAA,UAAA;AAAA,UAG1B,UAAA,KAAK;AAAA,QAAA;AAAA,MAAA,IAEV;AAAA,IAAA,GACR;AAAA,EAER;AACA,SAAO;AACX;AAQA,MAAM,cAAoC,CAAC,EAAE,MAAM,UAAU,eACzDD,kCAAAA;AAAAA,EAAC;AAAA,EAAA;AAAA,IACG;AAAA,IACA;AAAA,IACA,WAAU;AAAA,IACV,WAAW;AAAA,MACP,EAAE,MAAM,UAAU,SAAS,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAE;AAAA,MAC5C,EAAE,MAAM,mBAAmB,SAAS,EAAE,SAAS,IAAE;AAAA,MACjD,EAAE,MAAM,QAAQ,SAAS,EAAE,oBAAoB,CAAC,aAAa,YAAY,EAAA,EAAE;AAAA,IAAE;AAAA,IAGjF,UAAAA,kCAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,IAAI;AAAA,UACA,IAAI;AAAA,UACJ,IAAI;AAAA,UACJ,WAAW;AAAA,UACX,WAAW;AAAA,UACX,oBAAoB;AAAA,QAAA;AAAA,QAGvB;AAAA,MAAA;AAAA,IAAA;AAAA,EACL;AACJ;AAgBG,MAAM,qBAAkD,CAAC,EAAE,MAAM,QAAQ,UAAU,UAAU,WAAW,yBAAyB,MAAM,yBAAyB,SAAS,cAAc,cAAc;AACxM,QAAM,CAAC,oBAAoB,qBAAqB,IAAI,SAAwB,IAAI;AAChF,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAA6B,IAAI;AAE3E,QAAM,YAA4B,MAAM;AACpC,QAAI,aAAa,2BAA2B,KAAK,UAAU;AACvD,aAAO;AAAA,QACH,UAAU;AAAA,QACV,UAAU;AAAA,QACV,KAAK;AAAA,QACL,OAAO;AAAA,QACP,WAAW;AAAA,MAAA;AAAA,IAEnB;AACA,QAAI,CAAC,aAAa,0BAA0B,KAAK,UAAU;AACvD,aAAO;AAAA,QACH,IAAI;AAAA,QACJ,WAAW,UAAU,SAAS,IAAI,GAAG;AAAA,MAAA;AAAA,IAE7C;AACA,WAAO,EAAE,SAAS,OAAA;AAAA,EACtB;AAEA,QAAM,mBAAmB,KAAK,YAAY,CAAC;AAE3C,QAAM,cAAc;AAAA,IAChB;AAAA,IACA;AAAA,IACA,IAAI,EAAE,IAAI,KAAK,QAAQ,YAAY,KAAK,GAAA;AAAA,EAAG;AAG/C,QAAM,gBACFD,kCAAAA,KAAAG,kBAAAA,UAAA,EACI,UAAA;AAAA,IAAAF,kCAAAA,IAAC,cAAA,EAAa,MAAY,UAAA,CAAsB;AAAA,IAC/C,CAAC,aACEA,kCAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,SAAS,KAAK;AAAA,QACd,WAAW,EAAE,SAAS,EAAE,QAAQ,MAAM,OAAO,KAAK,QAAM;AAAA,QACxD,IAAI,EAAE,IAAI,KAAK,MAAM,GAAG,UAAU,GAAG,yBAAyB,EAAE,YAAY,UAAU,UAAU,UAAU,cAAc,aAAW;AAAA,MAAE;AAAA,IAAA;AAAA,IAG5I,KAAK,WAAWA,sCAAC,gBAAA,EAAe,IAAI,WAAW,IAAK;AAAA,EAAA,GACzD;AAGJ,QAAM,WACFD,kCAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACI,GAAI,KAAK,YAAY,YAChB;AAAA,QACE,cAAc,CAAC,UAAyC;AACpD,2BAAiB,MAAM,aAAa;AACpC,gCAAsB,KAAK,KAAK;AAAA,QACpC;AAAA,QACA,cAAc,MAAM;AAChB,gCAAsB,IAAI;AAAA,QAC9B;AAAA,MAAA,IAEF,CAAA;AAAA,MACN,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,WAAW,SAAA;AAAA,MAE9B,UAAA;AAAA,QAAA,mBACGC,kCAAAA,IAAC,iBAAA,EAAiB,GAAG,aAAa,SAAS,MAAM,UAAU,IAAI,GAC1D,UAAA,cAAA,CACL,IAEAA,kCAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YACI,GAAG;AAAA,YACJ,IAAI,KAAK;AAAA,YACT,MAAM,KAAK;AAAA,YACX,QAAQ,KAAK;AAAA,YACb,QAAQ,KAAK;AAAA,YACb,SAAS;AAAA,YAER,UAAA;AAAA,UAAA;AAAA,QAAA;AAAA,QAIR,KAAK,YAAY,YACdA,kCAAAA,IAAC,eAAY,MAAM,KAAK,UAAU,oBAAoB,UAAU,eAC3D,UAAA,eAAe,KAAK,QAAQ,GACjC,IACA;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAIZ,SACID,kCAAAA,KAACG,UAAA,EACI,UAAA;AAAA,IAAA;AAAA,IACA,KAAK,YAAY,CAAC,YACfF,kCAAAA,IAAC,YAAS,IAAI,QAAQ,SAAQ,QAAO,eAAa,MAC7C,UAAA,eAAe,KAAK,QAAQ,GACjC,IACA;AAAA,EAAA,EAAA,GANO,KAAK,EAOpB;AAER;ACrOO,MAAM,aAAa,CAAC,SAAqD,EAAE,UAAU;AACrF,MAAM,YAAY,CAAC,SAAoD,UAAU,QAAQ,KAAK,SAAS;AACvG,MAAM,WAAW,CAAC,SAAmD,UAAU,QAAQ,KAAK,SAAS;AAgBrG,MAAM,iBAA0C,CAAC,EAAE,eAAe,QAAQ,GAAG,WAAW,WAAW,yBAAyB,MAAM,yBAAyB,eAAe,YAAY,YAAY,YAAY,cAAc;AAC/N,QAAM,CAAC,UAAU,WAAW,IAAI,SAAwB,CAAA,CAAE;AAE1D,YAAU,MAAM;AACZ,QAAI,UAAW,aAAY,EAAE;AAAA,EACjC,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,YAAY,CAAC,QACf,YAAY,CAAC,aAAc,SAAS,SAAS,GAAG,IAAI,SAAS,OAAO,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,UAAU,GAAG,CAAE;AAE/G,QAAM,eAAe,CAAC,aAAoCA,kCAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACvD,eAAe;AAAA,MACf,OAAO,QAAQ;AAAA,MACf,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,EAAA;AAGJ,QAAM,qBAAqB,cAAc,OAAO,CAAA,QAAO,CAAC,IAAI,MAAM;AAElE,SACIA,kCAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACG,IAAI;AAAA,QACA,SAAS;AAAA,QACT,IAAI,aAAa,UAAU,IAAI,MAAM;AAAA,QACrC,IAAI,UAAU,KAAK,CAAC,YAAY,IAAI;AAAA,QACpC,KAAK,YAAY,IAAI,MAAM,YAAY,QAAQ,IAAI;AAAA,QACnD,UAAU,aAAa,UAAU,IAAI,iBAAiB;AAAA,QACtD,OAAO,YAAY,aAAa;AAAA,MAAA;AAAA,MAGnC,UAAA,mBAAmB,IAAI,CAAC,SAAS,UAAU;AACxC,YAAI,SAAS,OAAO,GAAG;AACnB,iBACIA,kCAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cAEG,IAAI;AAAA,gBACA,UAAU;AAAA,gBACV,YAAY;AAAA,gBACZ,QAAQ,YAAY,IAAI;AAAA,gBACxB,IAAI;AAAA,gBACJ,UAAU;AAAA,gBACV,UAAU;AAAA,gBACV,cAAc;AAAA,gBACd,YAAY;AAAA,gBACZ,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,UAAU;AAAA,cAAA;AAAA,cAGb,UAAA,QAAQ;AAAA,YAAA;AAAA,YAfJ,aAAa,KAAK,IAAI,KAAK;AAAA,UAAA;AAAA,QAkB5C;AAEA,YAAI,UAAU,OAAO,GAAG;AACpB,gBAAM,WAAW,mBAAmB,QAAQ,CAAC;AAC7C,iBACIA,kCAAAA,IAAC,MAAA,EACG,UAAAA,kCAAAA,IAAC,SAAA,EAAQ,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,CAAC,YAAY,IAAI,EAAA,EAAE,CAAG,KADxE,WAAW,KAAK,IAAI,KAAK,EAElC;AAAA,QAER;AAEA,YAAI,CAAC,WAAW,OAAO,EAAG,QAAO;AAEjC,cAAM,MAAM,QAAQ,KAAK,IAAI,KAAK;AAClC,cAAM,gBAAgB,GAAG,KAAK,IAAI,KAAK,IAAI,QAAQ,KAAK;AAExD,YAAI,WAAY,QAAOA,kCAAAA,IAAC,UAAA,EAAoB,UAAA,WAAW,SAAS,EAAE,WAAW,CAAC,CAAC,UAAA,CAAW,KAApD,GAAsD;AAE5F,eAAOA,kCAAAA;AAAAA,UAAC;AAAA,UAAA;AAAA,YAEJ,MAAM;AAAA,YACN,QAAQ,SAAS,SAAS,aAAa;AAAA,YACvC,UAAU,eAAe,QAAQ;AAAA,YACjC;AAAA,YACA;AAAA,YACA;AAAA,YACA,SAAS,QAAQ,YAAY,CAAC,YAAY,MAAM,UAAU,aAAa,IAAI;AAAA,YAC3E;AAAA,YACA;AAAA,UAAA;AAAA,UATK;AAAA,QAAA;AAAA,MAWb,CAAC;AAAA,IAAA;AAAA,EAAA;AAGb;AC1GO,MAAM,aAAa;AACnB,MAAM,iBAAiB;AACvB,MAAM,iBAAiB;AAQvB,MAAM,iBAA0C,CAAC,EAAE,YAAY,UAAU,kBAAkB;AAC9F,QAAM,WAAW,YAAA;AACjB,QAAM,cAAc,eAAA;AACpB,QAAM,QAAQ,SAAA;AACd,QAAM,gBAAgB,cAAc,MAAM,YAAY,GAAG,IAAI,CAAC;AAE9D,QAAM,gBAAgB,CAAC,cACnBA,kCAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACG,WAAU;AAAA,MACV,IAAI;AAAA,QACA,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,eAAe;AAAA,QACf,gBAAgB;AAAA,QAChB,UAAU;AAAA,QACV,iBAAiB,YAAY,WAAW;AAAA,QACxC,WAAW;AAAA,QACX,IAAI,WAAW,CAAC,KAAK,SAAS,WAAW,CAAC,CAAC,KAAK,CAAC,YAAY,IAAI;AAAA,MAAA;AAAA,MAGrE,UAAAA,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACG,eAAe;AAAA,UACf;AAAA,UACA,wBAAwB;AAAA,UACxB,yBAAyB,CAAC;AAAA,UAC1B,eAAe;AAAA,UACf,YAAY,YAAY,SAAS;AAAA,UACjC,YAAY;AAAA,UACZ,SAAS,CAAC,gBAAgB,MAAM,YAAY,KAAK,IAAI;AAAA,QAAA;AAAA,MAAA;AAAA,IACzD;AAAA,EAAA;AAIR,MAAI;AACA,WACIA,kCAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACG,SAAQ;AAAA,QACR,IAAI;AAAA,UACA,OAAO,WAAW,iBAAiB;AAAA,UACnC,CAAC,oBAAoB,GAAG;AAAA,YACpB,UAAU;AAAA,YACV,KAAK,GAAG,cAAc;AAAA,YACtB,QAAQ,eAAe,cAAc;AAAA,YACrC,OAAO,WAAW,iBAAiB;AAAA,YACnC,WAAW;AAAA,YACX,aAAa;AAAA,UAAA;AAAA,QACjB;AAAA,QAGH,UAAA,cAAc,CAAC,QAAQ;AAAA,MAAA;AAAA,IAAA;AAIpC,SACIA,kCAAAA,IAAC,QAAA,EAAO,MAAM,UAAU,SAAS,MAAM,YAAY,KAAK,GACnD,UAAA,cAAc,CAAC,QAAQ,EAAA,CAC5B;AAER;AC1DA,MAAM,aAAa,CAAC,UAA8B,SAAS,MAAM,OAAO,CAAC,EAAE,YAAA,IAAgB,MAAM,MAAM,CAAC;AAEjG,MAAM,iBAAqB,MAAM;AACpC,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAA;AAC1C,QAAM,CAAC,KAAK,MAAM,IAAI,SAAkB,UAAU;AAClD,QAAM,OAAO,QAAQ,aAAa;AAClC,QAAM,EAAE,GAAG,MAAAG,MAAA,IAAS,eAAA;AACpB,QAAM,EAAE,MAAM,QAAA,IAAY,eAAA;AAC1B,QAAM,EAAE,SAAA,IAAa,QAAA;AACrB,QAAM,OAAO,QAAA;AAEb,QAAM,sBAAsB,MAAM,QAAQA,MAAK,QAAQ,aAAa,IAAIA,MAAK,QAAQ,gBAAgB,IAAI,OAAO,CAAA,QAAO,QAAQ,QAAQ;AACvI,QAAM,uBAAuB,IAAI,KAAK,aAAa,CAACA,MAAK,QAAQ,GAAG,EAAE,MAAM,YAAY;AAExF,QAAM,aAAkG;AAAA,IACpG,EAAE,MAAM,SAAS,MAAM,WAAW,OAAO,EAAE,cAAc,EAAA;AAAA,IACzD,EAAE,MAAM,QAAQ,MAAM,UAAU,OAAO,EAAE,aAAa,EAAA;AAAA,IACtD,EAAE,MAAM,UAAU,MAAM,oBAAoB,OAAO,EAAE,eAAe,EAAA;AAAA,EAAE;AAG1E,QAAM,WAAW,CAAC,UAA2D,iBAAiB,MAAM,aAAa;AACjH,QAAM,YAAY,MAAM;AAAE,qBAAiB,MAAS;AAAG,eAAW,MAAM,OAAO,UAAU,GAAG,GAAG;AAAA,EAAG;AAElG,QAAM,YAAY,CAAC,WAAoB,MAAM,OAAO,MAAM;AAE1D,QAAM,WACFJ,kCAAAA,KAACK,QAAA,EAAK,WAAU,OAAM,WAAWJ,kCAAAA,IAACK,iBAAA,EAAc,IAAI,EAAE,iBAAiB,iBAAkB,UAAA,EAAE,iBAAiB,GAAE,GAC1G,UAAA;AAAA,IAAAN,kCAAAA,KAACO,kBAAA,EAAe,SAAS,UAAU,OAAO,GAAG,IAAI,EAAE,IAAI,IAAA,GACnD,UAAA;AAAA,MAAAN,kCAAAA,IAACO,gBAAA,EACG,UAAAP,kCAAAA,IAAC,aAAA,CAAA,CAAY,GACjB;AAAA,MACAA,kCAAAA,IAACQ,gBAAA,EAAa,SAAS,EAAE,mBAAmB,GAAG,WAAW,WAAW,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI,GAAG,OAAO;AAAA,4CACzG,cAAA,CAAA,CAAa;AAAA,IAAA,GAClB;AAAA,IAEAT,kCAAAA,KAACO,kBAAA,EAAe,SAAS,UAAU,UAAU,GAAG,IAAI,EAAE,IAAI,IAAA,GACtD,UAAA;AAAA,MAAAN,kCAAAA,IAACO,gBAAA,EACG,UAAAP,kCAAAA,IAAC,WAAA,CAAA,CAAU,GACf;AAAA,MACAA,kCAAAA,IAACQ,gBAAA,EAAa,SAAS,EAAE,iBAAiB,GAAG,WAAW,WAAW,qBAAqB,GAAGL,MAAK,QAAQ,CAAC,EAAA,CAAG;AAAA,4CAC3G,cAAA,CAAA,CAAa;AAAA,IAAA,EAAA,CAClB;AAAA,EAAA,GACJ;AAGJ,QAAM,8CACDC,QAAA,EAAK,kDACDC,iBAAA,EAAc,SAAS,UAAU,UAAU,GAAG,IAAI,EAAE,iBAAiB,eAAe,SAAS,QAAQ,YAAY,UAAU,IAAI,GAAG,QAAQ,UAAA,GACvI,UAAA;AAAA,IAAAL,kCAAAA,IAAC,YAAA,EAAW,MAAK,SAAQ,IAAI,EAAE,IAAI,IAAA,GAC/B,UAAAA,kCAAAA,IAAC,WAAA,EAAU,UAAS,QAAA,CAAQ,GAChC;AAAA,IAAa;AAAA,IAAE,EAAE,mBAAmB;AAAA,EAAA,EAAA,CACxC,GAEC,UAAA,WAAW,IAAI,CAAC,EAAE,MAAM,WAAW,MAAM,MAAM,MAAA,MAC5CD,kCAAAA;AAAAA,IAACO;AAAAA,IAAA;AAAA,MAEG,SAAS,MAAM;AACX,gBAAQ,SAAS;AACjB,kBAAA;AAAA,MACJ;AAAA,MACA,UAAU,SAAS;AAAA,MAEnB,UAAA;AAAA,QAAAN,kCAAAA,IAACO,gBAAA,EACG,UAAAP,kCAAAA,IAAC,MAAA,CAAA,CAAK,GACV;AAAA,QACAA,kCAAAA,IAACQ,gBAAA,EAAa,SAAS,MAAA,CAAO;AAAA,MAAA;AAAA,IAAA;AAAA,IAVzB;AAAA,EAAA,CAYZ,GACL;AAGJ,QAAM,iDACDJ,QAAA,EAAK,kDACDC,iBAAA,EAAc,SAAS,UAAU,UAAU,GAAG,IAAI,EAAE,iBAAiB,eAAe,SAAS,QAAQ,YAAY,UAAU,IAAI,GAAG,QAAQ,UAAA,GACvI,UAAA;AAAA,IAAAL,kCAAAA,IAAC,YAAA,EAAW,MAAK,SAAQ,IAAI,EAAE,IAAI,IAAA,GAC/B,UAAAA,kCAAAA,IAAC,WAAA,EAAU,UAAS,QAAA,CAAQ,GAChC;AAAA,IAAa;AAAA,IAAE,EAAE,iBAAiB;AAAA,EAAA,GACtC,GAEC,UAAA,mBAAmB;AAAA,IAAI,CAAC,iBACrBD,kCAAAA;AAAAA,MAACO;AAAAA,MAAA;AAAA,QAEG,SAAS,MAAMH,MAAK,eAAe,YAAY,EAAE,QAAQ,MAAM,WAAW;AAAA,QAC1E,UAAUA,MAAK,qBAAqB;AAAA,QAEpC,UAAA;AAAA,UAAAH,kCAAAA,IAACO,kBACI,UAAAJ,MAAK,qBAAqB,gBAAgBH,sCAAC,QAAK,GACrD;AAAA,UACAA,sCAACQ,kBAAa,SAAS,WAAW,qBAAqB,GAAG,YAAY,CAAC,EAAA,CAAG;AAAA,QAAA;AAAA,MAAA;AAAA,MAPrE;AAAA,IAAA;AAAA,EAQT,GAER;AAGJ,gDACK,UAAA,EACG,UAAA;AAAA,IAAAR,kCAAAA,IAAC,YAAA,EAAW,MAAK,SAAQ,MAAK,OAAM,SAAS,UACxC,eAAK,QACFA,kCAAAA;AAAAA,MAACS;AAAAA,MAAA;AAAA,QACG,KAAK,KAAK;AAAA,QACV,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,IAAI,GAAA,GAAM,QAAQ,EAAE,IAAI,IAAI,IAAI,KAAG;AAAA,MAAE;AAAA,IAAA,0CAG/D,eAAA,EAAc,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,IAAI,MAAM,QAAQ,EAAE,IAAI,IAAI,IAAI,GAAA,EAAG,GAAK,GAEtF;AAAA,IAEAT,kCAAAA,IAAC,MAAA,EAAK,UAAU,eAAe,MAAY,SAAS,WAChD,UAAAD,kCAAAA,KAACW,OAAA,EAAI,IAAI,EAAE,OAAO,OACd,UAAA;AAAA,MAAAX,kCAAAA,KAACK,QAAA,EAAK,gBAAc,MAChB,UAAA;AAAA,QAAAJ,kCAAAA,IAACW,YAAA,EACG,gDAACH,gBAAA,EAAa,SAAS,KAAK,MAAM,WAAW,KAAK,SAAA,CAAU,EAAA,CAChE;AAAA,QAEAT,kCAAAA;AAAAA,UAACO;AAAAA,UAAA;AAAA,YACG,SAAS,MACL,SAAS,eAAe;AAAA,cACpB,uBAAuB;AAAA,YAAA,CAC1B;AAAA,YAGL,UAAA;AAAA,cAAAN,sCAACO,gBAAA,EAAa,UAAAP,kCAAAA,IAAC,QAAA,EAAO,OAAM,SAAQ,GAAE;AAAA,cACtCA,kCAAAA,IAACQ,gBAAA,EAAa,SAAS,EAAE,eAAe,EAAA,CAAG;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAC/C,GACJ;AAAA,MAEC,QAAQ,cAAc;AAAA,MACtB,QAAQ,WAAW;AAAA,MACnB,QAAQ,cAAc;AAAA,IAAA,EAAA,CAC3B,EAAA,CACJ;AAAA,EAAA,GACJ;AAER;ACzIA,MAAM,kBAAkB,KAAK,KAAK,KAAK;AAEvC,MAAM,0BAA0B,qBAC3B,OAAO,MAAM;AACV,QAAM,SAAS,UAAU,gBAAgB;AACzC,SAAO,WAAW;AACtB,CAAC,EACA,OAAO,MAAM;AACV,QAAM,SAAS,SAAS,OACnB,MAAM,IAAI,EACV,KAAK,CAAA,QAAO,IAAI,WAAW,iBAAiB,CAAC;AAClD,SAAO,SAAS,OAAO,MAAM,GAAG,EAAE,CAAC,MAAM,SAAS;AACtD,CAAC;AAEL,MAAM,eAAe,OAAO,KAAK,EAAE,CAAC,EAAE,aAAa;AAAA,EAC/C,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,SAAS,MAAM,QAAQ,GAAG,CAAC;AAAA,EAC3B,GAAG,MAAM,OAAO;AACpB,EAAE;AAOK,MAAM,SAA0B,CAAC,UAAU;AAC9C,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,uBAAuB;AAC5E,QAAM,aAAa,CAAC,CAAC,cAAA;AACrB,QAAM,aAAa,CAAC,CAAC,cAAA;AAErB,gDACK,UAAA,EACG,UAAA;AAAA,IAAAR,kCAAAA,IAAC,uBAAA,EAAsB;AAAA,0CACtB,aAAA,EAAY;AAAA,IAEbD,kCAAAA,KAACW,OAAA,EAAI,IAAI,EAAE,SAAS,QAAQ,QAAQ,UAAU,WAAW,UAAU,UAAU,UAAU,OAAO,UAC1F,UAAA;AAAA,MAAAV,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACG,OAAM;AAAA,UACN,UAAS;AAAA,UACT,IAAI;AAAA,YACA,cAAc;AAAA,YACd,aAAa;AAAA,YACb,WAAW;AAAA,UAAA;AAAA,UAEf,iDAAC,SAAA,EACI,UAAA;AAAA,YAAA,MAAM,cACHA,kCAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBACG,SAAS,MAAM;AACX,oCAAkB,CAAA,aAAY;AAC1B,0BAAM,WAAW,CAAC;AAClB,6BAAS,SAAS,kBAAkB,QAAQ,aAAa,eAAe;AACxE,2BAAO;AAAA,kBACX,CAAC;AAAA,gBACL;AAAA,gBACA,IAAI,EAAE,aAAa,EAAA;AAAA,gBAElB,UAAA,iBAAiBA,sCAAC,UAAA,CAAA,CAAS,0CAAMY,QAAA,CAAA,CAAK;AAAA,cAAA;AAAA,YAAA;AAAA,kDAI9C,UAAA,EAAS;AAAA,kDAET,gBAAA,CAAA,CAAe;AAAA,UAAA,EAAA,CACpB;AAAA,QAAA;AAAA,MAAA;AAAA,MAGH,MAAM,cACHZ,kCAAAA;AAAAA,QAAC;AAAA,QAAA;AAAA,UACG,YAAY,MAAM;AAAA,UAClB,UAAU;AAAA,UACV,aAAa,CAAA,aAAY;AACrB,8BAAkB,QAAQ;AAC1B,qBAAS,SAAS,kBAAkB,QAAQ,aAAa,eAAe;AAAA,UAC5E;AAAA,QAAA;AAAA,MAAA;AAAA,6CAIPU,OAAA,EAAI,WAAU,QAAO,IAAI,EAAE,UAAU,GAAG,SAAS,QAAQ,eAAe,UAAU,UAAU,GAAG,QAAQ,QAAQ,UAAU,YACtH,UAAA;AAAA,QAAAV,kCAAAA,IAAC,cAAA,EAAa;AAAA,QACdA,kCAAAA,IAACU,OAAA,EAAI,IAAI,EAAE,MAAM,GAAG,UAAU,QAAQ,UAAU,cAC5C,UAAAV,kCAAAA,IAAC,uBAAA,EACI,UAAA,MAAM,UACX,EAAA,CACJ;AAAA,MAAA,EAAA,CACJ;AAAA,IAAA,GACJ;AAAA,KAEE,cAAc,eAAeA,sCAAC,kBAAe,IAAI,EAAE,UAAU,SAAS,KAAK,EAAE,IAAI,IAAI,IAAI,GAAA,GAAM,MAAM,GAAG,OAAO,IAAE,CAAG;AAAA,EAAA,GAC1H;AAER;ACtFA,MAAM,kBAAkB,KAAK,KAAK;AAElC,KACK,IAAI,gBAAgB,EACpB,IAAI,gBAAgB,EACpB,KAAK;AAAA,EACF;AAAA,EACA,aAAa;AAAA,EACb,eAAe,OAAO,KAAK,SAAS;AAAA,EACpC,WAAW;AAAA,IACP,QAAQ,CAAC,QAAQ;AAAA,IACjB,eAAe;AAAA,EAAA;AAAA,EAEnB,eAAe,EAAE,aAAa,MAAA;AAClC,CAAC;AAQE,MAAM,iBAAqC,CAAC,EAAE,YAAY,OAAO,eAAe;AAEnF,QAAM,yBAAyB,eAAe,MAAM;AAChDa,eAAE,OAAOA,WAAE,KAAK,QAAQ,KAAK,QAAuC,GAAG;AACvE,UAAM,OAAO,KAAK,QAAQ;AAAA,EAC9B,CAAC;AAED,YAAU,MAAM;AACZ,2BAAA;AAEA,SAAK,GAAG,mBAAmB,sBAAsB;AACjD,WAAO,MAAM;AAAE,WAAK,IAAI,mBAAmB,sBAAsB;AAAA,IAAG;AAAA,EACxE,GAAG,CAAA,CAAE;AAEL,SACIb,kCAAAA,IAAC,cAAA,EAAa,UAAU,cACpB,UAAAA,kCAAAA,IAAC,cAAA,EACG,UAAAA,sCAAC,eAAA,EAAc,OACX,UAAAA,kCAAAA,IAAC,sBAAA,EAAyC,aAAa,cAAc,eAAe,KAAK,UACrF,UAAAA,kCAAAA,IAAC,iBAAA,EACG,UAAAA,kCAAAA,IAAC,QAAA,EAAO,YACH,SAAA,CACL,EAAA,CACJ,KALuB,KAAK,QAMhC,EAAA,CACJ,EAAA,CACJ,GACJ;AAER;AAEO,MAAM,iBAAiB,iBAAiB,QAAQ,YAAY;AAC/D,QAAM,WAAW,UAAU,KAAK,SAAS,iBAAiB,QAAQ,YAAY,KAAK;AACnFa,aAAE,OAAOA,WAAE,KAAK,QAAQ,QAAuC,GAAG;AAClE,QAAM,OAAO,QAAQ;AACrB,QAAM,KAAK,eAAe,QAAQ;AACtC,CAAC;"}
|