import styled from "@emotion/styled"; import { Menu, MenuItem, Modal } from "@mui/material"; import { FileDown, FileUp, Plus, Table2, Trash2 } from "lucide-react"; import { useRef, useState } from "react"; import DeleteWorkbookDialog from "./DeleteWorkbookDialog"; import UploadFileDialog from "./UploadFileDialog"; // import TemplatesDialog from "./WelcomeDialog/TemplatesDialog"; import { getModelsMetadata, getSelectedUuid } from "./storage"; export function FileMenu(props: { newModel: () => void; newModelFromTemplate: () => void; setModel: (key: string) => void; onDownload: () => void; onModelUpload: (blob: ArrayBuffer, fileName: string) => Promise; onDelete: () => void; }) { const [isMenuOpen, setMenuOpen] = useState(false); const [isImportMenuOpen, setImportMenuOpen] = useState(false); const anchorElement = useRef(null); const models = getModelsMetadata(); const selectedUuid = getSelectedUuid(); const [isDeleteDialogOpen, setDeleteDialogOpen] = useState(false); return ( <> setMenuOpen(true)} ref={anchorElement} $isActive={isMenuOpen} aria-haspopup="true" > File setMenuOpen(false)} anchorEl={anchorElement.current} autoFocus={false} disableRestoreFocus={true} sx={{ "& .MuiPaper-root": { borderRadius: "8px", padding: "4px 0px" }, "& .MuiList-root": { padding: "0" }, transform: "translate(-4px, 4px)", }} slotProps={{ list: { "aria-labelledby": "file-menu-button", tabIndex: -1, }, }} > { props.newModel(); setMenuOpen(false); }} > New blank workbook { props.newModelFromTemplate(); setMenuOpen(false); }} > New from template { setImportMenuOpen(true); setMenuOpen(false); }} > Import Download (.xlsx) { setDeleteDialogOpen(true); setMenuOpen(false); }} > Delete workbook { setImportMenuOpen(false); }} aria-labelledby="modal-modal-title" aria-describedby="modal-modal-description" > { setImportMenuOpen(false); }} onModelUpload={props.onModelUpload} /> setDeleteDialogOpen(false)} aria-labelledby="delete-dialog-title" aria-describedby="delete-dialog-description" > setDeleteDialogOpen(false)} onConfirm={props.onDelete} workbookName={selectedUuid ? models[selectedUuid].name : ""} /> ); } export const MenuDivider = styled.div` width: 100%; margin: auto; margin-top: 4px; margin-bottom: 4px; border-top: 1px solid #eeeeee; `; export const MenuItemWrapper = styled(MenuItem)` display: flex; justify-content: flex-start; font-size: 14px; width: calc(100% - 8px); min-width: 172px; margin: 0px 4px; border-radius: 4px; padding: 8px; height: 32px; color: #000; font-size: 12px; gap: 8px; svg { width: 16px; height: 100%; color: #757575; } `; const FileMenuWrapper = styled.button<{ $isActive: boolean }>` display: flex; align-items: center; font-size: 12px; font-family: Inter; padding: 8px; border-radius: 4px; cursor: pointer; background-color: ${(props) => (props.$isActive ? "#e6e6e6" : "transparent")}; border: none; &:hover { background-color: #f2f2f2; } `; export const DeleteButton = styled(MenuItemWrapper)` color: #EB5757; svg { color: #EB5757; } &:hover { background-color: #EB57571A; } &:active { background-color: #EB57571A; } `;