From 84a4fc037a24d629625671f1ef8ad4fb0e482475 Mon Sep 17 00:00:00 2001 From: oliver Date: Wed, 5 Aug 2026 19:27:52 +0800 Subject: [PATCH] Open LLDP job detail when jumping from canvas discover. Pass job_id in the LLDP page URL so the network module auto-opens the task detail modal. Co-authored-by: Cursor --- web/src/pages/TopologyPage.tsx | 11 +++++++---- web/src/pages/network/LldpLinksPage.tsx | 19 +++++++++++++++++++ web/src/types.ts | 1 + 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/web/src/pages/TopologyPage.tsx b/web/src/pages/TopologyPage.tsx index 6b3a7a9..3009224 100644 --- a/web/src/pages/TopologyPage.tsx +++ b/web/src/pages/TopologyPage.tsx @@ -1602,6 +1602,7 @@ export function TopologyPage() { const out: TopologyDiscoverOut = { map_id: mapId, protocol: "lldp", + job_id: job.id, scanned: job.done, edges_added: job.edges_added, edges_updated: job.edges_updated, @@ -3533,12 +3534,14 @@ export function TopologyPage() { diff --git a/web/src/pages/network/LldpLinksPage.tsx b/web/src/pages/network/LldpLinksPage.tsx index a563e73..710116a 100644 --- a/web/src/pages/network/LldpLinksPage.tsx +++ b/web/src/pages/network/LldpLinksPage.tsx @@ -1,5 +1,6 @@ import { useEffect, useMemo, useState } from "react"; import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; +import { useSearchParams } from "react-router-dom"; import { fetchCliTargets, fetchFabricEdges, @@ -28,6 +29,7 @@ export function LldpLinksPage() { const { t } = useI18n(); const { showOk, showError } = useToast(); const queryClient = useQueryClient(); + const [searchParams, setSearchParams] = useSearchParams(); const [jobPage, setJobPage] = useState(1); const [expandedJobId, setExpandedJobId] = useState(""); @@ -91,6 +93,23 @@ export function LldpLinksPage() { setPolicyHydrated(true); }, [dashQuery.data, policyHydrated]); + // Deep link from topology canvas: /network/topology/lldp?job_id=… + useEffect(() => { + const jobId = String(searchParams.get("job_id") || "").trim(); + if (!jobId) return; + setItemDetail(null); + setItemPage(1); + setExpandedJobId(jobId); + setSearchParams( + (prev) => { + const next = new URLSearchParams(prev); + if (next.get("job_id") === jobId) next.delete("job_id"); + return next; + }, + { replace: true }, + ); + }, [searchParams, setSearchParams]); + const jobsQuery = useQuery({ queryKey: queryKeys.lldpCollectJobs(jobPage), queryFn: () => fetchLldpCollectJobs({ page: jobPage, pageSize: 10 }), diff --git a/web/src/types.ts b/web/src/types.ts index 0cebb8c..676dc01 100644 --- a/web/src/types.ts +++ b/web/src/types.ts @@ -636,6 +636,7 @@ export type TopologyDiscoverNeResult = TopologyDiscoverJobItem & { export type TopologyDiscoverOut = { map_id?: string; protocol?: string; + job_id?: string; scanned: number; edges_added: number; edges_updated: number;