wcz-test 6.10.0 → 6.11.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.
@@ -5,7 +5,7 @@ import { Upload } from "tus-js-client";
5
5
  import { uuidv7 } from "uuidv7";
6
6
  import z__default from "zod";
7
7
  import { F as FileMetaSchema } from "./FileMeta-G1oT3mYK.js";
8
- import { t as toKebabCase, h as httpClient } from "./utils-DKyKGba7.js";
8
+ import { t as toKebabCase, h as httpClient } from "./utils-JYv9O0GI.js";
9
9
  import { c as clientEnv } from "./env-CoxTjaDr.js";
10
10
  const QUERY_KEY = "file";
11
11
  const HOUR = 1e3 * 60 * 60;
@@ -192,4 +192,4 @@ export {
192
192
  useUploadFile as h,
193
193
  useGetFileMetas as u
194
194
  };
195
- //# sourceMappingURL=FileHooks-hWKTwLCr.js.map
195
+ //# sourceMappingURL=FileHooks-BbjesS5D.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FileHooks-hWKTwLCr.js","sources":["../src/queries/FileHooks.ts"],"sourcesContent":["import { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\r\nimport saveAs from \"file-saver\";\r\nimport { useState } from \"react\";\r\nimport { Upload as TusUpload } from \"tus-js-client\";\r\nimport { uuidv7 } from \"uuidv7\";\r\nimport z from \"zod\";\r\nimport type { DetailedError } from \"tus-js-client\";\r\nimport type { DefinedInitialDataOptions, UseMutationOptions } from \"@tanstack/react-query\";\r\nimport type { FileMeta } from \"~/models/file/FileMeta\";\r\nimport { FileMetaSchema } from \"~/models/file/FileMeta\";\r\nimport { httpClient, toKebabCase } from \"~/lib/utils\";\r\nimport { clientEnv } from \"~/env\";\r\n\r\nconst QUERY_KEY = \"file\";\r\nconst HOUR = 1000 * 60 * 60;\r\nconst APP_NAME = toKebabCase(clientEnv.VITE_APP_TITLE);\r\n\r\ntype OptionalId = string | undefined | null;\r\n\r\ntype BaseFileMetaArrayQueryOptions = Omit<DefinedInitialDataOptions<Array<FileMeta>>, \"queryKey\" | \"queryFn\" | \"staleTime\" | \"gcTime\" | \"refetchOnWindowFocus\" | \"initialData\">;\r\ntype BaseBlobQueryOptions = Omit<DefinedInitialDataOptions<Blob, Error, string>, \"queryKey\" | \"queryFn\" | \"select\" | \"staleTime\" | \"gcTime\" | \"refetchOnWindowFocus\" | \"initialData\">;\r\ntype BaseFileMetaMutationOptions = Omit<UseMutationOptions<FileMeta, Error, FileMeta>, \"mutationFn\" | \"onSettled\">;\r\ntype BaseBlobMutationOptions = Omit<UseMutationOptions<Blob, Error, FileMeta>, \"mutationFn\" | \"onSuccess\">;\r\ntype BaseStringMutationOptions = Omit<UseMutationOptions<string, Error, string>, \"mutationFn\" | \"onSettled\">;\r\n\r\nexport const GetFileMetasParamsSchema = z.object({\r\n appName: z.string().min(1).max(255).default(APP_NAME).optional(),\r\n subId: z.uuid(),\r\n});\r\n\r\nexport type GetFileMetasParams = z.infer<typeof GetFileMetasParamsSchema>;\r\n\r\nexport const useGetFileMetas = (params: GetFileMetasParams, options?: BaseFileMetaArrayQueryOptions) => {\r\n const queryParams = new URLSearchParams();\r\n queryParams.append(\"appName\", params.appName ?? APP_NAME);\r\n queryParams.append(\"subId\", params.subId);\r\n\r\n return useQuery<Array<FileMeta>>({\r\n ...options,\r\n queryKey: [QUERY_KEY, \"meta\", params.appName ?? APP_NAME, params.subId],\r\n queryFn: ({ signal }) => httpClient.request({\r\n url: `/${QUERY_KEY}/v1/meta?${queryParams.toString()}`,\r\n method: \"GET\",\r\n signal,\r\n }),\r\n staleTime: HOUR,\r\n gcTime: HOUR,\r\n refetchOnWindowFocus: false,\r\n });\r\n};\r\n\r\nexport const GetFileThumbnailParamsSchema = z.object({\r\n appName: z.string().min(1).max(255).default(APP_NAME).optional(),\r\n meta: FileMetaSchema.nullish(),\r\n});\r\n\r\nexport type GetFileThumbnailParams = z.infer<typeof GetFileThumbnailParamsSchema>;\r\n\r\nexport const useGetFileThumbnail = (params: GetFileThumbnailParams, options?: BaseBlobQueryOptions) => {\r\n const queryParams = new URLSearchParams();\r\n queryParams.append(\"appName\", params.appName ?? APP_NAME);\r\n queryParams.append(\"id\", params.meta?.id ?? \"\");\r\n\r\n return useQuery<Blob, Error, string>({\r\n ...options,\r\n queryKey: [QUERY_KEY, \"thumbnail\", params.appName ?? APP_NAME, params.meta?.id],\r\n queryFn: ({ signal }) => httpClient.request({\r\n url: `/${QUERY_KEY}/v1/thumbnail?${queryParams.toString()}`,\r\n method: \"GET\",\r\n signal,\r\n responseType: \"blob\"\r\n }),\r\n select: data => URL.createObjectURL(data),\r\n staleTime: HOUR,\r\n gcTime: HOUR,\r\n refetchOnWindowFocus: false,\r\n enabled: !!params.meta && options?.enabled !== false,\r\n });\r\n};\r\n\r\nexport const GetFileParamsSchema = z.object({\r\n appName: z.string().min(1).max(255).default(APP_NAME).optional(),\r\n meta: FileMetaSchema.nullish(),\r\n});\r\n\r\nexport type GetFileParams = z.infer<typeof GetFileParamsSchema>;\r\n\r\nexport const useGetFile = (params: GetFileParams, options?: BaseBlobQueryOptions) => {\r\n const queryParams = new URLSearchParams();\r\n queryParams.append(\"appName\", params.appName ?? APP_NAME);\r\n queryParams.append(\"id\", params.meta?.id ?? \"\");\r\n\r\n return useQuery<Blob, Error, string>({\r\n ...options,\r\n queryKey: [QUERY_KEY, params.appName ?? APP_NAME, params.meta?.id],\r\n queryFn: ({ signal }) => httpClient.request({\r\n url: `/${QUERY_KEY}/v1?${queryParams.toString()}`,\r\n method: \"GET\",\r\n signal,\r\n responseType: \"blob\"\r\n }),\r\n select: data => URL.createObjectURL(data),\r\n staleTime: HOUR,\r\n gcTime: HOUR,\r\n refetchOnWindowFocus: false,\r\n enabled: !!params.meta && options?.enabled !== false,\r\n });\r\n};\r\n\r\nexport const useDownloadFile = (options?: BaseBlobMutationOptions) => {\r\n return useMutation<Blob, Error, FileMeta>({\r\n ...options,\r\n mutationFn: meta => httpClient.request({\r\n url: `/${QUERY_KEY}/v1/download?appName=${APP_NAME}&id=${meta.id}`,\r\n method: \"GET\",\r\n responseType: \"blob\"\r\n }),\r\n onSuccess: (data, variables) => saveAs(data, `${variables.fileName}.${variables.fileExtension}`)\r\n });\r\n};\r\n\r\nexport const useOpenFile = (options?: BaseBlobMutationOptions) => {\r\n return useMutation<Blob, Error, FileMeta>({\r\n ...options,\r\n mutationFn: meta => httpClient.request({\r\n url: `/${QUERY_KEY}/v1?appName=${APP_NAME}&id=${meta.id}`,\r\n method: \"GET\",\r\n responseType: \"blob\"\r\n }),\r\n onSuccess: data => { window.open(URL.createObjectURL(data)); }\r\n });\r\n};\r\n\r\nexport const useUpdateFileMeta = (options?: BaseFileMetaMutationOptions) => {\r\n const queryClient = useQueryClient();\r\n\r\n return useMutation<FileMeta, Error, FileMeta>({\r\n ...options,\r\n mutationFn: meta => httpClient.request({\r\n url: `/${QUERY_KEY}/v1/meta?appName=${APP_NAME}&id=${meta.id}`,\r\n method: \"PUT\",\r\n data: meta\r\n }),\r\n onSettled: () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY, \"meta\"], exact: false })\r\n });\r\n};\r\n\r\nexport const useDeleteFile = (options?: BaseFileMetaMutationOptions) => {\r\n const queryClient = useQueryClient();\r\n\r\n return useMutation<FileMeta, Error, FileMeta>({\r\n ...options,\r\n mutationFn: meta => httpClient.request({\r\n url: `/${QUERY_KEY}/v1?appName=${APP_NAME}&id=${meta.id}`,\r\n method: \"DELETE\"\r\n }),\r\n onSettled: () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY, \"meta\"], exact: false }),\r\n });\r\n};\r\n\r\nexport const useDeleteFiles = (options?: BaseStringMutationOptions) => {\r\n const queryClient = useQueryClient();\r\n\r\n return useMutation<string, Error, string>({\r\n ...options,\r\n mutationFn: subId => httpClient.request({\r\n url: `/${QUERY_KEY}/v1?appName=${APP_NAME}&subId=${subId}`,\r\n method: \"DELETE\"\r\n }),\r\n onSettled: () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY, \"meta\"], exact: false })\r\n });\r\n};\r\n\r\ninterface UseUploadFileProps {\r\n subId: OptionalId;\r\n onSuccess?: (meta: Pick<FileMeta, \"id\" | \"appName\" | \"subId\" | \"fileName\">) => void;\r\n onError?: (error: Error | DetailedError) => void;\r\n}\r\n\r\nexport const useUploadFile = ({ subId, onSuccess, onError }: UseUploadFileProps) => {\r\n const [progress, setProgress] = useState<number>(0);\r\n const queryClient = useQueryClient();\r\n\r\n const mutate = async (file: File) => {\r\n if (!subId) throw new Error(\"subId is required for file upload\");\r\n\r\n const metadata: Pick<FileMeta, \"id\" | \"appName\" | \"subId\" | \"fileName\"> = {\r\n id: uuidv7(),\r\n appName: APP_NAME,\r\n subId: subId,\r\n fileName: file.name,\r\n };\r\n\r\n const upload = new TusUpload(file, {\r\n endpoint: `${clientEnv.VITE_API_URL}/${QUERY_KEY}/v1/upload`,\r\n chunkSize: 1_048_576, // 1 MB\r\n metadata: {\r\n id: metadata.id,\r\n appName: metadata.appName,\r\n subId: metadata.subId,\r\n fileName: metadata.fileName,\r\n fileExtension: file.type\r\n },\r\n // headers: { \"Authorization\": `Bearer ${await getToken()}` }, //TODO: implement token retrieval\r\n onError: (error) => {\r\n setProgress(0);\r\n onError?.(error);\r\n },\r\n onProgress: (bytesUploaded, bytesTotal) => {\r\n setProgress((bytesUploaded / bytesTotal) * 100);\r\n },\r\n onSuccess: () => {\r\n setProgress(0);\r\n queryClient.invalidateQueries({ queryKey: [QUERY_KEY, \"meta\", subId], exact: false });\r\n onSuccess?.(metadata);\r\n },\r\n });\r\n\r\n const previousUploads = await upload.findPreviousUploads();\r\n if (previousUploads.length > 0) {\r\n upload.resumeFromPreviousUpload(previousUploads[0]);\r\n }\r\n\r\n upload.start();\r\n };\r\n\r\n return { mutate, progress };\r\n};\r\n"],"names":["z","TusUpload"],"mappings":"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"}
1
+ {"version":3,"file":"FileHooks-BbjesS5D.js","sources":["../src/queries/FileHooks.ts"],"sourcesContent":["import { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\r\nimport saveAs from \"file-saver\";\r\nimport { useState } from \"react\";\r\nimport { Upload as TusUpload } from \"tus-js-client\";\r\nimport { uuidv7 } from \"uuidv7\";\r\nimport z from \"zod\";\r\nimport type { DetailedError } from \"tus-js-client\";\r\nimport type { DefinedInitialDataOptions, UseMutationOptions } from \"@tanstack/react-query\";\r\nimport type { FileMeta } from \"~/models/file/FileMeta\";\r\nimport { FileMetaSchema } from \"~/models/file/FileMeta\";\r\nimport { httpClient, toKebabCase } from \"~/lib/utils\";\r\nimport { clientEnv } from \"~/env\";\r\n\r\nconst QUERY_KEY = \"file\";\r\nconst HOUR = 1000 * 60 * 60;\r\nconst APP_NAME = toKebabCase(clientEnv.VITE_APP_TITLE);\r\n\r\ntype OptionalId = string | undefined | null;\r\n\r\ntype BaseFileMetaArrayQueryOptions = Omit<DefinedInitialDataOptions<Array<FileMeta>>, \"queryKey\" | \"queryFn\" | \"staleTime\" | \"gcTime\" | \"refetchOnWindowFocus\" | \"initialData\">;\r\ntype BaseBlobQueryOptions = Omit<DefinedInitialDataOptions<Blob, Error, string>, \"queryKey\" | \"queryFn\" | \"select\" | \"staleTime\" | \"gcTime\" | \"refetchOnWindowFocus\" | \"initialData\">;\r\ntype BaseFileMetaMutationOptions = Omit<UseMutationOptions<FileMeta, Error, FileMeta>, \"mutationFn\" | \"onSettled\">;\r\ntype BaseBlobMutationOptions = Omit<UseMutationOptions<Blob, Error, FileMeta>, \"mutationFn\" | \"onSuccess\">;\r\ntype BaseStringMutationOptions = Omit<UseMutationOptions<string, Error, string>, \"mutationFn\" | \"onSettled\">;\r\n\r\nexport const GetFileMetasParamsSchema = z.object({\r\n appName: z.string().min(1).max(255).default(APP_NAME).optional(),\r\n subId: z.uuid(),\r\n});\r\n\r\nexport type GetFileMetasParams = z.infer<typeof GetFileMetasParamsSchema>;\r\n\r\nexport const useGetFileMetas = (params: GetFileMetasParams, options?: BaseFileMetaArrayQueryOptions) => {\r\n const queryParams = new URLSearchParams();\r\n queryParams.append(\"appName\", params.appName ?? APP_NAME);\r\n queryParams.append(\"subId\", params.subId);\r\n\r\n return useQuery<Array<FileMeta>>({\r\n ...options,\r\n queryKey: [QUERY_KEY, \"meta\", params.appName ?? APP_NAME, params.subId],\r\n queryFn: ({ signal }) => httpClient.request({\r\n url: `/${QUERY_KEY}/v1/meta?${queryParams.toString()}`,\r\n method: \"GET\",\r\n signal,\r\n }),\r\n staleTime: HOUR,\r\n gcTime: HOUR,\r\n refetchOnWindowFocus: false,\r\n });\r\n};\r\n\r\nexport const GetFileThumbnailParamsSchema = z.object({\r\n appName: z.string().min(1).max(255).default(APP_NAME).optional(),\r\n meta: FileMetaSchema.nullish(),\r\n});\r\n\r\nexport type GetFileThumbnailParams = z.infer<typeof GetFileThumbnailParamsSchema>;\r\n\r\nexport const useGetFileThumbnail = (params: GetFileThumbnailParams, options?: BaseBlobQueryOptions) => {\r\n const queryParams = new URLSearchParams();\r\n queryParams.append(\"appName\", params.appName ?? APP_NAME);\r\n queryParams.append(\"id\", params.meta?.id ?? \"\");\r\n\r\n return useQuery<Blob, Error, string>({\r\n ...options,\r\n queryKey: [QUERY_KEY, \"thumbnail\", params.appName ?? APP_NAME, params.meta?.id],\r\n queryFn: ({ signal }) => httpClient.request({\r\n url: `/${QUERY_KEY}/v1/thumbnail?${queryParams.toString()}`,\r\n method: \"GET\",\r\n signal,\r\n responseType: \"blob\"\r\n }),\r\n select: data => URL.createObjectURL(data),\r\n staleTime: HOUR,\r\n gcTime: HOUR,\r\n refetchOnWindowFocus: false,\r\n enabled: !!params.meta && options?.enabled !== false,\r\n });\r\n};\r\n\r\nexport const GetFileParamsSchema = z.object({\r\n appName: z.string().min(1).max(255).default(APP_NAME).optional(),\r\n meta: FileMetaSchema.nullish(),\r\n});\r\n\r\nexport type GetFileParams = z.infer<typeof GetFileParamsSchema>;\r\n\r\nexport const useGetFile = (params: GetFileParams, options?: BaseBlobQueryOptions) => {\r\n const queryParams = new URLSearchParams();\r\n queryParams.append(\"appName\", params.appName ?? APP_NAME);\r\n queryParams.append(\"id\", params.meta?.id ?? \"\");\r\n\r\n return useQuery<Blob, Error, string>({\r\n ...options,\r\n queryKey: [QUERY_KEY, params.appName ?? APP_NAME, params.meta?.id],\r\n queryFn: ({ signal }) => httpClient.request({\r\n url: `/${QUERY_KEY}/v1?${queryParams.toString()}`,\r\n method: \"GET\",\r\n signal,\r\n responseType: \"blob\"\r\n }),\r\n select: data => URL.createObjectURL(data),\r\n staleTime: HOUR,\r\n gcTime: HOUR,\r\n refetchOnWindowFocus: false,\r\n enabled: !!params.meta && options?.enabled !== false,\r\n });\r\n};\r\n\r\nexport const useDownloadFile = (options?: BaseBlobMutationOptions) => {\r\n return useMutation<Blob, Error, FileMeta>({\r\n ...options,\r\n mutationFn: meta => httpClient.request({\r\n url: `/${QUERY_KEY}/v1/download?appName=${APP_NAME}&id=${meta.id}`,\r\n method: \"GET\",\r\n responseType: \"blob\"\r\n }),\r\n onSuccess: (data, variables) => saveAs(data, `${variables.fileName}.${variables.fileExtension}`)\r\n });\r\n};\r\n\r\nexport const useOpenFile = (options?: BaseBlobMutationOptions) => {\r\n return useMutation<Blob, Error, FileMeta>({\r\n ...options,\r\n mutationFn: meta => httpClient.request({\r\n url: `/${QUERY_KEY}/v1?appName=${APP_NAME}&id=${meta.id}`,\r\n method: \"GET\",\r\n responseType: \"blob\"\r\n }),\r\n onSuccess: data => { window.open(URL.createObjectURL(data)); }\r\n });\r\n};\r\n\r\nexport const useUpdateFileMeta = (options?: BaseFileMetaMutationOptions) => {\r\n const queryClient = useQueryClient();\r\n\r\n return useMutation<FileMeta, Error, FileMeta>({\r\n ...options,\r\n mutationFn: meta => httpClient.request({\r\n url: `/${QUERY_KEY}/v1/meta?appName=${APP_NAME}&id=${meta.id}`,\r\n method: \"PUT\",\r\n data: meta\r\n }),\r\n onSettled: () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY, \"meta\"], exact: false })\r\n });\r\n};\r\n\r\nexport const useDeleteFile = (options?: BaseFileMetaMutationOptions) => {\r\n const queryClient = useQueryClient();\r\n\r\n return useMutation<FileMeta, Error, FileMeta>({\r\n ...options,\r\n mutationFn: meta => httpClient.request({\r\n url: `/${QUERY_KEY}/v1?appName=${APP_NAME}&id=${meta.id}`,\r\n method: \"DELETE\"\r\n }),\r\n onSettled: () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY, \"meta\"], exact: false }),\r\n });\r\n};\r\n\r\nexport const useDeleteFiles = (options?: BaseStringMutationOptions) => {\r\n const queryClient = useQueryClient();\r\n\r\n return useMutation<string, Error, string>({\r\n ...options,\r\n mutationFn: subId => httpClient.request({\r\n url: `/${QUERY_KEY}/v1?appName=${APP_NAME}&subId=${subId}`,\r\n method: \"DELETE\"\r\n }),\r\n onSettled: () => queryClient.invalidateQueries({ queryKey: [QUERY_KEY, \"meta\"], exact: false })\r\n });\r\n};\r\n\r\ninterface UseUploadFileProps {\r\n subId: OptionalId;\r\n onSuccess?: (meta: Pick<FileMeta, \"id\" | \"appName\" | \"subId\" | \"fileName\">) => void;\r\n onError?: (error: Error | DetailedError) => void;\r\n}\r\n\r\nexport const useUploadFile = ({ subId, onSuccess, onError }: UseUploadFileProps) => {\r\n const [progress, setProgress] = useState<number>(0);\r\n const queryClient = useQueryClient();\r\n\r\n const mutate = async (file: File) => {\r\n if (!subId) throw new Error(\"subId is required for file upload\");\r\n\r\n const metadata: Pick<FileMeta, \"id\" | \"appName\" | \"subId\" | \"fileName\"> = {\r\n id: uuidv7(),\r\n appName: APP_NAME,\r\n subId: subId,\r\n fileName: file.name,\r\n };\r\n\r\n const upload = new TusUpload(file, {\r\n endpoint: `${clientEnv.VITE_API_URL}/${QUERY_KEY}/v1/upload`,\r\n chunkSize: 1_048_576, // 1 MB\r\n metadata: {\r\n id: metadata.id,\r\n appName: metadata.appName,\r\n subId: metadata.subId,\r\n fileName: metadata.fileName,\r\n fileExtension: file.type\r\n },\r\n // headers: { \"Authorization\": `Bearer ${await getToken()}` }, //TODO: implement token retrieval\r\n onError: (error) => {\r\n setProgress(0);\r\n onError?.(error);\r\n },\r\n onProgress: (bytesUploaded, bytesTotal) => {\r\n setProgress((bytesUploaded / bytesTotal) * 100);\r\n },\r\n onSuccess: () => {\r\n setProgress(0);\r\n queryClient.invalidateQueries({ queryKey: [QUERY_KEY, \"meta\", subId], exact: false });\r\n onSuccess?.(metadata);\r\n },\r\n });\r\n\r\n const previousUploads = await upload.findPreviousUploads();\r\n if (previousUploads.length > 0) {\r\n upload.resumeFromPreviousUpload(previousUploads[0]);\r\n }\r\n\r\n upload.start();\r\n };\r\n\r\n return { mutate, progress };\r\n};\r\n"],"names":["z","TusUpload"],"mappings":"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"}
package/dist/client.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import { W, b, a } from "./auth-client-B6cIXYDV.js";
2
2
  import { t } from "i18next";
3
3
  import { useTranslation } from "react-i18next";
4
- import { P } from "./utils-DKyKGba7.js";
4
+ import { P } from "./utils-JYv9O0GI.js";
5
5
  export {
6
6
  P as Platform,
7
7
  W as WISTRON_PRIMARY_COLOR,
@@ -9,7 +9,7 @@ import { grey } from "@mui/material/colors";
9
9
  import { useInView } from "react-intersection-observer";
10
10
  import Delete from "@mui/icons-material/Delete";
11
11
  import FileDownload from "@mui/icons-material/FileDownload";
12
- import { c as useDownloadFile, f as useDeleteFile, a as useGetFileThumbnail, d as useOpenFile, b as useGetFile, u as useGetFileMetas } from "./FileHooks-hWKTwLCr.js";
12
+ import { c as useDownloadFile, f as useDeleteFile, a as useGetFileThumbnail, d as useOpenFile, b as useGetFile, u as useGetFileMetas } from "./FileHooks-BbjesS5D.js";
13
13
  import AttachFile from "@mui/icons-material/AttachFile";
14
14
  import Image from "@mui/icons-material/Image";
15
15
  import SmartDisplay from "@mui/icons-material/SmartDisplay";
package/dist/hooks.js CHANGED
@@ -2,7 +2,7 @@ import { createFormHookContexts, createFormHook } from "@tanstack/react-form";
2
2
  import { j as jsxRuntimeExports } from "./DialogsHooks-Bi8dZoyu.js";
3
3
  import { u } from "./DialogsHooks-Bi8dZoyu.js";
4
4
  import { Autocomplete, TextField, FormControl, FormControlLabel, Checkbox, FormHelperText, FormLabel, RadioGroup, Radio, Slider, Button, Switch } from "@mui/material";
5
- import { g as getFieldStatus } from "./utils-DKyKGba7.js";
5
+ import { g as getFieldStatus } from "./utils-JYv9O0GI.js";
6
6
  import { DatePicker, DateRangePicker, TimePicker, TimeRangePicker, DateTimePicker, DateTimeRangePicker } from "@mui/x-date-pickers-pro";
7
7
  import { NumericFormat } from "react-number-format";
8
8
  import { useInView } from "react-intersection-observer";
package/dist/index.d.ts CHANGED
@@ -1,8 +1,12 @@
1
+ import { createEnv } from '@t3-oss/env-core';
1
2
  import { CssVarsThemeOptions } from '@mui/material';
2
3
  import { FC } from 'react';
3
4
  import { LinkOptions } from '@tanstack/react-router';
4
5
  import { OptionalFetcher } from '@tanstack/start-client-core';
5
6
  import { ReactNode } from 'react';
7
+ import { uuidv7 } from 'uuidv7';
8
+
9
+ export { createEnv }
6
10
 
7
11
  export declare const LayoutProvider: FC<ProvidersProps>;
8
12
 
@@ -71,4 +75,6 @@ export declare const rootRouteHead: () => {
71
75
 
72
76
  export declare const setSSRLanguage: OptionalFetcher<undefined, undefined, Promise<void>>;
73
77
 
78
+ export { uuidv7 }
79
+
74
80
  export { }
package/dist/index.js CHANGED
@@ -45,7 +45,9 @@ import Logout from "@mui/icons-material/Logout";
45
45
  import SettingsBrightness from "@mui/icons-material/SettingsBrightness";
46
46
  import Translate from "@mui/icons-material/Translate";
47
47
  import Done from "@mui/icons-material/Done";
48
- import { r } from "./utils-DKyKGba7.js";
48
+ import { r } from "./utils-JYv9O0GI.js";
49
+ import { uuidv7 } from "uuidv7";
50
+ import { createEnv } from "@t3-oss/env-core";
49
51
  function DialogsProvider({ children, unmountAfter = 1e3 }) {
50
52
  const [stack, setStack] = useState([]);
51
53
  const keyPrefix = useId();
@@ -658,7 +660,9 @@ const setSSRLanguage = createServerFn().handler(async () => {
658
660
  });
659
661
  export {
660
662
  LayoutProvider,
663
+ createEnv,
661
664
  r as rootRouteHead,
662
- setSSRLanguage
665
+ setSSRLanguage,
666
+ uuidv7
663
667
  };
664
668
  //# sourceMappingURL=index.js.map
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\";\r\nimport { useId, useRef, useState } from \"react\";\r\nimport { DialogsContext } from \"../contexts/DialogsContext\";\r\nimport type { DialogComponent, OpenDialog, OpenDialogOptions } from \"../hooks/DialogsHooks\";\r\n\r\ninterface DialogStackEntry<TPayload, TResult> {\r\n key: string;\r\n open: boolean;\r\n promise: Promise<TResult>;\r\n Component: DialogComponent<TPayload, TResult>;\r\n payload: TPayload;\r\n onClose: (result: TResult) => Promise<void>;\r\n resolve: (result: TResult) => void;\r\n}\r\n\r\nexport interface DialogProviderProps {\r\n children?: React.ReactNode;\r\n unmountAfter?: number;\r\n}\r\n\r\nfunction DialogsProvider({ children, unmountAfter = 1000 }: Readonly<DialogProviderProps>) {\r\n const [stack, setStack] = useState<Array<DialogStackEntry<any, any>>>([]);\r\n const keyPrefix = useId();\r\n const nextId = useRef(0);\r\n const dialogMetadata = useRef(new WeakMap<Promise<any>, DialogStackEntry<any, any>>());\r\n\r\n const requestDialog = useEventCallback<OpenDialog>(function open<TPayload, TResult>(\r\n Component: DialogComponent<TPayload, TResult>,\r\n payload: TPayload,\r\n options: OpenDialogOptions<TResult> = {},\r\n ) {\r\n const { onClose = async () => { } } = options;\r\n\r\n let resolve: (result: TResult) => void;\r\n const promise = new Promise<TResult>((resolveImpl) => {\r\n resolve = resolveImpl;\r\n });\r\n\r\n const key = `${keyPrefix}-${nextId.current}`;\r\n nextId.current += 1;\r\n\r\n const newEntry: DialogStackEntry<TPayload, TResult> = {\r\n key,\r\n open: true,\r\n promise,\r\n Component,\r\n payload,\r\n onClose,\r\n resolve: resolve!,\r\n };\r\n\r\n dialogMetadata.current.set(promise, newEntry);\r\n\r\n setStack((previousStack) => [...previousStack, newEntry]);\r\n\r\n return promise;\r\n });\r\n\r\n const removeDialogFromStack = (dialog: Promise<any>) => {\r\n setStack((previousStack) => previousStack.filter((entry) => entry.promise !== dialog));\r\n dialogMetadata.current.delete(dialog);\r\n };\r\n\r\n const closeDialogUi = useEventCallback(function closeDialogUi<TResult>(dialog: Promise<TResult>) {\r\n setStack((previousStack) =>\r\n previousStack.map((entry) => (entry.promise === dialog ? { ...entry, open: false } : entry)),\r\n );\r\n\r\n setTimeout(() => removeDialogFromStack(dialog), unmountAfter);\r\n });\r\n\r\n const closeDialog = useEventCallback(async function closeDialog<TResult>(\r\n dialog: Promise<TResult>,\r\n result: TResult,\r\n ) {\r\n const entryToClose = dialogMetadata.current.get(dialog);\r\n if (!entryToClose) {\r\n throw new Error(\"Dialog not found in stack\");\r\n }\r\n\r\n try {\r\n await entryToClose.onClose(result);\r\n } finally {\r\n entryToClose.resolve(result);\r\n closeDialogUi(dialog);\r\n }\r\n\r\n return dialog;\r\n });\r\n\r\n return (\r\n <DialogsContext.Provider value={{ open: requestDialog, close: closeDialog }}>\r\n {children}\r\n {stack.map(({ key, open, Component, payload, promise }) => (\r\n <Component\r\n key={key}\r\n payload={payload}\r\n open={open}\r\n onClose={async (result) => {\r\n await closeDialog(promise, result);\r\n }}\r\n />\r\n ))}\r\n </DialogsContext.Provider>\r\n );\r\n}\r\n\r\nexport { DialogsProvider };\r\n\r\n","import { Chip, Stack, Typography } from \"@mui/material\";\r\nimport type { FC } from \"react\";\r\nimport { clientEnv } from \"~/env\";\r\n\r\nexport const AppTitle: FC = () => {\r\n return (\r\n <Stack direction=\"row\" alignItems=\"center\" spacing={2} flexGrow={1}>\r\n <img src=\"/favicon-32x32.png\" alt=\"app-logo\" loading=\"lazy\" />\r\n <Typography variant=\"h6\">{clientEnv.VITE_APP_TITLE}</Typography>\r\n {import.meta.env.DEV && <Chip size=\"small\" label=\"TEST\" color=\"info\" />}\r\n </Stack>\r\n );\r\n};\r\n","import ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\nimport { Collapse } from \"@mui/material\";\r\nimport Avatar from \"@mui/material/Avatar\";\r\nimport Box from \"@mui/material/Box\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemButton from \"@mui/material/ListItemButton\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport Popper from \"@mui/material/Popper\";\r\nimport { styled } from \"@mui/material/styles\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport { Fragment, useState } from \"react\";\r\nimport { MINI_WIDTH } from \"./NavigationRail\";\r\nimport type { NavigationItem, NavigationPageItem } from \"~/models/Navigation\";\r\nimport type { FC, ReactNode } from \"react\";\r\nimport type { SxProps, Theme } from \"@mui/material/styles\";\r\nimport { RouterListItemButton } from \"~/components/router/RouterListItemButton\";\r\n\r\nconst ICON_SIZE = 34;\r\n\r\nconst StyledNavButton = styled(ListItemButton)(({ theme }) => ({\r\n borderRadius: 8,\r\n \"&.Mui-selected\": {\r\n \"& .MuiListItemIcon-root, & .MuiTypography-root, & .MuiSvgIcon-root\": {\r\n color: (theme.vars ?? theme).palette.primary.dark,\r\n },\r\n \"& .MuiAvatar-root\": {\r\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\r\n },\r\n \"& .MuiTouchRipple-child\": {\r\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\r\n },\r\n },\r\n \"& .MuiSvgIcon-root\": {\r\n color: (theme.vars ?? theme).palette.action.active,\r\n },\r\n \"& .MuiAvatar-root\": {\r\n backgroundColor: (theme.vars ?? theme).palette.action.active,\r\n },\r\n}));\r\n\r\nconst StyledRouterButton = styled(RouterListItemButton)(({ theme }) => ({\r\n borderRadius: 8,\r\n \"&.Mui-selected\": {\r\n \"& .MuiListItemIcon-root, & .MuiTypography-root, & .MuiSvgIcon-root\": {\r\n color: (theme.vars ?? theme).palette.primary.dark,\r\n },\r\n \"& .MuiAvatar-root\": {\r\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\r\n },\r\n \"& .MuiTouchRipple-child\": {\r\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\r\n },\r\n },\r\n \"& .MuiSvgIcon-root\": {\r\n color: (theme.vars ?? theme).palette.action.active,\r\n },\r\n \"& .MuiAvatar-root\": {\r\n backgroundColor: (theme.vars ?? theme).palette.action.active,\r\n },\r\n}));\r\n\r\nconst IconOrAvatar: FC<{ item: NavigationPageItem; collapsed?: boolean }> = ({ item, collapsed }) => {\r\n if (item.icon || collapsed) {\r\n return (\r\n <Box sx={collapsed ? { position: \"absolute\", left: \"50%\", top: \"calc(50% - 6px)\", transform: \"translate(-50%, -50%)\" } : {}}>\r\n <ListItemIcon sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", minWidth: ICON_SIZE }}>\r\n {item.icon ?? null}\r\n {!item.icon && collapsed ? (\r\n <Avatar sx={{ width: ICON_SIZE - 7, height: ICON_SIZE - 7, fontSize: 12 }}>{item.title}</Avatar>\r\n ) : null}\r\n </ListItemIcon>\r\n {collapsed ? (\r\n <Typography\r\n variant=\"caption\"\r\n sx={{\r\n position: \"absolute\",\r\n bottom: -18,\r\n left: \"50%\",\r\n transform: \"translateX(-50%)\",\r\n fontSize: 10,\r\n fontWeight: 500,\r\n textAlign: \"center\",\r\n whiteSpace: \"nowrap\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n maxWidth: MINI_WIDTH - 28,\r\n }}\r\n >\r\n {item.title}\r\n </Typography>\r\n ) : null}\r\n </Box>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\ninterface MiniPopoverProps {\r\n open: boolean;\r\n anchorEl: HTMLElement | null;\r\n children?: ReactNode;\r\n}\r\n\r\nconst MiniPopover: FC<MiniPopoverProps> = ({ open, anchorEl, children }) => (\r\n <Popper\r\n open={open}\r\n anchorEl={anchorEl}\r\n placement=\"right-start\"\r\n modifiers={[\r\n { name: \"offset\", options: { offset: [6, 0] } },\r\n { name: \"preventOverflow\", options: { padding: 8 } },\r\n { name: \"flip\", options: { fallbackPlacements: [\"right-end\", \"left-start\"] } },\r\n ]}\r\n >\r\n <Paper\r\n sx={{\r\n pt: 0.5,\r\n pb: 0.5,\r\n maxHeight: \"min(calc(100vh - 100px), 560px)\",\r\n overflowY: \"auto\",\r\n overscrollBehavior: \"contain\",\r\n }}\r\n >\r\n {children}\r\n </Paper>\r\n </Popper>\r\n);\r\n\r\ninterface NavigationListItemProps {\r\n item: NavigationPageItem;\r\n isOpen?: boolean;\r\n selected?: boolean;\r\n disabled?: boolean;\r\n collapsed?: boolean;\r\n isSidebarFullyExpanded?: boolean;\r\n isSidebarFullyCollapsed?: boolean;\r\n onClick?: (item: NavigationPageItem) => void;\r\n renderNested?: (sub: Array<NavigationItem>) => ReactNode;\r\n onClose?: () => void;\r\n}\r\n\r\nexport const NavigationListItem: FC<NavigationListItemProps> = ({ item, isOpen, selected, disabled, collapsed, isSidebarFullyExpanded = true, isSidebarFullyCollapsed, onClick, renderNested, onClose }) => {\r\n const [hoveredPopoverItem, setHoveredPopoverItem] = useState<string | null>(null);\r\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\r\n\r\n const chevronSx: SxProps<Theme> = () => {\r\n if (collapsed && isSidebarFullyCollapsed && item.children) {\r\n return {\r\n fontSize: 18,\r\n position: \"absolute\",\r\n top: \"41.5%\",\r\n right: \"2px\",\r\n transform: \"translateY(-50%) rotate(-90deg)\",\r\n };\r\n }\r\n if (!collapsed && isSidebarFullyExpanded && item.children) {\r\n return {\r\n ml: 0.5,\r\n transform: `rotate(${isOpen ? 0 : -90}deg)`,\r\n };\r\n }\r\n return { display: \"none\" };\r\n };\r\n\r\n const shouldJustExpand = item.children && !collapsed;\r\n\r\n const buttonProps = {\r\n selected,\r\n disabled,\r\n sx: { px: 1.4, height: collapsed ? 60 : 48 }\r\n };\r\n\r\n const buttonContent = (\r\n <>\r\n <IconOrAvatar item={item} collapsed={collapsed} />\r\n {!collapsed && (\r\n <ListItemText\r\n primary={item.title}\r\n slotProps={{ primary: { noWrap: true, title: item.title } }}\r\n sx={{ ml: 1.2, flex: 1, minWidth: 0, \"& .MuiTypography-root\": { whiteSpace: \"nowrap\", overflow: \"hidden\", textOverflow: \"ellipsis\" } }}\r\n />\r\n )}\r\n {item.children ? <ExpandMoreIcon sx={chevronSx} /> : null}\r\n </>\r\n );\r\n\r\n const listItem = (\r\n <ListItem\r\n {...(item.children && collapsed\r\n ? {\r\n onMouseEnter: (event: React.MouseEvent<HTMLElement>) => {\r\n setAnchorElement(event.currentTarget);\r\n setHoveredPopoverItem(item.title);\r\n },\r\n onMouseLeave: () => {\r\n setHoveredPopoverItem(null);\r\n },\r\n }\r\n : {})}\r\n sx={{ py: 0, px: 1, overflowX: \"hidden\" }}\r\n >\r\n {shouldJustExpand ? (\r\n <StyledNavButton {...buttonProps} onClick={() => onClick?.(item)}>\r\n {buttonContent}\r\n </StyledNavButton>\r\n ) : (\r\n <StyledRouterButton\r\n {...buttonProps}\r\n to={item.to}\r\n href={item.href}\r\n params={item.params as any}\r\n search={item.search as any}\r\n onClick={onClose}\r\n >\r\n {buttonContent}\r\n </StyledRouterButton>\r\n )}\r\n\r\n {item.children && collapsed ? (\r\n <MiniPopover open={item.title === hoveredPopoverItem} anchorEl={anchorElement}>\r\n {renderNested?.(item.children)}\r\n </MiniPopover>\r\n ) : null}\r\n </ListItem>\r\n );\r\n\r\n return (\r\n <Fragment key={item.to}>\r\n {listItem}\r\n {item.children && !collapsed ? (\r\n <Collapse in={isOpen} timeout=\"auto\" unmountOnExit>\r\n {renderNested?.(item.children)}\r\n </Collapse>\r\n ) : null}\r\n </Fragment>\r\n );\r\n};\r\n","import Divider from \"@mui/material/Divider\";\r\nimport List from \"@mui/material/List\";\r\nimport ListSubheader from \"@mui/material/ListSubheader\";\r\nimport { Fragment, useEffect, useState } from \"react\";\r\nimport { NavigationListItem } from \"./NavigationListItem\";\r\nimport { EXPANDED_WIDTH, MINI_WIDTH } from \"./NavigationRail\";\r\nimport type { FC, ReactNode } from \"react\";\r\nimport type { Navigation, NavigationDivider, NavigationHeader, NavigationItem, NavigationPageItem } from \"~/models/Navigation\";\r\n\r\nexport const isPageItem = (item: NavigationItem): item is NavigationPageItem => !(\"kind\" in item);\r\nexport const isDivider = (item: NavigationItem): item is NavigationDivider => \"kind\" in item && item.kind === \"divider\";\r\nexport const isHeader = (item: NavigationItem): item is NavigationHeader => \"kind\" in item && item.kind === \"header\";\r\n\r\ninterface NavigationListProps {\r\n subNavigation: Navigation;\r\n depth?: number;\r\n collapsed?: boolean;\r\n isPopover?: boolean;\r\n isSidebarFullyExpanded?: boolean;\r\n isSidebarFullyCollapsed?: boolean;\r\n expandedWidth: number | string;\r\n renderItem?: (item: NavigationPageItem, context: { collapsed: boolean }) => ReactNode;\r\n activePath?: string | null;\r\n onNavigate: (item: NavigationPageItem) => void;\r\n onClose?: () => void;\r\n}\r\n\r\nexport const NavigationList: FC<NavigationListProps> = ({ subNavigation, depth = 0, collapsed, isPopover, isSidebarFullyExpanded = true, isSidebarFullyCollapsed, expandedWidth, renderItem, activePath, onNavigate, onClose }) => {\r\n const [openKeys, setOpenKeys] = useState<Array<string>>([]);\r\n\r\n useEffect(() => {\r\n if (collapsed) setOpenKeys([]);\r\n }, [collapsed]);\r\n\r\n const toggleKey = (key: string) =>\r\n setOpenKeys((previous) => (previous.includes(key) ? previous.filter((k) => k !== key) : [...previous, key]));\r\n\r\n const renderNested = (children: Array<NavigationItem>) => <NavigationList\r\n subNavigation={children}\r\n depth={depth + 1}\r\n isPopover={collapsed}\r\n expandedWidth={expandedWidth}\r\n activePath={activePath}\r\n onNavigate={onNavigate}\r\n onClose={onClose}\r\n />;\r\n\r\n const filteredNavigation = subNavigation.filter(nav => !nav.hidden);\r\n\r\n return (\r\n <List\r\n sx={{\r\n padding: 0,\r\n mt: isPopover && depth === 1 ? 0.5 : 0,\r\n mb: depth === 0 && !isPopover ? 4 : 0.5,\r\n pl: (isPopover ? 1 : 2) * (isPopover ? depth - 1 : depth),\r\n minWidth: isPopover && depth === 1 ? EXPANDED_WIDTH : \"auto\",\r\n width: collapsed ? MINI_WIDTH : \"auto\",\r\n }}\r\n >\r\n {filteredNavigation.map((navItem, index) => {\r\n if (isHeader(navItem)) {\r\n return (\r\n <ListSubheader\r\n key={`subheader-${depth}-${index}`}\r\n sx={{\r\n fontSize: 12,\r\n fontWeight: \"700\",\r\n height: collapsed ? 0 : 40,\r\n px: 2,\r\n minWidth: expandedWidth,\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n zIndex: 2,\r\n bgcolor: \"transparent\",\r\n position: \"static\"\r\n }}\r\n >\r\n {navItem.title}\r\n </ListSubheader>\r\n );\r\n }\r\n\r\n if (isDivider(navItem)) {\r\n const nextItem = filteredNavigation[index + 1];\r\n return (\r\n <li key={`divider-${depth}-${index}`}>\r\n <Divider sx={{ mx: 1, mt: 1, mb: isHeader(nextItem) && !collapsed ? 0 : 1 }} />\r\n </li>\r\n );\r\n }\r\n\r\n if (!isPageItem(navItem)) return null;\r\n\r\n const key = `item-${depth}-${index}`;\r\n const uniqueItemKey = `${depth}-${index}-${navItem.title}`;\r\n\r\n if (renderItem) return <Fragment key={key}>{renderItem(navItem, { collapsed: !!collapsed })}</Fragment>;\r\n\r\n return <NavigationListItem\r\n key={key}\r\n item={navItem}\r\n isOpen={openKeys.includes(uniqueItemKey)}\r\n selected={activePath === navItem.to}\r\n collapsed={collapsed}\r\n isSidebarFullyExpanded={isSidebarFullyExpanded}\r\n isSidebarFullyCollapsed={isSidebarFullyCollapsed}\r\n onClick={navItem.children && !collapsed ? () => toggleKey(uniqueItemKey) : undefined}\r\n renderNested={renderNested}\r\n onClose={onClose}\r\n />;\r\n })}\r\n </List>\r\n );\r\n};","import { useMediaQuery } from \"@mui/material\";\r\nimport Box from \"@mui/material/Box\";\r\nimport Drawer from \"@mui/material/Drawer\";\r\nimport { useTheme } from \"@mui/material/styles\";\r\nimport { useNavigate, useRouterState } from \"@tanstack/react-router\";\r\nimport { NavigationList, isHeader } from \"./NavigationList\";\r\nimport type { FC } from \"react\";\r\nimport type { Navigation } from \"~/models/Navigation\";\r\n\r\nexport const MINI_WIDTH = 84;\r\nexport const EXPANDED_WIDTH = 320;\r\nexport const TOOLBAR_HEIGHT = 64;\r\n\r\ninterface NavigationRailProps {\r\n navigation: Navigation;\r\n expanded: boolean;\r\n setExpanded: (open: boolean) => void;\r\n}\r\n\r\nexport const NavigationRail: FC<NavigationRailProps> = ({ navigation, expanded, setExpanded }) => {\r\n const navigate = useNavigate();\r\n const routerState = useRouterState();\r\n const theme = useTheme();\r\n const showPermanent = useMediaQuery(theme.breakpoints.up(\"sm\"));\r\n\r\n const drawerContent = (collapsed: boolean) => (\r\n <Box\r\n component=\"nav\"\r\n sx={{\r\n height: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n justifyContent: \"space-between\",\r\n overflow: \"auto\",\r\n scrollbarGutter: collapsed ? \"stable\" : \"auto\",\r\n overflowX: \"hidden\",\r\n pt: navigation[0] && isHeader(navigation[0]) && !collapsed ? 0 : 2,\r\n }}\r\n >\r\n <NavigationList\r\n subNavigation={navigation}\r\n collapsed={collapsed}\r\n isSidebarFullyExpanded={expanded}\r\n isSidebarFullyCollapsed={!expanded}\r\n expandedWidth={EXPANDED_WIDTH}\r\n activePath={routerState.location.pathname}\r\n onNavigate={navigate}\r\n onClose={!showPermanent ? () => setExpanded(false) : undefined}\r\n />\r\n </Box>\r\n );\r\n\r\n if (showPermanent)\r\n return (\r\n <Drawer\r\n variant=\"permanent\"\r\n sx={{\r\n width: expanded ? EXPANDED_WIDTH : MINI_WIDTH,\r\n [\"& .MuiDrawer-paper\"]: {\r\n position: \"absolute\",\r\n top: `${TOOLBAR_HEIGHT}px`,\r\n height: `calc(100% - ${TOOLBAR_HEIGHT}px)`,\r\n width: expanded ? EXPANDED_WIDTH : MINI_WIDTH,\r\n borderTop: \"1px solid\",\r\n borderColor: theme.vars?.palette.divider,\r\n },\r\n }}\r\n >\r\n {drawerContent(!expanded)}\r\n </Drawer>\r\n );\r\n\r\n return (\r\n <Drawer open={expanded} onClose={() => setExpanded(false)}>\r\n {drawerContent(!expanded)}\r\n </Drawer>\r\n );\r\n};\r\n","import 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 LightMode from \"@mui/icons-material/LightMode\";\r\nimport Login from \"@mui/icons-material/Login\";\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, Typography, useColorScheme } from \"@mui/material\";\r\nimport { Fragment, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport Done from \"@mui/icons-material/Done\";\r\nimport type { FC } from \"react\";\r\nimport type { User } from \"~/models/User\";\r\nimport { authClient } from \"~/lib/auth/auth-client\";\r\nimport { useDialogs } from \"~/hooks/DialogsHooks\";\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 { data: session } = authClient.useSession();\r\n const { alert } = useDialogs();\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 user = {\r\n name: \"Dalibor Homola\",\r\n employeeId: \"C2503017\",\r\n department: \"IT\",\r\n } as User;\r\n\r\n const usernameInitials = () => {\r\n if (!user.name) return \"\";\r\n const splittedName: Array<string> = user.name.split(\" \");\r\n return `${splittedName[0][0]}${splittedName.length > 1 ? splittedName[1][0] : \"\"}`;\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.name ?\r\n <Avatar sx={{ width: { xs: 32, sm: 40 }, height: { xs: 32, sm: 40 }, bgcolor: \"primary.main\" }}>\r\n <Typography variant=\"subtitle2\" sx={{ fontWeight: \"bold\", lineHeight: 0 }}>\r\n {usernameInitials()}\r\n </Typography>\r\n </Avatar>\r\n :\r\n <AccountCircle fontSize=\"large\" />\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>\r\n {session ?\r\n <Fragment>\r\n <ListItem>\r\n <ListItemText primary={user.name} secondary={\r\n <span>\r\n <span>{user.employeeId}</span>\r\n <br />\r\n <span>{user.department}</span>\r\n </span>\r\n } />\r\n </ListItem>\r\n\r\n <ListItemButton\r\n onClick={() =>\r\n authClient.signOut({}, {\r\n onSuccess: () => closeMenu(),\r\n onError: ({ error }) => alert(error.message)\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 </Fragment>\r\n :\r\n <ListItemButton\r\n onClick={() =>\r\n authClient.signIn.social({ provider: \"microsoft\" }, {\r\n onSuccess: () => closeMenu(),\r\n onError: ({ error }) => alert(error.message)\r\n })\r\n }\r\n >\r\n <ListItemIcon><Login color=\"success\" /></ListItemIcon>\r\n <ListItemText primary={t(\"Layout.LogIn\")} />\r\n </ListItemButton>\r\n }\r\n </List>\r\n\r\n {tab === \"settings\" && settings}\r\n {tab === \"theme\" && theme}\r\n {tab === \"language\" && language}\r\n </Box>\r\n </Menu>\r\n </Fragment>\r\n );\r\n};\r\n","import 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 { Fragment, useState } from \"react\";\r\nimport { createIsomorphicFn } from \"@tanstack/react-start\";\r\nimport { getCookie } from \"@tanstack/react-start/server\";\r\nimport { AppTitle } from \"./AppTitle\";\r\nimport { NavigationRail } from \"./navigation/NavigationRail\";\r\nimport { ToolbarAccount } from \"./ToolbarAccount\";\r\nimport type { FC, ReactNode } from \"react\";\r\nimport type { Navigation } from \"~/models/Navigation\";\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={theme => ({\r\n borderBottom: \"1px solid\",\r\n borderColor: theme.vars?.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 {props.children}\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 { 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 type { CssVarsThemeOptions } from \"@mui/material\";\r\nimport type { Navigation } from \"~/models/Navigation\";\r\nimport type { FC, ReactNode } from \"react\";\r\nimport { useGetTheme } from \"~/hooks/ThemeHook\";\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?: Pick<CssVarsThemeOptions, \"colorSchemes\" | \"components\">;\r\n children: ReactNode;\r\n}\r\n\r\nexport const LayoutProvider: FC<ProvidersProps> = ({ navigation, theme, children }) => {\r\n const createdTheme = useGetTheme(theme);\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 <ThemeProvider theme={createdTheme}>\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 );\r\n};\r\n\r\nexport const setSSRLanguage = createServerFn().handler(async () => {\r\n const language = getCookie(i18n.services.languageDetector.options.lookupCookie) || \"en\";\r\n dayjs.locale(language);\r\n z.config(z.core.locales[language as keyof typeof z.core.locales]());\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":"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"}
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\";\r\nimport { useId, useRef, useState } from \"react\";\r\nimport { DialogsContext } from \"../contexts/DialogsContext\";\r\nimport type { DialogComponent, OpenDialog, OpenDialogOptions } from \"../hooks/DialogsHooks\";\r\n\r\ninterface DialogStackEntry<TPayload, TResult> {\r\n key: string;\r\n open: boolean;\r\n promise: Promise<TResult>;\r\n Component: DialogComponent<TPayload, TResult>;\r\n payload: TPayload;\r\n onClose: (result: TResult) => Promise<void>;\r\n resolve: (result: TResult) => void;\r\n}\r\n\r\nexport interface DialogProviderProps {\r\n children?: React.ReactNode;\r\n unmountAfter?: number;\r\n}\r\n\r\nfunction DialogsProvider({ children, unmountAfter = 1000 }: Readonly<DialogProviderProps>) {\r\n const [stack, setStack] = useState<Array<DialogStackEntry<any, any>>>([]);\r\n const keyPrefix = useId();\r\n const nextId = useRef(0);\r\n const dialogMetadata = useRef(new WeakMap<Promise<any>, DialogStackEntry<any, any>>());\r\n\r\n const requestDialog = useEventCallback<OpenDialog>(function open<TPayload, TResult>(\r\n Component: DialogComponent<TPayload, TResult>,\r\n payload: TPayload,\r\n options: OpenDialogOptions<TResult> = {},\r\n ) {\r\n const { onClose = async () => { } } = options;\r\n\r\n let resolve: (result: TResult) => void;\r\n const promise = new Promise<TResult>((resolveImpl) => {\r\n resolve = resolveImpl;\r\n });\r\n\r\n const key = `${keyPrefix}-${nextId.current}`;\r\n nextId.current += 1;\r\n\r\n const newEntry: DialogStackEntry<TPayload, TResult> = {\r\n key,\r\n open: true,\r\n promise,\r\n Component,\r\n payload,\r\n onClose,\r\n resolve: resolve!,\r\n };\r\n\r\n dialogMetadata.current.set(promise, newEntry);\r\n\r\n setStack((previousStack) => [...previousStack, newEntry]);\r\n\r\n return promise;\r\n });\r\n\r\n const removeDialogFromStack = (dialog: Promise<any>) => {\r\n setStack((previousStack) => previousStack.filter((entry) => entry.promise !== dialog));\r\n dialogMetadata.current.delete(dialog);\r\n };\r\n\r\n const closeDialogUi = useEventCallback(function closeDialogUi<TResult>(dialog: Promise<TResult>) {\r\n setStack((previousStack) =>\r\n previousStack.map((entry) => (entry.promise === dialog ? { ...entry, open: false } : entry)),\r\n );\r\n\r\n setTimeout(() => removeDialogFromStack(dialog), unmountAfter);\r\n });\r\n\r\n const closeDialog = useEventCallback(async function closeDialog<TResult>(\r\n dialog: Promise<TResult>,\r\n result: TResult,\r\n ) {\r\n const entryToClose = dialogMetadata.current.get(dialog);\r\n if (!entryToClose) {\r\n throw new Error(\"Dialog not found in stack\");\r\n }\r\n\r\n try {\r\n await entryToClose.onClose(result);\r\n } finally {\r\n entryToClose.resolve(result);\r\n closeDialogUi(dialog);\r\n }\r\n\r\n return dialog;\r\n });\r\n\r\n return (\r\n <DialogsContext.Provider value={{ open: requestDialog, close: closeDialog }}>\r\n {children}\r\n {stack.map(({ key, open, Component, payload, promise }) => (\r\n <Component\r\n key={key}\r\n payload={payload}\r\n open={open}\r\n onClose={async (result) => {\r\n await closeDialog(promise, result);\r\n }}\r\n />\r\n ))}\r\n </DialogsContext.Provider>\r\n );\r\n}\r\n\r\nexport { DialogsProvider };\r\n\r\n","import { Chip, Stack, Typography } from \"@mui/material\";\r\nimport type { FC } from \"react\";\r\nimport { clientEnv } from \"~/env\";\r\n\r\nexport const AppTitle: FC = () => {\r\n return (\r\n <Stack direction=\"row\" alignItems=\"center\" spacing={2} flexGrow={1}>\r\n <img src=\"/favicon-32x32.png\" alt=\"app-logo\" loading=\"lazy\" />\r\n <Typography variant=\"h6\">{clientEnv.VITE_APP_TITLE}</Typography>\r\n {import.meta.env.DEV && <Chip size=\"small\" label=\"TEST\" color=\"info\" />}\r\n </Stack>\r\n );\r\n};\r\n","import ExpandMoreIcon from \"@mui/icons-material/ExpandMore\";\r\nimport { Collapse } from \"@mui/material\";\r\nimport Avatar from \"@mui/material/Avatar\";\r\nimport Box from \"@mui/material/Box\";\r\nimport ListItem from \"@mui/material/ListItem\";\r\nimport ListItemButton from \"@mui/material/ListItemButton\";\r\nimport ListItemIcon from \"@mui/material/ListItemIcon\";\r\nimport ListItemText from \"@mui/material/ListItemText\";\r\nimport Paper from \"@mui/material/Paper\";\r\nimport Popper from \"@mui/material/Popper\";\r\nimport { styled } from \"@mui/material/styles\";\r\nimport Typography from \"@mui/material/Typography\";\r\nimport { Fragment, useState } from \"react\";\r\nimport { MINI_WIDTH } from \"./NavigationRail\";\r\nimport type { NavigationItem, NavigationPageItem } from \"~/models/Navigation\";\r\nimport type { FC, ReactNode } from \"react\";\r\nimport type { SxProps, Theme } from \"@mui/material/styles\";\r\nimport { RouterListItemButton } from \"~/components/router/RouterListItemButton\";\r\n\r\nconst ICON_SIZE = 34;\r\n\r\nconst StyledNavButton = styled(ListItemButton)(({ theme }) => ({\r\n borderRadius: 8,\r\n \"&.Mui-selected\": {\r\n \"& .MuiListItemIcon-root, & .MuiTypography-root, & .MuiSvgIcon-root\": {\r\n color: (theme.vars ?? theme).palette.primary.dark,\r\n },\r\n \"& .MuiAvatar-root\": {\r\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\r\n },\r\n \"& .MuiTouchRipple-child\": {\r\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\r\n },\r\n },\r\n \"& .MuiSvgIcon-root\": {\r\n color: (theme.vars ?? theme).palette.action.active,\r\n },\r\n \"& .MuiAvatar-root\": {\r\n backgroundColor: (theme.vars ?? theme).palette.action.active,\r\n },\r\n}));\r\n\r\nconst StyledRouterButton = styled(RouterListItemButton)(({ theme }) => ({\r\n borderRadius: 8,\r\n \"&.Mui-selected\": {\r\n \"& .MuiListItemIcon-root, & .MuiTypography-root, & .MuiSvgIcon-root\": {\r\n color: (theme.vars ?? theme).palette.primary.dark,\r\n },\r\n \"& .MuiAvatar-root\": {\r\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\r\n },\r\n \"& .MuiTouchRipple-child\": {\r\n backgroundColor: (theme.vars ?? theme).palette.primary.dark,\r\n },\r\n },\r\n \"& .MuiSvgIcon-root\": {\r\n color: (theme.vars ?? theme).palette.action.active,\r\n },\r\n \"& .MuiAvatar-root\": {\r\n backgroundColor: (theme.vars ?? theme).palette.action.active,\r\n },\r\n}));\r\n\r\nconst IconOrAvatar: FC<{ item: NavigationPageItem; collapsed?: boolean }> = ({ item, collapsed }) => {\r\n if (item.icon || collapsed) {\r\n return (\r\n <Box sx={collapsed ? { position: \"absolute\", left: \"50%\", top: \"calc(50% - 6px)\", transform: \"translate(-50%, -50%)\" } : {}}>\r\n <ListItemIcon sx={{ display: \"flex\", alignItems: \"center\", justifyContent: \"center\", minWidth: ICON_SIZE }}>\r\n {item.icon ?? null}\r\n {!item.icon && collapsed ? (\r\n <Avatar sx={{ width: ICON_SIZE - 7, height: ICON_SIZE - 7, fontSize: 12 }}>{item.title}</Avatar>\r\n ) : null}\r\n </ListItemIcon>\r\n {collapsed ? (\r\n <Typography\r\n variant=\"caption\"\r\n sx={{\r\n position: \"absolute\",\r\n bottom: -18,\r\n left: \"50%\",\r\n transform: \"translateX(-50%)\",\r\n fontSize: 10,\r\n fontWeight: 500,\r\n textAlign: \"center\",\r\n whiteSpace: \"nowrap\",\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n maxWidth: MINI_WIDTH - 28,\r\n }}\r\n >\r\n {item.title}\r\n </Typography>\r\n ) : null}\r\n </Box>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\ninterface MiniPopoverProps {\r\n open: boolean;\r\n anchorEl: HTMLElement | null;\r\n children?: ReactNode;\r\n}\r\n\r\nconst MiniPopover: FC<MiniPopoverProps> = ({ open, anchorEl, children }) => (\r\n <Popper\r\n open={open}\r\n anchorEl={anchorEl}\r\n placement=\"right-start\"\r\n modifiers={[\r\n { name: \"offset\", options: { offset: [6, 0] } },\r\n { name: \"preventOverflow\", options: { padding: 8 } },\r\n { name: \"flip\", options: { fallbackPlacements: [\"right-end\", \"left-start\"] } },\r\n ]}\r\n >\r\n <Paper\r\n sx={{\r\n pt: 0.5,\r\n pb: 0.5,\r\n maxHeight: \"min(calc(100vh - 100px), 560px)\",\r\n overflowY: \"auto\",\r\n overscrollBehavior: \"contain\",\r\n }}\r\n >\r\n {children}\r\n </Paper>\r\n </Popper>\r\n);\r\n\r\ninterface NavigationListItemProps {\r\n item: NavigationPageItem;\r\n isOpen?: boolean;\r\n selected?: boolean;\r\n disabled?: boolean;\r\n collapsed?: boolean;\r\n isSidebarFullyExpanded?: boolean;\r\n isSidebarFullyCollapsed?: boolean;\r\n onClick?: (item: NavigationPageItem) => void;\r\n renderNested?: (sub: Array<NavigationItem>) => ReactNode;\r\n onClose?: () => void;\r\n}\r\n\r\nexport const NavigationListItem: FC<NavigationListItemProps> = ({ item, isOpen, selected, disabled, collapsed, isSidebarFullyExpanded = true, isSidebarFullyCollapsed, onClick, renderNested, onClose }) => {\r\n const [hoveredPopoverItem, setHoveredPopoverItem] = useState<string | null>(null);\r\n const [anchorElement, setAnchorElement] = useState<HTMLElement | null>(null);\r\n\r\n const chevronSx: SxProps<Theme> = () => {\r\n if (collapsed && isSidebarFullyCollapsed && item.children) {\r\n return {\r\n fontSize: 18,\r\n position: \"absolute\",\r\n top: \"41.5%\",\r\n right: \"2px\",\r\n transform: \"translateY(-50%) rotate(-90deg)\",\r\n };\r\n }\r\n if (!collapsed && isSidebarFullyExpanded && item.children) {\r\n return {\r\n ml: 0.5,\r\n transform: `rotate(${isOpen ? 0 : -90}deg)`,\r\n };\r\n }\r\n return { display: \"none\" };\r\n };\r\n\r\n const shouldJustExpand = item.children && !collapsed;\r\n\r\n const buttonProps = {\r\n selected,\r\n disabled,\r\n sx: { px: 1.4, height: collapsed ? 60 : 48 }\r\n };\r\n\r\n const buttonContent = (\r\n <>\r\n <IconOrAvatar item={item} collapsed={collapsed} />\r\n {!collapsed && (\r\n <ListItemText\r\n primary={item.title}\r\n slotProps={{ primary: { noWrap: true, title: item.title } }}\r\n sx={{ ml: 1.2, flex: 1, minWidth: 0, \"& .MuiTypography-root\": { whiteSpace: \"nowrap\", overflow: \"hidden\", textOverflow: \"ellipsis\" } }}\r\n />\r\n )}\r\n {item.children ? <ExpandMoreIcon sx={chevronSx} /> : null}\r\n </>\r\n );\r\n\r\n const listItem = (\r\n <ListItem\r\n {...(item.children && collapsed\r\n ? {\r\n onMouseEnter: (event: React.MouseEvent<HTMLElement>) => {\r\n setAnchorElement(event.currentTarget);\r\n setHoveredPopoverItem(item.title);\r\n },\r\n onMouseLeave: () => {\r\n setHoveredPopoverItem(null);\r\n },\r\n }\r\n : {})}\r\n sx={{ py: 0, px: 1, overflowX: \"hidden\" }}\r\n >\r\n {shouldJustExpand ? (\r\n <StyledNavButton {...buttonProps} onClick={() => onClick?.(item)}>\r\n {buttonContent}\r\n </StyledNavButton>\r\n ) : (\r\n <StyledRouterButton\r\n {...buttonProps}\r\n to={item.to}\r\n href={item.href}\r\n params={item.params as any}\r\n search={item.search as any}\r\n onClick={onClose}\r\n >\r\n {buttonContent}\r\n </StyledRouterButton>\r\n )}\r\n\r\n {item.children && collapsed ? (\r\n <MiniPopover open={item.title === hoveredPopoverItem} anchorEl={anchorElement}>\r\n {renderNested?.(item.children)}\r\n </MiniPopover>\r\n ) : null}\r\n </ListItem>\r\n );\r\n\r\n return (\r\n <Fragment key={item.to}>\r\n {listItem}\r\n {item.children && !collapsed ? (\r\n <Collapse in={isOpen} timeout=\"auto\" unmountOnExit>\r\n {renderNested?.(item.children)}\r\n </Collapse>\r\n ) : null}\r\n </Fragment>\r\n );\r\n};\r\n","import Divider from \"@mui/material/Divider\";\r\nimport List from \"@mui/material/List\";\r\nimport ListSubheader from \"@mui/material/ListSubheader\";\r\nimport { Fragment, useEffect, useState } from \"react\";\r\nimport { NavigationListItem } from \"./NavigationListItem\";\r\nimport { EXPANDED_WIDTH, MINI_WIDTH } from \"./NavigationRail\";\r\nimport type { FC, ReactNode } from \"react\";\r\nimport type { Navigation, NavigationDivider, NavigationHeader, NavigationItem, NavigationPageItem } from \"~/models/Navigation\";\r\n\r\nexport const isPageItem = (item: NavigationItem): item is NavigationPageItem => !(\"kind\" in item);\r\nexport const isDivider = (item: NavigationItem): item is NavigationDivider => \"kind\" in item && item.kind === \"divider\";\r\nexport const isHeader = (item: NavigationItem): item is NavigationHeader => \"kind\" in item && item.kind === \"header\";\r\n\r\ninterface NavigationListProps {\r\n subNavigation: Navigation;\r\n depth?: number;\r\n collapsed?: boolean;\r\n isPopover?: boolean;\r\n isSidebarFullyExpanded?: boolean;\r\n isSidebarFullyCollapsed?: boolean;\r\n expandedWidth: number | string;\r\n renderItem?: (item: NavigationPageItem, context: { collapsed: boolean }) => ReactNode;\r\n activePath?: string | null;\r\n onNavigate: (item: NavigationPageItem) => void;\r\n onClose?: () => void;\r\n}\r\n\r\nexport const NavigationList: FC<NavigationListProps> = ({ subNavigation, depth = 0, collapsed, isPopover, isSidebarFullyExpanded = true, isSidebarFullyCollapsed, expandedWidth, renderItem, activePath, onNavigate, onClose }) => {\r\n const [openKeys, setOpenKeys] = useState<Array<string>>([]);\r\n\r\n useEffect(() => {\r\n if (collapsed) setOpenKeys([]);\r\n }, [collapsed]);\r\n\r\n const toggleKey = (key: string) =>\r\n setOpenKeys((previous) => (previous.includes(key) ? previous.filter((k) => k !== key) : [...previous, key]));\r\n\r\n const renderNested = (children: Array<NavigationItem>) => <NavigationList\r\n subNavigation={children}\r\n depth={depth + 1}\r\n isPopover={collapsed}\r\n expandedWidth={expandedWidth}\r\n activePath={activePath}\r\n onNavigate={onNavigate}\r\n onClose={onClose}\r\n />;\r\n\r\n const filteredNavigation = subNavigation.filter(nav => !nav.hidden);\r\n\r\n return (\r\n <List\r\n sx={{\r\n padding: 0,\r\n mt: isPopover && depth === 1 ? 0.5 : 0,\r\n mb: depth === 0 && !isPopover ? 4 : 0.5,\r\n pl: (isPopover ? 1 : 2) * (isPopover ? depth - 1 : depth),\r\n minWidth: isPopover && depth === 1 ? EXPANDED_WIDTH : \"auto\",\r\n width: collapsed ? MINI_WIDTH : \"auto\",\r\n }}\r\n >\r\n {filteredNavigation.map((navItem, index) => {\r\n if (isHeader(navItem)) {\r\n return (\r\n <ListSubheader\r\n key={`subheader-${depth}-${index}`}\r\n sx={{\r\n fontSize: 12,\r\n fontWeight: \"700\",\r\n height: collapsed ? 0 : 40,\r\n px: 2,\r\n minWidth: expandedWidth,\r\n overflow: \"hidden\",\r\n textOverflow: \"ellipsis\",\r\n whiteSpace: \"nowrap\",\r\n zIndex: 2,\r\n bgcolor: \"transparent\",\r\n position: \"static\"\r\n }}\r\n >\r\n {navItem.title}\r\n </ListSubheader>\r\n );\r\n }\r\n\r\n if (isDivider(navItem)) {\r\n const nextItem = filteredNavigation[index + 1];\r\n return (\r\n <li key={`divider-${depth}-${index}`}>\r\n <Divider sx={{ mx: 1, mt: 1, mb: isHeader(nextItem) && !collapsed ? 0 : 1 }} />\r\n </li>\r\n );\r\n }\r\n\r\n if (!isPageItem(navItem)) return null;\r\n\r\n const key = `item-${depth}-${index}`;\r\n const uniqueItemKey = `${depth}-${index}-${navItem.title}`;\r\n\r\n if (renderItem) return <Fragment key={key}>{renderItem(navItem, { collapsed: !!collapsed })}</Fragment>;\r\n\r\n return <NavigationListItem\r\n key={key}\r\n item={navItem}\r\n isOpen={openKeys.includes(uniqueItemKey)}\r\n selected={activePath === navItem.to}\r\n collapsed={collapsed}\r\n isSidebarFullyExpanded={isSidebarFullyExpanded}\r\n isSidebarFullyCollapsed={isSidebarFullyCollapsed}\r\n onClick={navItem.children && !collapsed ? () => toggleKey(uniqueItemKey) : undefined}\r\n renderNested={renderNested}\r\n onClose={onClose}\r\n />;\r\n })}\r\n </List>\r\n );\r\n};","import { useMediaQuery } from \"@mui/material\";\r\nimport Box from \"@mui/material/Box\";\r\nimport Drawer from \"@mui/material/Drawer\";\r\nimport { useTheme } from \"@mui/material/styles\";\r\nimport { useNavigate, useRouterState } from \"@tanstack/react-router\";\r\nimport { NavigationList, isHeader } from \"./NavigationList\";\r\nimport type { FC } from \"react\";\r\nimport type { Navigation } from \"~/models/Navigation\";\r\n\r\nexport const MINI_WIDTH = 84;\r\nexport const EXPANDED_WIDTH = 320;\r\nexport const TOOLBAR_HEIGHT = 64;\r\n\r\ninterface NavigationRailProps {\r\n navigation: Navigation;\r\n expanded: boolean;\r\n setExpanded: (open: boolean) => void;\r\n}\r\n\r\nexport const NavigationRail: FC<NavigationRailProps> = ({ navigation, expanded, setExpanded }) => {\r\n const navigate = useNavigate();\r\n const routerState = useRouterState();\r\n const theme = useTheme();\r\n const showPermanent = useMediaQuery(theme.breakpoints.up(\"sm\"));\r\n\r\n const drawerContent = (collapsed: boolean) => (\r\n <Box\r\n component=\"nav\"\r\n sx={{\r\n height: \"100%\",\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n justifyContent: \"space-between\",\r\n overflow: \"auto\",\r\n scrollbarGutter: collapsed ? \"stable\" : \"auto\",\r\n overflowX: \"hidden\",\r\n pt: navigation[0] && isHeader(navigation[0]) && !collapsed ? 0 : 2,\r\n }}\r\n >\r\n <NavigationList\r\n subNavigation={navigation}\r\n collapsed={collapsed}\r\n isSidebarFullyExpanded={expanded}\r\n isSidebarFullyCollapsed={!expanded}\r\n expandedWidth={EXPANDED_WIDTH}\r\n activePath={routerState.location.pathname}\r\n onNavigate={navigate}\r\n onClose={!showPermanent ? () => setExpanded(false) : undefined}\r\n />\r\n </Box>\r\n );\r\n\r\n if (showPermanent)\r\n return (\r\n <Drawer\r\n variant=\"permanent\"\r\n sx={{\r\n width: expanded ? EXPANDED_WIDTH : MINI_WIDTH,\r\n [\"& .MuiDrawer-paper\"]: {\r\n position: \"absolute\",\r\n top: `${TOOLBAR_HEIGHT}px`,\r\n height: `calc(100% - ${TOOLBAR_HEIGHT}px)`,\r\n width: expanded ? EXPANDED_WIDTH : MINI_WIDTH,\r\n borderTop: \"1px solid\",\r\n borderColor: theme.vars?.palette.divider,\r\n },\r\n }}\r\n >\r\n {drawerContent(!expanded)}\r\n </Drawer>\r\n );\r\n\r\n return (\r\n <Drawer open={expanded} onClose={() => setExpanded(false)}>\r\n {drawerContent(!expanded)}\r\n </Drawer>\r\n );\r\n};\r\n","import 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 LightMode from \"@mui/icons-material/LightMode\";\r\nimport Login from \"@mui/icons-material/Login\";\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, Typography, useColorScheme } from \"@mui/material\";\r\nimport { Fragment, useState } from \"react\";\r\nimport { useTranslation } from \"react-i18next\";\r\nimport Done from \"@mui/icons-material/Done\";\r\nimport type { FC } from \"react\";\r\nimport type { User } from \"~/models/User\";\r\nimport { authClient } from \"~/lib/auth/auth-client\";\r\nimport { useDialogs } from \"~/hooks/DialogsHooks\";\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 { data: session } = authClient.useSession();\r\n const { alert } = useDialogs();\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 user = {\r\n name: \"Dalibor Homola\",\r\n employeeId: \"C2503017\",\r\n department: \"IT\",\r\n } as User;\r\n\r\n const usernameInitials = () => {\r\n if (!user.name) return \"\";\r\n const splittedName: Array<string> = user.name.split(\" \");\r\n return `${splittedName[0][0]}${splittedName.length > 1 ? splittedName[1][0] : \"\"}`;\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.name ?\r\n <Avatar sx={{ width: { xs: 32, sm: 40 }, height: { xs: 32, sm: 40 }, bgcolor: \"primary.main\" }}>\r\n <Typography variant=\"subtitle2\" sx={{ fontWeight: \"bold\", lineHeight: 0 }}>\r\n {usernameInitials()}\r\n </Typography>\r\n </Avatar>\r\n :\r\n <AccountCircle fontSize=\"large\" />\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>\r\n {session ?\r\n <Fragment>\r\n <ListItem>\r\n <ListItemText primary={user.name} secondary={\r\n <span>\r\n <span>{user.employeeId}</span>\r\n <br />\r\n <span>{user.department}</span>\r\n </span>\r\n } />\r\n </ListItem>\r\n\r\n <ListItemButton\r\n onClick={() =>\r\n authClient.signOut({}, {\r\n onSuccess: () => closeMenu(),\r\n onError: ({ error }) => alert(error.message)\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 </Fragment>\r\n :\r\n <ListItemButton\r\n onClick={() =>\r\n authClient.signIn.social({ provider: \"microsoft\" }, {\r\n onSuccess: () => closeMenu(),\r\n onError: ({ error }) => alert(error.message)\r\n })\r\n }\r\n >\r\n <ListItemIcon><Login color=\"success\" /></ListItemIcon>\r\n <ListItemText primary={t(\"Layout.LogIn\")} />\r\n </ListItemButton>\r\n }\r\n </List>\r\n\r\n {tab === \"settings\" && settings}\r\n {tab === \"theme\" && theme}\r\n {tab === \"language\" && language}\r\n </Box>\r\n </Menu>\r\n </Fragment>\r\n );\r\n};\r\n","import 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 { Fragment, useState } from \"react\";\r\nimport { createIsomorphicFn } from \"@tanstack/react-start\";\r\nimport { getCookie } from \"@tanstack/react-start/server\";\r\nimport { AppTitle } from \"./AppTitle\";\r\nimport { NavigationRail } from \"./navigation/NavigationRail\";\r\nimport { ToolbarAccount } from \"./ToolbarAccount\";\r\nimport type { FC, ReactNode } from \"react\";\r\nimport type { Navigation } from \"~/models/Navigation\";\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={theme => ({\r\n borderBottom: \"1px solid\",\r\n borderColor: theme.vars?.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 {props.children}\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 { 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 type { CssVarsThemeOptions } from \"@mui/material\";\r\nimport type { Navigation } from \"~/models/Navigation\";\r\nimport type { FC, ReactNode } from \"react\";\r\nimport { useGetTheme } from \"~/hooks/ThemeHook\";\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?: Pick<CssVarsThemeOptions, \"colorSchemes\" | \"components\">;\r\n children: ReactNode;\r\n}\r\n\r\nexport const LayoutProvider: FC<ProvidersProps> = ({ navigation, theme, children }) => {\r\n const createdTheme = useGetTheme(theme);\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 <ThemeProvider theme={createdTheme}>\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 );\r\n};\r\n\r\nexport const setSSRLanguage = createServerFn().handler(async () => {\r\n const language = getCookie(i18n.services.languageDetector.options.lookupCookie) || \"en\";\r\n dayjs.locale(language);\r\n z.config(z.core.locales[language as keyof typeof z.core.locales]());\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":"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"}
package/dist/queries.js CHANGED
@@ -1,6 +1,6 @@
1
- import { f, g, c, b, u, a, d, e, h } from "./FileHooks-hWKTwLCr.js";
1
+ import { f, g, c, b, u, a, d, e, h } from "./FileHooks-BbjesS5D.js";
2
2
  import { useQuery, useQueryClient, useMutation } from "@tanstack/react-query";
3
- import { h as httpClient, t as toKebabCase } from "./utils-DKyKGba7.js";
3
+ import { h as httpClient, t as toKebabCase } from "./utils-JYv9O0GI.js";
4
4
  import { createIsomorphicFn } from "@tanstack/react-start";
5
5
  import z__default from "zod";
6
6
  import { c as clientEnv } from "./env-CoxTjaDr.js";
@@ -36,7 +36,6 @@ const rootRouteHead = () => ({
36
36
  });
37
37
  const httpClient = axios.create({
38
38
  baseURL: clientEnv.VITE_API_URL
39
- // TODO: Not working in children projects
40
39
  });
41
40
  const getFieldStatus = (field) => {
42
41
  const { meta } = field.state;
@@ -55,4 +54,4 @@ export {
55
54
  rootRouteHead as r,
56
55
  toKebabCase as t
57
56
  };
58
- //# sourceMappingURL=utils-DKyKGba7.js.map
57
+ //# sourceMappingURL=utils-JYv9O0GI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-JYv9O0GI.js","sources":["../src/lib/utils.ts"],"sourcesContent":["import axios from \"axios\";\r\nimport type { AnyFieldApi } from \"@tanstack/react-form\";\r\nimport { clientEnv } from \"~/env\";\r\n\r\nexport class Platform {\r\n static get isAndroid() { return /android/i.test(this.userAgent); }\r\n static get isIOS() { return /iPad|iPhone|iPod/.test(this.userAgent); }\r\n static get isWindows() { return /windows/i.test(this.userAgent); }\r\n static get isMacOS() { return /Macintosh|MacIntel|MacPPC|Mac68K/.test(this.userAgent); }\r\n\r\n private static get userAgent() { return typeof navigator === \"undefined\" ? \"\" : navigator.userAgent; }\r\n}\r\n\r\nexport const rootRouteHead = () => ({\r\n meta: [\r\n { charSet: \"utf-8\" },\r\n { name: \"viewport\", content: \"width=device-width, initial-scale=1\" },\r\n { title: clientEnv.VITE_APP_TITLE },\r\n { name: \"og:type\", content: \"website\" },\r\n { name: \"og:title\", content: clientEnv.VITE_APP_TITLE },\r\n { name: \"og:image\", content: \"/favicon-32x32.png\" }\r\n ],\r\n links: [\r\n { rel: \"apple-touch-icon\", sizes: \"180x180\", href: \"/apple-touch-icon.png\", },\r\n { rel: \"icon\", type: \"image/png\", sizes: \"32x32\", href: \"/favicon-32x32.png\", },\r\n { rel: \"icon\", type: \"image/png\", sizes: \"16x16\", href: \"/favicon-16x16.png\", },\r\n { rel: \"manifest\", href: \"/manifest.webmanifest\" },\r\n { rel: \"icon\", href: \"/favicon.ico\" },\r\n ],\r\n});\r\n\r\nexport const httpClient = axios.create({\r\n baseURL: clientEnv.VITE_API_URL,\r\n});\r\n\r\n/* Internal Utils */\r\nexport type FormOmittedProps =\r\n \"name\" |\r\n \"value\" |\r\n \"onChange\" |\r\n \"onBlur\" |\r\n \"error\" |\r\n \"helperText\" |\r\n \"renderInput\" |\r\n \"type\" |\r\n \"aria-label\";\r\n\r\nexport const getFieldStatus = (field: AnyFieldApi) => {\r\n const { meta } = field.state;\r\n\r\n const isTouched = meta.isTouched;\r\n const hasError = !!meta.errors.length;\r\n const helperText = meta.errors[0]?.message;\r\n\r\n return { isTouched, hasError, helperText };\r\n};\r\n\r\nexport const toKebabCase = (str: string): string => {\r\n return str\r\n .replaceAll(/([a-z])([A-Z])/g, \"$1-$2\")\r\n .replaceAll(/[\\s_]+/g, \"-\")\r\n .replaceAll(/[^a-zA-Z0-9-]/g, \"\")\r\n .toLowerCase()\r\n .replaceAll(/-+/g, \"-\")\r\n .replaceAll(/(^-|-$)/g, \"\");\r\n};\r\n"],"names":[],"mappings":";;AAIO,MAAM,SAAS;AAAA,EAClB,WAAW,YAAY;AAAE,WAAO,WAAW,KAAK,KAAK,SAAS;AAAA,EAAG;AAAA,EACjE,WAAW,QAAQ;AAAE,WAAO,mBAAmB,KAAK,KAAK,SAAS;AAAA,EAAG;AAAA,EACrE,WAAW,YAAY;AAAE,WAAO,WAAW,KAAK,KAAK,SAAS;AAAA,EAAG;AAAA,EACjE,WAAW,UAAU;AAAE,WAAO,mCAAmC,KAAK,KAAK,SAAS;AAAA,EAAG;AAAA,EAEvF,WAAmB,YAAY;AAAE,WAAO,OAAO,cAAc,cAAc,KAAK,UAAU;AAAA,EAAW;AACzG;AAEO,MAAM,gBAAgB,OAAO;AAAA,EAChC,MAAM;AAAA,IACF,EAAE,SAAS,QAAA;AAAA,IACX,EAAE,MAAM,YAAY,SAAS,sCAAA;AAAA,IAC7B,EAAE,OAAO,UAAU,eAAA;AAAA,IACnB,EAAE,MAAM,WAAW,SAAS,UAAA;AAAA,IAC5B,EAAE,MAAM,YAAY,SAAS,UAAU,eAAA;AAAA,IACvC,EAAE,MAAM,YAAY,SAAS,qBAAA;AAAA,EAAqB;AAAA,EAEtD,OAAO;AAAA,IACH,EAAE,KAAK,oBAAoB,OAAO,WAAW,MAAM,wBAAA;AAAA,IACnD,EAAE,KAAK,QAAQ,MAAM,aAAa,OAAO,SAAS,MAAM,qBAAA;AAAA,IACxD,EAAE,KAAK,QAAQ,MAAM,aAAa,OAAO,SAAS,MAAM,qBAAA;AAAA,IACxD,EAAE,KAAK,YAAY,MAAM,wBAAA;AAAA,IACzB,EAAE,KAAK,QAAQ,MAAM,eAAA;AAAA,EAAe;AAE5C;AAEO,MAAM,aAAa,MAAM,OAAO;AAAA,EACnC,SAAS,UAAU;AACvB,CAAC;AAcM,MAAM,iBAAiB,CAAC,UAAuB;AAClD,QAAM,EAAE,SAAS,MAAM;AAEvB,QAAM,YAAY,KAAK;AACvB,QAAM,WAAW,CAAC,CAAC,KAAK,OAAO;AAC/B,QAAM,aAAa,KAAK,OAAO,CAAC,GAAG;AAEnC,SAAO,EAAE,WAAW,UAAU,WAAA;AAClC;AAEO,MAAM,cAAc,CAAC,QAAwB;AAChD,SAAO,IACF,WAAW,mBAAmB,OAAO,EACrC,WAAW,WAAW,GAAG,EACzB,WAAW,kBAAkB,EAAE,EAC/B,cACA,WAAW,OAAO,GAAG,EACrB,WAAW,YAAY,EAAE;AAClC;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wcz-test",
3
- "version": "6.10.0",
3
+ "version": "6.11.0",
4
4
  "private": false,
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -36,10 +36,6 @@
36
36
  "types": "./dist/queries.d.ts",
37
37
  "import": "./dist/queries.js"
38
38
  },
39
- "./utils": {
40
- "types": "./dist/utils.d.ts",
41
- "import": "./dist/utils.js"
42
- },
43
39
  "./vite": {
44
40
  "types": "./dist/vite.d.ts",
45
41
  "import": "./dist/vite.js"
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils-DKyKGba7.js","sources":["../src/lib/utils.ts"],"sourcesContent":["import axios from \"axios\";\r\nimport type { AnyFieldApi } from \"@tanstack/react-form\";\r\nimport { clientEnv } from \"~/env\";\r\n\r\nexport class Platform {\r\n static get isAndroid() { return /android/i.test(this.userAgent); }\r\n static get isIOS() { return /iPad|iPhone|iPod/.test(this.userAgent); }\r\n static get isWindows() { return /windows/i.test(this.userAgent); }\r\n static get isMacOS() { return /Macintosh|MacIntel|MacPPC|Mac68K/.test(this.userAgent); }\r\n\r\n private static get userAgent() { return typeof navigator === \"undefined\" ? \"\" : navigator.userAgent; }\r\n}\r\n\r\nexport const rootRouteHead = () => ({\r\n meta: [\r\n { charSet: \"utf-8\" },\r\n { name: \"viewport\", content: \"width=device-width, initial-scale=1\" },\r\n { title: clientEnv.VITE_APP_TITLE },\r\n { name: \"og:type\", content: \"website\" },\r\n { name: \"og:title\", content: clientEnv.VITE_APP_TITLE },\r\n { name: \"og:image\", content: \"/favicon-32x32.png\" }\r\n ],\r\n links: [\r\n { rel: \"apple-touch-icon\", sizes: \"180x180\", href: \"/apple-touch-icon.png\", },\r\n { rel: \"icon\", type: \"image/png\", sizes: \"32x32\", href: \"/favicon-32x32.png\", },\r\n { rel: \"icon\", type: \"image/png\", sizes: \"16x16\", href: \"/favicon-16x16.png\", },\r\n { rel: \"manifest\", href: \"/manifest.webmanifest\" },\r\n { rel: \"icon\", href: \"/favicon.ico\" },\r\n ],\r\n});\r\n\r\nexport const httpClient = axios.create({\r\n baseURL: clientEnv.VITE_API_URL // TODO: Not working in children projects\r\n});\r\n\r\n/* Internal Utils */\r\nexport type FormOmittedProps =\r\n \"name\" |\r\n \"value\" |\r\n \"onChange\" |\r\n \"onBlur\" |\r\n \"error\" |\r\n \"helperText\" |\r\n \"renderInput\" |\r\n \"type\" |\r\n \"aria-label\";\r\n\r\nexport const getFieldStatus = (field: AnyFieldApi) => {\r\n const { meta } = field.state;\r\n\r\n const isTouched = meta.isTouched;\r\n const hasError = !!meta.errors.length;\r\n const helperText = meta.errors[0]?.message;\r\n\r\n return { isTouched, hasError, helperText };\r\n};\r\n\r\nexport const toKebabCase = (str: string): string => {\r\n return str\r\n .replaceAll(/([a-z])([A-Z])/g, \"$1-$2\")\r\n .replaceAll(/[\\s_]+/g, \"-\")\r\n .replaceAll(/[^a-zA-Z0-9-]/g, \"\")\r\n .toLowerCase()\r\n .replaceAll(/-+/g, \"-\")\r\n .replaceAll(/(^-|-$)/g, \"\");\r\n};\r\n"],"names":[],"mappings":";;AAIO,MAAM,SAAS;AAAA,EAClB,WAAW,YAAY;AAAE,WAAO,WAAW,KAAK,KAAK,SAAS;AAAA,EAAG;AAAA,EACjE,WAAW,QAAQ;AAAE,WAAO,mBAAmB,KAAK,KAAK,SAAS;AAAA,EAAG;AAAA,EACrE,WAAW,YAAY;AAAE,WAAO,WAAW,KAAK,KAAK,SAAS;AAAA,EAAG;AAAA,EACjE,WAAW,UAAU;AAAE,WAAO,mCAAmC,KAAK,KAAK,SAAS;AAAA,EAAG;AAAA,EAEvF,WAAmB,YAAY;AAAE,WAAO,OAAO,cAAc,cAAc,KAAK,UAAU;AAAA,EAAW;AACzG;AAEO,MAAM,gBAAgB,OAAO;AAAA,EAChC,MAAM;AAAA,IACF,EAAE,SAAS,QAAA;AAAA,IACX,EAAE,MAAM,YAAY,SAAS,sCAAA;AAAA,IAC7B,EAAE,OAAO,UAAU,eAAA;AAAA,IACnB,EAAE,MAAM,WAAW,SAAS,UAAA;AAAA,IAC5B,EAAE,MAAM,YAAY,SAAS,UAAU,eAAA;AAAA,IACvC,EAAE,MAAM,YAAY,SAAS,qBAAA;AAAA,EAAqB;AAAA,EAEtD,OAAO;AAAA,IACH,EAAE,KAAK,oBAAoB,OAAO,WAAW,MAAM,wBAAA;AAAA,IACnD,EAAE,KAAK,QAAQ,MAAM,aAAa,OAAO,SAAS,MAAM,qBAAA;AAAA,IACxD,EAAE,KAAK,QAAQ,MAAM,aAAa,OAAO,SAAS,MAAM,qBAAA;AAAA,IACxD,EAAE,KAAK,YAAY,MAAM,wBAAA;AAAA,IACzB,EAAE,KAAK,QAAQ,MAAM,eAAA;AAAA,EAAe;AAE5C;AAEO,MAAM,aAAa,MAAM,OAAO;AAAA,EACnC,SAAS,UAAU;AAAA;AACvB,CAAC;AAcM,MAAM,iBAAiB,CAAC,UAAuB;AAClD,QAAM,EAAE,SAAS,MAAM;AAEvB,QAAM,YAAY,KAAK;AACvB,QAAM,WAAW,CAAC,CAAC,KAAK,OAAO;AAC/B,QAAM,aAAa,KAAK,OAAO,CAAC,GAAG;AAEnC,SAAO,EAAE,WAAW,UAAU,WAAA;AAClC;AAEO,MAAM,cAAc,CAAC,QAAwB;AAChD,SAAO,IACF,WAAW,mBAAmB,OAAO,EACrC,WAAW,WAAW,GAAG,EACzB,WAAW,kBAAkB,EAAE,EAC/B,cACA,WAAW,OAAO,GAAG,EACrB,WAAW,YAAY,EAAE;AAClC;"}
package/dist/utils.d.ts DELETED
@@ -1,11 +0,0 @@
1
- import { AxiosInstance } from 'axios';
2
- import { createEnv } from '@t3-oss/env-core';
3
- import { uuidv7 } from 'uuidv7';
4
-
5
- export { createEnv }
6
-
7
- export declare const httpClient: AxiosInstance;
8
-
9
- export { uuidv7 }
10
-
11
- export { }
package/dist/utils.js DELETED
@@ -1,9 +0,0 @@
1
- import { uuidv7 } from "uuidv7";
2
- import { h } from "./utils-DKyKGba7.js";
3
- import { createEnv } from "@t3-oss/env-core";
4
- export {
5
- createEnv,
6
- h as httpClient,
7
- uuidv7
8
- };
9
- //# sourceMappingURL=utils.js.map
package/dist/utils.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}