feat(records): scheduled records empty-state hint

Fixes UX bug: пользователь создаёт запись с validFrom на будущую дату
(e.g. 18.05), открывает catalog 15.05 — пустая таблица, никаких хинтов
о том что запись существует.

Backend (read-api):
- New endpoint GET /api/v1/{dict}/records/scheduled-summary
- Returns {count, nearestValidFrom} для записей с validFrom > now AND
  validTo > now в текущем scope view
- Single-aggregate JPA query (COUNT + MIN), respect scope filter same way
  as listActive — INTERNAL scheduled не учитывается для PUBLIC consumer'а

Frontend:
- New useScheduledSummary hook + ScheduledRecordsSummary type
- Empty-state в dictionaries.$name now shows: "Запланировано N, ближайшая
  на DD.MM [Перейти к этой дате]" с CTA который set'ает time-travel на
  nearestValidFrom
- i18n keys для ru/en plural forms

Связан с MR !219 (TimeTravelPicker 30-day future window) — теперь slider
позволяет дойти до даты записи, и empty-state hint позволяет узнать что
запись существует.
This commit is contained in:
Zimin A.N.
2026-05-15 20:17:07 +03:00
parent 4c3327b05c
commit 234184645f
8 changed files with 205 additions and 1 deletions
+14
View File
@@ -349,6 +349,15 @@ i18n
'dict.list.fk.usedBy_many': '← {{count}} использ.',
'dict.list.fk.usedBy_other': '← {{count}} использ.',
'dict.empty': 'В этом справочнике пока нет записей',
'dict.scheduled.hint_one':
'Запланирована {{count}} запись на {{date}}',
'dict.scheduled.hint_few':
'Запланировано {{count}} записи, ближайшая на {{date}}',
'dict.scheduled.hint_many':
'Запланировано {{count}} записей, ближайшая на {{date}}',
'dict.scheduled.hint_other':
'Запланировано {{count}} записей, ближайшая на {{date}}',
'dict.scheduled.cta': 'Перейти к этой дате',
'dict.col.businessKey': 'Бизнес-ключ',
'dict.col.scope': 'Scope',
'dict.col.validFrom': 'Действует с',
@@ -1151,6 +1160,11 @@ i18n
'dict.list.fk.usedBy_one': '← {{count}} used by',
'dict.list.fk.usedBy_other': '← {{count}} used by',
'dict.empty': 'No records in this dictionary yet',
'dict.scheduled.hint_one':
'{{count}} record scheduled for {{date}}',
'dict.scheduled.hint_other':
'{{count}} records scheduled, earliest on {{date}}',
'dict.scheduled.cta': 'Jump to that date',
'dict.col.businessKey': 'Business key',
'dict.col.scope': 'Scope',
'dict.col.validFrom': 'Valid from',