From 0ecaea2fb269bb79396bcb5b012f419b0380f286 Mon Sep 17 00:00:00 2001 From: RuoJi6 Date: Mon, 26 Oct 2026 09:14:28 +0800 Subject: [PATCH] =?UTF-8?q?feat(web):=20=E4=BB=BB=E5=8A=A1=E5=8F=91?= =?UTF-8?q?=E7=8E=B0=20tab=20=E6=94=AF=E6=8C=81=E4=B8=A5=E9=87=8D=E5=BA=A6?= =?UTF-8?q?=E7=AD=9B=E9=80=89=E4=B8=8E=E6=8E=92=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 对齐全局发现页:共用 severity chip、Case 列表 sort=severity, 原始上报列表前端按严重度过滤并排序。 --- web/src/app/(main)/function/findings/page.tsx | 12 +--- .../tasks/detail/_tabs/findings-tab.tsx | 53 ++++++++++----- web/src/lib/finding-severity.test.mjs | 68 +++++++++++++++++++ web/src/lib/finding-severity.ts | 19 ++++++ web/src/lib/status.ts | 8 +++ 5 files changed, 134 insertions(+), 26 deletions(-) create mode 100644 web/src/lib/finding-severity.test.mjs create mode 100644 web/src/lib/finding-severity.ts diff --git a/web/src/app/(main)/function/findings/page.tsx b/web/src/app/(main)/function/findings/page.tsx index 4c59d2a..4ce291c 100644 --- a/web/src/app/(main)/function/findings/page.tsx +++ b/web/src/app/(main)/function/findings/page.tsx @@ -42,7 +42,7 @@ import { Textarea } from "@/components/ui/textarea"; import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"; import { api } from "@/lib/api"; import { getLocalStorageValue, setLocalStorageValue } from "@/lib/local-storage.client"; -import { statusMeta } from "@/lib/status"; +import { SEVERITY_FILTER_OPTIONS, statusMeta } from "@/lib/status"; import type { ActiveFindingRetest, Finding, @@ -918,15 +918,7 @@ export default function FindingsPage() { size="sm" spacing={0} > - {( - [ - ["all", "全部"], - ["critical", "严重"], - ["high", "高危"], - ["medium", "中危"], - ["low", "低危"], - ] as const - ).map(([val, label]) => ( + {SEVERITY_FILTER_OPTIONS.map(([val, label]) => ( {label} diff --git a/web/src/app/(main)/function/tasks/detail/_tabs/findings-tab.tsx b/web/src/app/(main)/function/tasks/detail/_tabs/findings-tab.tsx index b643264..679e23f 100644 --- a/web/src/app/(main)/function/tasks/detail/_tabs/findings-tab.tsx +++ b/web/src/app/(main)/function/tasks/detail/_tabs/findings-tab.tsx @@ -12,10 +12,12 @@ import { StatusBadge } from "@/components/status-badge"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent } from "@/components/ui/card"; import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger } from "@/components/ui/select"; +import { ToggleGroup, ToggleGroupItem } from "@/components/ui/toggle-group"; import { api } from "@/lib/api"; +import { filterAndSortFindings } from "@/lib/finding-severity"; import { useStoredSortPreference } from "@/lib/sort-preference"; -import { statusMeta } from "@/lib/status"; -import type { Finding, FindingStatus } from "@/lib/types"; +import { SEVERITY_FILTER_OPTIONS, statusMeta } from "@/lib/status"; +import type { Finding, FindingStatus, Severity } from "@/lib/types"; import { cn } from "@/lib/utils"; type FindingSortField = "time"; @@ -140,6 +142,7 @@ function Row({ export function FindingsTab({ taskId }: { taskId: string }) { const [findings, setFindings] = React.useState([]); + const [severity, setSeverity] = React.useState<"all" | Severity>("all"); const [sortPreference, setSortPreference] = useStoredSortPreference( FINDING_SORT_PREFERENCE_KEY, FINDING_SORT_FIELDS, @@ -180,20 +183,32 @@ export function FindingsTab({ taskId }: { taskId: string }) { } }, []); - const items = findings - .filter((f) => f.task_id === taskId || f.inherited) - .sort((a, b) => { - const compared = Date.parse(a.ts) - Date.parse(b.ts); - if (compared !== 0) return sortPreference.direction === "asc" ? compared : -compared; - return b.id.localeCompare(a.id, undefined, { numeric: true }); - }); + // Discover inherited sources before severity filtering; finding-cases owns folder matching. + const taskFindings = findings.filter((f) => f.task_id === taskId || f.inherited); + const items = filterAndSortFindings(taskFindings, severity, sortPreference.direction); return (
- + value && setSeverity(value as "all" | Severity)} + variant="outline" + size="sm" + spacing={0} + > + {SEVERITY_FILTER_OPTIONS.map(([val, label]) => ( + + {label} + + ))} + + {[ ...new Set( - items + taskFindings .filter((f) => f.inherited) .map((f) => f.source_task_id) .filter((id): id is string => !!id), @@ -201,7 +216,11 @@ export function FindingsTab({ taskId }: { taskId: string }) { ].map((source) => (

继承任务 #{source} · 只读

- +
))}
@@ -209,11 +228,11 @@ export function FindingsTab({ taskId }: { taskId: string }) {
- 漏洞 + 漏洞(按严重度排序)