import { useState } from "react"; import { useQuery } from "@tanstack/react-query"; import { ListPager } from "../../components/ListPager"; import { queryKeys } from "../../constants/queryKeys"; import { useDebouncedValue } from "../../hooks/useDebouncedValue"; import { useToast } from "../../hooks/useToast"; import { useI18n } from "../../i18n"; import { fetchUmeCurrentAlarms, formatErr } from "../../services/api"; import type { UmeAlarmItem } from "../../types"; import { downloadCsv, fetchAllPages } from "../../utils/csvExport"; import { pageCount } from "../../utils/display"; import { formatSystemTime } from "../../utils/time"; function severityClass(sev: string | null | undefined): string { const s = String(sev || "").trim().toLowerCase(); if (s.includes("critical")) return "pt-list-status--critical"; if (s.includes("major")) return "pt-list-status--major"; if (s.includes("minor")) return "pt-list-status--minor"; if (s.includes("warning") || s.includes("warn")) return "pt-list-status--warning"; if (s.includes("info") || s.includes("indeterminate")) return "pt-list-status--info"; return "pt-list-status--unknown"; } /** Current UME alarms query view for Network Management. */ export function NetworkAlarmsPage() { const { t } = useI18n(); const { showOk, showError } = useToast(); const [curSeverity, setCurSeverity] = useState(""); const [curCleared, setCurCleared] = useState(""); const [curHostName, setCurHostName] = useState(""); const [curKeyword, setCurKeyword] = useState(""); const [curPage, setCurPage] = useState(1); const [curPageSize, setCurPageSize] = useState(50); const [exporting, setExporting] = useState(false); const debouncedKeyword = useDebouncedValue(curKeyword, 300); const debouncedHost = useDebouncedValue(curHostName, 300); const currentQuery = useQuery({ queryKey: queryKeys.umeCurrentAlarms( curSeverity, curCleared, debouncedHost, debouncedKeyword, curPage, curPageSize, ), queryFn: () => fetchUmeCurrentAlarms({ severity: curSeverity, isCleared: curCleared, hostName: debouncedHost, keyword: debouncedKeyword, page: curPage, pageSize: curPageSize, }), staleTime: 5000, }); const items = currentQuery.data?.items || []; const curTotal = Number(currentQuery.data?.total || 0); const curPages = pageCount(curTotal, curPageSize); const hasFilters = Boolean(curKeyword.trim() || curHostName.trim() || curSeverity || curCleared); const exportCsv = async () => { setExporting(true); try { const rows = await fetchAllPages({ pageSize: 200, maxRows: 2000, fetchPage: (page, pageSize) => fetchUmeCurrentAlarms({ severity: curSeverity, isCleared: curCleared, hostName: debouncedHost, keyword: debouncedKeyword, page, pageSize, }), }); downloadCsv(`ume-alarms-${new Date().toISOString().slice(0, 10)}.csv`, rows, [ { key: "time_created", header: t("ume.alarms.col.time"), value: (r) => formatSystemTime(r.time_created) }, { key: "perceived_severity", header: t("ume.alarms.col.severity") }, { key: "ne_id", header: t("ume.alarms.col.neId") }, { key: "host_name", header: t("ume.alarms.col.hostName") }, { key: "ne_type", header: t("ume.alarms.col.neType") }, { key: "native_probable_cause", header: t("ume.alarms.col.cause") }, { key: "is_cleared", header: "is_cleared" }, { key: "alarm_key", header: "alarm_key" }, ]); if (rows.length < curTotal) { showOk( t("common.exportTruncated", { count: String(rows.length), total: String(curTotal) }), ); } else { showOk(t("common.exportOk", { count: String(rows.length) })); } } catch (err) { showError(t("common.exportFailed") + ": " + formatErr(err)); } finally { setExporting(false); } }; return (

{t("ume.alarms.title")}

{ setCurKeyword(e.target.value); setCurPage(1); }} /> { setCurHostName(e.target.value); setCurPage(1); }} />
{currentQuery.isLoading ?

{t("common.refreshing")}

: null} {currentQuery.isError ?

{t("common.opFailed")}

: null} {!items.length && !currentQuery.isLoading ? (

{t("common.empty")}

) : (
{items.map((x) => ( ))}
{t("ume.alarms.col.time")} {t("ume.alarms.col.severity")} {t("ume.alarms.col.neId")} {t("ume.alarms.col.hostName")} {t("ume.alarms.col.neType")} {t("ume.alarms.col.cause")}
{formatSystemTime(x.time_created)} {x.perceived_severity || "—"} {x.ne_id} {(x.host_name || "").trim() ? ( ) : ( {t("common.empty")} )} {x.ne_type ?? ""} {x.native_probable_cause}
)} { setCurPageSize(size); setCurPage(1); }} disabled={currentQuery.isLoading} />
); }