import { CheckCircleOutlined, ClockCircleOutlined, DeleteOutlined, EditOutlined, EyeOutlined, LinkOutlined, } from '@ant-design/icons' import { Badge, Breadcrumb, Button, Card, Col, Descriptions, Popconfirm, Result, Row, Select, Space, Spin, Table, Tag, Tooltip, Typography, message, } from 'antd' import dayjs from 'dayjs' import { useState } from 'react' import { useNavigate, useParams } from 'react-router-dom' import { useAlerts, useAcknowledgeAlert, useResolveAlert, type AlertItem } from '../api/alerts' import { useDevice, useDeleteDevice, useObject } from '../api/objects' import { getDeviceWebUrl } from '../utils/deviceUrl' import { elapsedAgo } from '../utils/time' import { useSnapshots, useSnapshotDiff } from '../api/snapshots' import { useDeviceTasks, useTask, type Task } from '../api/tasks' import { DeviceEditModal } from '../components/DeviceEditModal' import { CategoryTag, DeviceStatusBadge, TaskStatusBadge } from '../components/StatusBadge' import { useMonitorSSE } from '../hooks/useMonitorSSE' const ALERT_STATUS_COLOR: Record = { open: 'error', acknowledged: 'warning', resolved: 'success', } const ALERT_STATUS_LABEL: Record = { open: 'Открыт', acknowledged: 'Подтверждён', resolved: 'Закрыт', } const LOCATION_LABEL: Record = { server_room: 'Серверная', street: 'Улица', } // ─── Alerts tab ───────────────────────────────────────────────────────────── function AlertsTab({ deviceId }: { deviceId: number }) { const [statusFilter, setStatusFilter] = useState(undefined) const { data: alerts, isLoading } = useAlerts({ device_id: deviceId, status: statusFilter }) const acknowledge = useAcknowledgeAlert() const resolve = useResolveAlert() const columns = [ { title: 'Сообщение', dataIndex: 'message', key: 'message', }, { title: 'Статус', dataIndex: 'status', key: 'status', width: 140, render: (s: string) => ( ), }, { title: 'Создан', dataIndex: 'created_at', key: 'created_at', width: 160, render: (v: string) => dayjs(v).format('DD.MM.YY HH:mm'), }, { title: 'Подтверждён', dataIndex: 'acknowledged_by_username', key: 'ack', width: 140, render: (v: string | null, row: AlertItem) => v ? ( {v} ) : '—', }, { title: '', key: 'actions', width: 120, render: (_: unknown, row: AlertItem) => ( {row.status === 'open' && (