From ddd47e67ac1037173d26cd80b356ab627bd2e862 Mon Sep 17 00:00:00 2001 From: henrygd Date: Sat, 25 Apr 2026 14:39:04 -0400 Subject: [PATCH] update --- internal/hub/probes.go | 6 ++ .../site/src/components/charts/area-chart.tsx | 6 +- .../site/src/components/charts/line-chart.tsx | 10 ++- .../network-probes-table/probe-dialog.tsx | 33 +++++----- .../routes/system/charts/probes-charts.tsx | 1 + internal/site/src/components/ui/chart.tsx | 61 +++++++++++++------ internal/site/src/components/ui/table.tsx | 2 +- internal/site/src/lib/use-network-probes.ts | 3 +- 8 files changed, 81 insertions(+), 41 deletions(-) diff --git a/internal/hub/probes.go b/internal/hub/probes.go index e338a1c0..bea0b2e1 100644 --- a/internal/hub/probes.go +++ b/internal/hub/probes.go @@ -31,6 +31,12 @@ func bindNetworkProbesEvents(hub *Hub) { if !e.Record.GetBool("enabled") { return nil } + // if system connected, run the probe immediately + // if not, return and wait for the system to connect and sync probes then + system, err := hub.sm.GetSystem(e.Record.GetString("system")) + if err != nil || system.Status != "up" { + return nil + } result, err := hub.upsertNetworkProbe(e.Record, true) if err != nil { hub.Logger().Warn("failed to sync probe to agent", "system", e.Record.GetString("system"), "probe", e.Record.Id, "err", err) diff --git a/internal/site/src/components/charts/area-chart.tsx b/internal/site/src/components/charts/area-chart.tsx index 09844c88..69532299 100644 --- a/internal/site/src/components/charts/area-chart.tsx +++ b/internal/site/src/components/charts/area-chart.tsx @@ -111,6 +111,8 @@ export default function AreaChartDefault({ }) }, [areasKey, displayMaxToggled]) + const XAxis = xAxis(chartData.chartTime, displayData.at(-1)?.created) + return useMemo(() => { if (displayData.length === 0) { return null @@ -146,7 +148,7 @@ export default function AreaChartDefault({ axisLine={false} /> )} - {xAxis(chartData.chartTime, displayData.at(-1)?.created as number)} + {XAxis} ) - }, [displayData, yAxisWidth, filter, Areas]) + }, [displayData, yAxisWidth, filter, Areas, XAxis]) } diff --git a/internal/site/src/components/charts/line-chart.tsx b/internal/site/src/components/charts/line-chart.tsx index cd3c65f0..c9501c8b 100644 --- a/internal/site/src/components/charts/line-chart.tsx +++ b/internal/site/src/components/charts/line-chart.tsx @@ -42,6 +42,7 @@ export default function LineChartDefault({ truncate = false, chartProps, connectNulls, + dot = false, }: { chartData: ChartData // biome-ignore lint/suspicious/noExplicitAny: accepts different data source types (systemStats or containerData) @@ -64,6 +65,7 @@ export default function LineChartDefault({ truncate?: boolean chartProps?: Omit, "data" | "margin"> connectNulls?: boolean + dot?: boolean }) { const { yAxisWidth, updateYAxisWidth } = useYAxisWidth() const { isIntersecting, ref } = useIntersectionObserver({ freeze: false }) @@ -87,6 +89,8 @@ export default function LineChartDefault({ // Use a stable key derived from data point identities and visual properties const linesKey = dataPoints?.map((d) => `${d.label}:${d.strokeOpacity ?? ""}`).join("\0") + const XAxis = xAxis(chartData.chartTime, displayData.at(-1)?.created) + const Lines = useMemo(() => { return dataPoints?.map((dataPoint, i) => { let { color } = dataPoint @@ -99,7 +103,7 @@ export default function LineChartDefault({ dataKey={dataPoint.dataKey} name={dataPoint.label} type="monotoneX" - dot={false} + dot={dot} strokeWidth={1.5} stroke={color} strokeOpacity={dataPoint.strokeOpacity} @@ -148,7 +152,7 @@ export default function LineChartDefault({ axisLine={false} /> )} - {xAxis(chartData.chartTime, displayData.at(-1)?.created as number)} + {XAxis} ) - }, [displayData, yAxisWidth, filter, Lines]) + }, [displayData, yAxisWidth, filter, Lines, XAxis]) } diff --git a/internal/site/src/components/network-probes-table/probe-dialog.tsx b/internal/site/src/components/network-probes-table/probe-dialog.tsx index bbeab5ab..d82c53d9 100644 --- a/internal/site/src/components/network-probes-table/probe-dialog.tsx +++ b/internal/site/src/components/network-probes-table/probe-dialog.tsx @@ -1,4 +1,4 @@ -import { useState } from "react" +import { useRef, useState } from "react" import { Trans, useLingui } from "@lingui/react/macro" import { useStore } from "@nanostores/react" import { pb } from "@/lib/api" @@ -111,13 +111,14 @@ export function AddProbeDialog({ systemId }: { systemId?: string }) { const [bulkInput, setBulkInput] = useState("") const [bulkLoading, setBulkLoading] = useState(false) const [bulkSelectedSystemId, setBulkSelectedSystemId] = useState("") + const bulkFormRef = useRef(null) const { toast } = useToast() const { t } = useLingui() const systems = useStore($systems) const resetBulkForm = () => { setBulkInput("") - setBulkSelectedSystemId("") + // setBulkSelectedSystemId("") } const openBulkAdd = (selectedSystemId?: string) => { @@ -140,13 +141,15 @@ export function AddProbeDialog({ systemId }: { systemId?: string }) { try { const system = systemId ?? bulkSelectedSystemId + if (!system) { + throw new Error("Select a system.") + } const rawLines = bulkInput.split(/\r?\n/).filter((line) => line.trim()) if (!rawLines.length) { throw new Error("Enter at least one probe.") } const payloads = rawLines.map((line, index) => parseBulkProbeLine(line, index + 1, system)) - setBulkOpen(false) closedForSubmit = true let batch = pb.createBatch() let inBatch = 0 @@ -221,16 +224,10 @@ export function AddProbeDialog({ systemId }: { systemId?: string }) { Bulk Add {{ foo: t`Network Probes` }} - - Paste one probe per line. See{" "} - - the documentation - - . - + target[,protocol[,port[,interval[,name]]]] - TCP/HTTP default to port 443. -
+
{!systemId && (
@@ -252,8 +249,8 @@ export function AddProbeDialog({ systemId }: { systemId?: string }) {
)}
-