From c33f901f48712d5a3acc04f193a348d3171b2599 Mon Sep 17 00:00:00 2001 From: Bill Thiede Date: Thu, 2 Mar 2023 09:33:48 -0800 Subject: [PATCH] Move to "show pretty" currently a dupe of 'show'. --- server/src/main.rs | 19 +++++++++++- web/index.html | 3 ++ web/src/lib.rs | 74 ++++++++++++++++++++++++++++++++++------------ 3 files changed, 76 insertions(+), 20 deletions(-) diff --git a/server/src/main.rs b/server/src/main.rs index 99e87c6..9bdbf8b 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -32,6 +32,15 @@ async fn search( Ok(Json(res)) } +#[get("/show//pretty")] +async fn show_pretty( + nm: &State, + query: &str, +) -> Result, Debug> { + let res = nm.show(query)?; + Ok(Json(res)) +} + #[get("/show/")] async fn show(nm: &State, query: &str) -> Result, Debug> { let res = nm.show(query)?; @@ -110,7 +119,15 @@ async fn main() -> Result<(), Box> { let _ = rocket::build() .mount( "/", - routes![original_part, original, hello, search_all, search, show], + routes![ + original_part, + original, + hello, + search_all, + search, + show_pretty, + show + ], ) .attach(cors) .manage(Notmuch::default()) diff --git a/web/index.html b/web/index.html index 414a69d..64f4fe4 100644 --- a/web/index.html +++ b/web/index.html @@ -42,6 +42,9 @@ iframe { height: 3em; padding: 1em; } +.tag { + margin-right: 2px; +} diff --git a/web/src/lib.rs b/web/src/lib.rs index 347372a..81f2d4f 100644 --- a/web/src/lib.rs +++ b/web/src/lib.rs @@ -2,6 +2,10 @@ // - it's useful when you want to check your code with `cargo make verify` // but some rules are too "annoying" or are not applicable for your case.) #![allow(clippy::wildcard_imports)] +use std::{ + collections::hash_map::DefaultHasher, + hash::{Hash, Hasher}, +}; use itertools::Itertools; use log::{debug, error, info, warn, Level}; @@ -25,7 +29,7 @@ fn init(url: Url, orders: &mut impl Orders) -> Model { match hpp { Some("t") => { let tid = url.next_hash_path_part().unwrap_or("").to_string(); - orders.send_msg(Msg::ShowRequest(tid)); + orders.send_msg(Msg::ShowPrettyRequest(tid)); } Some("s") => { query = url.next_hash_path_part().unwrap_or("").to_string(); @@ -74,6 +78,8 @@ enum Msg { SearchResult(fetch::Result), ShowRequest(String), ShowResult(fetch::Result), + ShowPrettyRequest(String), + ShowPrettyResult(fetch::Result), } // `update` describes how to handle each `Msg`. @@ -111,6 +117,21 @@ fn update(msg: Msg, model: &mut Model, orders: &mut impl Orders) { Msg::ShowResult(Err(fetch_error)) => { error!("fetch failed {:?}", fetch_error); } + + Msg::ShowPrettyRequest(tid) => { + let url = Url::new().set_hash_path(["t", &tid]); + orders.request_url(url); + orders + .skip() + .perform_cmd(async move { Msg::ShowPrettyResult(show_pretty_request(&tid).await) }); + } + Msg::ShowPrettyResult(Ok(response_data)) => { + debug!("fetch ok {:#?}", response_data); + model.context = Context::Thread(response_data); + } + Msg::ShowPrettyResult(Err(fetch_error)) => { + error!("fetch failed {:?}", fetch_error); + } } } @@ -132,6 +153,9 @@ mod api { pub fn show(tid: &str) -> String { format!("{}/show/{}", BASE_URL, tid) } + pub fn show_pretty(tid: &str) -> String { + format!("{}/show/{}/pretty", BASE_URL, tid) + } pub fn original(message_id: &str) -> String { format!("{}/original/{}", BASE_URL, message_id) } @@ -151,6 +175,16 @@ async fn show_request(tid: &str) -> fetch::Result { .map_err(|_| FetchError::JsonError(fetch::JsonError::Serde(JsValue::NULL)))?) } +async fn show_pretty_request(tid: &str) -> fetch::Result { + Request::new(api::show_pretty(tid)) + .method(Method::Get) + .fetch() + .await? + .check_status()? + .json() + .await +} + // ------ ------ // View // ------ ------ @@ -274,30 +308,32 @@ fn set_title(title: &str) { } fn tags_chiclet(tags: &[String]) -> impl Iterator> + '_ { - tags.iter().map(|tag| match tag.as_str() { - "attachment" => span![C!["tag"], "📎"], - "replied" => span![C!["tag"], i![C!["fa-solid", "fa-reply"]]], - _ => span![C!["tag"], tag], + tags.iter().map(|tag| { + let mut hasher = DefaultHasher::new(); + tag.hash(&mut hasher); + let hex = format!("#{:06x}", hasher.finish() % (1 << 24)); + let style = style! {St::BackgroundColor=>hex}; + match tag.as_str() { + "attachment" => span![C!["tag"], style, "📎"], + "replied" => span![C!["tag"], style, i![C!["fa-solid", "fa-reply"]]], + _ => span![C!["tag"], style, tag], + } }) } fn pretty_authors(authors: &str) -> impl Iterator> + '_ { + let one_person = authors.matches(',').count() == 0; let authors = authors.split(','); - /* - if authors.len() == 1 { - return authors.iter().filter_map(|author| { - Some(span![ - attrs! { - At::Title => author.trim()}, - author - ]) - }); - } - */ - Itertools::intersperse( - authors.filter_map(|author| { + authors.filter_map(move |author| { + if one_person { + return Some(span![ + attrs! { + At::Title => author.trim()}, + author + ]); + } author.split_whitespace().nth(0).map(|first| { span![ attrs! { @@ -326,7 +362,7 @@ fn view_search_results(query: &str, search_results: &SearchSummary) -> Node ], td![C!["subject"], tags_chiclet(&r.tags), " ", &r.subject], td![C!["date"], &r.date_relative], - ev(Ev::Click, move |_| Msg::ShowRequest(tid)), + ev(Ev::Click, move |_| Msg::ShowPrettyRequest(tid)), ] }); div![table![