Add repository filter dropdown to findings page
Some checks failed
CI / Format (push) Failing after 24s
CI / Clippy (push) Failing after 1m20s
CI / Security Audit (push) Successful in 1m34s
CI / Tests (push) Has been skipped

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 <noreply@anthropic.com>
This commit is contained in:
Sharang Parnerkar
2026-03-04 21:53:33 +01:00
parent 5da0b5f4df
commit db454867f3

View File

@@ -11,14 +11,20 @@ pub fn FindingsPage() -> Element {
let mut severity_filter = use_signal(String::new); let mut severity_filter = use_signal(String::new);
let mut type_filter = use_signal(String::new); let mut type_filter = use_signal(String::new);
let mut status_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 findings = use_resource(move || {
let p = page(); let p = page();
let sev = severity_filter(); let sev = severity_filter();
let typ = type_filter(); let typ = type_filter();
let stat = status_filter(); let stat = status_filter();
let repo = repo_filter();
async move { async move {
crate::infrastructure::findings::fetch_findings(p, sev, typ, stat, String::new()) crate::infrastructure::findings::fetch_findings(p, sev, typ, stat, repo)
.await .await
.ok() .ok()
} }
@@ -31,6 +37,26 @@ pub fn FindingsPage() -> Element {
} }
div { class: "filter-bar", 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 { select {
onchange: move |e| { severity_filter.set(e.value()); page.set(1); }, onchange: move |e| { severity_filter.set(e.value()); page.set(1); },
option { value: "", "All Severities" } option { value: "", "All Severities" }