feat: frontend improvements - shared schedule, bottle type, settings UI, planner notifications (#146)
- Rewrite SharedSchedule to match DashboardPage rendering with time-based consumption - Add bottle package type support across all views (MedDetail, Refill, Planner, Dashboard) - Redesign settings page with colored threshold chips, validation, and stock reminder display - Add shareStockStatus toggle and send manual reminder button - Pill/pills singular/plural consistency across all views - Planner send notification via push (Shoutrrr) in addition to email - Stock overflow warning and past-missed day styling - Update README: bottles in Smart Inventory, push in Trip Planner, new ENV section - 708 passing frontend tests including new coverage for all changes
This commit is contained in:
+41
-19
@@ -21,11 +21,11 @@
|
||||
"badge": "Bestandsüberwachung",
|
||||
"noMeds": "Noch keine Medikamente konfiguriert.",
|
||||
"allGood": "Alles in Ordnung, genug Vorrat.",
|
||||
"lowWarning": "Genug Vorrat, aber {{meds}} wird knapp.",
|
||||
"lowWarning_other": "Genug Vorrat, aber {{meds}} werden knapp.",
|
||||
"lowWarning": "Genug Vorrat, aber {{meds}} ist kritisch niedrig.",
|
||||
"lowWarning_other": "Genug Vorrat, aber {{meds}} sind kritisch niedrig.",
|
||||
"lowWarningPrefix": "Genug Vorrat, aber",
|
||||
"lowWarningSuffix": "wird knapp.",
|
||||
"lowWarningSuffix_other": "werden knapp.",
|
||||
"lowWarningSuffix": "ist kritisch niedrig.",
|
||||
"lowWarningSuffix_other": "sind kritisch niedrig.",
|
||||
"sendReminder": "🔔 Erinnerung jetzt senden"
|
||||
},
|
||||
"overview": {
|
||||
@@ -59,10 +59,11 @@
|
||||
"reminders": {
|
||||
"active": "Automatische Erinnerungen aktiv",
|
||||
"status": "Status",
|
||||
"allStockOk": "Bestand OK",
|
||||
"allOk": "Alles OK",
|
||||
"allStockOk": "Bestand gut",
|
||||
"allOk": "Alles gut",
|
||||
"lastReminder": "Letzte Einnahme-Erinnerung",
|
||||
"lastSent": "Letzte Einnahme-Erinnerung",
|
||||
"lastStockSent": "Letzte Bestands-Erinnerung",
|
||||
"next": "Nachbestell-Erinnerung",
|
||||
"nextIn": "Nachbestell-Erinnerung",
|
||||
"inDays": "in {{days}} Tagen",
|
||||
@@ -73,8 +74,8 @@
|
||||
"needRefill_other": "{{count}} Medikamente nachfüllen",
|
||||
"emptyStock": "{{count}} Medikament leer",
|
||||
"emptyStock_other": "{{count}} Medikamente leer",
|
||||
"lowWarning": "{{count}} Medikament wird knapp",
|
||||
"lowWarning_other": "{{count}} Medikamente werden knapp",
|
||||
"lowWarning": "{{count}} Medikament kritisch niedrig",
|
||||
"lowWarning_other": "{{count}} Medikamente kritisch niedrig",
|
||||
"waitingFirstCheck": "Warte auf erste Prüfung",
|
||||
"type": "Typ",
|
||||
"typeStock": "Bestand",
|
||||
@@ -123,7 +124,9 @@
|
||||
"pillsPerBlister": "Tabletten pro Blister",
|
||||
"loose": "Lose",
|
||||
"total": "Gesamt",
|
||||
"stock": "Bestand"
|
||||
"stock": "Bestand",
|
||||
"totalCapacity": "Kapazität",
|
||||
"type": "Typ"
|
||||
}
|
||||
},
|
||||
"form": {
|
||||
@@ -181,6 +184,7 @@
|
||||
"calculate": "Berechnen",
|
||||
"calculating": "Wird berechnet...",
|
||||
"sendEmail": "📧 Per E-Mail senden",
|
||||
"sendNotification": "🔔 Bedarf senden",
|
||||
"table": {
|
||||
"medication": "Medikament",
|
||||
"usage": "Verbrauch",
|
||||
@@ -229,25 +233,34 @@
|
||||
"intakeCheck": "Einnahmeprüfung",
|
||||
"15minBefore": "15 Min. vor geplanter Zeit",
|
||||
"nextCheck": "Nächste Bestandsprüfung",
|
||||
"lastSent": "Zuletzt gesendet",
|
||||
"lastSent": "Letzte Benachrichtigung",
|
||||
"lastStockSent": "Letzte Bestands-Erinnerung",
|
||||
"lastIntakeSent": "Letzte Einnahme-Erinnerung",
|
||||
"envHint": "Diese Werte können über REMINDER_HOUR und REMINDER_MINUTES_BEFORE in .env konfiguriert werden"
|
||||
},
|
||||
"stock": {
|
||||
"title": "Bestand",
|
||||
"threshold": "Erinnerungsschwelle",
|
||||
"remindWhen": "Erinnern wenn Vorrat unter",
|
||||
"repeatDaily": "Täglich wiederholen",
|
||||
"repeatTooltip": "Wenn aktiviert, wird täglich eine Erinnerung gesendet solange der Bestand niedrig ist. Andernfalls nur einmal pro Medikament bis zum Auffüllen.",
|
||||
"calculationMode": "Bestandsberechnung",
|
||||
"automatic": "Automatisch",
|
||||
"automaticDesc": "Bestand wird automatisch anhand des Einnahmeplans reduziert",
|
||||
"manual": "Manuell",
|
||||
"manualDesc": "Bestand wird nur reduziert wenn Dosen als genommen markiert werden",
|
||||
"display": "Anzeige",
|
||||
"lowStockDays": "Niedriger Bestand (Tage)",
|
||||
"lowStockTooltip": "Gelbe Warnung ab diesem Schwellenwert",
|
||||
"highStockDays": "Hoher Bestand (Tage)",
|
||||
"highStockTooltip": "Grün mit Stern ab diesem Schwellenwert"
|
||||
"thresholds": "Schwellenwerte",
|
||||
"criticalStockDays": "Kritisch (Tage)",
|
||||
"criticalStockTooltip": "Bestand unter diesem Wert ist kritisch und erfordert sofortige Aufmerksamkeit",
|
||||
"lowStockDays": "Niedrig (Tage)",
|
||||
"lowStockTooltip": "Bestand unter diesem Wert bedeutet, dass bald nachbestellt werden sollte",
|
||||
"highStockDays": "Hoch (Tage)",
|
||||
"highStockTooltip": "Bestand über diesem Wert bedeutet, dass du gut versorgt bist",
|
||||
"thresholdValidation": "Werte müssen sein: Kritisch < Niedrig < Hoch",
|
||||
"shareStockStatus": "Bestand auf geteilten Links anzeigen",
|
||||
"shareStockStatusDesc": "Bestandsstatus (Normal/Niedrig/Kritisch) und farbige Rahmen auf geteilten Zeitplan-Links für Einnahme-Nutzer anzeigen"
|
||||
},
|
||||
"stockReminder": {
|
||||
"title": "Bestands-Erinnerung",
|
||||
"description": "Benachrichtigung wenn Medikamentenbestand erreicht",
|
||||
"repeatDaily": "Täglich wiederholen",
|
||||
"repeatTooltip": "Wenn aktiviert, wird täglich eine Erinnerung gesendet solange der Bestand kritisch ist. Andernfalls nur einmal pro Medikament bis zum Auffüllen."
|
||||
},
|
||||
"saveSettings": "Einstellungen speichern"
|
||||
},
|
||||
@@ -288,6 +301,7 @@
|
||||
"tooltips": {
|
||||
"intakeReminders": "Einnahme-Erinnerungen aktiviert",
|
||||
"hasNotes": "Hat Notizen",
|
||||
"stockExceedsCapacity": "Bestand überschreitet Packungskapazität — Packungsanzahl anpassen",
|
||||
"lightMode": "Zum hellen Modus wechseln",
|
||||
"darkMode": "Zum dunklen Modus wechseln"
|
||||
},
|
||||
@@ -348,6 +362,9 @@
|
||||
"common": {
|
||||
"loading": "Wird geladen...",
|
||||
"sending": "Wird gesendet...",
|
||||
"sent": "Gesendet!",
|
||||
"sendFailed": "Senden fehlgeschlagen",
|
||||
"networkError": "Netzwerkfehler",
|
||||
"saving": "Wird gespeichert...",
|
||||
"unsavedChanges": {
|
||||
"title": "Ungespeicherte Änderungen",
|
||||
@@ -386,6 +403,9 @@
|
||||
"fullBlisters": "volle Blister",
|
||||
"inBlister": "in 1 Blister",
|
||||
"total": "gesamt",
|
||||
"pillsTotal": "{{count}} Tabletten gesamt",
|
||||
"pillsTotal_one": "{{count}} Tablette gesamt",
|
||||
"pillsTotal_other": "{{count}} Tabletten gesamt",
|
||||
"max": "max"
|
||||
},
|
||||
"share": {
|
||||
@@ -450,6 +470,7 @@
|
||||
"refill": {
|
||||
"title": "Nachfüllen",
|
||||
"packs": "Packungen hinzufügen",
|
||||
"pillsToAdd": "Tabletten hinzufügen",
|
||||
"loosePills": "Lose Tabletten hinzufügen",
|
||||
"pillsPerPack": "1 Packung = {{count}} Tabletten",
|
||||
"addToStock": "Zum Bestand hinzufügen",
|
||||
@@ -466,6 +487,7 @@
|
||||
"editStock": {
|
||||
"title": "Bestand korrigieren",
|
||||
"hint": "Dies ist für die Korrektur von Bestandsabweichungen. Für normale Bestandsänderungen nutze 'Nachfüllen'.",
|
||||
"totalPills": "Gesamte Tabletten",
|
||||
"fullBlisters": "Volle Blister",
|
||||
"partialBlisterPills": "Angebrochener Blister",
|
||||
"pillsPerBlister": "(je {{count}} Tabletten)",
|
||||
|
||||
+41
-19
@@ -21,11 +21,11 @@
|
||||
"badge": "Stock watch",
|
||||
"noMeds": "No medications configured yet.",
|
||||
"allGood": "All good, enough stock.",
|
||||
"lowWarning": "Enough stock for now, but {{meds}} is running low.",
|
||||
"lowWarning_other": "Enough stock for now, but {{meds}} are running low.",
|
||||
"lowWarning": "Enough stock for now, but {{meds}} is running critically low.",
|
||||
"lowWarning_other": "Enough stock for now, but {{meds}} are running critically low.",
|
||||
"lowWarningPrefix": "Enough stock for now, but",
|
||||
"lowWarningSuffix": "is running low.",
|
||||
"lowWarningSuffix_other": "are running low.",
|
||||
"lowWarningSuffix": "is running critically low.",
|
||||
"lowWarningSuffix_other": "are running critically low.",
|
||||
"sendReminder": "🔔 Send Reminder Now"
|
||||
},
|
||||
"overview": {
|
||||
@@ -59,10 +59,11 @@
|
||||
"reminders": {
|
||||
"active": "Automatic reminders active",
|
||||
"status": "Status",
|
||||
"allStockOk": "All stock OK",
|
||||
"allOk": "All OK",
|
||||
"allStockOk": "All stock good",
|
||||
"allOk": "All good",
|
||||
"lastReminder": "Last intake reminder",
|
||||
"lastSent": "Last intake reminder",
|
||||
"lastStockSent": "Last stock reminder",
|
||||
"next": "Refill reminder",
|
||||
"nextIn": "Refill reminder",
|
||||
"inDays": "in {{days}} days",
|
||||
@@ -73,8 +74,8 @@
|
||||
"needRefill_other": "{{count}} meds need refill",
|
||||
"emptyStock": "{{count}} med is empty",
|
||||
"emptyStock_other": "{{count}} meds are empty",
|
||||
"lowWarning": "{{count}} medication running low",
|
||||
"lowWarning_other": "{{count}} medications running low",
|
||||
"lowWarning": "{{count}} medication running critically low",
|
||||
"lowWarning_other": "{{count}} medications running critically low",
|
||||
"waitingFirstCheck": "Waiting for first check",
|
||||
"type": "Type",
|
||||
"typeStock": "Stock",
|
||||
@@ -123,7 +124,9 @@
|
||||
"pillsPerBlister": "Pills per blister",
|
||||
"loose": "Loose",
|
||||
"total": "Total",
|
||||
"stock": "Stock"
|
||||
"stock": "Stock",
|
||||
"totalCapacity": "Capacity",
|
||||
"type": "Type"
|
||||
}
|
||||
},
|
||||
"form": {
|
||||
@@ -181,6 +184,7 @@
|
||||
"calculate": "Calculate",
|
||||
"calculating": "Calculating...",
|
||||
"sendEmail": "📧 Send via Email",
|
||||
"sendNotification": "🔔 Send Demand",
|
||||
"table": {
|
||||
"medication": "Medication",
|
||||
"usage": "Usage",
|
||||
@@ -229,25 +233,34 @@
|
||||
"intakeCheck": "Intake check",
|
||||
"15minBefore": "15 min before scheduled time",
|
||||
"nextCheck": "Next stock check",
|
||||
"lastSent": "Last sent",
|
||||
"lastSent": "Last notification sent",
|
||||
"lastStockSent": "Last stock reminder",
|
||||
"lastIntakeSent": "Last intake reminder",
|
||||
"envHint": "These values can be configured via REMINDER_HOUR and REMINDER_MINUTES_BEFORE in .env"
|
||||
},
|
||||
"stock": {
|
||||
"title": "Stock",
|
||||
"threshold": "Reminder Threshold",
|
||||
"remindWhen": "Remind when supply drops below",
|
||||
"repeatDaily": "Repeat daily",
|
||||
"repeatTooltip": "When enabled, sends reminders every day while stock is low. Otherwise, only notifies once per medication until restocked.",
|
||||
"calculationMode": "Stock Calculation",
|
||||
"automatic": "Automatic",
|
||||
"automaticDesc": "Stock automatically decreases based on schedule",
|
||||
"manual": "Manual",
|
||||
"manualDesc": "Stock only decreases when doses are marked as taken",
|
||||
"display": "Display",
|
||||
"lowStockDays": "Low Stock (days)",
|
||||
"lowStockTooltip": "Yellow warning color threshold",
|
||||
"highStockDays": "High Stock (days)",
|
||||
"highStockTooltip": "Green with star threshold"
|
||||
"thresholds": "Thresholds",
|
||||
"criticalStockDays": "Critical (days)",
|
||||
"criticalStockTooltip": "Stock below this value is critical and needs immediate attention",
|
||||
"lowStockDays": "Low (days)",
|
||||
"lowStockTooltip": "Stock below this value means you should reorder soon",
|
||||
"highStockDays": "High (days)",
|
||||
"highStockTooltip": "Stock above this value means you are well supplied",
|
||||
"thresholdValidation": "Values must be: Critical < Low < High",
|
||||
"shareStockStatus": "Show Stock on Shared Links",
|
||||
"shareStockStatusDesc": "Show stock status (Normal/Low/Critical) and colored borders on shared schedule links for intake users"
|
||||
},
|
||||
"stockReminder": {
|
||||
"title": "Stock Reminder",
|
||||
"description": "Sends notification when medication stock reaches",
|
||||
"repeatDaily": "Repeat daily",
|
||||
"repeatTooltip": "When enabled, sends reminders every day while stock is critical. Otherwise, only notifies once per medication until restocked."
|
||||
},
|
||||
"saveSettings": "Save Settings"
|
||||
},
|
||||
@@ -288,6 +301,7 @@
|
||||
"tooltips": {
|
||||
"intakeReminders": "Intake reminders enabled",
|
||||
"hasNotes": "Has notes",
|
||||
"stockExceedsCapacity": "Stock exceeds package capacity — consider updating pack count",
|
||||
"lightMode": "Switch to light mode",
|
||||
"darkMode": "Switch to dark mode"
|
||||
},
|
||||
@@ -348,6 +362,9 @@
|
||||
"common": {
|
||||
"loading": "Loading...",
|
||||
"sending": "Sending...",
|
||||
"sent": "Sent!",
|
||||
"sendFailed": "Failed to send",
|
||||
"networkError": "Network error",
|
||||
"saving": "Saving...",
|
||||
"unsavedChanges": {
|
||||
"title": "Unsaved Changes",
|
||||
@@ -386,6 +403,9 @@
|
||||
"fullBlisters": "full blisters",
|
||||
"inBlister": "in 1 blister",
|
||||
"total": "total",
|
||||
"pillsTotal": "{{count}} pills total",
|
||||
"pillsTotal_one": "{{count}} pill total",
|
||||
"pillsTotal_other": "{{count}} pills total",
|
||||
"max": "max"
|
||||
},
|
||||
"share": {
|
||||
@@ -450,6 +470,7 @@
|
||||
"refill": {
|
||||
"title": "Refill",
|
||||
"packs": "Packs to add",
|
||||
"pillsToAdd": "Pills to add",
|
||||
"loosePills": "Loose pills to add",
|
||||
"pillsPerPack": "1 pack = {{count}} pills",
|
||||
"addToStock": "Add to Stock",
|
||||
@@ -466,6 +487,7 @@
|
||||
"editStock": {
|
||||
"title": "Correct Stock",
|
||||
"hint": "This is for correcting stock discrepancies. For regular stock changes, use 'Refill'.",
|
||||
"totalPills": "Total pills",
|
||||
"fullBlisters": "Full blisters",
|
||||
"partialBlisterPills": "Partial blister",
|
||||
"pillsPerBlister": "({{count}} pills each)",
|
||||
|
||||
Reference in New Issue
Block a user