Appearance
Alarm Developer Notes
This document is generated from alarm-related frontend and backend source files. It is intended to help developers understand the implemented behavior, available actions, and evidence captured during extraction.
Scan Summary
- Frontend files scanned: 35
- Backend files scanned: 13
- Total files scanned: 48
Pages
- Alarms
alarms-list-page - Alarm Details
alarm-details-page
Tables
alarms-table
Columns:
- Alarm
- Severity
- Status
- Ack
- Device
- Key
- Value
- Created
- Updated
- Actions
Controls
- Refresh
refresh-alarms - Ack
acknowledge-alarm - Clear
clear-alarm - Open
open-dashboard-from-alarm - Details
open-alarm-details - Select Dashboard
select-dashboard - Select Dashboard State
select-dashboard-state - Export PDF
export-alarm-pdf - Print
print-alarm
Behavior Flows
acknowledge-alarm-flow
- Locate an active alarm that has not yet been acknowledged.
- Click Acknowledge.
- The system marks the alarm as acknowledged.
- The alarm list refreshes to show the updated acknowledgement state.
clear-alarm-flow
- Locate an active alarm.
- Click Clear.
- Confirm the clear action if confirmation is required by the UI.
- The system clears the alarm.
- The alarm list refreshes to reflect the updated status.
open-dashboard-from-alarm-flow
- Select the destination dashboard and dashboard state if required by the current UI.
- Click Open for the alarm row you want to investigate.
- The dashboard opens in the configured state.
- The device context from the alarm is applied so related widgets can focus on that device.
open-alarm-details-flow
- Click Details for the alarm.
- The alarm details page opens for the selected alarm.
export-pdf-flow
- Open the alarm details page.
- Click Export PDF.
- The system prepares a PDF version of the visible alarm details.
- The generated file is downloaded.
print-alarm-flow
- Open the alarm details page.
- Click Print.
- The system opens the print flow for the current alarm details view.
Constraints
- An alarm can only be acknowledged when it is active and not already acknowledged.
- An alarm can only be cleared when its status is ACTIVE.
- A dashboard must be configured before the Open action can navigate to a dashboard.
- Available dashboard states depend on the selected dashboard.
- The alarm details page may show a not-found state when the requested alarm does not exist.
- PDF export depends on rendering the alarm details view before the file is generated.
c:/autoconnecto/frontend/src/features/alarms/AlarmDetailsPage.tsx (page)
text
"green"; case "CLEARED": return "gray"; default: return "blue"; } } export default function AlarmDetailsPage() { const { alarmId } = useParams(); const navigate = useNavigate(); const exportRef = useRef<HTMLDivElement | null>(null); const [loading, setLoading] = useState(trc:/autoconnecto/frontend/src/features/alarms/AlarmDetailsPage.tsx (page)
text
"green"; case "CLEARED": return "gray"; default: return "blue"; } } export default function AlarmDetailsPage() { const { alarmId } = useParams(); const navigate = useNavigate(); const exportRef = useRef<HTMLDivElement | null>(null); const [loading, setLoading] = useState(trc:/autoconnecto/frontend/src/features/alarms/AlarmListPage.tsx (table)
text
me, source: "alarm", alarmId: record.alarm_id, }, }); } const columns = [ { title: "Alarm", dataIndex: "rule_name", render: (v: string) => v || "—", }, { title: "Severity", dataIndex: "severity", render: (v: string) => <Tag cc:/autoconnecto/frontend/src/features/alarms/AlarmDetailsPage.tsx (control)
text
rams, useNavigate } from "react-router-dom"; import { ArrowLeftOutlined, PrinterOutlined, ReloadOutlined, FilePdfOutlined, } from "@ant-design/icons"; import html2canvas from "html2canvas"; import jsPDF from "jspdf"; import { alarmsApi } from "../../api/alarms.api"; const { Title, Text } = Typographc:/autoconnecto/frontend/src/features/alarms/AlarmDetailsPage.tsx (control)
text
}}> {alarm.status || "—"} </Tag> {alarm.acknowledged ? ( <Tag color="green" style={{ fontSize: 13 }}> ACKNOWLEDGED </Tag> ) : ( <Tag color="red" style={{ fc:/autoconnecto/frontend/src/features/alarms/AlarmListPage.tsx (control)
text
message, Card, Empty, Alert, Select, } from "antd"; import { CheckOutlined, StopOutlined, ReloadOutlined, ExportOutlined, EyeOutlined, } from "@ant-design/icons"; import { useNavigate } from "react-router-dom"; import api from "../../api/apiClient"; import { alarmsApi } from "../.c:/autoconnecto/frontend/src/features/alarms/AlarmListPage.tsx (control)
text
lert, Select, } from "antd"; import { CheckOutlined, StopOutlined, ReloadOutlined, ExportOutlined, EyeOutlined, } from "@ant-design/icons"; import { useNavigate } from "react-router-dom"; import api from "../../api/apiClient"; import { alarmsApi } from "../../api/alarms.api"; import { dashboac:/autoconnecto/frontend/src/features/alarms/AlarmDetailsPage.tsx (control)
text
: return "gray"; default: return "blue"; } } export default function AlarmDetailsPage() { const { alarmId } = useParams(); const navigate = useNavigate(); const exportRef = useRef<HTMLDivElement | null>(null); const [loading, setLoading] = useState(true); const [exportingPdf,c:/autoconnecto/frontend/src/features/alarms/AlarmListPage.tsx (control)
text
, Typography, Tag, Space, Button, Modal, message, Card, Empty, Alert, Select, } from "antd"; import { CheckOutlined, StopOutlined, ReloadOutlined, ExportOutlined, EyeOutlined, } from "@ant-design/icons"; import { useNavigate } from "react-router-dom"; import api fromc:/autoconnecto/frontend/src/features/alarms/AlarmListPage.tsx (control)
text
const ATTR_TARGET_DASHBOARD_ID = "alarms.targetDashboardId"; const ATTR_TARGET_STATE_ID = "alarms.targetStateId"; const ATTR_DEVICE_TYPE = "alarms.deviceType"; type AlarmRecord = { alarm_id: string; device_id: string; device_name?: string; device_type?: string; rule_name?: string; severity?: strc:/autoconnecto/frontend/src/features/alarms/AlarmDetailsPage.tsx (control)
text
from "react-router-dom"; import { ArrowLeftOutlined, PrinterOutlined, ReloadOutlined, FilePdfOutlined, } from "@ant-design/icons"; import html2canvas from "html2canvas"; import jsPDF from "jspdf"; import { alarmsApi } from "../../api/alarms.api"; const { Title, Text } = Typography; function formc:/autoconnecto/frontend/src/features/alarms/AlarmDetailsPage.tsx (control)
text
td"; import { useParams, useNavigate } from "react-router-dom"; import { ArrowLeftOutlined, PrinterOutlined, ReloadOutlined, FilePdfOutlined, } from "@ant-design/icons"; import html2canvas from "html2canvas"; import jsPDF from "jspdf"; import { alarmsApi } from "../../api/alarms.api"; const { Titlec:/autoconnecto/frontend/src/features/alarms/AlarmDetailsPage.tsx (acknowledge-alarm-flow)
text
}}> {alarm.status || "—"} </Tag> {alarm.acknowledged ? ( <Tag color="green" style={{ fontSize: 13 }}> ACKNOWLEDGED </Tag> ) : ( <Tag color="red" style={{ fc:/autoconnecto/frontend/src/features/alarms/AlarmDetailsPage.tsx (clear-alarm-flow)
text
eturn "default"; } } function statusColor(status?: string) { switch (status) { case "ACTIVE": return "red"; case "CLEARED": return "green"; default: return "default"; } } function eventColor(type?: string) { switch (type) { case "CREATED": return "bluec:/autoconnecto/frontend/src/features/alarms/AlarmDetailsPage.tsx (open-dashboard-from-alarm-flow)
text
<Space> <Button icon={<ArrowLeftOutlined />} onClick={() => navigate(-1)} > Back </Button> <Button icon={<ReloadOutlined />} onClick={load} > Refresh </Button> </c:/autoconnecto/frontend/src/features/alarms/AlarmDetailsPage.tsx (open-alarm-details-flow)
text
ARED": return "gray"; default: return "blue"; } } export default function AlarmDetailsPage() { const { alarmId } = useParams(); const navigate = useNavigate(); const exportRef = useRef<HTMLDivElement | null>(null); const [loading, setLoading] = useState(true); const [exportingc:/autoconnecto/frontend/src/features/alarms/AlarmDetailsPage.tsx (export-pdf-flow)
text
from "react-router-dom"; import { ArrowLeftOutlined, PrinterOutlined, ReloadOutlined, FilePdfOutlined, } from "@ant-design/icons"; import html2canvas from "html2canvas"; import jsPDF from "jspdf"; import { alarmsApi } from "../../api/alarms.api"; const { Title, Text } = Typography; function formc:/autoconnecto/frontend/src/features/alarms/AlarmDetailsPage.tsx (print-alarm-flow)
text
td"; import { useParams, useNavigate } from "react-router-dom"; import { ArrowLeftOutlined, PrinterOutlined, ReloadOutlined, FilePdfOutlined, } from "@ant-design/icons"; import html2canvas from "html2canvas"; import jsPDF from "jspdf"; import { alarmsApi } from "../../api/alarms.api"; const { Titlec:/autoconnecto/frontend/src/features/alarms/AlarmDetailsPage.tsx (constraint)
text
anvas = await html2canvas(exportRef.current, { scale: 2, useCORS: true, backgroundColor: "#ffffff", logging: false, }); const imgData = canvas.toDataURL("image/png"); const pdf = new jsPDF("p", "mm", "a4"); const pageWidth = pdf.internal.pageSize.getWic:/autoconnecto/frontend/src/features/alarms/AlarmDetailsPage.tsx (constraint)
text
eturn "default"; } } function statusColor(status?: string) { switch (status) { case "ACTIVE": return "red"; case "CLEARED": return "green"; default: return "default"; } } function eventColor(type?: string) { switch (type) { case "CREATED": return "bluec:/autoconnecto/frontend/src/features/alarms/AlarmListPage.tsx (constraint)
text
/sdk/useAlarms"; const { Title, Text } = Typography; const ATTR_TARGET_DASHBOARD_ID = "alarms.targetDashboardId"; const ATTR_TARGET_STATE_ID = "alarms.targetStateId"; const ATTR_DEVICE_TYPE = "alarms.deviceType"; type AlarmRecord = { alarm_id: string; device_id: string; device_name?: string; devic:/autoconnecto/frontend/src/features/alarms/AlarmListPage.tsx (constraint)
text
const ATTR_TARGET_DASHBOARD_ID = "alarms.targetDashboardId"; const ATTR_TARGET_STATE_ID = "alarms.targetStateId"; const ATTR_DEVICE_TYPE = "alarms.deviceType"; type AlarmRecord = { alarm_id: string; device_id: string; device_name?: string; device_type?: string; rule_name?: string; severity?: strc:/autoconnecto/frontend/src/features/alarms/AlarmDetailsPage.tsx (constraint)
text
Spin size="large" /> </div> ) : !alarm ? ( <Empty description="Alarm not found" /> ) : ( <Space direction="vertical" size={16} style={{ width: "100%" }}> <Card className="print-card"> <div style={{ displayc:/autoconnecto/frontend/src/features/alarms/AlarmDetailsPage.tsx (constraint)
text
utlined, } from "@ant-design/icons"; import html2canvas from "html2canvas"; import jsPDF from "jspdf"; import { alarmsApi } from "../../api/alarms.api"; const { Title, Text } = Typography; function formatDateTime(ts?: number | null) { if (!ts) return "—"; const d = new Date(Number(ts)); if (Number.is