From 6ff0ad27453275dcc19f1b8e2e74f94ea5c66cbb Mon Sep 17 00:00:00 2001 From: Daniel Volz Date: Sat, 14 Feb 2026 20:17:01 +0100 Subject: [PATCH] fix: mobile modal UX improvements (delete confirm, browser-back, z-index) (#206) - Replace browser confirm() with ConfirmModal for delete confirmation - Add dedicated history entry for delete dialog so browser back dismisses it - Track unsaved-changes warning source to restore correct context on cancel - Add overlayClassName prop to ConfirmModal for nested z-index layering - Add .nested-confirm CSS class for proper modal stacking - Add i18n keys for delete confirmation dialog (EN + DE) Closes #202 --- frontend/src/components/ConfirmModal.tsx | 4 +- frontend/src/i18n/de.json | 4 ++ frontend/src/i18n/en.json | 4 ++ frontend/src/pages/MedicationsPage.tsx | 83 ++++++++++++++++++++---- frontend/src/styles.css | 4 ++ 5 files changed, 84 insertions(+), 15 deletions(-) diff --git a/frontend/src/components/ConfirmModal.tsx b/frontend/src/components/ConfirmModal.tsx index 3ca4d52..1b4443d 100644 --- a/frontend/src/components/ConfirmModal.tsx +++ b/frontend/src/components/ConfirmModal.tsx @@ -13,6 +13,7 @@ export interface ConfirmModalProps { onCancel: () => void; isLoading?: boolean; confirmVariant?: "primary" | "danger" | "success"; + overlayClassName?: string; } export function ConfirmModal({ @@ -24,9 +25,10 @@ export function ConfirmModal({ onCancel, isLoading = false, confirmVariant = "primary", + overlayClassName, }: ConfirmModalProps) { return ( -
+
e.stopPropagation()} style={{ maxWidth: "450px" }}>
- - + )} +
@@ -547,10 +583,12 @@ export function MedicationsPage() {
- - + )} +
@@ -1145,10 +1183,27 @@ export function MedicationsPage() { title={t("common.unsavedChanges.title", "Unsaved Changes")} message={t("common.unsavedChanges.message")} confirmLabel={t("common.unsavedChanges.leave", "Leave")} - cancelLabel={t("common.unsavedChanges.stay", "Stay")} + cancelLabel={ + unsavedConfirmSource === "mobile-edit" ? t("common.back") : t("common.unsavedChanges.stay", "Stay") + } onConfirm={handleConfirmClose} onCancel={handleCancelClose} confirmVariant="danger" + overlayClassName={showEditModal ? "nested-confirm" : undefined} + /> + )} + + {/* Delete Medication Confirmation Modal */} + {showDeleteConfirm && deleteCandidate && ( + )} diff --git a/frontend/src/styles.css b/frontend/src/styles.css index 368a4d2..ed99a9d 100644 --- a/frontend/src/styles.css +++ b/frontend/src/styles.css @@ -5497,6 +5497,10 @@ a.about-version-link:hover { background: rgba(0, 0, 0, 0.6); } +.modal-overlay.nested-confirm { + z-index: 1200; +} + /* ============================================================================= Shared Schedule Page (Public) ============================================================================= */