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}