From db454867f37a1bec71db9ad848008abdb651130d Mon Sep 17 00:00:00 2001 From: Sharang Parnerkar Date: Wed, 4 Mar 2026 21:53:33 +0100 Subject: [PATCH] Add repository filter dropdown to findings page Adds a repo_filter signal and fetches the repository list to populate a select dropdown before existing severity/type/status filters, allowing users to filter findings by specific repository. Co-Authored-By: Claude Opus 4.6 --- compliance-dashboard/src/pages/findings.rs | 28 +++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/compliance-dashboard/src/pages/findings.rs b/compliance-dashboard/src/pages/findings.rs index e8537b7..2f06b8e 100644 --- a/compliance-dashboard/src/pages/findings.rs +++ b/compliance-dashboard/src/pages/findings.rs @@ -11,14 +11,20 @@ pub fn FindingsPage() -> Element { let mut severity_filter = use_signal(String::new); let mut type_filter = use_signal(String::new); let mut status_filter = use_signal(String::new); + let mut repo_filter = use_signal(String::new); + + let repos = use_resource(|| async { + crate::infrastructure::repositories::fetch_repositories(1).await.ok() + }); let findings = use_resource(move || { let p = page(); let sev = severity_filter(); let typ = type_filter(); let stat = status_filter(); + let repo = repo_filter(); async move { - crate::infrastructure::findings::fetch_findings(p, sev, typ, stat, String::new()) + crate::infrastructure::findings::fetch_findings(p, sev, typ, stat, repo) .await .ok() } @@ -31,6 +37,26 @@ pub fn FindingsPage() -> Element { } div { class: "filter-bar", + select { + onchange: move |e| { repo_filter.set(e.value()); page.set(1); }, + option { value: "", "All Repositories" } + { + match &*repos.read() { + Some(Some(resp)) => rsx! { + for repo in &resp.data { + { + let id = repo.id.as_ref().map(|id| id.to_hex()).unwrap_or_default(); + let name = repo.name.clone(); + rsx! { + option { value: "{id}", "{name}" } + } + } + } + }, + _ => rsx! {}, + } + } + } select { onchange: move |e| { severity_filter.set(e.value()); page.set(1); }, option { value: "", "All Severities" }