feat(vaccinations): add the dose capture and edit form

- one sheet for create and edit, saving with a date and one identity arm
  (catalogue pick or free text); nothing else can block the save
- catalogue picker searches localised names and generic synonyms over the
  static antigen list, never overwriting the free-text arm
- optional dose/series, lot, site, practice combobox, visit suggestion and
  note, all reusing the encounter-form primitives
- write hooks fan out through the dose dependent-keys and the reminder reads
- form/site/sheet copy in six locales
This commit is contained in:
Marc-André Bombeck committed 2026-08-08 20:40:40 +02:00
1 parent 1d07204293
commit ff72917833
14 files changed
+1056 -13

No files matched your search

+37
View File
@@ -8527,6 +8527,43 @@
"row": {
"lot": "Charge {lot}"
},
"form": {
"date": "Datum",
"catalogLabel": "Impfstoff (Katalog)",
"identityHint": "Katalog wählen oder unten frei eintragen — eins genügt.",
"catalogNone": "Impfstoff wählen",
"catalogSearch": "Impfstoff suchen",
"catalogNoMatch": "Kein Katalogeintrag gefunden",
"catalogClear": "Auswahl entfernen",
"freeTextLabel": "Freitext",
"freeTextPlaceholder": "wie im Impfpass angegeben",
"seriesToggle": "Serie angeben",
"doseNumber": "Dosis-Nr.",
"seriesDoses": "Dosen in Serie",
"lot": "Chargennummer",
"site": "Impfstelle",
"siteNone": "Keine Angabe",
"practitioner": "Praxis / Arzt",
"note": "Notiz"
},
"site": {
"LEFT_ARM": "Linker Oberarm",
"RIGHT_ARM": "Rechter Oberarm",
"LEFT_THIGH": "Linker Oberschenkel",
"RIGHT_THIGH": "Rechter Oberschenkel",
"ORAL": "Oral",
"NASAL": "Nasal",
"OTHER": "Andere"
},
"createTitle": "Impfung erfassen",
"editTitle": "Impfung bearbeiten",
"formDescription": "Datum und Impfstoff genügen; alles andere ist optional.",
"created": "Impfung gespeichert",
"updated": "Impfung aktualisiert",
"saveFailed": "Impfung konnte nicht gespeichert werden.",
"deleteTitle": "Impfung löschen?",
"deleteDescription": "Der Eintrag wird aus deinem Impfpass entfernt. Ein geplanter Auffrischungs-Reminder bleibt bestehen.",
"deleteFailed": "Impfung konnte nicht gelöscht werden.",
"empty": {
"title": "Noch keine Impfung erfasst",
"description": "Übertrage deinen Impfpass Zeile für Zeile — Datum und Impfstoff genügen."
+37
View File
@@ -8527,6 +8527,43 @@
"row": {
"lot": "Lot {lot}"
},
"form": {
"date": "Date",
"catalogLabel": "Vaccine (catalogue)",
"identityHint": "Pick from the catalogue or type it in below — either is enough.",
"catalogNone": "Choose a vaccine",
"catalogSearch": "Search vaccines",
"catalogNoMatch": "No catalogue entry found",
"catalogClear": "Clear selection",
"freeTextLabel": "Free text",
"freeTextPlaceholder": "as written on the record",
"seriesToggle": "Add series details",
"doseNumber": "Dose no.",
"seriesDoses": "Doses in series",
"lot": "Lot number",
"site": "Injection site",
"siteNone": "Not specified",
"practitioner": "Practice / doctor",
"note": "Note"
},
"site": {
"LEFT_ARM": "Left upper arm",
"RIGHT_ARM": "Right upper arm",
"LEFT_THIGH": "Left thigh",
"RIGHT_THIGH": "Right thigh",
"ORAL": "Oral",
"NASAL": "Nasal",
"OTHER": "Other"
},
"createTitle": "Log a vaccination",
"editTitle": "Edit vaccination",
"formDescription": "A date and the vaccine are enough; everything else is optional.",
"created": "Vaccination saved",
"updated": "Vaccination updated",
"saveFailed": "The vaccination could not be saved.",
"deleteTitle": "Delete this vaccination?",
"deleteDescription": "The entry is removed from your record. A planned booster reminder stays.",
"deleteFailed": "The vaccination could not be deleted.",
"empty": {
"title": "No vaccination logged yet",
"description": "Transcribe your vaccination card line by line — a date and the vaccine are enough."
+37
View File
@@ -8527,6 +8527,43 @@
"row": {
"lot": "Lote {lot}"
},
"form": {
"date": "Fecha",
"catalogLabel": "Vacuna (catálogo)",
"identityHint": "Elige del catálogo o escríbela abajo: basta con una.",
"catalogNone": "Elegir una vacuna",
"catalogSearch": "Buscar vacunas",
"catalogNoMatch": "No se encontró ninguna entrada del catálogo",
"catalogClear": "Quitar selección",
"freeTextLabel": "Texto libre",
"freeTextPlaceholder": "tal como figura en la cartilla",
"seriesToggle": "Añadir datos de la serie",
"doseNumber": "N.º de dosis",
"seriesDoses": "Dosis en la serie",
"lot": "Número de lote",
"site": "Lugar de aplicación",
"siteNone": "Sin especificar",
"practitioner": "Consulta / médico",
"note": "Nota"
},
"site": {
"LEFT_ARM": "Brazo izquierdo",
"RIGHT_ARM": "Brazo derecho",
"LEFT_THIGH": "Muslo izquierdo",
"RIGHT_THIGH": "Muslo derecho",
"ORAL": "Oral",
"NASAL": "Nasal",
"OTHER": "Otro"
},
"createTitle": "Registrar una vacuna",
"editTitle": "Editar vacuna",
"formDescription": "Bastan una fecha y la vacuna; todo lo demás es opcional.",
"created": "Vacuna guardada",
"updated": "Vacuna actualizada",
"saveFailed": "No se pudo guardar la vacuna.",
"deleteTitle": "¿Eliminar esta vacuna?",
"deleteDescription": "La entrada se elimina de tu registro. Un recordatorio de refuerzo programado se mantiene.",
"deleteFailed": "No se pudo eliminar la vacuna.",
"empty": {
"title": "Aún no hay ninguna vacuna registrada",
"description": "Transcribe tu cartilla de vacunación línea por línea: bastan una fecha y la vacuna."
+37
View File
@@ -8527,6 +8527,43 @@
"row": {
"lot": "Lot {lot}"
},
"form": {
"date": "Date",
"catalogLabel": "Vaccin (catalogue)",
"identityHint": "Choisissez dans le catalogue ou saisissez ci-dessous : l'un suffit.",
"catalogNone": "Choisir un vaccin",
"catalogSearch": "Rechercher des vaccins",
"catalogNoMatch": "Aucune entrée du catalogue trouvée",
"catalogClear": "Effacer la sélection",
"freeTextLabel": "Texte libre",
"freeTextPlaceholder": "comme indiqué sur le carnet",
"seriesToggle": "Ajouter les détails de la série",
"doseNumber": "N° de dose",
"seriesDoses": "Doses dans la série",
"lot": "Numéro de lot",
"site": "Site d'injection",
"siteNone": "Non précisé",
"practitioner": "Cabinet / médecin",
"note": "Note"
},
"site": {
"LEFT_ARM": "Bras gauche",
"RIGHT_ARM": "Bras droit",
"LEFT_THIGH": "Cuisse gauche",
"RIGHT_THIGH": "Cuisse droite",
"ORAL": "Oral",
"NASAL": "Nasal",
"OTHER": "Autre"
},
"createTitle": "Enregistrer une vaccination",
"editTitle": "Modifier la vaccination",
"formDescription": "Une date et le vaccin suffisent ; tout le reste est facultatif.",
"created": "Vaccination enregistrée",
"updated": "Vaccination mise à jour",
"saveFailed": "La vaccination n'a pas pu être enregistrée.",
"deleteTitle": "Supprimer cette vaccination ?",
"deleteDescription": "L'entrée est retirée de votre carnet. Un rappel programmé est conservé.",
"deleteFailed": "La vaccination n'a pas pu être supprimée.",
"empty": {
"title": "Aucune vaccination enregistrée",
"description": "Recopiez votre carnet de vaccination ligne par ligne : une date et le vaccin suffisent."
+37
View File
@@ -8527,6 +8527,43 @@
"row": {
"lot": "Lotto {lot}"
},
"form": {
"date": "Data",
"catalogLabel": "Vaccino (catalogo)",
"identityHint": "Scegli dal catalogo o scrivilo sotto: ne basta uno.",
"catalogNone": "Scegli un vaccino",
"catalogSearch": "Cerca vaccini",
"catalogNoMatch": "Nessuna voce del catalogo trovata",
"catalogClear": "Rimuovi selezione",
"freeTextLabel": "Testo libero",
"freeTextPlaceholder": "come indicato sul libretto",
"seriesToggle": "Aggiungi dettagli della serie",
"doseNumber": "N. dose",
"seriesDoses": "Dosi nella serie",
"lot": "Numero di lotto",
"site": "Sede di iniezione",
"siteNone": "Non specificato",
"practitioner": "Studio / medico",
"note": "Nota"
},
"site": {
"LEFT_ARM": "Braccio sinistro",
"RIGHT_ARM": "Braccio destro",
"LEFT_THIGH": "Coscia sinistra",
"RIGHT_THIGH": "Coscia destra",
"ORAL": "Orale",
"NASAL": "Nasale",
"OTHER": "Altro"
},
"createTitle": "Registra una vaccinazione",
"editTitle": "Modifica vaccinazione",
"formDescription": "Bastano una data e il vaccino; tutto il resto è facoltativo.",
"created": "Vaccinazione salvata",
"updated": "Vaccinazione aggiornata",
"saveFailed": "Impossibile salvare la vaccinazione.",
"deleteTitle": "Eliminare questa vaccinazione?",
"deleteDescription": "La voce viene rimossa dal tuo libretto. Un promemoria di richiamo programmato rimane.",
"deleteFailed": "Impossibile eliminare la vaccinazione.",
"empty": {
"title": "Nessuna vaccinazione registrata",
"description": "Trascrivi il tuo libretto vaccinale riga per riga: bastano una data e il vaccino."
+37
View File
@@ -8527,6 +8527,43 @@
"row": {
"lot": "Seria {lot}"
},
"form": {
"date": "Data",
"catalogLabel": "Szczepionka (katalog)",
"identityHint": "Wybierz z katalogu lub wpisz poniżej — wystarczy jedno.",
"catalogNone": "Wybierz szczepionkę",
"catalogSearch": "Szukaj szczepionek",
"catalogNoMatch": "Nie znaleziono wpisu w katalogu",
"catalogClear": "Wyczyść wybór",
"freeTextLabel": "Tekst dowolny",
"freeTextPlaceholder": "jak podano w karcie szczepień",
"seriesToggle": "Dodaj szczegóły serii",
"doseNumber": "Nr dawki",
"seriesDoses": "Dawki w serii",
"lot": "Numer serii",
"site": "Miejsce podania",
"siteNone": "Nie podano",
"practitioner": "Gabinet / lekarz",
"note": "Notatka"
},
"site": {
"LEFT_ARM": "Lewe ramię",
"RIGHT_ARM": "Prawe ramię",
"LEFT_THIGH": "Lewe udo",
"RIGHT_THIGH": "Prawe udo",
"ORAL": "Doustnie",
"NASAL": "Donosowo",
"OTHER": "Inne"
},
"createTitle": "Zarejestruj szczepienie",
"editTitle": "Edytuj szczepienie",
"formDescription": "Wystarczą data i szczepionka; cała reszta jest opcjonalna.",
"created": "Szczepienie zapisane",
"updated": "Szczepienie zaktualizowane",
"saveFailed": "Nie udało się zapisać szczepienia.",
"deleteTitle": "Usunąć to szczepienie?",
"deleteDescription": "Wpis zostanie usunięty z Twojej karty. Zaplanowane przypomnienie o dawce przypominającej pozostaje.",
"deleteFailed": "Nie udało się usunąć szczepienia.",
"empty": {
"title": "Nie zarejestrowano jeszcze żadnego szczepienia",
"description": "Przepisz swoją kartę szczepień wiersz po wierszu — wystarczą data i szczepionka."