import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { useConfirm } from '@/components/ui/confirm-dialog'; import { Card, CardContent } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Badge } from '@/components/ui/badge'; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table'; import { Search, AlertTriangle, Bell, CheckCircle, Loader2 } from 'lucide-react'; import { alertApi } from '@/api'; import type { AlertEventRecord } from '@/types'; export function AlertEventsTab({ alerts, loading, onReload, }: { alerts: AlertEventRecord[]; loading: boolean; onReload: () => void; }) { const { t } = useTranslation(); const _confirm = useConfirm(); const [searchQuery, setSearchQuery] = useState(''); const [severityFilter, setSeverityFilter] = useState('all'); const [statusFilter, setStatusFilter] = useState('all'); const filteredEvents = alerts.filter((event) => { const matchesSearch = ((event.rule && event.rule.name) || event.message || '').toLowerCase().includes(searchQuery.toLowerCase()) || (event.target || '').toLowerCase().includes(searchQuery.toLowerCase()); const matchesSeverity = severityFilter === 'all' || event.severity === severityFilter; const matchesStatus = statusFilter === 'all' || event.status === statusFilter; return matchesSearch && matchesSeverity && matchesStatus; }); const getSeverityBadge = ( severity: string) => { switch (severity) { case 'critical': return ( {t('monitor.alertEvents.severity.critical')} ); case 'warning': return ( {t('monitor.alertEvents.severity.warning')} ); case 'info': return ( {t('monitor.alertEvents.severity.info')} ); default: return null; } }; const getStatusBadge = ( status: string) => { switch (status) { case 'firing': return ( {t('monitor.alertEvents.status.firing')} ); case 'resolved': return ( {t('monitor.alertEvents.status.resolved')} ); default: return null; } }; const handleAcknowledge = async ( id: number) => { try { await alertApi.acknowledge(id); onReload(); } catch (error) { console.error('Failed to acknowledge alert:', error); } }; return (
{/* Filters */}
setSearchQuery(e.target.value)} className="pl-9 h-9 dg-input" />
{/* Events Table */}
{t('monitor.alertEvents.col.severity')} {t('monitor.alertEvents.col.alertName')} {t('monitor.alertEvents.col.status')} {t('monitor.alertEvents.col.target')} {t('monitor.alertEvents.col.currentValue')} {t('monitor.alertEvents.col.threshold')} {t('monitor.alertEvents.col.startTime')} {t('monitor.alertEvents.col.actions')} {loading ? ( {t('monitor.alertEvents.loading')} ) : filteredEvents.map((event) => ( {getSeverityBadge(event.severity)} {(event.rule && event.rule.name) || event.message} {getStatusBadge(event.status)} {event.target} {typeof event.value === 'number' ? event.value.toFixed(1) : event.value} {event.threshold} {event.created_at ? new Date(event.created_at).toLocaleString() : '--'}
{event.status === 'firing' && ( )}
))}
); }