diff --git a/frontend/src/lib/utils.ts b/frontend/src/lib/utils.ts index 8b4fe98d..51ca79f9 100644 --- a/frontend/src/lib/utils.ts +++ b/frontend/src/lib/utils.ts @@ -1,20 +1 @@ -/** - * Converts an ISO date string (YYYY-MM-DD) to German display format (DD.MM.YYYY). - * Returns an empty string for invalid or empty input. - */ -export function isoToGerman(iso: string): string { - if (!iso || !/^\d{4}-\d{2}-\d{2}$/.test(iso)) return ''; - const [y, m, d] = iso.split('-'); - return `${d}.${m}.${y}`; -} - -/** - * Converts a German date string (DD.MM.YYYY) to ISO format (YYYY-MM-DD). - * Returns an empty string for invalid or empty input. - */ -export function germanToIso(german: string): string { - const match = german.match(/^(\d{2})\.(\d{2})\.(\d{4})$/); - if (!match) return ''; - const [, d, m, y] = match; - return `${y}-${m}-${d}`; -} +export { isoToGerman, germanToIso } from '$lib/utils/date'; diff --git a/frontend/src/lib/utils/date.ts b/frontend/src/lib/utils/date.ts index 9f8b5c54..c2ab4e8e 100644 --- a/frontend/src/lib/utils/date.ts +++ b/frontend/src/lib/utils/date.ts @@ -9,3 +9,44 @@ export function formatDate(isoDate: string): string { year: 'numeric' }).format(new Date(isoDate + 'T12:00:00')); } + +/** + * Converts an ISO date string (YYYY-MM-DD) to German display format (DD.MM.YYYY). + * Returns an empty string for invalid or empty input. + */ +export function isoToGerman(iso: string): string { + if (!iso || !/^\d{4}-\d{2}-\d{2}$/.test(iso)) return ''; + const [y, m, d] = iso.split('-'); + return `${d}.${m}.${y}`; +} + +/** + * Converts a German date string (DD.MM.YYYY) to ISO format (YYYY-MM-DD). + * Returns an empty string for invalid or empty input. + */ +export function germanToIso(german: string): string { + const match = german.match(/^(\d{2})\.(\d{2})\.(\d{4})$/); + if (!match) return ''; + const [, d, m, y] = match; + return `${y}-${m}-${d}`; +} + +/** + * Handles a date input event for German-format date fields (DD.MM.YYYY). + * Strips non-digits, formats with dots, mutates the input's displayed value, + * and returns the display string and its ISO equivalent. + */ +export function handleGermanDateInput(e: Event): { display: string; iso: string } { + const input = e.target as HTMLInputElement; + const digits = input.value.replace(/\D/g, '').slice(0, 8); + let display: string; + if (digits.length <= 2) { + display = digits; + } else if (digits.length <= 4) { + display = `${digits.slice(0, 2)}.${digits.slice(2)}`; + } else { + display = `${digits.slice(0, 2)}.${digits.slice(2, 4)}.${digits.slice(4)}`; + } + input.value = display; + return { display, iso: germanToIso(display) }; +}