import { capitalizeString } from "@granity/helpers"; import { Box, BoxProps, Breadcrumbs, BreadcrumbsProps, Container, Divider, Grid, Link, LinkProps, Typography, TypographyProps, } from "@granity/ui"; import FileManagerFormModal from "@ui/components/moleculs/FileManagerFormModal/FileManagerFormModal"; import FileManagerItem, { FileItem } from "@ui/components/moleculs/FileManagerItem/FileManagerItem"; import pxToRem from "@ui/theme/utilities/pxToRem"; import { ChangeEvent, FC, FormEvent, useState } from "react"; type FilesData = { currentRootPath: string; folders: FileItem[]; files: FileItem[]; }; export type FilesManagerProps = { title?: string; breadcrumbsLinks: string[]; filesData: FilesData | undefined; newFolderName: string; selectedFolderIndex?: number; selectedFileIndex?: number; onChangeNewFolderName: (event: ChangeEvent) => void; onClickFolder: (folderPath: string) => void; onClickBreadcrumbsElement: (folder: string) => void; onUploadFile: (event: ChangeEvent) => void; onAddFolder: () => Promise; setSelectedFolderIndex: (index?: number) => void; setSelectedFileIndex: (index?: number) => void; onDelete: (item: FileItem) => void; onEdit: (item: FileItem, newName: string) => void; onSelectFile?: (file: FileItem) => void; }; export type FilesManagerStyles = { section?: BoxProps; headerSection?: BoxProps; breadcrumbs?: BreadcrumbsProps; breadcrumbsLink?: LinkProps; title?: TypographyProps; subTitle?: TypographyProps; }; const styles: FilesManagerStyles = { section: { sx: { margin: pxToRem(25, 0), }, }, headerSection: { sx: { display: "flex", alignItems: "center", }, }, title: { sx: { fontSize: pxToRem(24), marginRight: pxToRem(32), }, }, breadcrumbsLink: { underline: "hover", color: "inherit", sx: { cursor: "pointer", }, }, subTitle: { sx: { fontSize: pxToRem(15), marginBottom: pxToRem(12), }, }, }; const FilesManager: FC = ({ title, breadcrumbsLinks, filesData, newFolderName, onChangeNewFolderName, onClickFolder, onClickBreadcrumbsElement, onUploadFile, onAddFolder, selectedFolderIndex, setSelectedFolderIndex, selectedFileIndex, setSelectedFileIndex, onDelete, onEdit, onSelectFile, }) => { const [editingItem, setEditingItem] = useState(); const [isCreateFolderModalOpen, setIsCreateForlderModalOpen] = useState(false); const [isEditModalOpen, setIsEditModalOpen] = useState(false); const [newName, setNewName] = useState(""); const isFolderNotSelected = (index: number) => { return selectedFolderIndex === undefined || index !== selectedFolderIndex; }; const isFolderSelected = (index: number) => { return selectedFolderIndex !== undefined && selectedFolderIndex === index; }; const isFileNotSelected = (index: number) => { return selectedFileIndex === undefined || index !== selectedFileIndex; }; const isFileSelected = (index: number) => { return selectedFileIndex !== undefined && selectedFileIndex === index; }; const onClickFolderHandler = (name: string, index: number) => { if (selectedFileIndex !== undefined) { setSelectedFileIndex(undefined); } if (isFolderNotSelected(index)) { setSelectedFolderIndex(index); return; } onClickFolder?.(name); setSelectedFolderIndex(undefined); }; const onClickFileHandler = (file: FileItem, index: number) => { if (selectedFolderIndex !== undefined) { setSelectedFolderIndex(undefined); } if (isFileNotSelected(index)) { setSelectedFileIndex(index); return; } onSelectFile?.(file); setSelectedFileIndex(undefined); }; const onSubmitAddFolderForm = (event: FormEvent) => { event.preventDefault(); onAddFolder(); closeCreateFolderModal(); }; const onDeleteItem = (item: FileItem) => { onDelete(item); }; const onEditItem = (event: FormEvent) => { event.preventDefault(); if (editingItem) { onEdit(editingItem, newName); onCloseEditModal(); } }; const openCreateFolderModal = () => { setIsCreateForlderModalOpen(true); }; const closeCreateFolderModal = () => { setIsCreateForlderModalOpen(false); }; const onOpenEditModal = (item: FileItem) => { setIsEditModalOpen(true); setEditingItem(item); setNewName(item.name); }; const onCloseEditModal = () => { setIsEditModalOpen(false); }; const onChangeEditingName = (event: ChangeEvent) => { setNewName(event.target.value); }; return ( {title && {title}} {breadcrumbsLinks?.map((x, index) => { if (index === breadcrumbsLinks.length - 1) { return ( {capitalizeString(x)} ); } return ( onClickBreadcrumbsElement(x)} {...styles.breadcrumbsLink} > {capitalizeString(x)} ); })} Folders {filesData?.folders?.length && filesData?.folders?.length > 0 ? filesData?.folders.map((x, index) => ( onClickFolderHandler(x.name, index)} options={[ { name: "Edit", onClick: onOpenEditModal, }, { name: "Delete", onClick: onDeleteItem, }, ]} /> )) : null} Files {filesData?.files?.length && filesData?.files?.length > 0 ? filesData?.files?.map((x, index) => ( onClickFileHandler(x, index)} options={[ { name: "Delete", onClick: onDeleteItem, }, { name: "Edit", onClick: onOpenEditModal, }, ]} /> )) : null} {editingItem && ( )} ); }; export default FilesManager;