From 3de1b2ef0cc5d8508832c785775ce40280bd7d32 Mon Sep 17 00:00:00 2001 From: Daniel Volz Date: Sun, 8 Feb 2026 22:13:52 +0100 Subject: [PATCH] fix: UI polish for intake form, dashboard cards, and schedule (#142) - Intake form: replace remind checkbox with bell icon + toggle switch - Intake form: smart takenBy dropdown based on medication's people - Dashboard: hide DETAILS row for pill bottles on mobile cards - Dashboard: use status-chip with icons in schedule view (past/today/future) - Dashboard: reduce spacing between icons and status chips on mobile - MedDetailModal: show package type in PACKAGE DETAILS heading - PlannerPage: show dash for bottle blisters column - Shorten Pill Bottle label in EN/DE translations - Update related tests --- frontend/src/components/MedDetailModal.tsx | 5 +- frontend/src/components/MobileEditModal.tsx | 49 +++++++++++-------- frontend/src/i18n/de.json | 2 +- frontend/src/i18n/en.json | 2 +- frontend/src/pages/DashboardPage.tsx | 21 ++++++-- frontend/src/pages/MedicationsPage.tsx | 46 ++++++++++------- frontend/src/pages/PlannerPage.tsx | 4 +- frontend/src/styles.css | 30 +++++++++++- .../test/components/MobileEditModal.test.tsx | 10 +++- .../src/test/pages/MedicationsPage.test.tsx | 10 ++-- 10 files changed, 120 insertions(+), 59 deletions(-) diff --git a/frontend/src/components/MedDetailModal.tsx b/frontend/src/components/MedDetailModal.tsx index 37e27e1..adf7527 100644 --- a/frontend/src/components/MedDetailModal.tsx +++ b/frontend/src/components/MedDetailModal.tsx @@ -202,7 +202,10 @@ export function MedDetailModal({ {/* Package Details Section */}
-

{t("modal.packageDetails")}

+

+ {t("modal.packageDetails")} ( + {selectedMed.packageType === "bottle" ? t("form.packageTypeBottle") : t("form.packageTypeBlister")}) +

{selectedMed.packageType === "blister" ? ( <> diff --git a/frontend/src/components/MobileEditModal.tsx b/frontend/src/components/MobileEditModal.tsx index 716e2c9..7c0cd33 100644 --- a/frontend/src/components/MobileEditModal.tsx +++ b/frontend/src/components/MobileEditModal.tsx @@ -426,26 +426,29 @@ export function MobileEditModal({ onChange={(e) => onSetIntakeValue(idx, "startTime", e.target.value)} /> - - - πŸ”” + {form.takenBy.length === 0 ? null : ( + + )} +
+ πŸ”” + +
{form.intakes.length > 1 && (
))} - diff --git a/frontend/src/i18n/de.json b/frontend/src/i18n/de.json index 29d7fdc..7241d0c 100644 --- a/frontend/src/i18n/de.json +++ b/frontend/src/i18n/de.json @@ -135,7 +135,7 @@ "takenBy": "Eingenommen von", "packageType": "Verpackungsart", "packageTypeBlister": "Blisterpackung", - "packageTypeBottle": "Pillendose / BehΓ€lter", + "packageTypeBottle": "Pillendose", "packs": "Packungen", "blistersPerPack": "Blister pro Packung", "pillsPerBlister": "Tabletten pro Blister", diff --git a/frontend/src/i18n/en.json b/frontend/src/i18n/en.json index 0b95fbd..daece7f 100644 --- a/frontend/src/i18n/en.json +++ b/frontend/src/i18n/en.json @@ -135,7 +135,7 @@ "takenBy": "Taken by", "packageType": "Package Type", "packageTypeBlister": "Blister Pack", - "packageTypeBottle": "Pill Bottle / Container", + "packageTypeBottle": "Pill Bottle", "packs": "Packs", "blistersPerPack": "Blisters per pack", "pillsPerBlister": "Pills per blister", diff --git a/frontend/src/pages/DashboardPage.tsx b/frontend/src/pages/DashboardPage.tsx index a1e5489..07920d9 100644 --- a/frontend/src/pages/DashboardPage.tsx +++ b/frontend/src/pages/DashboardPage.tsx @@ -439,9 +439,12 @@ export function DashboardPage() { ? t("table.pillsCount", { count: Math.round(row.medsLeft) }) : formatFullBlisters(stock.fullBlisters, t)} - + {med?.packageType === "bottle" - ? "-" + ? "β€”" : formatOpenBlisterAndLoose( stock.openBlisterPills, stock.loosePills, @@ -597,6 +600,9 @@ export function DashboardPage() { const med = meds.find((m) => m.name === item.medName); const medCov = coverageByMed[item.medName]; const isEmpty = medCov ? medCov.medsLeft <= 0 : false; + const status = medCov + ? getStockStatus(medCov.daysLeft, medCov.medsLeft, stockThresholds) + : null; const itemDoseIds = expandDoseIds(item.doses); const allTaken = itemDoseIds.every((id) => takenDoses.has(id)); return ( @@ -623,6 +629,9 @@ export function DashboardPage() { {item.total} {t("common.pills")} {t("common.total")} + {status && ( + {t(status.label)} + )}
@@ -772,7 +781,9 @@ export function DashboardPage() { {item.total} {t("common.pills")} {t("common.total")} - {status && {t(status.label)}} + {status && ( + {t(status.label)} + )}
@@ -959,7 +970,9 @@ export function DashboardPage() { {item.total} {t("common.pills")} {t("common.total")} - {status && {t(status.label)}} + {status && ( + {t(status.label)} + )}
diff --git a/frontend/src/pages/MedicationsPage.tsx b/frontend/src/pages/MedicationsPage.tsx index f698a96..0032c2f 100644 --- a/frontend/src/pages/MedicationsPage.tsx +++ b/frontend/src/pages/MedicationsPage.tsx @@ -632,7 +632,11 @@ export function MedicationsPage() {

{t("form.blisters.title")}

-
@@ -675,25 +679,29 @@ export function MedicationsPage() { onChange={(e) => setIntakeValue(idx, "startTime", e.target.value)} /> - -
{form.intakes.length > 1 && (