From 06e6e7d120f622ff44384821dd3bf54c4e84f300 Mon Sep 17 00:00:00 2001 From: Arthur Belleville Date: Sun, 13 Apr 2025 17:50:11 +0200 Subject: [PATCH] WIP --- ui/src/components/RowActionMenu.tsx | 30 +- ui/src/components/devis/CreateDevisModal.tsx | 200 +++++++++ ui/src/components/devis/DeleteDevisModal.tsx | 65 +++ ui/src/components/devis/ViewDevisModal.tsx | 119 ++++++ ui/src/pages/devis.tsx | 424 ++----------------- ui/src/utils/helpers.ts | 7 + 6 files changed, 439 insertions(+), 406 deletions(-) create mode 100644 ui/src/components/devis/CreateDevisModal.tsx create mode 100644 ui/src/components/devis/DeleteDevisModal.tsx create mode 100644 ui/src/components/devis/ViewDevisModal.tsx create mode 100644 ui/src/utils/helpers.ts diff --git a/ui/src/components/RowActionMenu.tsx b/ui/src/components/RowActionMenu.tsx index d754233..f53d53f 100644 --- a/ui/src/components/RowActionMenu.tsx +++ b/ui/src/components/RowActionMenu.tsx @@ -1,19 +1,18 @@ import React from "react"; -import { Button } from "@ui/ui-library/button"; -import { PencilIcon, TrashIcon } from "lucide-react"; +import { DeleteDevisModal } from "@ui/components/devis/DeleteDevisModal"; +import { ViewDevisModal } from "./devis/ViewDevisModal"; import { Database } from "@ui/types/db"; type Devis = Database["public"]["Tables"]["devis"]["Row"]; - interface RowActionMenuProps { devis: Devis; - onEdit: (devis: Devis) => void; - onDelete: (devis: Devis) => void; + // onEdit: (devis: Devis) => void; + onDelete: (devisId: string) => void; } export const RowActionMenu: React.FC = ({ devis, - onEdit, + // onEdit, onDelete, }) => { return ( @@ -26,23 +25,8 @@ export const RowActionMenu: React.FC = ({ onClick={(e) => e.stopPropagation()} onDoubleClick={(e) => e.stopPropagation()} > - - + + ); }; diff --git a/ui/src/components/devis/CreateDevisModal.tsx b/ui/src/components/devis/CreateDevisModal.tsx new file mode 100644 index 0000000..c7dbed5 --- /dev/null +++ b/ui/src/components/devis/CreateDevisModal.tsx @@ -0,0 +1,200 @@ +import { Button } from "@ui/ui-library/button"; +import { + Dialog, + DialogBody, + DialogCloseButton, + DialogFooter, + DialogHeader, +} from "@ui/ui-library/dialog"; +import { Modal } from "@ui/ui-library/modal"; +import { PlusIcon } from "lucide-react"; +import { Form } from "@ui/ui-library/form"; +import { DateField, DateInput } from "@ui/ui-library/date-field"; +import { FieldError, Input, Label } from "@ui/ui-library/field"; +import { TextField, TextArea } from "@ui/ui-library/field"; +import { useState } from "react"; +import { CalendarDate } from "@internationalized/date"; +import { calculateTotal } from "@ui/utils/helpers"; +import { calculateTax } from "@ui/utils/helpers"; + +const now = new Date(); +const defaultFormData = { + client_email: "", + date: new CalendarDate(now.getFullYear(), now.getMonth(), now.getDate()), + due_date: new CalendarDate( + now.getFullYear(), + now.getMonth(), + now.getDate() + ).add({ days: 30 }), + notes: "", + terms: "", + amount: 0, + tax_rate: 20, +}; + +export const CreateDevisModal = ({ + handleCreate, + dueDateError, + setDueDateError, +}: { + handleCreate: (event: React.FormEvent) => void; + dueDateError: string; + setDueDateError: (error: string) => void; +}) => { + const [formData, setFormData] = useState(defaultFormData); + const [isOpen, setIsOpen] = useState(false); + return ( + <> + + + + +

Créer un nouveau devis

+ +
+ +
+
+ + + + + setDueDateError("")} + > + + + {dueDateError} + +
+ + + + + {(validationState) => { + console.log(validationState); + return validationState.validationErrors + ? "Veuillez entrer une adresse email valide" + : ""; + }} + + +
+ { + const amount = parseFloat(value) || 0; + setFormData((prev) => ({ + ...prev, + amount, + })); + }} + > + + + + {(validationState) => { + return validationState.validationErrors + ? "Veuillez entrer un montant valide" + : ""; + }} + + + { + const tax_rate = parseFloat(value) || 0; + setFormData((prev) => ({ + ...prev, + tax_rate, + })); + }} + > + + + + {(validationState) => { + return validationState.validationErrors + ? "Veuillez entrer un taux valide" + : ""; + }} + + +
+
+
+ + Montant HT + + {formData.amount.toFixed(2)} € +
+
+ + TVA ({formData.tax_rate}%) + + + {calculateTax(formData.amount, formData.tax_rate).toFixed( + 2 + )}{" "} + € + +
+
+ Total TTC + + {calculateTotal( + formData.amount, + calculateTax(formData.amount, formData.tax_rate) + ).toFixed(2)}{" "} + € + +
+
+ +