diff --git a/src/components/ClientMonitor/ClientMonitorPage.tsx b/src/components/ClientMonitor/ClientMonitorPage.tsx index efba56c..120a510 100644 --- a/src/components/ClientMonitor/ClientMonitorPage.tsx +++ b/src/components/ClientMonitor/ClientMonitorPage.tsx @@ -53,7 +53,11 @@ function formatApiDateTime(value: unknown): string { import PrinterMonitorTab from "@/components/ClientMonitor/PrinterMonitorTab"; import LabelPrinterMonitorPanel from "@/components/ClientMonitor/LabelPrinterMonitorPanel"; import DeviceConnectivityHistoryChart from "@/components/ClientMonitor/DeviceConnectivityHistoryChart"; -import { formatClientIpDisplay } from "@/lib/devicePresence"; +import { + extractDeviceUniqueSuffix, + formatClientIpDisplay, + formatDeviceDisplayLabel, +} from "@/lib/devicePresence"; type ClientRow = { deviceId: string; @@ -145,7 +149,7 @@ function toApiDateTime(value: Dayjs | null): string { } function defaultHistoryFrom(): Dayjs { - return dayjs().startOf("day"); + return dayjs().subtract(6, "day").startOf("day"); } function defaultHistoryTo(): Dayjs { @@ -176,6 +180,7 @@ export default function ClientMonitorPage() { useState(null); const [historyLoading, setHistoryLoading] = useState(false); const [historyError, setHistoryError] = useState(null); + const [historyQueried, setHistoryQueried] = useState(false); const [historyDefinitionsOpen, setHistoryDefinitionsOpen] = useState(false); const historyFetchInFlightRef = useRef(false); @@ -297,6 +302,7 @@ export default function ClientMonitorPage() { setPrinterHistoryRows([]); setPrinterHistorySummary(null); } + setHistoryQueried(true); } catch (e) { console.error("client monitor history", e); setHistoryError(e instanceof Error ? e.message : "無法載入歷史記錄"); @@ -330,6 +336,13 @@ export default function ClientMonitorPage() { return () => window.clearInterval(id); }, [fetchClients, tab]); + useEffect(() => { + if (tab !== "history") return; + void fetchHistory(); + // Auto-load when opening the history tab; filter changes use the 查詢 button. + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [tab]); + const offlineCount = summary?.offline ?? 0; return ( @@ -391,8 +404,8 @@ export default function ClientMonitorPage() { {tab === "live" && ( <> - 顯示所有已登入並開啟 FPSMS 的瀏覽器(平板、電腦等)。超過約 90 秒無心跳視為離線;超過 5 - 分鐘無頁面活動視為閒置。每 10 秒自動更新。 + 顯示最近 7 天內有心跳的裝置(平板、電腦等)。超過約 90 秒無心跳視為離線;超過 5 + 分鐘無頁面活動視為閒置。長期離線的舊紀錄會自動隱藏並清除。每 10 秒自動更新。 {offlineCount > 0 && ( @@ -466,11 +479,11 @@ export default function ClientMonitorPage() { - - {row.displayName || row.deviceId.slice(0, 8) + "…"} + + {formatDeviceDisplayLabel(row)} - - {row.deviceId} + + #{extractDeviceUniqueSuffix(row.deviceId)} @@ -532,7 +545,8 @@ export default function ClientMonitorPage() { <> 查詢指定時間範圍內的裝置(平板/電腦)與印表機異常記錄(最長 - 30 天)。圖表與表格分開顯示;超過 30 天的記錄會由系統自動清除。 + 30 天)。僅記錄離線連線差事件;在線或閒置不會出現在此。切換到此分頁會自動查詢最近 + 7 天。