fix(trips): the trip form drops its complaint once you edit, and the typed date hint follows your language

"Title is required" stayed on screen after the title was typed, until the
next save. Any edit in the trip form, desktop and phone, now clears the
last save's complaint; the next save checks again.

The keyboard date field always hinted DD.MM.YYYY, while it was filled and
read back in the user's own order: a Korean user saw "2026. 12. 10." under
a German hint. The hint is now the locale's own pattern (YYYY. MM. DD. in
Korean, MM/DD/YYYY in US English), and the field's name is translated.

Refs #2604
This commit is contained in:
Maurice
2026-10-12 15:46:02 +02:00
parent 35eba21128
commit cb04ebe6d2
8 changed files with 90 additions and 32 deletions
+18
View File
@@ -0,0 +1,18 @@
import { describe, expect, it } from 'vitest';
import { dateInputPattern } from './dateInputPattern';
// The manual date field's hint has to read the way the field is filled and
// parsed in the user's language; it used to say DD.MM.YYYY everywhere (#2604).
describe('dateInputPattern', () => {
it('follows the field order and separators of the locale', () => {
expect(dateInputPattern('de-DE')).toBe('DD.MM.YYYY');
expect(dateInputPattern('en-US')).toBe('MM/DD/YYYY');
expect(dateInputPattern('en-GB')).toBe('DD/MM/YYYY');
expect(dateInputPattern('ko-KR')).toBe('YYYY. MM. DD.');
});
it('takes the shape only, never the locale digits', () => {
expect(dateInputPattern('ar')).not.toMatch(/[٠-٩\d]/);
expect(dateInputPattern('ar')).toContain('YYYY');
});
});
+15
View File
@@ -0,0 +1,15 @@
const LETTERS: Record<string, string> = { day: 'DD', month: 'MM', year: 'YYYY' };
/**
* How a typed date is written in `locale`, as letters (DD, MM, YYYY) between the
* locale's own separators. It is the hint of the manual date field, which is
* pre-filled and read back in this same order, so a Korean user sees
* "YYYY. MM. DD." rather than a German "DD.MM.YYYY". Direction marks are dropped:
* the hint shows the shape, the field itself carries the script.
*/
export function dateInputPattern(locale: string): string {
return new Intl.DateTimeFormat(locale, { day: '2-digit', month: '2-digit', year: 'numeric', timeZone: 'UTC' })
.formatToParts(new Date(Date.UTC(2001, 5, 15)))
.map((part) => LETTERS[part.type] ?? part.value.replace(/[؜‎‏]/g, ''))
.join('');
}