diff --git a/webapp/app.ironcalc.com/frontend/src/App.tsx b/webapp/app.ironcalc.com/frontend/src/App.tsx index 7ed931f..03419b3 100644 --- a/webapp/app.ironcalc.com/frontend/src/App.tsx +++ b/webapp/app.ironcalc.com/frontend/src/App.tsx @@ -24,7 +24,6 @@ import { IronCalc, IronCalcIcon, Model, init } from "@ironcalc/workbook"; function App() { const [model, setModel] = useState(null); const [showWelcomeDialog, setShowWelcomeDialog] = useState(false); - const [isTemplateOnlyDialog, setIsTemplateOnlyDialog] = useState(false); useEffect(() => { async function start() { @@ -59,7 +58,6 @@ function App() { const newModel = loadSelectedModelFromStorage(); if (!newModel) { setShowWelcomeDialog(true); - setIsTemplateOnlyDialog(false); // Full dialog for first-time usage const createdModel = new Model("template", "en", "UTC"); setModel(createdModel); } else { @@ -109,7 +107,6 @@ function App() { }} newModelFromTemplate={() => { setShowWelcomeDialog(true); - setIsTemplateOnlyDialog(true); // Template-only dialog for "New from template" }} setModel={(uuid: string) => { const newModel = selectModelFromStorage(uuid); @@ -133,7 +130,6 @@ function App() { setModel(createdModel); } setShowWelcomeDialog(false); - setIsTemplateOnlyDialog(false); }} onSelectTemplate={async (templateId) => { switch (templateId) { @@ -151,10 +147,7 @@ function App() { } } setShowWelcomeDialog(false); - setIsTemplateOnlyDialog(false); }} - showHeader={!isTemplateOnlyDialog} - showNewSection={!isTemplateOnlyDialog} /> )} diff --git a/webapp/app.ironcalc.com/frontend/src/components/FileMenu.tsx b/webapp/app.ironcalc.com/frontend/src/components/FileMenu.tsx index fa674dc..ea8ad24 100644 --- a/webapp/app.ironcalc.com/frontend/src/components/FileMenu.tsx +++ b/webapp/app.ironcalc.com/frontend/src/components/FileMenu.tsx @@ -4,6 +4,7 @@ import { Check, 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: { @@ -21,7 +22,7 @@ export function FileMenu(props: { const uuids = Object.keys(models); const selectedUuid = getSelectedUuid(); const [isDeleteDialogOpen, setDeleteDialogOpen] = useState(false); - + const [isTemplatesDialogOpen, setTemplatesDialogOpen] = useState(false); const elements = []; for (const uuid of uuids) { elements.push( @@ -97,7 +98,7 @@ export function FileMenu(props: { { - props.newModelFromTemplate(); + setTemplatesDialogOpen(true); setMenuOpen(false); }} > @@ -165,6 +166,17 @@ export function FileMenu(props: { workbookName={selectedUuid ? models[selectedUuid] : ""} /> + setTemplatesDialogOpen(false)} + aria-labelledby="templates-dialog-title" + aria-describedby="templates-dialog-description" + > + setTemplatesDialogOpen(false)} + onSelectTemplate={props.newModelFromTemplate} + /> + ); } diff --git a/webapp/app.ironcalc.com/frontend/src/components/WelcomeDialog/TemplatesDialog.tsx b/webapp/app.ironcalc.com/frontend/src/components/WelcomeDialog/TemplatesDialog.tsx new file mode 100644 index 0000000..6e4edd1 --- /dev/null +++ b/webapp/app.ironcalc.com/frontend/src/components/WelcomeDialog/TemplatesDialog.tsx @@ -0,0 +1,145 @@ +import { Dialog, styled } from "@mui/material"; +import { House, TicketsPlane, X } from "lucide-react"; +import { useState } from "react"; +import TemplatesListItem from "./TemplatesListItem"; + +function TemplatesDialog(properties: { + onClose: () => void; + onSelectTemplate: (templateId: string) => void; +}) { + const [selectedTemplate, setSelectedTemplate] = useState(""); + + const handleClose = () => { + properties.onClose(); + }; + + const handleTemplateSelect = (templateId: string) => { + setSelectedTemplate(templateId); + }; + + return ( + {}}> + + Choose a template + event.key === "Enter" && properties.onClose()} + > + + + + + + } + iconColor="#2F80ED" + active={selectedTemplate === "mortgage_calculator"} + onClick={() => handleTemplateSelect("mortgage_calculator")} + /> + } + iconColor="#EB5757" + active={selectedTemplate === "travel_expenses_tracker"} + onClick={() => handleTemplateSelect("travel_expenses_tracker")} + /> + + + + properties.onSelectTemplate(selectedTemplate)} + > + Create workbook + + + + ); +} + +const DialogWrapper = styled(Dialog)` + font-family: Inter; + .MuiDialog-paper { + width: 440px; + border-radius: 12px; + margin: 16px; + border: 1px solid #e0e0e0; + } + .MuiBackdrop-root { + background-color: rgba(0, 0, 0, 0.4); + } +`; + +const DialogHeader = styled("div")` + display: flex; + align-items: center; + border-bottom: 1px solid #e0e0e0; + height: 44px; + font-size: 14px; + font-weight: 500; + font-family: Inter; +`; + +const Cross = styled("div")` + &:hover { + background-color: #f5f5f5; + } + display: flex; + border-radius: 4px; + min-height: 24px; + min-width: 24px; + cursor: pointer; + align-items: center; + justify-content: center; + svg { + width: 16px; + height: 16px; + stroke-width: 1.5; + } +`; + +const DialogContent = styled("div")` + display: flex; + flex-direction: column; + gap: 12px; + padding: 16px; + max-height: 300px; + overflow: hidden; + overflow-y: auto; +`; + +const TemplatesListWrapper = styled("div")` + display: flex; + flex-direction: column; + gap: 10px; +`; + +const DialogFooter = styled("div")` + border-top: 1px solid #e0e0e0; + padding: 16px; +`; + +const DialogFooterButton = styled("button")` + background-color: #F2994A; + border: none; + color: #FFF; + padding: 12px; + border-radius: 4px; + cursor: pointer; + width: 100%; + font-size: 12px; + font-family: Inter; + &:hover { + background-color: #D68742; + } + &:active { + background-color: #D68742; + } +`; + +export default TemplatesDialog; diff --git a/webapp/app.ironcalc.com/frontend/src/components/WelcomeDialog/WelcomeDialog.tsx b/webapp/app.ironcalc.com/frontend/src/components/WelcomeDialog/WelcomeDialog.tsx index 0efd315..88fcfa6 100644 --- a/webapp/app.ironcalc.com/frontend/src/components/WelcomeDialog/WelcomeDialog.tsx +++ b/webapp/app.ironcalc.com/frontend/src/components/WelcomeDialog/WelcomeDialog.tsx @@ -7,12 +7,8 @@ import TemplatesListItem from "./TemplatesListItem"; function WelcomeDialog(properties: { onClose: () => void; onSelectTemplate: (templateId: string) => void; - showHeader: boolean; - showNewSection: boolean; }) { - const [selectedTemplate, setSelectedTemplate] = useState( - properties.showNewSection ? "blank" : "mortgage_calculator", - ); + const [selectedTemplate, setSelectedTemplate] = useState("blank"); const handleClose = () => { properties.onClose(); @@ -24,56 +20,37 @@ function WelcomeDialog(properties: { return ( {}}> - {properties.showHeader !== false ? ( - - - - - - Welcome to IronCalc - - Start with a blank workbook or a ready-made template. - - - event.key === "Enter" && properties.onClose()} - > - - - - ) : ( - - Choose a template - event.key === "Enter" && properties.onClose()} - > - - - - )} + + + + + + Welcome to IronCalc + + Start with a blank workbook or a ready-made template. + + + event.key === "Enter" && properties.onClose()} + > + + + - {properties.showNewSection !== false && ( - <> - New - - } - iconColor="#F2994A" - active={selectedTemplate === "blank"} - onClick={() => handleTemplateSelect("blank")} - /> - - - )} + New + + } + iconColor="#F2994A" + active={selectedTemplate === "blank"} + onClick={() => handleTemplateSelect("blank")} + /> + Templates