From 07cfd41cd1eee897379fcc5e27247d7bf9576ba3 Mon Sep 17 00:00:00 2001 From: spinline Date: Wed, 4 Feb 2026 23:32:02 +0300 Subject: [PATCH] fix(logic): exclude incomplete paused torrents from completed filter --- frontend/src/components/layout/sidebar.rs | 52 ++++++++++++++++++++--- frontend/src/components/torrent/table.rs | 21 ++++----- 2 files changed, 56 insertions(+), 17 deletions(-) diff --git a/frontend/src/components/layout/sidebar.rs b/frontend/src/components/layout/sidebar.rs index 2a56a5c..ca38eed 100644 --- a/frontend/src/components/layout/sidebar.rs +++ b/frontend/src/components/layout/sidebar.rs @@ -1,15 +1,49 @@ -use leptos::*; use leptos::wasm_bindgen::JsCast; +use leptos::*; #[component] pub fn Sidebar() -> impl IntoView { let store = use_context::().expect("store not provided"); let total_count = move || store.torrents.get().len(); - let downloading_count = move || store.torrents.get().iter().filter(|t| t.status == shared::TorrentStatus::Downloading).count(); - let seeding_count = move || store.torrents.get().iter().filter(|t| t.status == shared::TorrentStatus::Seeding).count(); - let completed_count = move || store.torrents.get().iter().filter(|t| t.status == shared::TorrentStatus::Seeding || t.status == shared::TorrentStatus::Paused).count(); - let inactive_count = move || store.torrents.get().iter().filter(|t| t.status == shared::TorrentStatus::Paused || t.status == shared::TorrentStatus::Error).count(); + let downloading_count = move || { + store + .torrents + .get() + .iter() + .filter(|t| t.status == shared::TorrentStatus::Downloading) + .count() + }; + let seeding_count = move || { + store + .torrents + .get() + .iter() + .filter(|t| t.status == shared::TorrentStatus::Seeding) + .count() + }; + let completed_count = move || { + store + .torrents + .get() + .iter() + .filter(|t| { + t.status == shared::TorrentStatus::Seeding + || (t.status == shared::TorrentStatus::Paused && t.percent_complete >= 100.0) + }) + .count() + }; + let inactive_count = move || { + store + .torrents + .get() + .iter() + .filter(|t| { + t.status == shared::TorrentStatus::Paused + || t.status == shared::TorrentStatus::Error + }) + .count() + }; let close_drawer = move || { if let Some(element) = document().get_element_by_id("my-drawer") { @@ -25,7 +59,11 @@ pub fn Sidebar() -> impl IntoView { }; let filter_class = move |f: crate::store::FilterStatus| { - if store.filter.get() == f { "active" } else { "" } + if store.filter.get() == f { + "active" + } else { + "" + } }; view! { @@ -80,7 +118,7 @@ pub fn Sidebar() -> impl IntoView { - + } diff --git a/frontend/src/components/torrent/table.rs b/frontend/src/components/torrent/table.rs index 0f0a8e5..a64beb0 100644 --- a/frontend/src/components/torrent/table.rs +++ b/frontend/src/components/torrent/table.rs @@ -65,7 +65,8 @@ pub fn TorrentTable() -> impl IntoView { } crate::store::FilterStatus::Completed => { t.status == shared::TorrentStatus::Seeding - || t.status == shared::TorrentStatus::Paused + || (t.status == shared::TorrentStatus::Paused + && t.percent_complete >= 100.0) } // Approximate crate::store::FilterStatus::Inactive => { t.status == shared::TorrentStatus::Paused @@ -282,14 +283,14 @@ pub fn TorrentTable() -> impl IntoView {
"Torrents" - -