From dd151acfcfc414e1d6eb4c3aa894e30dd6cc4a3c Mon Sep 17 00:00:00 2001 From: Maxime Van Hees Date: Thu, 25 Jul 2024 13:30:50 +0200 Subject: [PATCH] Search functionality for Routes tables --- mycelium-ui/src/main.rs | 42 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/mycelium-ui/src/main.rs b/mycelium-ui/src/main.rs index e92f141..76f004e 100644 --- a/mycelium-ui/src/main.rs +++ b/mycelium-ui/src/main.rs @@ -504,13 +504,53 @@ fn RoutesTable(routes: Vec, table_name: String) -> Element sorted }); + // Searching + let mut search_state = use_signal(|| SearchState { + query: String::new(), + column: "Subnet".to_string(), + }); + + let filtered_routes = use_memo(move || { + let query = search_state.read().query.to_lowercase(); + let column = &search_state.read().column; + sorted_routes + .read() + .iter() + .filter(|route| match column.as_str() { + "Subnet" => route.subnet.to_string().to_lowercase().contains(&query), + "Next-hop" => route.next_hop.to_string().to_lowercase().contains(&query), + "Metric" => route.metric.to_string().to_lowercase().contains(&query), + "Seqno" => route.seqno.to_string().to_lowercase().contains(&query), + _ => false, + }) + .cloned() + .collect::>() + }); + + let routes_len = filtered_routes.len(); + let start = current_page * items_per_page; let end = (start + items_per_page).min(routes_len); - let current_routes = &sorted_routes.read()[start..end]; + let current_routes = &filtered_routes.read()[start..end]; rsx! { div { class: "{table_name.to_lowercase()}-routes", h2 { "{table_name} Routes" } + div { class: "search-container", + input { + placeholder: "Search...", + value: "{search_state.read().query}", + oninput: move |evt| search_state.write().query.clone_from(&evt.value()), + } + select { + value: "{search_state.read().column}", + onchange: move |evt| search_state.write().column.clone_from(&evt.value()), + option { value: "Subnet", "Subnet" } + option { value: "Next-hop", "Next-hop" } + option { value: "Metric", "Metric" } + option { value: "Seqno", "Seqno" } + } + } div { class: "table-container", table { thead {