feat(ux): улучшение работы с датами validFrom/validTo

Backend (defensive):
- GlobalExceptionHandler ловит HttpMessageNotReadableException → 400 c понятным
  сообщением вместо 500 'Internal server error'.
- DateTimeParseException → code='invalid_date_format', сообщение с подсказкой
  ISO формата (например 2026-05-08T14:30:00+03:00).
- InvalidFormatException → code='invalid_field_format' с именем сломанного поля.
- Раньше падало 500 если фронт отправлял 'YYYY-MM-DD' вместо OffsetDateTime
  (из-за browser cache на старом bundle).

Frontend:
- Submit-валидация validFrom < validTo с inline error на validTo поле,
  переключение на таб 'Идентификация' с фокусом на ошибке.
- DateTimeField теперь принимает hint и error props и показывает их под
  парой DatePicker+TextInput[time].
- Подсказки i18n под полями: 'Когда запись становится активной. Пусто = с момента
  создания.' / 'Когда перестаёт действовать. Пусто = бессрочно.'
- Новая i18n ключ form.error.validToBeforeFrom (RU/EN).
This commit is contained in:
Zimin A.N.
2026-05-04 04:15:58 +03:00
parent b5c2378ab7
commit c7b651011a
3 changed files with 65 additions and 13 deletions
+6
View File
@@ -38,7 +38,10 @@ i18n
'form.tabs.extra': 'Дополнительно',
'form.businessKey': 'Бизнес-ключ',
'form.validFrom': 'Действует с',
'form.validFromHint': 'Когда запись становится активной. Пусто = с момента создания.',
'form.validTo': 'Действует до',
'form.validToHint': 'Когда перестаёт действовать. Пусто = бессрочно.',
'form.error.validToBeforeFrom': 'Дата окончания должна быть позже даты начала.',
'form.dataFields': 'Поля записи',
'form.cancel': 'Отмена',
'form.save': 'Сохранить',
@@ -152,7 +155,10 @@ i18n
'form.tabs.extra': 'Additional',
'form.businessKey': 'Business key',
'form.validFrom': 'Valid from',
'form.validFromHint': 'When this record becomes active. Empty = from creation moment.',
'form.validTo': 'Valid to',
'form.validToHint': 'When it stops being valid. Empty = forever.',
'form.error.validToBeforeFrom': 'Valid-to must be later than valid-from.',
'form.dataFields': 'Record fields',
'form.cancel': 'Cancel',
'form.save': 'Save',