diff --git a/web/src/view/mod.rs b/web/src/view/mod.rs index 90a6056..6feab0e 100644 --- a/web/src/view/mod.rs +++ b/web/src/view/mod.rs @@ -263,81 +263,93 @@ fn search_results( } else { set_title(query); } - 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); - }; - let is_unread = unread_idx.is_some(); - let mut title_break = None; - const TITLE_LENGTH_WRAP_LIMIT: usize = 40; - for w in r.subject.split_whitespace() { - if w.len() > TITLE_LENGTH_WRAP_LIMIT { - title_break = Some(C!["break-all", "text-pretty"]); + let rows: Vec<_> = 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); + }; + let is_unread = unread_idx.is_some(); + let mut title_break = None; + const TITLE_LENGTH_WRAP_LIMIT: usize = 40; + for w in r.subject.split_whitespace() { + if w.len() > TITLE_LENGTH_WRAP_LIMIT { + title_break = Some(C!["break-all", "text-pretty"]); + } } - } - div![ - C![ - "flex", - "flex-nowrap", - "w-auto", - "flex-auto", - "py-4", - "border-b", - "border-neutral-800" - ], div![ - C!["flex", "items-center", "mr-4"], - input![ - C![&tw_classes::CHECKBOX], - attrs! { - At::Type=>"checkbox", - At::Checked=>selected_threads.contains(&tid).as_at_value(), - } + C![ + "flex", + "flex-nowrap", + "w-auto", + "flex-auto", + "py-4", + "border-b", + "border-neutral-800" ], - ev(Ev::Input, move |e| { - if let Some(input) = e - .target() - .as_ref() - .expect("failed to get reference to target") - .dyn_ref::() - { - if input.checked() { - Msg::SelectionAddThread(check_tid) - } else { - Msg::SelectionRemoveThread(check_tid) - } - } else { - Msg::Noop - } - }), - ], - a![ - C!["flex-grow"], - IF!(is_unread => C!["font-bold"]), - attrs! { - At::Href => urls::thread(&tid) - }, - div![title_break, &r.subject], - span![C!["text-xs"], pretty_authors(&r.authors)], div![ - C!["flex", "flex-wrap", "justify-between"], - span![tags_chiclet(&tags)], - span![C!["text-sm"], datetime] + C!["flex", "items-center", "mr-4"], + input![ + C![&tw_classes::CHECKBOX], + attrs! { + At::Type=>"checkbox", + At::Checked=>selected_threads.contains(&tid).as_at_value(), + } + ], + ev(Ev::Input, move |e| { + if let Some(input) = e + .target() + .as_ref() + .expect("failed to get reference to target") + .dyn_ref::() + { + if input.checked() { + Msg::SelectionAddThread(check_tid) + } else { + Msg::SelectionRemoveThread(check_tid) + } + } else { + Msg::Noop + } + }), + ], + a![ + C!["flex-grow"], + IF!(is_unread => C!["font-bold"]), + attrs! { + At::Href => urls::thread(&tid) + }, + div![title_break, &r.subject], + span![C!["text-xs"], pretty_authors(&r.authors)], + div![ + C!["flex", "flex-wrap", "justify-between"], + span![tags_chiclet(&tags)], + span![C!["text-sm"], datetime] + ] ] ] + }) + .collect(); + let content = if rows.is_empty() { + div![ + C!["text-center"], + h1![C!["text-9xl"], "🥳"], + p![C!["mt-8", "text-3xl", "font-semibold"], "All caught up!"] ] - }); + } else { + div![rows] + }; let show_bulk_edit = !selected_threads.is_empty(); let all_selected = selected_threads.len() == results.len(); div![ C!["flex", "flex-col", "flex-auto", "p-4"], search_toolbar(count, pager, show_bulk_edit, all_selected), - div![rows], + content, search_toolbar(count, pager, show_bulk_edit, all_selected), ] }