diff --git a/web/src/view/mod.rs b/web/src/view/mod.rs index 5fe3ca0..4519467 100644 --- a/web/src/view/mod.rs +++ b/web/src/view/mod.rs @@ -440,6 +440,9 @@ fn render_open_header(msg: &ShowThreadQueryThreadOnEmailThreadMessages) -> Node< C!["px-4", "mr-auto"], span![ C!["font-semibold", "text-sm"], + from_detail.as_ref().map(|addr| attrs! { + At::Title => addr + }), &from, " ", from_detail.as_ref().map(|text| copy_text_widget(&text)) @@ -454,6 +457,9 @@ fn render_open_header(msg: &ShowThreadQueryThreadOnEmailThreadMessages) -> Node< msg.to.iter().map(|to| { let ShowThreadQueryThreadOnEmailThreadMessagesTo { name, addr } = to; span![ + addr.as_ref().map(|addr| attrs! { + At::Title => addr + }), name.as_ref().unwrap_or_else(|| addr.as_ref().unwrap_or(&unknown)), " ", addr.as_ref().map(|addr| copy_text_widget(&addr)), @@ -472,6 +478,9 @@ fn render_open_header(msg: &ShowThreadQueryThreadOnEmailThreadMessages) -> Node< msg.cc.iter().map(|cc| { let ShowThreadQueryThreadOnEmailThreadMessagesCc { name, addr } = cc; span![ + addr.as_ref().map(|addr| attrs! { + At::Title => addr + }), name.as_ref().unwrap_or_else(|| addr.as_ref().unwrap_or(&unknown)), " ", addr.as_ref().map(|addr| copy_text_widget(&addr)), @@ -504,14 +513,15 @@ fn render_open_header(msg: &ShowThreadQueryThreadOnEmailThreadMessages) -> Node< } fn render_closed_header(msg: &ShowThreadQueryThreadOnEmailThreadMessages) -> Node { - let from: String = match &msg.from { + let (from, from_detail) = match &msg.from { Some(ShowThreadQueryThreadOnEmailThreadMessagesFrom { - name: Some(name), .. - }) => name.to_string(), + name: Some(name), + addr, + }) => (name.to_string(), addr.clone()), Some(ShowThreadQueryThreadOnEmailThreadMessagesFrom { addr: Some(addr), .. - }) => addr.to_string(), - _ => String::from("UNKNOWN"), + }) => (addr.to_string(), None), + _ => (String::from("UNKNOWN"), None), }; // TODO(wathiede): get this from server let avatar: Option = None; @@ -525,7 +535,13 @@ fn render_closed_header(msg: &ShowThreadQueryThreadOnEmailThreadMessages) -> Nod div![avatar], div![ C!["px-4", "mr-auto"], - span![C!["font-semibold", "text-sm"], &from], + span![ + C!["font-semibold", "text-sm"], + from_detail.as_ref().map(|addr| attrs! { + At::Title => addr + }), + &from + ], " ", IF!(!msg.to.is_empty() => div![ C!["text-xs"], @@ -537,6 +553,9 @@ fn render_closed_header(msg: &ShowThreadQueryThreadOnEmailThreadMessages) -> Nod msg.to.iter().enumerate().map(|(i, to)| { let ShowThreadQueryThreadOnEmailThreadMessagesTo { name, addr } = to; span![ + addr.as_ref().map(|addr| attrs! { + At::Title => addr + }), if i > 0 { ", " } else { "" }, name.as_ref().unwrap_or_else(|| addr.as_ref().unwrap_or(&unknown)) ] @@ -550,11 +569,15 @@ fn render_closed_header(msg: &ShowThreadQueryThreadOnEmailThreadMessages) -> Nod C!["font-semibold"], "CC: " ], - msg.cc.iter().map(|cc| { + msg.cc.iter().enumerate().map(|(i,cc)| { let ShowThreadQueryThreadOnEmailThreadMessagesCc { name, addr } = cc; span![ - name.as_ref().unwrap_or_else(|| addr.as_ref().unwrap_or(&unknown)) - , " "] + addr.as_ref().map(|addr| attrs! { + At::Title => addr + }), + if i > 0 { ", " } else { "" }, + name.as_ref().unwrap_or_else(|| addr.as_ref().unwrap_or(&unknown)) + ] }) ]) ], @@ -1076,6 +1099,7 @@ fn render_news_post_header(post: &ShowThreadQueryThreadOnNewsPost) -> Node //let avatar: Option = Some(String::from("https://bulma.io/images/placeholders/64x64.png")); let id = post.thread_id.clone(); let is_unread = !post.is_read; + // TODO: use https://www.google.com/s2/favicons?domain={domain} let avatar = render_avatar(avatar, &from, true); div![ C!["flex", "p-4"],