From aecd65e7d57a6853bf0744571da246d6db236071 Mon Sep 17 00:00:00 2001 From: "Zimin A.N." Date: Wed, 13 May 2026 10:58:48 +0300 Subject: [PATCH] =?UTF-8?q?fix(types):=20SchemaReviewQueuePage.total=20?= =?UTF-8?q?=E2=86=92=20totalElements=20(match=20backend)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit User reported бэйдж 'Согласований' в sidebar показывал 0 несмотря на 1 pending schema draft. Root cause: Backend сериализует Spring Page как: {items, page, size, totalElements, totalPages} Но TS type SchemaReviewQueuePage объявлял поле как 'total' (mismatch именования). Consumers читали data?.total → undefined → fallback 0: - useReviewsBadgeCount (queries.ts:650) — sidebar badge падал на 0 - reviews.tsx:61 — header count в Schemas tab (но fallback на items.length скрывал bug в UI) - reviews.tsx:593-594 — schema queue subtitle 'N drafts ждут ревью' Fix: - client.ts SchemaReviewQueuePage: total → totalElements + totalPages - 3 consumer'а обновлены на .totalElements - Backend контракт не меняется — это чисто frontend type alignment После prod deploy v2.16.3 sidebar badge заработает корректно. --- ordinis-admin-ui/src/api/client.ts | 12 ++++++++++-- ordinis-admin-ui/src/api/queries.ts | 2 +- ordinis-admin-ui/src/routes/reviews.tsx | 6 +++--- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/ordinis-admin-ui/src/api/client.ts b/ordinis-admin-ui/src/api/client.ts index dd9378a..dc92cfc 100644 --- a/ordinis-admin-ui/src/api/client.ts +++ b/ordinis-admin-ui/src/api/client.ts @@ -659,12 +659,20 @@ export type PublishSchemaDraftResult = { publishedAt: string } -/** Pool queue для /admin/schema-reviews/pending. */ +/** Pool queue для /admin/schema-reviews/pending. + * + *

Backend сериализует Spring {@code Page} как: + * {@code {items, page, size, totalElements, totalPages}}. Раньше type + * объявлял {@code total} что было mismatched — consumers (`reviews.tsx`, + * `useReviewsBadgeCount`) читали {@code data.total} который === undefined, + * fallback'или на {@code items.length} (или 0 для badge — отсюда баг + * "бэйджа нет"). Type совпадает с фактическим контрактом backend'а. */ export type SchemaReviewQueuePage = { items: SchemaDraft[] page: number size: number - total: number + totalElements: number + totalPages: number } export type ChangelogDiff = { diff --git a/ordinis-admin-ui/src/api/queries.ts b/ordinis-admin-ui/src/api/queries.ts index efa4022..a89817c 100644 --- a/ordinis-admin-ui/src/api/queries.ts +++ b/ordinis-admin-ui/src/api/queries.ts @@ -647,7 +647,7 @@ export const useReviewsBadgeCount = (enabled = true) => { refetchInterval: 60_000, }) const recordCount = recordQ.data?.totalElements ?? 0 - const schemaCount = schemaQ.data?.total ?? 0 + const schemaCount = schemaQ.data?.totalElements ?? 0 return { total: recordCount + schemaCount, recordCount, diff --git a/ordinis-admin-ui/src/routes/reviews.tsx b/ordinis-admin-ui/src/routes/reviews.tsx index 209e502..5adecab 100644 --- a/ordinis-admin-ui/src/routes/reviews.tsx +++ b/ordinis-admin-ui/src/routes/reviews.tsx @@ -58,7 +58,7 @@ function ReviewsPage() { const queue = useReviewQueue(0, 50) const schemaQueue = useSchemaReviewQueue(0, 50) const recordsCount = queue.data?.totalElements ?? 0 - const schemasCount = schemaQueue.data?.total ?? 0 + const schemasCount = schemaQueue.data?.totalElements ?? 0 // Tab дефолтит на records (старее, чаще). Если schema queue не пустой // а record queue пустой — переключаемся на schemas чтобы reviewer'у не // пришлось кликать дважды. @@ -590,8 +590,8 @@ function SchemaReviewQueuePanel() {

{t('reviews.schema.queueTotal', { - count: queue.data?.total ?? items.length, - defaultValue: `${queue.data?.total ?? items.length} draft(s) ждут ревью`, + count: queue.data?.totalElements ?? items.length, + defaultValue: `${queue.data?.totalElements ?? items.length} draft(s) ждут ревью`, })}