From bf58d5d0b3ee2fd824b5d5616292618e8b713e23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Bombeck?= Date: Fri, 26 Jun 2026 12:26:09 +0200 Subject: [PATCH] feat(ui): render date inputs in the user's date-format preference Swap the medication scheduling, inventory, illness, vorsorge, lab-OCR and profile-birthdate date inputs from the native field to the DateField primitive, which paints the chosen DMY/MDY/YMD/AUTO order over an ISO yyyy-MM-dd value. The committed value contract, min/max bounds and aria wiring are unchanged. --- src/components/illness/log-day-sheet.tsx | 8 ++++---- src/components/illness/new-episode-sheet.tsx | 6 +++--- src/components/labs/ocr-row-editor.tsx | 8 +++----- .../vorsorge-section.tsx | 8 ++++---- .../medications/scheduling/cadence-picker.tsx | 7 +++---- .../scheduling/course-window-row.tsx | 19 +++++++++---------- .../sections/inventory-section.tsx | 7 +++---- .../settings/account-section/index.tsx | 6 +++--- 8 files changed, 32 insertions(+), 37 deletions(-) diff --git a/src/components/illness/log-day-sheet.tsx b/src/components/illness/log-day-sheet.tsx index 19319ee94..1f6a740e8 100644 --- a/src/components/illness/log-day-sheet.tsx +++ b/src/components/illness/log-day-sheet.tsx @@ -19,6 +19,7 @@ import { Activity, CalendarDays, NotebookPen, Thermometer } from "lucide-react"; import { ResponsiveSheet } from "@/components/ui/responsive-sheet"; import { SheetSection, SheetSectionCount } from "@/components/ui/sheet-section"; import { Button } from "@/components/ui/button"; +import { DateField } from "@/components/ui/date-field"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; @@ -266,14 +267,13 @@ export function LogDaySheet({ - { - if (e.target.value) setSelectedDate(e.target.value); + onChange={(value) => { + if (value) setSelectedDate(value); }} className="max-w-44" /> diff --git a/src/components/illness/new-episode-sheet.tsx b/src/components/illness/new-episode-sheet.tsx index a93d61480..0334548b3 100644 --- a/src/components/illness/new-episode-sheet.tsx +++ b/src/components/illness/new-episode-sheet.tsx @@ -10,6 +10,7 @@ import { useState } from "react"; import { ResponsiveSheet } from "@/components/ui/responsive-sheet"; import { Button } from "@/components/ui/button"; +import { DateField } from "@/components/ui/date-field"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; @@ -230,12 +231,11 @@ export function NewEpisodeSheet({
- setOnset(e.target.value)} + onChange={setOnset} className="max-w-44" />
diff --git a/src/components/labs/ocr-row-editor.tsx b/src/components/labs/ocr-row-editor.tsx index 640ff96bf..f3838308d 100644 --- a/src/components/labs/ocr-row-editor.tsx +++ b/src/components/labs/ocr-row-editor.tsx @@ -25,6 +25,7 @@ import { import { Badge } from "@/components/ui/badge"; import { Checkbox } from "@/components/ui/checkbox"; +import { DateField } from "@/components/ui/date-field"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { useTranslations } from "@/lib/i18n/context"; @@ -178,13 +179,10 @@ export function OcrRowEditor({ - - onChange({ ...row, takenAt: e.target.value || null }) - } + onChange={(value) => onChange({ ...row, takenAt: value || null })} /> diff --git a/src/components/measurement-reminders/vorsorge-section.tsx b/src/components/measurement-reminders/vorsorge-section.tsx index b1a68df33..280702666 100644 --- a/src/components/measurement-reminders/vorsorge-section.tsx +++ b/src/components/measurement-reminders/vorsorge-section.tsx @@ -64,6 +64,7 @@ import { DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; +import { DateField } from "@/components/ui/date-field"; import { EmptyState } from "@/components/ui/empty-state"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; @@ -598,12 +599,11 @@ export function VorsorgeSection({ - - setForm((f) => ({ ...f, anchorDate: e.target.value })) + onChange={(value) => + setForm((f) => ({ ...f, anchorDate: value })) } /> diff --git a/src/components/medications/scheduling/cadence-picker.tsx b/src/components/medications/scheduling/cadence-picker.tsx index aac443d72..4a4271e0b 100644 --- a/src/components/medications/scheduling/cadence-picker.tsx +++ b/src/components/medications/scheduling/cadence-picker.tsx @@ -49,6 +49,7 @@ import { useCallback, useId, useMemo } from "react"; +import { DateField } from "@/components/ui/date-field"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { useTranslations } from "@/lib/i18n/context"; @@ -602,13 +603,11 @@ function YearlyDate({ - onChange(e.target.value)} - className="h-11" + onChange={onChange} data-slot="cadence-yearly-date" /> diff --git a/src/components/medications/scheduling/course-window-row.tsx b/src/components/medications/scheduling/course-window-row.tsx index aaad105bd..4ec9f91c1 100644 --- a/src/components/medications/scheduling/course-window-row.tsx +++ b/src/components/medications/scheduling/course-window-row.tsx @@ -25,7 +25,7 @@ import { useCallback, useId, useMemo } from "react"; -import { Input } from "@/components/ui/input"; +import { DateField } from "@/components/ui/date-field"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; import { useTranslations } from "@/lib/i18n/context"; @@ -135,15 +135,15 @@ export function CourseWindowRow({ - onStartsChange(e.target.value)} - className="h-11 w-full" + onChange={onStartsChange} + className="w-full" aria-label={t(`${i18nPrefix}.startsOn.label`)} data-slot="course-window-starts" + data-testid="course-window-starts-field" /> @@ -152,17 +152,16 @@ export function CourseWindowRow({ - onEndsChange(e.target.value)} - className="h-11 w-full" + onChange={onEndsChange} + className="w-full" aria-label={t(`${i18nPrefix}.endsOn.label`)} aria-invalid={!valid || undefined} data-slot="course-window-ends" + data-testid="course-window-ends-field" /> {lockEndsToStart && (

{t("medications.detail.bestand.addExpiryLabel")} - setExpiry(e.target.value)} + onChange={setExpiry} /> diff --git a/src/components/settings/account-section/index.tsx b/src/components/settings/account-section/index.tsx index 57c68ce83..4fc5df757 100644 --- a/src/components/settings/account-section/index.tsx +++ b/src/components/settings/account-section/index.tsx @@ -13,7 +13,7 @@ import { DialogTitle, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; -import { DateInput } from "@/components/ui/date-input"; +import { DateField } from "@/components/ui/date-field"; import { Label } from "@/components/ui/label"; import { NativeSelect } from "@/components/ui/native-select"; import { PasswordInput } from "@/components/ui/password-input"; @@ -373,10 +373,10 @@ export function AccountSection() {

- setDateOfBirth(e.target.value)} + onChange={setDateOfBirth} max={new Date().toISOString().slice(0, 10)} />