diff --git a/ordinis-admin-ui/src/routes/dictionaries.$name.tsx b/ordinis-admin-ui/src/routes/dictionaries.$name.tsx index 02f2df8..e4e6cae 100644 --- a/ordinis-admin-ui/src/routes/dictionaries.$name.tsx +++ b/ordinis-admin-ui/src/routes/dictionaries.$name.tsx @@ -21,7 +21,7 @@ import { TableRow, TextInput, } from '@/ui' -import { PlusIcon, PencilSimpleIcon, XCircleIcon, GearIcon, ClockCounterClockwiseIcon, TrashIcon, CheckCircleIcon, WarningIcon, XIcon, DownloadSimpleIcon, CaretLeftIcon, CaretRightIcon } from '@phosphor-icons/react' +import { PlusIcon, PencilSimpleIcon, XCircleIcon, GearIcon, ClockCounterClockwiseIcon, TrashIcon, CheckCircleIcon, WarningIcon, XIcon, CaretLeftIcon, CaretRightIcon } from '@phosphor-icons/react' import { useAudit, useDictionaryDetail, @@ -421,10 +421,8 @@ function DictionaryDetail() { setBulkOpen(true) } - const handleBulkExport = () => { - if (selection.size === 0) return - bulkExportMut.mutate(Array.from(selection)) - } + // handleBulkExport больше не нужен — bulk export через InfoPanel "Экспорт..." + // → ExportModal автоматически pre-picks scope=selected когда selection непуст. const handleBulkClose = () => { if (selection.size === 0) return @@ -836,9 +834,7 @@ function DictionaryDetail() { count={selection.size} totalVisible={filteredCount} onBulkClose={openBulkClose} - onBulkExport={handleBulkExport} onClear={clearSelection} - isExporting={bulkExportMut.isPending} /> )} @@ -882,7 +878,9 @@ function DictionaryDetail() { )}
- {r.businessKey} + {/* Business key — accent color per prototype (mono accent, + * primary identifier для каждой row). */} + {r.businessKey} {pendingByKey.has(r.businessKey) ? ( {t('dict.pendingReview.label')} @@ -1265,18 +1263,23 @@ type BulkSelectionToolbarProps = { count: number totalVisible: number onBulkClose: () => void - onBulkExport: () => void onClear: () => void - isExporting: boolean } +/** + * BulkSelectionToolbar — sticky bar появляется когда selection.size > 0. + * + *

Per user feedback: "Экспорт CSV в bulk bar лишний — повтор Экспорт + * кнопки в InfoPanel". Bulk export достижим через InfoPanel "↓ Экспорт..." + * → ExportModal с scope=selected (модал автоматически выбирает selected + * если selection непустой). Чтобы не дублировать, в bulk bar оставляем + * только destructive action — Закрыть выбранные. + */ function BulkSelectionToolbar({ count, totalVisible, onBulkClose, - onBulkExport, onClear, - isExporting, }: BulkSelectionToolbarProps) { const { t } = useTranslation() return ( @@ -1300,15 +1303,6 @@ function BulkSelectionToolbar({

-