diff --git a/ordinis-admin-ui/src/components/reviews/MyDraftsPanel.tsx b/ordinis-admin-ui/src/components/reviews/MyDraftsPanel.tsx index 6109647..11c43ea 100644 --- a/ordinis-admin-ui/src/components/reviews/MyDraftsPanel.tsx +++ b/ordinis-admin-ui/src/components/reviews/MyDraftsPanel.tsx @@ -16,7 +16,7 @@ import { TableHeaderCell, TableRow, } from '@/ui' -import { useMyDrafts, useMySchemaDrafts } from '@/api/queries' +import { useDictionaries, useMyDrafts, useMySchemaDrafts } from '@/api/queries' import { UserCell } from '@/lib/useUserDisplay' import type { DraftOperation, @@ -303,6 +303,14 @@ function RecordRow({ onClick: () => void }) { const { t } = useTranslation() + // DraftResponse несёт только dictionaryId (UUID) — резолвим в name через + // global dictionaries list (кешируется TanStack Query). Fallback на + // UUID-prefix без link'а если dict не в выдаче (scope-hide / deleted). + const dictionaries = useDictionaries() + const dictName = useMemo( + () => dictionaries.data?.find((d) => d.id === draft.dictionaryId)?.name, + [dictionaries.data, draft.dictionaryId], + ) return ( @@ -311,15 +319,23 @@ function RecordRow({ - - {draft.dictionaryId.slice(0, 8)}… - / - {draft.businessKey} - + {dictName ? ( + + {dictName} + / + {draft.businessKey} + + ) : ( + + {draft.dictionaryId.slice(0, 8)}… + / + {draft.businessKey} + + )} {draft.operation} diff --git a/ordinis-admin-ui/src/routes/reviews.tsx b/ordinis-admin-ui/src/routes/reviews.tsx index fafdf9b..1d0e84c 100644 --- a/ordinis-admin-ui/src/routes/reviews.tsx +++ b/ordinis-admin-ui/src/routes/reviews.tsx @@ -27,6 +27,7 @@ import axios from 'axios' import { useAuth } from 'react-oidc-context' import { ArrowCounterClockwiseIcon, CheckCircleIcon, XCircleIcon } from '@phosphor-icons/react' import { + useDictionaries, useDraft, useLiveRecord, useMyDrafts, @@ -162,6 +163,15 @@ function ReviewsPage() { const { t } = useTranslation() const queue = useReviewQueue(0, 50) const schemaQueue = useSchemaReviewQueue(0, 50) + // DraftResponse несёт только dictionaryId (UUID) — резолвим в name через + // global dictionaries list (кешируется TanStack Query, ~free). Fallback на + // UUID-prefix когда dict недоступен (scope-hide / deleted). + const dictionaries = useDictionaries() + const dictNameById = useMemo(() => { + const map = new Map() + for (const d of dictionaries.data ?? []) map.set(d.id, d.name) + return map + }, [dictionaries.data]) // Counts для "Мои" tab badge — sum of attention-needing drafts (pending + // WIP). Recompute дешёвый (linear over ≤100 items), refetch interval 30s // делает badge самозаживляющим без manual invalidation. @@ -463,13 +473,27 @@ function ReviewsPage() { /> - - {d.dictionaryId.slice(0, 8)}… - + {(() => { + const dictName = dictNameById.get(d.dictionaryId) + if (dictName) { + return ( + + {dictName} + + ) + } + // Dict скрыт scope-фильтром или удалён — UUID-prefix + // как fallback, без link'а (вёл бы в 404). + return ( + + {d.dictionaryId.slice(0, 8)}… + + ) + })()} {d.businessKey}