From 478b069fcddee614cc0640ae9cd5e41a9e41f74a Mon Sep 17 00:00:00 2001 From: Manus Date: Tue, 3 Nov 2026 14:51:56 +0000 Subject: [PATCH] feat: ajouter le litige par un clic et isoler les sauvegardes du build --- .dockerignore | 14 ++++++++++++++ client/src/pages/InvoiceDetail.tsx | 20 +++++++++++++++++++- server/disputeDeployment.test.ts | 18 ++++++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 server/disputeDeployment.test.ts diff --git a/.dockerignore b/.dockerignore index 44ef498..b70fca0 100644 --- a/.dockerignore +++ b/.dockerignore @@ -9,3 +9,17 @@ client/dist README.md uploads storage +# Les sauvegardes et secrets ne doivent jamais entrer dans une image de build. +**/backups +**/*backup* +**/.ssh +**/.manus-logs +**/__pycache__ +**/*.pyc +**/*.sql.gz +**/*.bundle +**/*.zip +**/*.tar +**/*.tar.gz +**/*.pem +**/*.key diff --git a/client/src/pages/InvoiceDetail.tsx b/client/src/pages/InvoiceDetail.tsx index 492b4e2..2a00417 100644 --- a/client/src/pages/InvoiceDetail.tsx +++ b/client/src/pages/InvoiceDetail.tsx @@ -66,6 +66,21 @@ export default function InvoiceDetail() { const upsertLearningMutation = trpc.learnings.upsert.useMutation(); + // Le premier clic ajoute le litige, puis ouvre la saisie du commentaire. + const markDisputeMutation = trpc.invoices.setDispute.useMutation({ + onSuccess: async () => { + utils.invoices.getById.setData({ id: invoiceId }, current => current ? { ...current, isDisputed: 1 } : current); + setDisputeDialogOpen(true); + toast.success("Facture ajoutée aux litiges"); + await Promise.all([ + utils.invoices.getById.invalidate({ id: invoiceId }), + utils.invoices.list.invalidate(), + utils.invoices.listDisputes.invalidate(), + ]); + }, + onError: error => toast.error(error.message || "Impossible d’ajouter cette facture aux litiges"), + }); + const updateMutation = trpc.invoices.update.useMutation({ onSuccess: () => { toast.success("Facture mise à jour avec succès"); @@ -198,7 +213,10 @@ export default function InvoiceDetail() {
-