UNPKG

wcz-layout

Version:

1 lines 65.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","loading","Dropzone","t0","$","_c","$i","Symbol","for","props","getRootProps","getInputProps","isFocused","isDragAccept","isDragReject","t","theme","t1","vars","T0","t2","palette","text","disabled","style","borderColor","primary","main","success","error","t3","t4","t5","t6","t7","t8","t9","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","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","ref","inView","queryClient","t4","enabled","data","source","isPending","t5","handleOnMouseEnter","t6","handleOnMouseLeave","t7","event","mouseX","clientX","mouseY","clientY","setTimeout","openMenu","t8","mutate","openFile","t9","download","t10","fileExtension","fileName","mediaType","onClick","t11","t12","t13","width","height","t14","prefetchQuery","cursor","objectFit","t15","delete","color","t16","t17","t18","AttachFile","Image","MoreVert","SmartDisplay","IconButton","List","ListItemButton","ListItemIcon","ListItemText","Fragment","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","queryClient","event","stopPropagation","mouseX","clientX","mouseY","clientY","openMenu","mutate","openFile","t3","download","t4","fileExtension","fileName","id","mediaType","onClick","t5","icon","t6","prefetchQuery","t7","t8","t9","t10","delete","t11","t12","t13","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 loading?: boolean;\r\n}\r\n\r\nexport const Dropzone: FC<DropzoneProps> = ({ sx, loading, ...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 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 {loading ? <CircularProgress size={24} /> : <CloudUpload />}\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(deleteFileMutationOptions({ queryClient }));\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\";\nimport { Box, IconButton, ImageListItem, ImageListItemBar, Skeleton, Stack, Tooltip } from \"@mui/material\";\nimport { grey } from \"@mui/material/colors\";\nimport { useMutation, useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport React, { Fragment, useEffect, useState } from \"react\";\nimport { useInView } from \"react-intersection-observer\";\nimport { ActionsMenu } from \"./common/ActionsMenu\";\nimport type { FileMeta } from \"~/models/file/FileMeta\";\nimport type { SxProps, Theme } from \"@mui/material\";\nimport { useFile } from \"~/contexts/FileContext\";\nimport {\n downloadFileMutationOptions,\n fileQueryOptions,\n fileThumbnailQueryOptions,\n openFileMutationOptions,\n} from \"~/data/client/file\";\n\nconst IMAGE_SIZE = 150;\n\ntype FileViewerGridItemBar = \"hidden\" | \"always\" | \"onMouseEnter\";\n\nexport interface FileViewerGridProps {\n size?: number;\n itemBar?: FileViewerGridItemBar;\n sx?: SxProps<Theme>;\n}\n\nexport const FileViewerGrid: React.FC<FileViewerGridProps> = ({ sx, size, itemBar }) => {\n const { fileMetas } = useFile();\n\n return (\n <Stack direction=\"row\" spacing={1} sx={{ overflow: \"auto\", ...sx }}>\n {fileMetas.map((fileMeta) => (\n <GridFileViewerItem key={fileMeta.id} meta={fileMeta} size={size} itemBar={itemBar} />\n ))}\n </Stack>\n );\n};\n\ninterface GridFileViewerItemProps {\n meta: FileMeta;\n size?: number;\n itemBar?: FileViewerGridItemBar;\n}\n\nexport const GridFileViewerItem: React.FC<GridFileViewerItemProps> = ({ meta, size, itemBar }) => {\n const { setImageId, actions, appName } = useFile();\n const [showItemBar, setShowItemBar] = useState<boolean>(itemBar === \"always\");\n const [menu, setMenu] = useState<{ mouseX: number; mouseY: number } | null>(null);\n const { ref, inView } = useInView();\n const queryClient = useQueryClient();\n\n useEffect(() => {\n setShowItemBar(itemBar === \"always\");\n }, [itemBar]);\n\n const { data: source, isPending } = useQuery({\n ...fileThumbnailQueryOptions({ id: meta.id, appName }),\n enabled: inView,\n });\n\n const handleOnMouseEnter = () => setShowItemBar(true);\n const handleOnMouseLeave = () => itemBar !== \"always\" && setShowItemBar(false);\n\n const openMenu = (event: React.MouseEvent) => {\n setMenu(menu === null ? { mouseX: event.clientX, mouseY: event.clientY } : null);\n setTimeout(() => setShowItemBar(true));\n };\n\n const { mutate: openFile } = useMutation(openFileMutationOptions());\n const { mutate: download } = useMutation(downloadFileMutationOptions());\n\n const onClick = () => {\n switch (meta.mediaType) {\n case \"image\": {\n return setImageId(meta.id);\n }\n case \"application\": {\n return openFile({ id: meta.id, appName });\n }\n case \"video\": {\n return openFile({ id: meta.id, appName });\n }\n default: {\n return download({\n id: meta.id,\n appName,\n fileName: meta.fileName,\n fileExtension: meta.fileExtension,\n });\n }\n }\n };\n\n return (\n <Fragment>\n <ImageListItem\n sx={{ width: size ?? IMAGE_SIZE, height: size ?? IMAGE_SIZE }}\n onMouseEnter={handleOnMouseEnter}\n onMouseLeave={handleOnMouseLeave}\n ref={ref}\n >\n {isPending ? (\n <Skeleton variant=\"rectangular\" width={size ?? IMAGE_SIZE} height={size ?? IMAGE_SIZE} />\n ) : (\n <Box\n component=\"img\"\n src={source}\n loading=\"lazy\"\n alt={\"thumbnail-\" + meta.id}\n onClick={onClick}\n onMouseEnter={() => queryClient.prefetchQuery(fileQueryOptions({ id: meta.id, appName }))}\n sx={{\n cursor: \"pointer\",\n objectFit: \"contain\",\n width: size ?? IMAGE_SIZE,\n height: size ?? IMAGE_SIZE,\n }}\n />\n )}\n {itemBar !== \"hidden\" && showItemBar && (\n <ImageListItemBar\n title={\n <Tooltip title={meta.fileName}>\n <Box>{meta.fileName}</Box>\n </Tooltip>\n }\n actionIcon={\n (actions?.download !== false || actions.delete !== false) && (\n <IconButton sx={{ color: grey[100] }} onClick={openMenu} aria-label=\"File actions\">\n <MoreVert />\n </IconButton>\n )\n }\n />\n )}\n </ImageListItem>\n\n {(actions?.download !== false || actions.delete !== false) && (\n <ActionsMenu meta={meta} menu={menu} setMenu={setMenu} />\n )}\n </Fragment>\n );\n};\n","import AttachFile from \"@mui/icons-material/AttachFile\";\nimport Image from \"@mui/icons-material/Image\";\nimport MoreVert from \"@mui/icons-material/MoreVert\";\nimport SmartDisplay from \"@mui/icons-material/SmartDisplay\";\nimport { IconButton, List, ListItemButton, ListItemIcon, ListItemText } from \"@mui/material\";\nimport { Fragment, useState } from \"react\";\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { ActionsMenu } from \"./common/ActionsMenu\";\nimport type { FC } from \"react\";\nimport type { SxProps, Theme } from \"@mui/material\";\nimport type { FileMeta } from \"~/models/file/FileMeta\";\nimport { useFile } from \"~/contexts/FileContext\";\nimport {\n downloadFileMutationOptions,\n fileQueryOptions,\n openFileMutationOptions,\n} from \"~/data/client/file\";\n\nexport interface FileViewerListProps {\n sx?: SxProps<Theme>;\n}\n\nexport const FileViewerList: FC<FileViewerListProps> = ({ sx }) => {\n const { fileMetas } = useFile();\n\n return (\n <List dense sx={sx}>\n {fileMetas.map((fileMeta) => (\n <ListFileViewerItem key={fileMeta.id} meta={fileMeta} />\n ))}\n </List>\n );\n};\n\ninterface ListFileViewerItemProps {\n meta: FileMeta;\n}\n\nexport const ListFileViewerItem: React.FC<ListFileViewerItemProps> = ({ meta }) => {\n const { setImageId, actions, appName } = useFile();\n const [menu, setMenu] = useState<{ mouseX: number; mouseY: number } | null>(null);\n const queryClient = useQueryClient();\n\n const openMenu = (event: React.MouseEvent) => {\n event.stopPropagation();\n setMenu(menu === null ? { mouseX: event.clientX, mouseY: event.clientY } : null);\n };\n\n const { mutate: openFile } = useMutation(openFileMutationOptions());\n const { mutate: download } = useMutation(downloadFileMutationOptions());\n\n const onClick = () => {\n switch (meta.mediaType) {\n case \"image\": {\n return setImageId(meta.id);\n }\n case \"application\": {\n return openFile({ id: meta.id, appName });\n }\n case \"video\": {\n return openFile({ id: meta.id, appName });\n }\n default: {\n return download({\n id: meta.id,\n appName,\n fileName: meta.fileName,\n fileExtension: meta.fileExtension,\n });\n }\n }\n };\n\n const icon = () => {\n switch (meta.mediaType) {\n case \"image\": {\n return <Image />;\n }\n case \"video\": {\n return <SmartDisplay />;\n }\n default: {\n return <AttachFile />;\n }\n }\n };\n\n return (\n <Fragment>\n <ListItemButton\n key={meta.id}\n onClick={onClick}\n onMouseEnter={() => queryClient.prefetchQuery(fileQueryOptions({ id: meta.id, appName }))}\n >\n <ListItemIcon>{icon()}</ListItemIcon>\n <ListItemText primary={`${meta.fileName}.${meta.fileExtension}`} />\n {(actions?.download !== false || actions.delete !== false) && (\n <IconButton edge=\"end\" onClick={openMenu} aria-label=\"File actions\">\n <MoreVert />\n </IconButton>\n )}\n </ListItemButton>\n\n {(actions?.download !== false || actions.delete !== false) && (\n <ActionsMenu meta={meta} menu={menu} setMenu={setMenu} />\n )}\n </Fragment>\n );\n};\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 size=\"medium\" onClick={onClose} aria-label=\"Close\" sx={{ position: \"fixed\", top: 8, right: 8 }}>\n <Close />\n </Fab>\n </Dialog>\n );\n};\n","import { useQuery } from \"@tanstack/react-query\";\r\nimport type { ComponentType, FC, ReactNode } from \"react\";\r\nimport { useState } from \"react\";\r\nimport { FileContext } from \"~/contexts/FileContext\";\r\nimport type { FileActions } from \"~/models/file/FileActions\";\r\nimport type { FileMeta } from \"~/models/file/FileMeta\";\r\nimport { fileMetasQueryOptions } from \"~/data/client/file\";\r\nimport type { FileViewerGridProps } from \"./fileViewer/FileViewerGrid\";\r\nimport { FileViewerGrid } from \"./fileViewer/FileViewerGrid\";\r\nimport type { FileViewerListProps } from \"./fileViewer/FileViewerList\";\r\nimport { FileViewerList } from \"./fileViewer/FileViewerList\";\r\nimport { ImageViewer } from \"./fileViewer/ImageViewer\";\r\n\r\ninterface FileViewerComponent {\r\n Grid: ComponentType<FileViewerGridProps>;\r\n List: ComponentType<FileViewerListProps>;\r\n}\r\n\r\ninterface FileViewerProps {\r\n appName: string;\r\n subId: string;\r\n onDelete?: (params: { remainingFileMetas: Array<FileMeta>; deletedFileMeta: FileMeta }) => void;\r\n actions?: FileActions;\r\n children: (component: FileViewerComponent) => ReactNode;\r\n}\r\n\r\nexport const FileViewer: FC<FileViewerProps> = ({\r\n appName,\r\n subId,\r\n onDelete,\r\n actions,\r\n children,\r\n}) => {\r\n const { data: fileMetas = [] } = useQuery({\r\n ...fileMetasQueryOptions({ appName, subId }),\r\n enabled: !!subId,\r\n });\r\n const [imageId, setImageId] = useState<string>(\"\");\r\n\r\n if (fileMetas.length === 0) return null;\r\n\r\n return (\r\n <FileContext.Provider value={{ appName, fileMetas, onDelete, actions, setImageId }}>\r\n {children({ Grid: FileViewerGrid, List: FileViewerList })}\r\n <ImageViewer metaId={imageId} />\r\n </FileContext.Provider>\r\n );\r\n};\r\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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