web: add bulk read/unerad functionality

This commit is contained in:
2024-02-20 19:24:56 -08:00
parent de3f392bd7
commit f50fe7196e
8 changed files with 484 additions and 72 deletions

View File

@@ -1,3 +1,5 @@
use std::collections::HashSet;
use seed::{prelude::*, *};
use crate::{
@@ -16,7 +18,8 @@ pub(super) fn view(model: &Model) -> Node<Msg> {
results,
count,
pager,
} => search_results(&query, results.as_slice(), *count, pager),
selected_threads,
} => search_results(&query, results.as_slice(), *count, pager, selected_threads),
};
div![
view_header(&model.query, &model.refreshing_state),
@@ -30,6 +33,7 @@ fn search_results(
results: &[FrontPageQuerySearchNodes],
count: usize,
pager: &FrontPageQuerySearchPageInfo,
selected_threads: &HashSet<String>,
) -> Node<Msg> {
if query.is_empty() {
set_title("all mail");
@@ -38,20 +42,45 @@ fn search_results(
}
let rows = results.iter().map(|r| {
let tid = r.thread.clone();
let check_tid = r.thread.clone();
let datetime = human_age(r.timestamp as i64);
let unread_idx = r.tags.iter().position(|e| e == &"unread");
let mut tags = r.tags.clone();
if let Some(idx) = unread_idx {
tags.remove(idx);
};
a![
C!["has-text-light"],
IF!(unread_idx.is_some() => C!["unread"]),
attrs! {
At::Href => urls::thread(&tid)
},
div![
C!["row"],
div![
C!["row"],
label![
C!["b-checkbox", "checkbox", "is-large"],
input![attrs! {
At::Type=>"checkbox",
At::Checked=>selected_threads.contains(&tid).as_at_value(),
}],
span![C!["check"]],
ev(Ev::Input, move |e| {
if let Some(input) = e
.target()
.as_ref()
.expect("failed to get reference to target")
.dyn_ref::<web_sys::HtmlInputElement>()
{
if input.checked() {
Msg::SelectionAddThread(check_tid)
} else {
Msg::SelectionRemoveThread(check_tid)
}
} else {
Msg::Noop
}
}),
],
a![
C!["has-text-light", "summary"],
IF!(unread_idx.is_some() => C!["unread"]),
attrs! {
At::Href => urls::thread(&tid)
},
div![C!["subject"], &r.subject],
span![C!["from", "is-size-7"], pretty_authors(&r.authors)],
div![
@@ -61,10 +90,11 @@ fn search_results(
]
]
});
let show_bulk_edit = !selected_threads.is_empty();
div![
C!["search-results"],
search_toolbar(count, pager),
div![C!["index"], rows,],
search_toolbar(count, pager),
search_toolbar(count, pager, show_bulk_edit),
div![C!["index"], rows],
search_toolbar(count, pager, show_bulk_edit),
]
}