UNPKG

wcz-layout

Version:

1 lines 61.5 kB
{"version":3,"file":"components.mjs","names":["Typography","TypographyProps","TypographyWithIconProps","startIcon","React","ReactNode","endIcon","gap","TypographyWithIcon","FC","t0","$","_c","$i","Symbol","for","children","props","sx","t1","undefined","t2","display","flexShrink","t3","alignItems","verticalAlign","t4","Array","isArray","t5","t6","Box","useEffectEvent","useLayoutEffect","useRef","useState","BoxProps","FC","Fullscreen","t0","$","_c","$i","Symbol","for","children","props","sx","reference","height","setHeight","t1","current","top","getBoundingClientRect","viewportHeight","window","visualViewport","innerHeight","avail","Math","max","floor","recompute","t2","element","addEventListener","ro","ResizeObserver","observe","document","documentElement","body","removeEventListener","disconnect","t3","t4","display","flexDirection","boxSizing","minHeight","width","overflow","t5","CloudUpload","SxProps","Theme","Box","CircularProgress","Typography","useTheme","CSSProperties","FC","DropzoneOptions","useDropzone","useTranslation","baseStyle","flex","display","flexDirection","alignItems","padding","borderWidth","borderRadius","borderStyle","outline","transition","cursor","DropzoneProps","sx","progress","Dropzone","t0","$","_c","$i","Symbol","for","props","getRootProps","getInputProps","isFocused","isDragAccept","isDragReject","t","theme","t1","disabled","t2","vars","T0","t3","palette","text","style","borderColor","primary","main","success","error","t4","t5","t6","t7","t8","t9","t10","createContext","useContext","FileMeta","FileActions","FileContextValue","appName","fileMetas","Array","onDelete","params","remainingFileMetas","deletedFileMeta","actions","setImageId","imageId","FileContext","useFile","$","_c","$i","Symbol","for","context","Error","Delete","FileDownload","List","ListItemButton","ListItemIcon","ListItemText","Menu","useMutation","useTranslation","FC","FileMeta","useFile","useDialogs","deleteFileMutationOptions","downloadFileMutationOptions","rootRouteId","useMatch","ActionsMenuProps","meta","menu","mouseX","mouseY","setMenu","ActionsMenu","t0","$","_c","$i","Symbol","for","t","fileMetas","onDelete","actions","appName","confirm","t1","handleMenuClose","t2","from","rootMatch","queryClient","context","t3","mutate","download","isPending","isDownloading","t4","deleteFile","isDeleting","t5","fileExtension","fileName","id","handleOnDownload","t6","name","remainingFileMetas","filter","m","deletedFileMeta","handleOnDelete","t7","t8","undefined","top","left","t9","t10","delete","t11","t12","MoreVert","Box","IconButton","ImageListItem","ImageListItemBar","Skeleton","Stack","Tooltip","grey","useMutation","useQuery","useQueryClient","React","Fragment","useEffect","useRef","useState","useInView","ActionsMenu","FileMeta","SxProps","Theme","useFile","downloadFileMutationOptions","fileQueryOptions","fileThumbnailQueryOptions","openFileMutationOptions","IMAGE_SIZE","FileViewerGridItemBar","FileViewerGridProps","size","itemBar","sx","FileViewerGrid","FC","t0","$","_c","$i","Symbol","for","fileMetas","t1","overflow","t2","t3","fileMeta","id","map","GridFileViewerItemProps","meta","GridFileViewerItem","setImageId","actions","appName","showItemBar","setShowItemBar","menu","setMenu","mouseX","mouseY","ref","inView","queryClient","target","Window","data","source","isPending","enabled","handleOnMouseEnter","handleOnMouseLeave","openMenu","event","MouseEvent","clientX","clientY","setTimeout","mutate","openFile","download","onClick","mediaType","current","window","open","fileName","fileExtension","width","height","prefetchQuery","cursor","objectFit","delete","color","AttachFile","Image","MoreVert","SmartDisplay","IconButton","List","ListItemButton","ListItemIcon","ListItemText","Fragment","useRef","useState","useMutation","useQueryClient","ActionsMenu","FC","SxProps","Theme","FileMeta","useFile","downloadFileMutationOptions","fileQueryOptions","openFileMutationOptions","FileViewerListProps","sx","FileViewerList","t0","$","_c","$i","Symbol","for","fileMetas","t1","map","_temp","t2","ListFileViewerItemProps","meta","ListFileViewerItem","React","setImageId","actions","appName","menu","setMenu","mouseX","mouseY","queryClient","target","Window","openMenu","event","MouseEvent","stopPropagation","clientX","clientY","mutate","openFile","download","onClick","mediaType","id","current","window","open","fileName","fileExtension","icon","prefetchQuery","delete","fileMeta","Close","Box","Dialog","Fab","Skeleton","useQuery","React","useEffect","FileMeta","useFile","fileQueryOptions","ImageViewerProps","metaId","ImageViewer","FC","fileMetas","setImageId","appName","meta","find","m","id","data","source","isPending","enabled","globalThis","addEventListener","handleOnKeydown","removeEventListener","event","KeyboardEvent","images","Array","filter","mediaType","imageIndex","findIndex","key","handleOnArrowLeft","handleOnArrowRight","preventDefault","onClose","index","previousFile","length","nextFile","width","xs","sm","height","fileName","maxWidth","maxHeight","position","top","right","useQuery","ComponentType","FC","ReactNode","useState","FileContext","FileActions","FileMeta","fileMetasQueryOptions","FileViewerGridProps","FileViewerGrid","FileViewerListProps","FileViewerList","ImageViewer","FileViewerComponent","Grid","List","FileViewerProps","appName","subId","onDelete","params","remainingFileMetas","Array","deletedFileMeta","actions","children","component","FileViewer","t0","$","_c","$i","Symbol","for","t1","t2","t3","enabled","data","t4","t5","undefined","fileMetas","imageId","setImageId","length","t6","t7","t8","t9","Edit","TypographyWithIcon","GridColumnHeaderParams","GridValidRowModel","EditableColumnHeader","t0","$","_c","$i","Symbol","for","colDef","t1","t2","headerName","Button","createLink","React","ButtonProps","LinkComponent","Component","forwardRef","HTMLAnchorElement","ButtonComponent","props","reference","$","_c","$i","Symbol","for","t0","CreatedComponent","RouterButton","Fab","createLink","React","FabProps","LinkComponent","Component","forwardRef","HTMLAnchorElement","FabComponent","props","reference","$","_c","$i","Symbol","for","t0","CreatedComponent","RouterFab","GridActionsCellItem","createLink","React","GridActionsCellItemProps","LinkComponent","Component","forwardRef","HTMLButtonElement","GridActionsCellItemComponent","props","reference","$","_c","$i","Symbol","for","t0","ForwardRefExoticComponent","RefAttributes","CreatedComponent","RouterGridActionsCellItem","Link","createLink","React","LinkProps","LinkComponent","Component","forwardRef","HTMLAnchorElement","props","reference","$","_c","$i","Symbol","for","t0","CreatedComponent","RouterLink","Tab","createLink","React","TabProps","LinkComponent","Component","forwardRef","HTMLAnchorElement","TabComponent","props","reference","$","_c","$i","Symbol","for","t0","CreatedComponent","RouterTab","Box","Divider","Typography","useTranslation","RouterNotFound","$","_c","$i","Symbol","for","t","t0","height","display","flexDirection","alignItems","justifyContent","textAlign","px","t1","mb","t2","fontWeight","lineHeight","t3","mx","t4","t5","Box","Divider","Typography","FC","ErrorComponentProps","RouterErrorProps","error","RouterError","t0","$","_c","$i","Symbol","for","t1","height","display","flexDirection","alignItems","justifyContent","textAlign","px","t2","mb","t3","fontWeight","lineHeight","t4","name","t5","t6","mx","t7","message","t8"],"sources":["../src/components/core/TypographyWithIcon.tsx","../src/components/core/Fullscreen.tsx","../src/components/file/Dropzone.tsx","../src/contexts/FileContext.ts","../src/components/file/fileViewer/common/ActionsMenu.tsx","../src/components/file/fileViewer/FileViewerGrid.tsx","../src/components/file/fileViewer/FileViewerList.tsx","../src/components/file/fileViewer/ImageViewer.tsx","../src/components/file/FileViewer.tsx","../src/components/data-grid/EditableColumnHeader.tsx","../src/components/router/RouterButton.tsx","../src/components/router/RouterFab.tsx","../src/components/router/RouterGridActionsCellItem.tsx","../src/components/router/RouterLink.tsx","../src/components/router/RouterTab.tsx","../src/components/router/RouterNotFound.tsx","../src/components/router/RouterError.tsx"],"sourcesContent":["import { Typography } from \"@mui/material\";\nimport type { TypographyProps } from \"@mui/material\";\n\ninterface TypographyWithIconProps extends TypographyProps {\n startIcon?: React.ReactNode;\n endIcon?: React.ReactNode;\n gap?: number | string;\n}\n\nexport const TypographyWithIcon: React.FC<TypographyWithIconProps> = ({\n startIcon,\n endIcon,\n children,\n gap = 1,\n sx,\n ...props\n}) => (\n <Typography\n component=\"span\"\n sx={[\n {\n display: \"inline-flex\",\n alignItems: \"center\",\n verticalAlign: \"middle\",\n gap,\n \"& > svg\": { display: \"block\", flexShrink: 0 },\n },\n ...(Array.isArray(sx) ? sx : [sx]),\n ]}\n {...props}\n >\n {startIcon}\n {children}\n {endIcon}\n </Typography>\n);\n","import { Box } from \"@mui/material\";\nimport { useEffectEvent, useLayoutEffect, useRef, useState } from \"react\";\nimport type { BoxProps } from \"@mui/material\";\nimport type { FC } from \"react\";\n\nexport const Fullscreen: FC<BoxProps> = ({ children, sx, ...props }) => {\n const reference = useRef<HTMLDivElement | null>(null);\n const [height, setHeight] = useState<number>();\n\n const recompute = useEffectEvent(() => {\n if (!reference.current) return;\n const top = reference.current.getBoundingClientRect().top;\n const viewportHeight = window.visualViewport?.height ?? window.innerHeight;\n const avail = Math.max(0, Math.floor(viewportHeight - top));\n setHeight(avail);\n });\n\n useLayoutEffect(() => {\n const element = reference.current;\n if (!element) return;\n\n recompute();\n\n window.addEventListener(\"resize\", recompute);\n\n const ro = new ResizeObserver(recompute);\n ro.observe(document.documentElement);\n ro.observe(document.body);\n ro.observe(element);\n\n return () => {\n window.removeEventListener(\"resize\", recompute);\n ro.disconnect();\n };\n }, []);\n\n return (\n <Box\n ref={reference}\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n boxSizing: \"border-box\",\n minHeight: 0,\n width: \"100%\",\n overflow: \"auto\",\n height,\n ...sx,\n }}\n {...props}\n >\n {children}\n </Box>\n );\n};\n","import CloudUpload from \"@mui/icons-material/CloudUpload\";\r\nimport type { SxProps, Theme } from \"@mui/material\";\r\nimport { Box, CircularProgress, Typography, useTheme } from \"@mui/material\";\r\nimport type { CSSProperties, FC } from \"react\";\r\nimport type { DropzoneOptions } from \"react-dropzone\";\r\nimport { useDropzone } from \"react-dropzone\";\r\nimport { useTranslation } from \"react-i18next\";\r\n\r\nconst baseStyle: CSSProperties = {\r\n flex: 1,\r\n display: \"flex\",\r\n flexDirection: \"column\",\r\n alignItems: \"center\",\r\n padding: \"20px\",\r\n borderWidth: 2,\r\n borderRadius: 2,\r\n borderStyle: \"dashed\",\r\n outline: \"none\",\r\n transition: \"border .24s ease-in-out\",\r\n cursor: \"pointer\",\r\n};\r\n\r\ninterface DropzoneProps extends DropzoneOptions {\r\n sx?: SxProps<Theme>;\r\n progress?: number;\r\n}\r\n\r\nexport const Dropzone: FC<DropzoneProps> = ({ sx, progress, ...props }) => {\r\n const { getRootProps, getInputProps, isFocused, isDragAccept, isDragReject } = useDropzone(props);\r\n const { t } = useTranslation();\r\n const theme = useTheme();\r\n\r\n const style = {\r\n ...baseStyle,\r\n cursor: progress ? \"progress\" : props.disabled ? \"not-allowed\" : \"pointer\",\r\n borderColor: (theme.vars || theme).palette.text.disabled,\r\n ...(isFocused ? { borderColor: (theme.vars || theme).palette.primary.main } : {}),\r\n ...(isDragAccept ? { borderColor: (theme.vars || theme).palette.success.main } : {}),\r\n ...(isDragReject ? { borderColor: (theme.vars || theme).palette.error.main } : {}),\r\n };\r\n\r\n return (\r\n <Box {...getRootProps({ style })} sx={sx}>\r\n <input {...getInputProps()} style={{ display: \"none\" }} />\r\n {progress ? (\r\n <CircularProgress size={24} variant=\"determinate\" value={progress} />\r\n ) : (\r\n <CloudUpload />\r\n )}\r\n <Typography>{t(\"Layout.File.DragSomeFilesHereOrClickToSelectThem\")}</Typography>\r\n </Box>\r\n );\r\n};\r\n","import { createContext, useContext } from \"react\";\nimport type { FileMeta } from \"../models/file/FileMeta\";\nimport type { FileActions } from \"~/models/file/FileActions\";\n\nexport interface FileContextValue {\n appName: string;\n fileMetas: Array<FileMeta>;\n onDelete?: (params: { remainingFileMetas: Array<FileMeta>; deletedFileMeta: FileMeta }) => void;\n actions?: FileActions;\n setImageId: (imageId: string) => void;\n}\n\nexport const FileContext = createContext<FileContextValue | null>(null);\n\nexport const useFile = () => {\n const context = useContext(FileContext);\n if (!context) {\n throw new Error(\"FileViewer components must be used within FileViewer\");\n }\n return context;\n};\n","import Delete from \"@mui/icons-material/Delete\";\nimport FileDownload from \"@mui/icons-material/FileDownload\";\nimport { List, ListItemButton, ListItemIcon, ListItemText, Menu } from \"@mui/material\";\nimport { useMutation } from \"@tanstack/react-query\";\nimport { useTranslation } from \"react-i18next\";\nimport type { FC } from \"react\";\nimport type { FileMeta } from \"~/models/file/FileMeta\";\nimport { useFile } from \"~/contexts/FileContext\";\nimport { useDialogs } from \"~/hooks/useDialogs\";\nimport { deleteFileMutationOptions, downloadFileMutationOptions } from \"~/data/client/file\";\nimport { rootRouteId, useMatch } from \"@tanstack/react-router\";\n\ninterface ActionsMenuProps {\n meta: FileMeta;\n menu: { mouseX: number; mouseY: number } | null;\n setMenu: (menu: { mouseX: number; mouseY: number } | null) => void;\n}\n\nexport const ActionsMenu: FC<ActionsMenuProps> = ({ meta, menu, setMenu }) => {\n const { t } = useTranslation();\n const { fileMetas, onDelete, actions, appName } = useFile();\n const { confirm } = useDialogs();\n\n const handleMenuClose = () => {\n setMenu(null);\n };\n\n const rootMatch = useMatch({ from: rootRouteId });\n const queryClient = rootMatch.context.queryClient;\n\n const { mutate: download, isPending: isDownloading } = useMutation(downloadFileMutationOptions());\n const { mutate: deleteFile, isPending: isDeleting } = useMutation(\n deleteFileMutationOptions({ queryClient }),\n );\n\n const handleOnDownload = () => {\n handleMenuClose();\n download({ id: meta.id, appName, fileName: meta.fileName, fileExtension: meta.fileExtension });\n };\n\n const handleOnDelete = async () => {\n if (!(await confirm(t(\"Layout.File.AreYouSureYouWantToDelete\", { name: meta.fileName }))))\n return;\n\n deleteFile({ id: meta.id, appName });\n handleMenuClose();\n\n if (onDelete) {\n const remainingFileMetas: Array<FileMeta> = fileMetas.filter((m) => m.id !== meta.id);\n onDelete({ remainingFileMetas, deletedFileMeta: meta });\n }\n };\n\n return (\n <Menu\n open={menu !== null}\n onClose={handleMenuClose}\n anchorReference=\"anchorPosition\"\n variant=\"menu\"\n anchorPosition={menu === null ? undefined : { top: menu.mouseY, left: menu.mouseX }}\n >\n <List disablePadding>\n {actions?.download !== false && (\n <ListItemButton onClick={handleOnDownload} disabled={isDownloading}>\n <ListItemIcon>\n <FileDownload />\n </ListItemIcon>\n <ListItemText>{t(\"Layout.File.Download\")}</ListItemText>\n </ListItemButton>\n )}\n {actions?.delete !== false && (\n <ListItemButton onClick={handleOnDelete} disabled={isDeleting}>\n <ListItemIcon>\n <Delete />\n </ListItemIcon>\n <ListItemText>{t(\"Layout.File.Delete\")}</ListItemText>\n </ListItemButton>\n )}\n </List>\n </Menu>\n );\n};\n","import MoreVert from \"@mui/icons-material/MoreVert\";\r\nimport {\r\n Box,\r\n IconButton,\r\n ImageListItem,\r\n ImageListItemBar,\r\n Skeleton,\r\n Stack,\r\n Tooltip,\r\n} from \"@mui/material\";\r\nimport { grey } from \"@mui/material/colors\";\r\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\r\nimport React, { Fragment, useEffect, useRef, useState } from \"react\";\r\nimport { useInView } from \"react-intersection-observer\";\r\nimport { ActionsMenu } from \"./common/ActionsMenu\";\r\nimport type { FileMeta } from \"~/models/file/FileMeta\";\r\nimport type { SxProps, Theme } from \"@mui/material\";\r\nimport { useFile } from \"~/contexts/FileContext\";\r\nimport {\r\n downloadFileMutationOptions,\r\n fileQueryOptions,\r\n fileThumbnailQueryOptions,\r\n openFileMutationOptions,\r\n} from \"~/data/client/file\";\r\n\r\nconst IMAGE_SIZE = 150;\r\n\r\ntype FileViewerGridItemBar = \"hidden\" | \"always\" | \"onMouseEnter\";\r\n\r\nexport interface FileViewerGridProps {\r\n size?: number;\r\n itemBar?: FileViewerGridItemBar;\r\n sx?: SxProps<Theme>;\r\n}\r\n\r\nexport const FileViewerGrid: React.FC<FileViewerGridProps> = ({\r\n sx,\r\n size,\r\n itemBar,\r\n}) => {\r\n const { fileMetas } = useFile();\r\n\r\n return (\r\n <Stack direction=\"row\" spacing={1} sx={{ overflow: \"auto\", ...sx }}>\r\n {fileMetas.map((fileMeta) => (\r\n <GridFileViewerItem\r\n key={fileMeta.id}\r\n meta={fileMeta}\r\n size={size}\r\n itemBar={itemBar}\r\n />\r\n ))}\r\n </Stack>\r\n );\r\n};\r\n\r\ninterface GridFileViewerItemProps {\r\n meta: FileMeta;\r\n size?: number;\r\n itemBar?: FileViewerGridItemBar;\r\n}\r\n\r\nexport const GridFileViewerItem: React.FC<GridFileViewerItemProps> = ({\r\n meta,\r\n size,\r\n itemBar,\r\n}) => {\r\n const { setImageId, actions, appName } = useFile();\r\n const [showItemBar, setShowItemBar] = useState<boolean>(itemBar === \"always\");\r\n const [menu, setMenu] = useState<{ mouseX: number; mouseY: number } | null>(\r\n null,\r\n );\r\n const { ref, inView } = useInView();\r\n const queryClient = useQueryClient();\r\n const target = useRef<Window | null>(null);\r\n\r\n useEffect(() => {\r\n setShowItemBar(itemBar === \"always\");\r\n }, [itemBar]);\r\n\r\n const { data: source, isPending } = useQuery({\r\n ...fileThumbnailQueryOptions({ id: meta.id, appName }),\r\n enabled: inView,\r\n });\r\n\r\n const handleOnMouseEnter = () => setShowItemBar(true);\r\n const handleOnMouseLeave = () =>\r\n itemBar !== \"always\" && setShowItemBar(false);\r\n\r\n const openMenu = (event: React.MouseEvent) => {\r\n setMenu(\r\n menu === null ? { mouseX: event.clientX, mouseY: event.clientY } : null,\r\n );\r\n setTimeout(() => setShowItemBar(true));\r\n };\r\n\r\n const { mutate: openFile } = useMutation(openFileMutationOptions({ target }));\r\n const { mutate: download } = useMutation(downloadFileMutationOptions());\r\n\r\n const onClick = () => {\r\n switch (meta.mediaType) {\r\n case \"image\": {\r\n return setImageId(meta.id);\r\n }\r\n case \"application\":\r\n case \"video\": {\r\n target.current = window.open(\"about:blank\", \"_blank\");\r\n return openFile({ id: meta.id, appName });\r\n }\r\n default: {\r\n return download({\r\n id: meta.id,\r\n appName,\r\n fileName: meta.fileName,\r\n fileExtension: meta.fileExtension,\r\n });\r\n }\r\n }\r\n };\r\n\r\n return (\r\n <Fragment>\r\n <ImageListItem\r\n sx={{ width: size ?? IMAGE_SIZE, height: size ?? IMAGE_SIZE }}\r\n onMouseEnter={handleOnMouseEnter}\r\n onMouseLeave={handleOnMouseLeave}\r\n ref={ref}\r\n >\r\n {isPending ? (\r\n <Skeleton\r\n variant=\"rectangular\"\r\n width={size ?? IMAGE_SIZE}\r\n height={size ?? IMAGE_SIZE}\r\n />\r\n ) : (\r\n <Box\r\n component=\"img\"\r\n src={source}\r\n loading=\"lazy\"\r\n alt={\"thumbnail-\" + meta.id}\r\n onClick={onClick}\r\n onMouseEnter={() =>\r\n queryClient.prefetchQuery(\r\n fileQueryOptions({ id: meta.id, appName }),\r\n )\r\n }\r\n sx={{\r\n cursor: \"pointer\",\r\n objectFit: \"contain\",\r\n width: size ?? IMAGE_SIZE,\r\n height: size ?? IMAGE_SIZE,\r\n }}\r\n />\r\n )}\r\n {itemBar !== \"hidden\" && showItemBar && (\r\n <ImageListItemBar\r\n title={\r\n <Tooltip title={meta.fileName}>\r\n <Box>{meta.fileName}</Box>\r\n </Tooltip>\r\n }\r\n actionIcon={\r\n (actions?.download !== false || actions.delete !== false) && (\r\n <IconButton\r\n sx={{ color: grey[100] }}\r\n onClick={openMenu}\r\n aria-label=\"File actions\"\r\n >\r\n <MoreVert />\r\n </IconButton>\r\n )\r\n }\r\n />\r\n )}\r\n </ImageListItem>\r\n\r\n {(actions?.download !== false || actions.delete !== false) && (\r\n <ActionsMenu meta={meta} menu={menu} setMenu={setMenu} />\r\n )}\r\n </Fragment>\r\n );\r\n};\r\n","import AttachFile from \"@mui/icons-material/AttachFile\";\r\nimport Image from \"@mui/icons-material/Image\";\r\nimport MoreVert from \"@mui/icons-material/MoreVert\";\r\nimport SmartDisplay from \"@mui/icons-material/SmartDisplay\";\r\nimport { IconButton, List, ListItemButton, ListItemIcon, ListItemText } from \"@mui/material\";\r\nimport { Fragment, useRef, useState } from \"react\";\r\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\r\nimport { ActionsMenu } from \"./common/ActionsMenu\";\r\nimport type { FC } from \"react\";\r\nimport type { SxProps, Theme } from \"@mui/material\";\r\nimport type { FileMeta } from \"~/models/file/FileMeta\";\r\nimport { useFile } from \"~/contexts/FileContext\";\r\nimport {\r\n downloadFileMutationOptions,\r\n fileQueryOptions,\r\n openFileMutationOptions,\r\n} from \"~/data/client/file\";\r\n\r\nexport interface FileViewerListProps {\r\n sx?: SxProps<Theme>;\r\n}\r\n\r\nexport const FileViewerList: FC<FileViewerListProps> = ({ sx }) => {\r\n const { fileMetas } = useFile();\r\n\r\n return (\r\n <List dense sx={sx}>\r\n {fileMetas.map((fileMeta) => (\r\n <ListFileViewerItem key={fileMeta.id} meta={fileMeta} />\r\n ))}\r\n </List>\r\n );\r\n};\r\n\r\ninterface ListFileViewerItemProps {\r\n meta: FileMeta;\r\n}\r\n\r\nexport const ListFileViewerItem: React.FC<ListFileViewerItemProps> = ({ meta }) => {\r\n const { setImageId, actions, appName } = useFile();\r\n const [menu, setMenu] = useState<{ mouseX: number; mouseY: number } | null>(null);\r\n const queryClient = useQueryClient();\r\n const target = useRef<Window | null>(null);\r\n\r\n const openMenu = (event: React.MouseEvent) => {\r\n event.stopPropagation();\r\n setMenu(menu === null ? { mouseX: event.clientX, mouseY: event.clientY } : null);\r\n };\r\n\r\n const { mutate: openFile } = useMutation(openFileMutationOptions({ target }));\r\n const { mutate: download } = useMutation(downloadFileMutationOptions());\r\n\r\n const onClick = () => {\r\n switch (meta.mediaType) {\r\n case \"image\": {\r\n return setImageId(meta.id);\r\n }\r\n case \"application\":\r\n case \"video\": {\r\n target.current = window.open(\"about:blank\", \"_blank\");\r\n return openFile({ id: meta.id, appName });\r\n }\r\n default: {\r\n return download({\r\n id: meta.id,\r\n appName,\r\n fileName: meta.fileName,\r\n fileExtension: meta.fileExtension,\r\n });\r\n }\r\n }\r\n };\r\n\r\n const icon = () => {\r\n switch (meta.mediaType) {\r\n case \"image\": {\r\n return <Image />;\r\n }\r\n case \"video\": {\r\n return <SmartDisplay />;\r\n }\r\n default: {\r\n return <AttachFile />;\r\n }\r\n }\r\n };\r\n\r\n return (\r\n <Fragment>\r\n <ListItemButton\r\n key={meta.id}\r\n onClick={onClick}\r\n onMouseEnter={() => queryClient.prefetchQuery(fileQueryOptions({ id: meta.id, appName }))}\r\n >\r\n <ListItemIcon>{icon()}</ListItemIcon>\r\n <ListItemText primary={`${meta.fileName}.${meta.fileExtension}`} />\r\n {(actions?.download !== false || actions.delete !== false) && (\r\n <IconButton edge=\"end\" onClick={openMenu} aria-label=\"File actions\">\r\n <MoreVert />\r\n </IconButton>\r\n )}\r\n </ListItemButton>\r\n\r\n {(actions?.download !== false || actions.delete !== false) && (\r\n <ActionsMenu meta={meta} menu={menu} setMenu={setMenu} />\r\n )}\r\n </Fragment>\r\n );\r\n};\r\n","import Close from \"@mui/icons-material/Close\";\nimport { Box, Dialog, Fab, Skeleton } from \"@mui/material\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport React, { useEffect } from \"react\";\nimport type { FileMeta } from \"~/models/file/FileMeta\";\nimport { useFile } from \"~/contexts/FileContext\";\nimport { fileQueryOptions } from \"~/data/client/file\";\n\ninterface ImageViewerProps {\n metaId: string;\n}\n\nexport const ImageViewer: React.FC<ImageViewerProps> = ({ metaId }) => {\n const { fileMetas, setImageId, appName } = useFile();\n\n const meta = fileMetas.find((m) => m.id === metaId);\n\n const { data: source, isPending } = useQuery({\n ...fileQueryOptions({ id: meta?.id ?? \"\", appName }),\n enabled: !!meta,\n });\n\n useEffect(() => {\n if (metaId) globalThis.addEventListener(\"keydown\", handleOnKeydown);\n\n return () => {\n globalThis.removeEventListener(\"keydown\", handleOnKeydown);\n };\n }, [metaId]);\n\n const handleOnKeydown = (event: KeyboardEvent) => {\n const images: Array<FileMeta> = fileMetas.filter((m) => m.mediaType === \"image\");\n const imageIndex: number = images.findIndex((m) => m.id === metaId);\n\n switch (event.key) {\n case \"ArrowLeft\": {\n return handleOnArrowLeft(images, imageIndex);\n }\n case \"ArrowRight\": {\n return handleOnArrowRight(images, imageIndex);\n }\n case \"Backspace\":\n case \"Escape\": {\n event.preventDefault();\n return onClose();\n }\n }\n };\n\n const handleOnArrowLeft = (images: Array<FileMeta>, index: number) => {\n if (index > 0) {\n const previousFile: FileMeta = images[index - 1];\n setImageId(previousFile.id);\n }\n };\n\n const handleOnArrowRight = (images: Array<FileMeta>, index: number) => {\n if (index < images.length - 1) {\n const nextFile: FileMeta = images[index + 1];\n setImageId(nextFile.id);\n }\n };\n\n const onClose = () => setImageId(\"\");\n\n if (!meta) return null;\n\n return (\n <Dialog open onClose={onClose} maxWidth=\"xl\">\n {isPending ? (\n <Skeleton\n variant=\"rectangular\"\n sx={{\n width: { xs: \"100vw\", sm: 600 },\n height: { xs: \"calc(100vh - 56px)\", sm: \"calc(100vh - 64px)\" },\n }}\n />\n ) : (\n <Box\n component=\"img\"\n src={source}\n alt={meta.fileName}\n sx={{\n maxWidth: \"100vw\",\n maxHeight: { xs: \"calc(100vh - 56px)\", sm: \"calc(100vh - 64px)\" },\n }}\n />\n )}\n\n <Fab\n size=\"medium\"\n onClick={onClose}\n aria-label=\"Close\"\n sx={{ position: \"fixed\", top: 8, right: 8 }}\n >\n <Close />\n </Fab>\n </Dialog>\n );\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport type { ComponentType, FC, ReactNode } from \"react\";\nimport { useState } from \"react\";\nimport { FileContext } from \"~/contexts/FileContext\";\nimport type { FileActions } from \"~/models/file/FileActions\";\nimport type { FileMeta } from \"~/models/file/FileMeta\";\nimport { fileMetasQueryOptions } from \"~/data/client/file\";\nimport type { FileViewerGridProps } from \"./fileViewer/FileViewerGrid\";\nimport { FileViewerGrid } from \"./fileViewer/FileViewerGrid\";\nimport type { FileViewerListProps } from \"./fileViewer/FileViewerList\";\nimport { FileViewerList } from \"./fileViewer/FileViewerList\";\nimport { ImageViewer } from \"./fileViewer/ImageViewer\";\n\ninterface FileViewerComponent {\n Grid: ComponentType<FileViewerGridProps>;\n List: ComponentType<FileViewerListProps>;\n}\n\ninterface FileViewerProps {\n appName: string;\n subId: string;\n onDelete?: (params: { remainingFileMetas: Array<FileMeta>; deletedFileMeta: FileMeta }) => void;\n actions?: FileActions;\n children: (component: FileViewerComponent) => ReactNode;\n}\n\nexport const FileViewer: FC<FileViewerProps> = ({\n appName,\n subId,\n onDelete,\n actions,\n children,\n}) => {\n const { data: fileMetas = [] } = useQuery({\n ...fileMetasQueryOptions({ appName, subId }),\n enabled: !!subId,\n });\n const [imageId, setImageId] = useState<string>(\"\");\n\n if (fileMetas.length === 0) return null;\n\n return (\n <FileContext.Provider value={{ appName, fileMetas, onDelete, actions, setImageId }}>\n {children({ Grid: FileViewerGrid, List: FileViewerList })}\n <ImageViewer metaId={imageId} />\n </FileContext.Provider>\n );\n};\n","import Edit from \"@mui/icons-material/Edit\";\nimport { TypographyWithIcon } from \"../core/TypographyWithIcon\";\nimport type { GridColumnHeaderParams, GridValidRowModel } from \"@mui/x-data-grid-premium\";\n\nexport const EditableColumnHeader = <T extends GridValidRowModel>({\n colDef,\n}: GridColumnHeaderParams<T>) => {\n return (\n <TypographyWithIcon\n endIcon={<Edit color=\"disabled\" fontSize=\"small\" />}\n variant=\"body2\"\n className=\"MuiDataGrid-columnHeaderTitle\"\n >\n {colDef.headerName}\n </TypographyWithIcon>\n );\n};\n","import { Button } from \"@mui/material\";\nimport { createLink } from \"@tanstack/react-router\";\nimport React from \"react\";\nimport type { ButtonProps } from \"@mui/material\";\nimport type { LinkComponent } from \"@tanstack/react-router\";\n\nconst Component = React.forwardRef<HTMLAnchorElement, ButtonProps<\"a\">>(\n function ButtonComponent(props, reference) {\n return <Button ref={reference} component=\"a\" {...props} />;\n },\n);\n\nconst CreatedComponent = createLink(Component);\n\nexport const RouterButton: LinkComponent<typeof Component> = (props) => {\n return <CreatedComponent {...props} />;\n};\n","import { Fab } from \"@mui/material\";\nimport { createLink } from \"@tanstack/react-router\";\nimport React from \"react\";\nimport type { FabProps } from \"@mui/material\";\nimport type { LinkComponent } from \"@tanstack/react-router\";\n\nconst Component = React.forwardRef<HTMLAnchorElement, FabProps<\"a\">>(\n function FabComponent(props, reference) {\n return <Fab ref={reference} component=\"a\" {...props} />;\n },\n);\n\nconst CreatedComponent = createLink(Component);\n\nexport const RouterFab: LinkComponent<typeof Component> = (props) => {\n return <CreatedComponent {...props} />;\n};\n","import { GridActionsCellItem } from \"@mui/x-data-grid-premium\";\nimport { createLink } from \"@tanstack/react-router\";\nimport React from \"react\";\nimport type { GridActionsCellItemProps } from \"@mui/x-data-grid-premium\";\nimport type { LinkComponent } from \"@tanstack/react-router\";\n\nconst Component = React.forwardRef<HTMLButtonElement, GridActionsCellItemProps>(\n function GridActionsCellItemComponent(props, reference) {\n return <GridActionsCellItem ref={reference} component=\"a\" {...props} />;\n },\n) as React.ForwardRefExoticComponent<\n GridActionsCellItemProps & React.RefAttributes<HTMLButtonElement>\n>;\n\nconst CreatedComponent = createLink(Component);\n\nexport const RouterGridActionsCellItem: LinkComponent<typeof Component> = (props) => {\n return <CreatedComponent {...props} />;\n};\n","import { Link } from \"@mui/material\";\nimport { createLink } from \"@tanstack/react-router\";\nimport React from \"react\";\nimport type { LinkProps } from \"@mui/material\";\nimport type { LinkComponent } from \"@tanstack/react-router\";\n\nconst Component = React.forwardRef<HTMLAnchorElement, LinkProps>(\n function LinkComponent(props, reference) {\n return <Link ref={reference} {...props} />;\n },\n);\n\nconst CreatedComponent = createLink(Component);\n\nexport const RouterLink: LinkComponent<typeof Component> = (props) => {\n return <CreatedComponent {...props} />;\n};\n","import { Tab } from \"@mui/material\";\nimport { createLink } from \"@tanstack/react-router\";\nimport React from \"react\";\nimport type { TabProps } from \"@mui/material\";\nimport type { LinkComponent } from \"@tanstack/react-router\";\n\nconst Component = React.forwardRef<HTMLAnchorElement, TabProps<\"a\">>(\n function TabComponent(props, reference) {\n return <Tab ref={reference} component=\"a\" {...props} />;\n },\n);\n\nconst CreatedComponent = createLink(Component);\n\nexport const RouterTab: LinkComponent<typeof Component> = (props) => {\n return <CreatedComponent {...props} />;\n};\n","import { Box, Divider, Typography } from \"@mui/material\";\nimport { useTranslation } from \"react-i18next\";\n\nexport function RouterNotFound() {\n const { t } = useTranslation();\n\n return (\n <Box\n sx={{\n height: \"100vh\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n textAlign: \"center\",\n px: 2,\n }}\n >\n <Box sx={{ display: \"flex\", alignItems: \"center\", mb: 4 }}>\n <Typography variant=\"h3\" component=\"span\" sx={{ fontWeight: 500, lineHeight: 1 }}>\n 404\n </Typography>\n <Divider orientation=\"vertical\" flexItem sx={{ mx: 3 }} />\n <Typography variant=\"h5\" component=\"span\">\n {t(\"Layout.ThisPageCouldNotBeFound\")}\n </Typography>\n </Box>\n </Box>\n );\n}\n","import { Box, Divider, Typography } from \"@mui/material\";\nimport type { FC } from \"react\";\nimport type { ErrorComponentProps } from \"@tanstack/react-router\";\n\ninterface RouterErrorProps {\n error: ErrorComponentProps[\"error\"];\n}\n\nexport const RouterError: FC<RouterErrorProps> = ({ error }) => {\n return (\n <Box\n sx={{\n height: \"100vh\",\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"center\",\n justifyContent: \"center\",\n textAlign: \"center\",\n px: 2,\n }}\n >\n <Box sx={{ display: \"flex\", alignItems: \"center\", mb: 4 }}>\n <Typography variant=\"h3\" component=\"span\" sx={{ fontWeight: 500, lineHeight: 1 }}>\n {error.name || \"500\"}\n </Typography>\n <Divider orientation=\"vertical\" flexItem sx={{ mx: 3 }} />\n <Typography variant=\"h5\" component=\"span\">\n {error.message}\n </Typography>\n </Box>\n </Box>\n );\n};\n"],"mappings":"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