From ed64716f0f88effe70a131d0b7cdba8110a6b7aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Hatcher?= Date: Sun, 12 Oct 2025 14:07:53 +0200 Subject: [PATCH] FIX: Refactor both dialogs to get common code --- webapp/app.ironcalc.com/frontend/src/App.tsx | 16 +-- .../WelcomeDialog/TemplatesDialog.tsx | 130 +++++------------- .../WelcomeDialog/TemplatesList.tsx | 103 ++++++++++++++ .../WelcomeDialog/WelcomeDialog.tsx | 115 +++------------- 4 files changed, 162 insertions(+), 202 deletions(-) create mode 100644 webapp/app.ironcalc.com/frontend/src/components/WelcomeDialog/TemplatesList.tsx diff --git a/webapp/app.ironcalc.com/frontend/src/App.tsx b/webapp/app.ironcalc.com/frontend/src/App.tsx index d718128..b4361a3 100644 --- a/webapp/app.ironcalc.com/frontend/src/App.tsx +++ b/webapp/app.ironcalc.com/frontend/src/App.tsx @@ -161,15 +161,13 @@ function App() { > setTemplatesDialogOpen(false)} - onSelectTemplate={ - async (fileName) => { - const model_bytes = await get_documentation_model(fileName); - const importedModel = Model.from_bytes(model_bytes); - saveModelToStorage(importedModel); - setModel(importedModel); - setTemplatesDialogOpen(false); - } - } + onSelectTemplate={async (fileName) => { + const model_bytes = await get_documentation_model(fileName); + const importedModel = Model.from_bytes(model_bytes); + saveModelToStorage(importedModel); + setModel(importedModel); + setTemplatesDialogOpen(false); + }} /> diff --git a/webapp/app.ironcalc.com/frontend/src/components/WelcomeDialog/TemplatesDialog.tsx b/webapp/app.ironcalc.com/frontend/src/components/WelcomeDialog/TemplatesDialog.tsx index 6e4edd1..d91bb48 100644 --- a/webapp/app.ironcalc.com/frontend/src/components/WelcomeDialog/TemplatesDialog.tsx +++ b/webapp/app.ironcalc.com/frontend/src/components/WelcomeDialog/TemplatesDialog.tsx @@ -1,7 +1,12 @@ import { Dialog, styled } from "@mui/material"; -import { House, TicketsPlane, X } from "lucide-react"; +import { X } from "lucide-react"; import { useState } from "react"; -import TemplatesListItem from "./TemplatesListItem"; +import TemplatesList, { + Cross, + DialogContent, + DialogFooter, + DialogFooterButton, +} from "./TemplatesList"; function TemplatesDialog(properties: { onClose: () => void; @@ -19,7 +24,7 @@ function TemplatesDialog(properties: { return ( {}}> - + Choose a template - + - - } - iconColor="#2F80ED" - active={selectedTemplate === "mortgage_calculator"} - onClick={() => handleTemplateSelect("mortgage_calculator")} - /> - } - iconColor="#EB5757" - active={selectedTemplate === "travel_expenses_tracker"} - onClick={() => handleTemplateSelect("travel_expenses_tracker")} - /> - + void; +}) { + const { selectedTemplate, handleTemplateSelect } = props; + return ( + + } + iconColor="#2F80ED" + active={selectedTemplate === "mortgage_calculator"} + onClick={() => handleTemplateSelect("mortgage_calculator")} + /> + } + iconColor="#EB5757" + active={selectedTemplate === "travel_expenses_tracker"} + onClick={() => handleTemplateSelect("travel_expenses_tracker")} + /> + + ); +} + +export 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); + } +`; + +export 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; + } +`; + +export const DialogContent = styled("div")` + display: flex; + flex-direction: column; + gap: 12px; + padding: 16px; + max-height: 300px; + overflow: hidden; + overflow-y: auto; +`; + +export const TemplatesListWrapper = styled("div")` + display: flex; + flex-direction: column; + gap: 10px; +`; + +export const DialogFooter = styled("div")` + border-top: 1px solid #e0e0e0; + padding: 16px; +`; + +export 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; +export default TemplatesList; 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 88fcfa6..6ac308e 100644 --- a/webapp/app.ironcalc.com/frontend/src/components/WelcomeDialog/WelcomeDialog.tsx +++ b/webapp/app.ironcalc.com/frontend/src/components/WelcomeDialog/WelcomeDialog.tsx @@ -1,9 +1,18 @@ import { IronCalcIconWhite as IronCalcIcon } from "@ironcalc/workbook"; -import { Dialog, styled } from "@mui/material"; -import { House, Table, TicketsPlane, X } from "lucide-react"; +import { styled } from "@mui/material"; +import { Table, X } from "lucide-react"; import { useState } from "react"; import TemplatesListItem from "./TemplatesListItem"; +import TemplatesList, { + Cross, + DialogContent, + DialogFooter, + DialogFooterButton, + DialogWrapper, + TemplatesListWrapper, +} from "./TemplatesList"; + function WelcomeDialog(properties: { onClose: () => void; onSelectTemplate: (templateId: string) => void; @@ -20,7 +29,7 @@ function WelcomeDialog(properties: { return ( {}}> - + @@ -38,7 +47,7 @@ function WelcomeDialog(properties: { > - + New @@ -52,24 +61,10 @@ function WelcomeDialog(properties: { /> Templates - - } - iconColor="#2F80ED" - active={selectedTemplate === "mortgage_calculator"} - onClick={() => handleTemplateSelect("mortgage_calculator")} - /> - } - iconColor="#EB5757" - active={selectedTemplate === "travel_expenses_tracker"} - onClick={() => handleTemplateSelect("travel_expenses_tracker")} - /> - +