import { useState } from 'react'; import { useConfirm } from '@/components/ui/confirm-dialog'; import { Card, CardContent } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Switch } from '@/components/ui/switch'; import { Checkbox } from '@/components/ui/checkbox'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { Settings, Trash2 } from 'lucide-react'; import { toast } from 'sonner'; import { alertApi } from '@/api'; import { renderRuleChannels } from './alertShared'; import type { AlertChannel, AlertRuleRecord } from '@/types'; import i18n from '@/i18n'; const COL_SPAN = 9; // 复选框 + 7 数据列 + 操作列 // Logan.Li export function AlertRulesTab({ rules, notifyChannels, onReload, onEditRule, }: { rules: AlertRuleRecord[]; notifyChannels: AlertChannel[]; onReload: () => void; onEditRule: ( rule: AlertRuleRecord) => void; }) { const confirm = useConfirm(); const [selectedIds, setSelectedIds] = useState([]); // 全选/取消全选 // Logan.Li const toggleSelectAll = () => { if (rules.length > 0 && selectedIds.length === rules.length) { setSelectedIds([]); } else { setSelectedIds(rules.map((r) => r.id)); } }; // 单行选择切换 // Logan.Li const toggleSelect = (id: number) => { setSelectedIds((prev) => prev.includes(id) ? prev.filter((s) => s !== id) : [...prev, id] ); }; const handleDeleteRule = async ( id: number) => { const ok = await confirm({ title: i18n.t('monitor.alertRulesTab.deleteRule'), description: i18n.t('monitor.alertRulesTab.deleteConfirm'), confirmText: i18n.t('kubernetes.storage.delete2'), variant: 'destructive', }); if (!ok) return; try { await alertApi.deleteRule(id); toast.success(i18n.t('monitor.alertRulesTab.deleted')); onReload(); } catch (error) { console.error('Failed to delete rule:', error); toast.error(i18n.t('kubernetes.msg.deleteFailed2')); } }; // 批量删除 // Logan.Li const handleBatchDelete = async () => { if (selectedIds.length === 0) return; const ok = await confirm({ title: i18n.t('monitor.alertRulesTab.deleteRule'), description: `确定删除选中的 ${selectedIds.length} 条告警规则吗?此操作不可撤销。`, confirmText: i18n.t('system.terminalBatchDelete'), variant: 'destructive', }); if (!ok) return; try { await alertApi.batchDeleteRules(selectedIds); toast.success(i18n.t('monitor.deletedRules', { count: selectedIds.length })); setSelectedIds([]); onReload(); } catch (error) { console.error('Failed to batch delete rules:', error); toast.error(i18n.t('system.batchDeleteFailed')); } }; const handleToggleRule = async ( id: number) => { try { await alertApi.toggleRule(id); onReload(); } catch (error) { console.error('Failed to toggle rule:', error); } }; const allSelected = rules.length > 0 && selectedIds.length === rules.length; return (
{/* 批量操作栏 // Logan.Li */} {selectedIds.length > 0 && (
已选择 {selectedIds.length} 项
)}
{i18n.t('monitor.ruleName')} {i18n.t('monitor.dashboard.custom.datasource')} {i18n.t('monitor.alertRulesTab.condition')} {i18n.t('kubernetes.event.eventLevel')} {i18n.t('monitor.alertDuration')} {i18n.t('monitor.notificationChannel')} {i18n.t('system.terminalStatus')} {i18n.t('system.auditAction')} {rules.length === 0 ? ( 暂无告警规则 ) : ( rules.map((rule) => ( toggleSelect(rule.id)} className="border-[var(--dg-border-hover)]" />
{rule.name} {rule.description && (

{rule.description}

)}
{rule.source || '--'} {rule.expression || '--'} {rule.severity === 'critical' ? ( 严重 ) : rule.severity === 'warning' ? ( 警告 ) : ( 提示 )} {(rule.duration || 0) / 60}分钟 {renderRuleChannels(rule, notifyChannels)} handleToggleRule(rule.id)} />
)) )}
); }