feat: obsolete medication archiving, start date, and UI improvements (#215)

* feat: obsolete medication archiving, start date, and UI improvements

- Add soft-archive (obsolete) for medications with dedicated section and toggle
- Add medication start date field with date picker and validation
- Add obsolete/reactivate API endpoints with proper auth
- Filter obsolete meds from schedule, coverage, planner, and notifications
- Improve UserFilterModal with intake schedules, stock badges, and click-to-open
- Improve dashboard taken-by badges with per-intake bell icons
- Add Escape key support to ConfirmModal and MobileEditModal
- Fix Lightbox close button positioning near image
- Add read-only mode support for MobileEditModal
- DB migrations: 0008 (is_obsolete, obsolete_at), 0009 (medication_start_date)
- All user-facing text uses i18n keys (en + de)

* test: fix tests for obsolete medications and UI changes

- Backend: add is_obsolete, obsolete_at, medication_start_date columns to test schemas
- Backend: add test medication inserts in planner tests for active-med filtering
- Frontend: update useMedications URL to include includeObsolete param
- Frontend: fix MobileEditModal selectors and validation assertions
- Frontend: add onClearUser prop to UserFilterModal test renders
- Frontend: fix MedicationsPage and DashboardPage test assertions
This commit is contained in:
Daniel Volz
2026-02-15 23:23:38 +01:00
committed by GitHub
parent c47a35d642
commit 4b697374f6
38 changed files with 2042 additions and 907 deletions
+17 -2
View File
@@ -125,7 +125,12 @@
"title": "Medikamentenliste",
"entries": "{{count}} Einträge",
"entries_one": "{{count}} Eintrag",
"entries_other": "{{count}} Einträge"
"entries_other": "{{count}} Einträge",
"markObsolete": "Als obsolet markieren",
"reactivate": "Reaktivieren",
"obsoleteTitle": "Obsolet ({{count}})",
"obsoleteSince": "Beendet",
"started": "Gestartet"
},
"details": {
"packs": "Packungen",
@@ -140,10 +145,15 @@
"deleteModal": {
"title": "Medikament löschen",
"message": "Möchtest du \"{{name}}\" wirklich löschen?"
},
"obsoleteModal": {
"title": "Medikament als obsolet markieren",
"message": "Möchtest du \"{{name}}\" wirklich als obsolet markieren?"
}
},
"form": {
"editEntry": "Medikament bearbeiten",
"viewEntry": "Medikament ansehen",
"newEntry": "Neues Medikament",
"badge": "Packungen + lose Tabletten",
"sections": {
@@ -165,6 +175,7 @@
"loosePills": "Lose Tabletten",
"pillWeight": "Dosis pro Tablette",
"total": "Gesamt (Tabletten)",
"medicationStartDate": "Medikations-Startdatum",
"expiryDate": "Ablaufdatum",
"notes": "Notizen",
"medicationImage": "Medikamentenbild",
@@ -177,6 +188,9 @@
"weight": "z.B. 240",
"notes": "z.B. Mit Essen einnehmen, Alkohol vermeiden... (optional)"
},
"validation": {
"startDateAfterIntake": "Das Medikations-Startdatum ({{medicationStartDate}}) darf nicht nach dem Einnahmedatum ({{intakeDate}}) liegen."
},
"blisters": {
"title": "Einnahmeplan",
"remind": "Erinnern",
@@ -406,6 +420,7 @@
"cancel": "Abbrechen",
"close": "Schließen",
"edit": "Bearbeiten",
"view": "Ansehen",
"delete": "Löschen",
"remove": "Entfernen",
"reset": "Zurücksetzen",
@@ -513,7 +528,7 @@
"prescription": {
"enabled": "Rezept verfolgen",
"authorizedRefills": "Genehmigte Nachfüllungen",
"remainingRefills": "Verbleibende Nachfüllungen",
"remainingRefills": "Verbleibende Rezept-Nachfüllungen",
"lowThreshold": "Schwelle für Rezept-Erinnerung",
"expiryDate": "Rezeptablauf",
"useForRefill": "Rezept-Nachfüllung verwenden"
+17 -2
View File
@@ -125,7 +125,12 @@
"title": "Medication list",
"entries": "{{count}} entries",
"entries_one": "{{count}} entry",
"entries_other": "{{count}} entries"
"entries_other": "{{count}} entries",
"markObsolete": "Mark obsolete",
"reactivate": "Reactivate",
"obsoleteTitle": "Obsolete ({{count}})",
"obsoleteSince": "Stopped",
"started": "Started"
},
"details": {
"packs": "Packs",
@@ -140,10 +145,15 @@
"deleteModal": {
"title": "Delete medication",
"message": "Do you really want to delete \"{{name}}\"?"
},
"obsoleteModal": {
"title": "Mark medication as obsolete",
"message": "Do you really want to mark \"{{name}}\" as obsolete?"
}
},
"form": {
"editEntry": "Edit medication",
"viewEntry": "View medication",
"newEntry": "New medication",
"badge": "Packs + loose pills",
"sections": {
@@ -165,6 +175,7 @@
"loosePills": "Loose pills",
"pillWeight": "Dose per pill",
"total": "Total (pills)",
"medicationStartDate": "Medication Start Date",
"expiryDate": "Expiry Date",
"notes": "Notes",
"medicationImage": "Medication Image",
@@ -177,6 +188,9 @@
"weight": "e.g. 240",
"notes": "e.g. Take with food, avoid alcohol... (optional)"
},
"validation": {
"startDateAfterIntake": "Medication start date ({{medicationStartDate}}) cannot be after intake date ({{intakeDate}})."
},
"blisters": {
"title": "Intake schedule",
"remind": "Remind",
@@ -406,6 +420,7 @@
"cancel": "Cancel",
"close": "Close",
"edit": "Edit",
"view": "View",
"delete": "Delete",
"remove": "Remove",
"reset": "Reset",
@@ -513,7 +528,7 @@
"prescription": {
"enabled": "Track prescription",
"authorizedRefills": "Authorized refills",
"remainingRefills": "Remaining refills",
"remainingRefills": "Remaining prescription refills",
"lowThreshold": "Low-refill reminder threshold",
"expiryDate": "Prescription expiry",
"useForRefill": "Use prescription refill"