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
+15
View File
@@ -756,3 +756,18 @@ export const NOTIFICATION_EVENT_TYPES = [
'RecordDraftWithdrawn',
] as const
export type NotificationEventType = (typeof NOTIFICATION_EVENT_TYPES)[number]
/**
* Empty-state hint payload (read-api scheduled-summary). Подсчёт записей с
* {@code validFrom > now AND validTo > now} в текущем scope view.
*
* <ul>
* <li>{@code count=0} → frontend hint не показывает.</li>
* <li>{@code nearestValidFrom} — ISO datetime ближайшей запланированной;
* используется в CTA «Перейти к дате» (time-travel).</li>
* </ul>
*/
export type ScheduledRecordsSummary = {
count: number
nearestValidFrom: string | null
}