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 }) {
- 漏洞 + 漏洞(按严重度排序)