feat(frontend): add intake journal and shared note flows (#648)

* feat(backend): add intake journal APIs and share note support

* feat(frontend): add intake journal and shared note flows
This commit is contained in:
Daniel Volz
2026-05-24 14:00:30 +02:00
committed by GitHub
parent e4a1b449c6
commit c78fc43083
67 changed files with 5414 additions and 580 deletions
+113 -1
View File
@@ -102,6 +102,64 @@
"needsRefill": "Nachfüllen nötig"
}
},
"journal": {
"actions": {
"note": "Notiz",
"noteTakenOnly": "Notizen funktionieren nur für genommene oder uebersprungene Dosen.",
"history": "Journal-Verlauf",
"historyShort": "Journal"
},
"editor": {
"addTitle": "Journal-Notiz hinzufügen",
"editTitle": "Journal-Notiz bearbeiten",
"description": "Halte fest, was bei dieser Einnahme passiert ist, ohne den bestehenden Einnahme- oder Überspringen-Status zu ändern.",
"loading": "Journal-Eintrag wird geladen...",
"noteLabel": "Journal-Notiz",
"notePlaceholder": "Was möchtest du zu dieser Einnahme festhalten?",
"saving": "Speichern...",
"deleting": "Löschen..."
},
"history": {
"title": "Journal-Verlauf",
"description": "Durchsuche gespeicherte Einnahme-Notizen nach Medikament oder Zeitraum und öffne einen Eintrag erneut im Bearbeitungsmodus.",
"loading": "Journal-Verlauf wird geladen...",
"empty": "Keine Journal-Einträge passen zu den aktuellen Filtern.",
"noNote": "Keine Notiz gespeichert.",
"reload": "Neu laden",
"resetFilters": "Filter zurücksetzen",
"reopen": "Notiz erneut öffnen",
"updatedAt": "Aktualisiert {{date}}",
"filters": {
"medication": "Medikament",
"allMedications": "Alle Medikamente",
"from": "Von",
"to": "Bis",
"fromPlaceholder": "Startdatum",
"toPlaceholder": "Enddatum"
}
},
"context": {
"scheduledFor": "Geplant für",
"takenAt": "Eingenommen um",
"markedBy": "Markiert von",
"source": "Markiert ueber",
"sourceOwnerApp": "Haupt-App",
"sourceSharedLink": "Geteilter Einnahme-Link",
"sourceAutomaticReminder": "Automatische Erinnerungslogik",
"statusTaken": "Eingenommen",
"statusSkipped": "Übersprungen",
"notRecorded": "Nicht erfasst",
"self": "Du"
},
"errors": {
"loadFailed": "Der Journal-Eintrag konnte nicht geladen werden.",
"historyFailed": "Der Journal-Verlauf konnte nicht geladen werden.",
"saveFailed": "Die Journal-Notiz konnte nicht gespeichert werden.",
"deleteFailed": "Die Journal-Notiz konnte nicht gelöscht werden.",
"emptySharedNote": "Geteilte Links koennen Journal-Notizen nicht leeren. Gib eine Notiz ein oder schliesse den Dialog.",
"noEventSelected": "Es ist kein Journal-Eintrag ausgewählt."
}
},
"table": {
"name": "Name",
"pills": "Tabletten",
@@ -604,10 +662,16 @@
"deleteAccount": "Konto löschen",
"deleteAccountConfirmTitle": "Konto löschen?",
"deleteAccountConfirmText": "Dadurch werden dein Konto und alle deine Daten (Medikamente, Einstellungen, Verlauf) dauerhaft gelöscht. Diese Aktion kann nicht rückgängig gemacht werden.",
"deleteAccountButton": "Ja, mein Konto löschen"
"deleteAccountButton": "Ja, mein Konto löschen",
"connectionErrorTitle": "Verbindungsfehler",
"connectionErrorHelp": "Bitte prüfe, ob der Server läuft, und versuche es erneut.",
"sessionExpiredTitle": "Sitzung abgelaufen",
"sessionExpiredHelp": "Bitte melde dich erneut an, um mit deiner Besitzersitzung fortzufahren."
},
"common": {
"loading": "Wird geladen...",
"initializing": "Initialisierung...",
"retry": "Erneut versuchen",
"sending": "Wird gesendet...",
"sent": "Gesendet!",
"sendFailed": "Senden fehlgeschlagen",
@@ -632,6 +696,7 @@
"back": "Zurück",
"cancel": "Abbrechen",
"close": "Schließen",
"hide": "Ausblenden",
"edit": "Bearbeiten",
"view": "Ansehen",
"delete": "Löschen",
@@ -676,6 +741,13 @@
"allPeople": "Alle",
"selectPerson": "Person auswählen",
"selectPeriod": "Zeitraum auswählen",
"selectExpiry": "Link-Ablauf",
"allowJournalNotes": "Diesem geteilten Link das Anzeigen und Bearbeiten von Journal-Notizen erlauben",
"journalNotesEnabled": "Journal anzeigen/bearbeiten erlaubt",
"expiryNever": "Laeuft nicht ab",
"expiry7Days": "Laeuft in 7 Tagen ab",
"expiry30Days": "Laeuft in 30 Tagen ab",
"expiry90Days": "Laeuft in 90 Tagen ab",
"generateLink": "Link generieren",
"generating": "Wird generiert...",
"generateAnother": "Weiteren Link generieren",
@@ -685,9 +757,21 @@
"copyLink": "Link kopieren",
"copyOverviewLink": "Übersichts-Link kopieren",
"copied": "In Zwischenablage kopiert!",
"activeLinksTitle": "Aktive Teilen-Links",
"loadingActiveLinks": "Aktive Teilen-Links werden geladen...",
"noActiveLinks": "Noch keine aktiven Teilen-Links.",
"manageLinksSummary": "Aktive Teilen-Links verwalten",
"generateFailed": "Freigabelink konnte nicht erstellt werden",
"revokeFailed": "Freigabelink konnte nicht widerrufen werden",
"activeLinkMeta": "{{days}} Tage, erstellt {{createdAt}}",
"activeLinkMetaWithExpiry": "{{days}} Tage, erstellt {{createdAt}}, Ablauf {{expiresAt}}",
"revoke": "Widerrufen",
"revoking": "Wird widerrufen...",
"revokeConfirm": "Den aktiven Teilen-Link fuer {{person}} widerrufen?",
"noPeople": "Keine Medikamente mit 'Eingenommen von' zugewiesen. Füge zuerst eine Person zu einem Medikament hinzu.",
"scheduleFor": "Zeitplan für",
"period": "Zeitraum",
"publicAccessHelp": "Dieser Teilen-Link zeigt nur den ausgewaehlten Zeitplan und geteilte Dosisaktionen. Einstellungen und voller Kontozugriff bleiben in der Haupt-App.",
"noSchedule": "Keine geplanten Einnahmen gefunden.",
"generatedBy": "Erstellt von",
"notFound": "Teilen-Link nicht gefunden",
@@ -755,6 +839,24 @@
"confirmImportEmpty": "Daten importieren?",
"confirmImportEmptyMessage": "Alle Medikamente, Einnahmehistorie, Einstellungen und Teilen-Links aus der ausgewählten Datei werden importiert.",
"confirmButtonEmpty": "Importieren",
"reviewDescription": "Prüfe den validierten Sicherungsinhalt, bevor deine aktuellen Installationsdaten ersetzt werden.",
"reviewDescriptionEmpty": "Prüfe den validierten Sicherungsinhalt, bevor er in diese Installation importiert wird.",
"incomingData": "Importdatei",
"currentData": "Aktuelle Daten",
"summaryCounts": "{{medications}} Medikamente, {{doses}} Dosen, {{refills}} Nachfüllungen, {{shares}} Teilen-Links",
"formatVersion": "Formatversion: {{version}}",
"exportedAt": "Exportiert am: {{date}}",
"settingsIncluded": "Einstellungen enthalten",
"settingsConfigured": "Einstellungen aktuell konfiguriert",
"journalEntries": "{{count}} Journaleinträge",
"imageCount": "{{count}} eingebettete Bilder",
"warningListTitle": "Warnungen",
"warningReplaceData": "Deine aktuellen Medikamente, die Einnahmehistorie, Einstellungen und Teilen-Links werden ersetzt.",
"warningShareLinks": "Importierte Teilen-Links erhalten beim Wiederherstellen aus Sicherheitsgründen neue Tokens.",
"warningImages": "Eingebettete Bilder vergrößern den Import und können die Wiederherstellung verlängern.",
"warningSensitive": "Diese Sicherung enthält sensible Benachrichtigungsdaten.",
"backupFirst": "Aktuelle Sicherung zuerst herunterladen",
"backupHint": "Empfohlen: exportiere zuerst deine aktuellen Daten, bevor du den Import bestätigst.",
"cancelButton": "Abbrechen",
"exportSuccess": "Daten erfolgreich exportiert",
"importSuccess": "Daten erfolgreich importiert",
@@ -836,6 +938,9 @@
"button": "Bericht",
"title": "Medikamentenbericht",
"description": "Erstelle ein Dokument mit detaillierten Medikamenteninformationen für deinen Arzt oder deine persönlichen Unterlagen.",
"dateRange": "Zeitraum",
"from": "Von",
"until": "Bis",
"selectAll": "Alle auswählen",
"deselectAll": "Alle abwählen",
"activeMeds": "Aktive Medikamente",
@@ -845,12 +950,19 @@
"formatMd": "Markdown (.md)",
"formatPdf": "PDF (Drucken)",
"generate": "Erstellen",
"regenerate": "Vorschau aktualisieren",
"generating": "Wird erstellt...",
"download": "Herunterladen",
"preview": "Vorschau",
"previewDescription": "Prüfe den generierten Bericht vor dem Export.",
"invalidDateRange": "Wähle einen gültigen Zeitraum.",
"error": "Der Bericht konnte nicht erstellt werden. Bitte versuche es erneut.",
"noSelection": "Wähle mindestens ein Medikament aus",
"filterByPerson": "Bericht für",
"allPeople": "Alle Personen",
"docTitle": "Medikamentenbericht",
"docGenerated": "Erstellt am",
"docRange": "Berichtszeitraum",
"docGeneral": "Allgemein",
"docCommercialName": "Handelsname",
"docGenericName": "Wirkstoff",
+113 -1
View File
@@ -102,6 +102,64 @@
"needsRefill": "Needs refill"
}
},
"journal": {
"actions": {
"note": "Note",
"noteTakenOnly": "Notes are only available for taken or skipped doses.",
"history": "Journal history",
"historyShort": "Journal"
},
"editor": {
"addTitle": "Add journal note",
"editTitle": "Edit journal note",
"description": "Capture what happened for this intake without changing the existing take or skip status.",
"loading": "Loading journal entry...",
"noteLabel": "Journal note",
"notePlaceholder": "What should you remember about this intake?",
"saving": "Saving...",
"deleting": "Deleting..."
},
"history": {
"title": "Journal history",
"description": "Browse saved intake notes by medication or date, then reopen an entry in edit mode.",
"loading": "Loading journal history...",
"empty": "No journal entries match the current filters.",
"noNote": "No note saved.",
"reload": "Reload",
"resetFilters": "Reset filters",
"reopen": "Reopen note",
"updatedAt": "Updated {{date}}",
"filters": {
"medication": "Medication",
"allMedications": "All medications",
"from": "From",
"to": "To",
"fromPlaceholder": "Start date",
"toPlaceholder": "End date"
}
},
"context": {
"scheduledFor": "Scheduled for",
"takenAt": "Taken at",
"markedBy": "Marked by",
"source": "Marked via",
"sourceOwnerApp": "Main app",
"sourceSharedLink": "Shared intake link",
"sourceAutomaticReminder": "Automatic reminder logic",
"statusTaken": "Taken",
"statusSkipped": "Skipped",
"notRecorded": "Not recorded",
"self": "You"
},
"errors": {
"loadFailed": "Journal entry could not be loaded.",
"historyFailed": "Journal history could not be loaded.",
"saveFailed": "Journal note could not be saved.",
"deleteFailed": "Journal note could not be deleted.",
"emptySharedNote": "Shared links cannot clear journal notes. Enter a note or close the dialog.",
"noEventSelected": "No journal entry is selected."
}
},
"table": {
"name": "Name",
"pills": "Pills",
@@ -604,10 +662,16 @@
"deleteAccount": "Delete Account",
"deleteAccountConfirmTitle": "Delete Account?",
"deleteAccountConfirmText": "This will permanently delete your account and all your data (medications, settings, history). This action cannot be undone.",
"deleteAccountButton": "Yes, delete my account"
"deleteAccountButton": "Yes, delete my account",
"connectionErrorTitle": "Connection Error",
"connectionErrorHelp": "Please check if the server is running and try again.",
"sessionExpiredTitle": "Session expired",
"sessionExpiredHelp": "Please sign in again to continue your owner session."
},
"common": {
"loading": "Loading...",
"initializing": "Initializing...",
"retry": "Retry",
"sending": "Sending...",
"sent": "Sent!",
"sendFailed": "Failed to send",
@@ -632,6 +696,7 @@
"back": "Back",
"cancel": "Cancel",
"close": "Close",
"hide": "Hide",
"edit": "Edit",
"view": "View",
"delete": "Delete",
@@ -676,6 +741,13 @@
"allPeople": "Everyone",
"selectPerson": "Select person",
"selectPeriod": "Select time period",
"selectExpiry": "Link expiry",
"allowJournalNotes": "Allow this shared link to view and edit journal notes",
"journalNotesEnabled": "Journal view/edit enabled",
"expiryNever": "Never expires",
"expiry7Days": "Expires in 7 days",
"expiry30Days": "Expires in 30 days",
"expiry90Days": "Expires in 90 days",
"generateLink": "Generate Link",
"generating": "Generating...",
"generateAnother": "Generate another link",
@@ -685,9 +757,21 @@
"copyLink": "Copy Link",
"copyOverviewLink": "Copy Overview Link",
"copied": "Copied to clipboard!",
"activeLinksTitle": "Active share links",
"loadingActiveLinks": "Loading active share links...",
"noActiveLinks": "No active share links yet.",
"manageLinksSummary": "Manage active share links",
"generateFailed": "Failed to generate share link",
"revokeFailed": "Failed to revoke share link",
"activeLinkMeta": "{{days}} days, created {{createdAt}}",
"activeLinkMetaWithExpiry": "{{days}} days, created {{createdAt}}, expires {{expiresAt}}",
"revoke": "Revoke",
"revoking": "Revoking...",
"revokeConfirm": "Revoke the active share link for {{person}}?",
"noPeople": "No medications with 'Taken by' assigned. Add a person to a medication first.",
"scheduleFor": "Schedule for",
"period": "Period",
"publicAccessHelp": "This shared link only exposes the selected schedule and shared dose actions. Owner settings and full account access stay in the main app.",
"noSchedule": "No scheduled doses found.",
"generatedBy": "Generated by",
"notFound": "Share link not found",
@@ -755,6 +839,24 @@
"confirmImportEmpty": "Import Data?",
"confirmImportEmptyMessage": "This will import all medications, dose history, settings, and share links from the selected file.",
"confirmButtonEmpty": "Import",
"reviewDescription": "Review the validated backup contents before replacing your current installation data.",
"reviewDescriptionEmpty": "Review the validated backup contents before importing them into this installation.",
"incomingData": "Import file",
"currentData": "Current data",
"summaryCounts": "{{medications}} medications, {{doses}} doses, {{refills}} refills, {{shares}} share links",
"formatVersion": "Format version: {{version}}",
"exportedAt": "Exported at: {{date}}",
"settingsIncluded": "Settings included",
"settingsConfigured": "Settings currently configured",
"journalEntries": "{{count}} journal entries",
"imageCount": "{{count}} embedded images",
"warningListTitle": "Warnings",
"warningReplaceData": "Your current medications, dose history, settings, and share links will be replaced.",
"warningShareLinks": "Imported share links will get new tokens during restore for security.",
"warningImages": "Embedded images increase import size and may take longer to restore.",
"warningSensitive": "This backup includes sensitive notification data.",
"backupFirst": "Download current backup first",
"backupHint": "Recommended: export your current data before confirming the import.",
"cancelButton": "Cancel",
"exportSuccess": "Data exported successfully",
"importSuccess": "Data imported successfully",
@@ -836,6 +938,9 @@
"button": "Report",
"title": "Medication Report",
"description": "Generate a document with detailed medication information for your doctor or personal records.",
"dateRange": "Date range",
"from": "From",
"until": "Until",
"selectAll": "Select all",
"deselectAll": "Deselect all",
"activeMeds": "Active Medications",
@@ -845,12 +950,19 @@
"formatMd": "Markdown (.md)",
"formatPdf": "PDF (Print)",
"generate": "Generate",
"regenerate": "Refresh preview",
"generating": "Generating...",
"download": "Download",
"preview": "Preview",
"previewDescription": "Review the generated report before exporting it.",
"invalidDateRange": "Choose a valid date range.",
"error": "Could not generate the report. Please try again.",
"noSelection": "Select at least one medication",
"filterByPerson": "Report for",
"allPeople": "Everyone",
"docTitle": "Medication Report",
"docGenerated": "Generated on",
"docRange": "Report range",
"docGeneral": "General",
"docCommercialName": "Commercial Name",
"docGenericName": "Generic Name",