import { useMemo } from 'react' import { DataGridMutedCell } from '@/components/data-grid-cell' import { StatusBadge } from '@/components/status-badge' import { Kanban, KanbanBoard, KanbanColumn, KanbanColumnContent, KanbanItem, KanbanOverlay, } from '@/components/reui/kanban' import { Frame, FramePanel } from '@/components/reui/frame' import { Badge } from '@/components/reui/badge' import { Item, ItemContent, ItemDescription, ItemTitle, } from '@evobgp/ui/components/item' import { jobKindRu } from '@/lib/ui-labels' import type { JobRow } from '@/types/api' /** * Operations jobs board — ReUI Kanban (read-only columns). * @see https://reui.io/preview/base/kanban-board-8 * @see https://reui.io/docs/components/base/kanban * @see https://reui.io/docs/components/base/frame */ const COLUMN_ORDER = ['queued', 'running', 'succeeded', 'failed'] as const const COLUMN_LABELS: Record<(typeof COLUMN_ORDER)[number], string> = { queued: 'В очереди', running: 'Выполняются', succeeded: 'Успешные', failed: 'Ошибки', } function columnForStatus(status: string): (typeof COLUMN_ORDER)[number] { const s = status.toLowerCase() if (s === 'queued') return 'queued' if (s === 'running') return 'running' if (s === 'succeeded') return 'succeeded' return 'failed' } function emptyColumns(): Record { return { queued: [], running: [], succeeded: [], failed: [], } } export function OperationsJobsKanban({ items, nameById, }: { items: JobRow[] nameById: Map }) { const columns = useMemo(() => { const next = emptyColumns() for (const job of items) { next[columnForStatus(job.status)].push(job) } return next }, [items]) return ( undefined} getItemValue={(job) => job.job_id} > {COLUMN_ORDER.map((columnId) => (

{COLUMN_LABELS[columnId]}

{columns[columnId]?.length ?? 0}
{(columns[columnId] ?? []).map((job) => ( {jobKindRu(job.kind)} {job.meta?.module_id ? ( {nameById.get(String(job.meta.module_id)) ?? String(job.meta.module_id)} ) : null} ))}
))}
Задача
) }