From 2a82a875c8eb7f12bc6a376b2f1f1f3097bcf096 Mon Sep 17 00:00:00 2001 From: "Zimin A.N." Date: Thu, 21 May 2026 16:05:09 +0300 Subject: [PATCH] =?UTF-8?q?fix(admin-ui):=20=D1=85=D0=B2=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D1=8B=20=E2=80=94=20404=20=D0=BD=D0=B0=20CREATE-=D1=87=D0=B5?= =?UTF-8?q?=D1=80=D0=BD=D0=BE=D0=B2=D0=B8=D0=BA=D0=B0=D1=85=20+=20Radix=20?= =?UTF-8?q?DialogTitle=20warning?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. reviews.tsx: ReviewDrawer звал useLiveRecord для ЛЮБОГО черновика, включая CREATE. У CREATE-черновика live-записи нет по определению → GET /dictionaries/{id}/records/{key} → 404 (красный шум в консоли на каждый CREATE-draft). Теперь для CREATE запрос не запускается, блок «текущая версия» показывает «нет текущей версии». 2. modal.tsx: Modal рендерил DialogTitle только при наличии prop title. Без title Radix писал в консоль «DialogContent requires a DialogTitle» + warning про aria-describedby. Теперь Modal всегда рендерит DialogTitle (sr-only fallback) и гасит aria-describedby когда описания нет. --- ordinis-admin-ui/src/routes/reviews.tsx | 10 +++++++--- ordinis-admin-ui/src/ui/components/modal.tsx | 13 ++++++++++++- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/ordinis-admin-ui/src/routes/reviews.tsx b/ordinis-admin-ui/src/routes/reviews.tsx index 3699518..fafdf9b 100644 --- a/ordinis-admin-ui/src/routes/reviews.tsx +++ b/ordinis-admin-ui/src/routes/reviews.tsx @@ -614,9 +614,13 @@ function ReviewDrawer({ draftId, onClose }: DrawerProps) { const currentSub = auth.user?.profile?.sub const draftQ = useDraft(draftId) const draft = draftQ.data + // CREATE-черновик не имеет live-записи по определению — не пробуем её + // загружать (GET /dictionaries/{id}/records/{key} → 404, красный шум в + // консоли на каждый CREATE-draft). Для UPDATE/CLOSE — грузим как раньше. + const isCreateDraft = draft?.operation === 'CREATE' const liveQ = useLiveRecord( - draft ? draft.dictionaryId : undefined, - draft ? draft.businessKey : undefined, + draft && !isCreateDraft ? draft.dictionaryId : undefined, + draft && !isCreateDraft ? draft.businessKey : undefined, ) const approveMut = useApproveDraft() const rejectMut = useRejectDraft() @@ -810,7 +814,7 @@ function ReviewDrawer({ draftId, onClose }: DrawerProps) { {t('reviews.drawer.live')}

{liveQ.isLoading && } - {liveQ.data === null && ( + {(liveQ.data === null || isCreateDraft) && (

{t('reviews.drawer.noLive')}

diff --git a/ordinis-admin-ui/src/ui/components/modal.tsx b/ordinis-admin-ui/src/ui/components/modal.tsx index 32fe407..a2c5d17 100644 --- a/ordinis-admin-ui/src/ui/components/modal.tsx +++ b/ordinis-admin-ui/src/ui/components/modal.tsx @@ -70,13 +70,24 @@ export function Modal({ if (!open) onClose() }} > - + {(title || description) && ( {title && {title}} {description && {description}} )} + {/* Radix требует DialogTitle в каждом DialogContent для скринридеров. + * Если callsite не передал title — рендерим sr-only fallback, иначе + * console-warning + диалог без названия для a11y. */} + {!title && Диалог} {bodyClassName ?
{children}
: children}