diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx index 2231949..bab2ad4 100644 --- a/frontend/src/App.tsx +++ b/frontend/src/App.tsx @@ -557,6 +557,7 @@ export default function App() { "/medications": { eyebrow: "MedAssist · Inventory", title: "Manage Medications" }, "/planner": { eyebrow: "MedAssist · Planner", title: "Demand Calculator" }, "/settings": { eyebrow: "MedAssist · Configuration", title: "Settings" }, + "/schedule": { eyebrow: "MedAssist · Schedule", title: "Upcoming Schedules" }, }[currentPath] || { eyebrow: "MedAssist · Overview", title: "Dashboard" }; return ( @@ -685,7 +686,7 @@ export default function App() {
-

Upcoming Schedules

+

navigate("/schedule")}>Upcoming Schedules

{ + const val = Number(e.target.value); + setScheduleDays(val); + localStorage.setItem("scheduleDays", String(val)); + }} + > + + + + +
+
+ {groupedSchedule.map((day) => ( +
+
{day.dateStr}
+ {day.meds.map((item) => { + const depletionTime = depletionByMed[item.medName]; + const outOfStock = typeof depletionTime === "number" && item.lastWhen > depletionTime; + const med = meds.find(m => m.name === item.medName); + const allTaken = item.doses.every((d) => takenDoses.has(d.id)); + return ( +
+
+
{item.medName}{med?.intakeRemindersEnabled && 🔔}
+
+ {item.total} pills total + + {outOfStock ? "⚠ No pills left" : "✓ Stock OK"} + +
+
+
+ {item.doses.map((dose) => { + const isTaken = takenDoses.has(dose.id); + return ( +
+ {dose.timeStr} + {dose.usage} pill{dose.usage !== 1 ? "s" : ""}{med?.pillWeightMg && ` (${dose.usage * med.pillWeightMg} mg)`}{med?.takenBy && taken by setSelectedUser(med.takenBy!)}>{med.takenBy}} + {isTaken ? ( + + ) : ( + + )} +
+ ); + })} +
+
+ ); + })} +
+ ))} +
+
+
+ } /> {/* Medication Detail Modal */} diff --git a/frontend/src/styles.css b/frontend/src/styles.css index 46297e1..b4ca740 100644 --- a/frontend/src/styles.css +++ b/frontend/src/styles.css @@ -185,6 +185,10 @@ body { .card-head { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; margin-bottom: 1rem; } .card h2 { margin: 0; font-size: 1.2rem; } +.card h2.clickable { cursor: pointer; transition: color 0.15s; } +.card h2.clickable:hover { color: var(--accent-light); } + +.schedule-full { max-width: 100%; } .schedule-days-select { background: var(--accent-bg);