refactor(utils): consolidate date utilities into \$lib/utils/date.ts
Move isoToGerman and germanToIso from utils.ts into utils/date.ts alongside formatDate, and add handleGermanDateInput for the shared date field handler. Make utils.ts a re-export shim so existing imports continue to work. Closes part of #75 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,20 +1 @@
|
|||||||
/**
|
export { isoToGerman, germanToIso } from '$lib/utils/date';
|
||||||
* 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}`;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -9,3 +9,44 @@ export function formatDate(isoDate: string): string {
|
|||||||
year: 'numeric'
|
year: 'numeric'
|
||||||
}).format(new Date(isoDate + 'T12:00:00'));
|
}).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) };
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user