diff --git a/messages/de.json b/messages/de.json index c781e36c6..74202e7b6 100644 --- a/messages/de.json +++ b/messages/de.json @@ -740,7 +740,8 @@ "invalidRange": "Das Enddatum muss am oder nach dem Startdatum liegen." }, "oneShot": { - "section": "Einmaldosis" + "section": "Einmaldosis", + "collapseWarning": "Einmaldosis aktiv — alle weiteren Pläne wurden auf den ersten zusammengeführt." }, "legacyWindow": { "section": "Erinnerungsfenster (alt)", diff --git a/messages/en.json b/messages/en.json index cc0d2ddc7..0fb78fa1a 100644 --- a/messages/en.json +++ b/messages/en.json @@ -740,7 +740,8 @@ "invalidRange": "End date must be on or after the start date." }, "oneShot": { - "section": "Single dose" + "section": "Single dose", + "collapseWarning": "Single dose enabled — every other schedule was merged into the first." }, "legacyWindow": { "section": "Reminder window (legacy)", diff --git a/messages/es.json b/messages/es.json index dd2584254..1c8d81c3c 100644 --- a/messages/es.json +++ b/messages/es.json @@ -740,7 +740,8 @@ "invalidRange": "End date must be on or after the start date." }, "oneShot": { - "section": "Single dose" + "section": "Single dose", + "collapseWarning": "Single dose enabled — every other schedule was merged into the first." }, "legacyWindow": { "section": "Reminder window (legacy)", diff --git a/messages/fr.json b/messages/fr.json index c218116a1..498bf2702 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -740,7 +740,8 @@ "invalidRange": "End date must be on or after the start date." }, "oneShot": { - "section": "Single dose" + "section": "Single dose", + "collapseWarning": "Single dose enabled — every other schedule was merged into the first." }, "legacyWindow": { "section": "Reminder window (legacy)", diff --git a/messages/it.json b/messages/it.json index d9e1c5777..22bfe173c 100644 --- a/messages/it.json +++ b/messages/it.json @@ -740,7 +740,8 @@ "invalidRange": "End date must be on or after the start date." }, "oneShot": { - "section": "Single dose" + "section": "Single dose", + "collapseWarning": "Single dose enabled — every other schedule was merged into the first." }, "legacyWindow": { "section": "Reminder window (legacy)", diff --git a/messages/pl.json b/messages/pl.json index 9617ff810..825378b9a 100644 --- a/messages/pl.json +++ b/messages/pl.json @@ -740,7 +740,8 @@ "invalidRange": "End date must be on or after the start date." }, "oneShot": { - "section": "Single dose" + "section": "Single dose", + "collapseWarning": "Single dose enabled — every other schedule was merged into the first." }, "legacyWindow": { "section": "Reminder window (legacy)", diff --git a/src/components/medications/medication-form.tsx b/src/components/medications/medication-form.tsx index ce5f81350..502021f1a 100644 --- a/src/components/medications/medication-form.tsx +++ b/src/components/medications/medication-form.tsx @@ -70,10 +70,28 @@ import { } from "@/components/medications/scheduling/TimesOfDayChips"; import { CourseWindowRow } from "@/components/medications/scheduling/CourseWindowRow"; import { + type CadenceKind, type CadenceSubControls, type CadenceValue, DEFAULT_SUB_CONTROLS, } from "@/components/medications/scheduling/types"; + +/** + * Cadence kinds the schedule-level picker exposes when the + * medication-level `oneShot` switch is off. `"oneShot"` lives on the + * medication-level switch above; surfacing it on the per-schedule + * picker would invite a contradictory shape (`oneShot = false` at the + * medication level + `cadence.kind = "oneShot"` on a schedule). + */ +const RECURRING_CADENCE_KINDS: readonly CadenceKind[] = [ + "daily", + "weekdays", + "everyNWeeks", + "monthly", + "everyNMonths", + "yearly", + "rolling", +]; import { inferCadenceFromLegacy, legacyPairFromCadence, @@ -860,9 +878,15 @@ export function MedicationForm({ onCheckedChange={(checked) => { setOneShot(checked); if (checked) { - // One-shot ⇒ collapse to a single schedule with one - // timesOfDay entry and no cadence; the picker stays - // hidden under `!oneShot` below. + // Flipping into one-shot collapses to a single + // schedule with one timesOfDay entry. Warn the user + // when this would drop additional schedules so the + // collapse stops being a silent data loss. + if (schedules.length > 1) { + toast.warning( + t("medications.scheduling.oneShot.collapseWarning"), + ); + } setSchedules((prev) => { const head = prev[0] ?? { ...DEFAULT_SCHEDULE }; const singleTime = @@ -998,6 +1022,7 @@ export function MedicationForm({ patchSchedule(i, { cadence: nextValue,