From ba7a72f4841c6304b33b77586273314db03981c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Tue, 16 Jun 2026 00:45:19 +0200 Subject: [PATCH] fix(labs): confirm destructive deletes on lab results and Vorsorge reminders The single-row delete on lab results and on preventive-care reminders fired immediately on click, unlike the measurement and mood lists which gate the same action behind a confirm dialog. Route both through the shared DeleteButton so a stray tap can no longer drop a reading or a reminder, and add the per-surface confirm copy across all locales. --- messages/de.json | 4 ++++ messages/en.json | 4 ++++ messages/es.json | 4 ++++ messages/fr.json | 4 ++++ messages/it.json | 4 ++++ messages/pl.json | 4 ++++ src/components/labs/lab-list.tsx | 21 +++++++++---------- .../vorsorge-section.tsx | 21 +++++++++---------- 8 files changed, 44 insertions(+), 22 deletions(-) diff --git a/messages/de.json b/messages/de.json index a423c6f78..9114e703e 100644 --- a/messages/de.json +++ b/messages/de.json @@ -6437,6 +6437,8 @@ "addButton": "Erinnerung hinzufügen", "markDone": "Erledigt", "delete": "Löschen", + "deleteConfirmTitle": "Erinnerung löschen?", + "deleteConfirmDescription": "Diese Vorsorge-Erinnerung wird dauerhaft gelöscht.", "disabledBadge": "Aus", "nextDue": { "none": "Nicht geplant", @@ -6493,6 +6495,8 @@ "referenceLabel": "Referenz", "readingsCount": "{count} Werte", "deleteLatest": "Letzten Wert löschen", + "deleteConfirmTitle": "Laborwert löschen?", + "deleteConfirmDescription": "Dieser Laborwert wird dauerhaft gelöscht.", "deletedToast": "Wert gelöscht", "deleteError": "Wert konnte nicht gelöscht werden", "loadError": "Laborwerte konnten nicht geladen werden", diff --git a/messages/en.json b/messages/en.json index 4efb384dc..27899f29d 100644 --- a/messages/en.json +++ b/messages/en.json @@ -6437,6 +6437,8 @@ "addButton": "Add reminder", "markDone": "Done", "delete": "Delete", + "deleteConfirmTitle": "Delete reminder?", + "deleteConfirmDescription": "This preventive-care reminder will be permanently deleted.", "disabledBadge": "Off", "nextDue": { "none": "Not scheduled", @@ -6493,6 +6495,8 @@ "referenceLabel": "Reference", "readingsCount": "{count} readings", "deleteLatest": "Delete latest reading", + "deleteConfirmTitle": "Delete lab result?", + "deleteConfirmDescription": "This lab result will be permanently deleted.", "deletedToast": "Result deleted", "deleteError": "Could not delete the result", "loadError": "Could not load lab results", diff --git a/messages/es.json b/messages/es.json index e78370478..cae5e473f 100644 --- a/messages/es.json +++ b/messages/es.json @@ -6437,6 +6437,8 @@ "addButton": "Añadir recordatorio", "markDone": "Hecho", "delete": "Eliminar", + "deleteConfirmTitle": "¿Eliminar recordatorio?", + "deleteConfirmDescription": "Este recordatorio de prevención se eliminará de forma permanente.", "disabledBadge": "Apagado", "nextDue": { "none": "Sin programar", @@ -6493,6 +6495,8 @@ "referenceLabel": "Referencia", "readingsCount": "{count} valores", "deleteLatest": "Eliminar el último valor", + "deleteConfirmTitle": "¿Eliminar resultado de laboratorio?", + "deleteConfirmDescription": "Este resultado de laboratorio se eliminará de forma permanente.", "deletedToast": "Resultado eliminado", "deleteError": "No se pudo eliminar el resultado", "loadError": "No se pudieron cargar los resultados", diff --git a/messages/fr.json b/messages/fr.json index 32f5c2b32..f89760ec4 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -6437,6 +6437,8 @@ "addButton": "Ajouter un rappel", "markDone": "Terminé", "delete": "Supprimer", + "deleteConfirmTitle": "Supprimer le rappel ?", + "deleteConfirmDescription": "Ce rappel de prévention sera définitivement supprimé.", "disabledBadge": "Désactivé", "nextDue": { "none": "Non planifié", @@ -6493,6 +6495,8 @@ "referenceLabel": "Référence", "readingsCount": "{count} valeurs", "deleteLatest": "Supprimer la dernière valeur", + "deleteConfirmTitle": "Supprimer le résultat d'analyse ?", + "deleteConfirmDescription": "Ce résultat d'analyse sera définitivement supprimé.", "deletedToast": "Résultat supprimé", "deleteError": "Impossible de supprimer le résultat", "loadError": "Impossible de charger les résultats", diff --git a/messages/it.json b/messages/it.json index 162c586dd..0d5c25c41 100644 --- a/messages/it.json +++ b/messages/it.json @@ -6437,6 +6437,8 @@ "addButton": "Aggiungi promemoria", "markDone": "Fatto", "delete": "Elimina", + "deleteConfirmTitle": "Eliminare il promemoria?", + "deleteConfirmDescription": "Questo promemoria di prevenzione verrà eliminato definitivamente.", "disabledBadge": "Disattivato", "nextDue": { "none": "Non pianificato", @@ -6493,6 +6495,8 @@ "referenceLabel": "Riferimento", "readingsCount": "{count} valori", "deleteLatest": "Elimina l'ultimo valore", + "deleteConfirmTitle": "Eliminare il risultato di laboratorio?", + "deleteConfirmDescription": "Questo risultato di laboratorio verrà eliminato definitivamente.", "deletedToast": "Risultato eliminato", "deleteError": "Impossibile eliminare il risultato", "loadError": "Impossibile caricare i risultati", diff --git a/messages/pl.json b/messages/pl.json index c16c94efd..e0a362da2 100644 --- a/messages/pl.json +++ b/messages/pl.json @@ -6437,6 +6437,8 @@ "addButton": "Dodaj przypomnienie", "markDone": "Gotowe", "delete": "Usuń", + "deleteConfirmTitle": "Usunąć przypomnienie?", + "deleteConfirmDescription": "To przypomnienie profilaktyczne zostanie trwale usunięte.", "disabledBadge": "Wył.", "nextDue": { "none": "Niezaplanowane", @@ -6493,6 +6495,8 @@ "referenceLabel": "Norma", "readingsCount": "{count} wyników", "deleteLatest": "Usuń ostatni wynik", + "deleteConfirmTitle": "Usunąć wynik laboratoryjny?", + "deleteConfirmDescription": "Ten wynik laboratoryjny zostanie trwale usunięty.", "deletedToast": "Wynik usunięty", "deleteError": "Nie udało się usunąć wyniku", "loadError": "Nie udało się wczytać wyników", diff --git a/src/components/labs/lab-list.tsx b/src/components/labs/lab-list.tsx index ab1a0cd5c..3d94b330e 100644 --- a/src/components/labs/lab-list.tsx +++ b/src/components/labs/lab-list.tsx @@ -2,9 +2,10 @@ import { useMemo } from "react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; -import { FlaskConical, Trash2 } from "lucide-react"; +import { FlaskConical } from "lucide-react"; import { toast } from "sonner"; +import { DeleteButton } from "@/components/data-list"; import { Button } from "@/components/ui/button"; import { Card, @@ -166,16 +167,14 @@ export function LabList({ onAddFirst }: { onAddFirst?: () => void } = {}) { r.value)} /> - + deleteMutation.mutate(group.latest.id)} + title={t("labs.deleteConfirmTitle")} + description={t("labs.deleteConfirmDescription")} + confirmLabel={t("labs.deleteLatest")} + className="size-9" + iconClassName="h-4 w-4" + /> diff --git a/src/components/measurement-reminders/vorsorge-section.tsx b/src/components/measurement-reminders/vorsorge-section.tsx index 162de30bb..98b927df9 100644 --- a/src/components/measurement-reminders/vorsorge-section.tsx +++ b/src/components/measurement-reminders/vorsorge-section.tsx @@ -13,9 +13,10 @@ * relative to "now" but never recomputes the cadence. */ import { useState } from "react"; -import { CheckCircle2, Plus, Trash2 } from "lucide-react"; +import { CheckCircle2, Plus } from "lucide-react"; import { useTranslations } from "@/lib/i18n/context"; +import { DeleteButton } from "@/components/data-list"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { @@ -365,16 +366,14 @@ function VorsorgeCard({ {t("measurementReminders.markDone")} - +