Compare commits

..

No commits in common. "7df11639edc4dccf6b9e9503e9ca1a99a340c3f9" and "8abf9398e9e86ffe1b951b7e02b9252ca87c7d41" have entirely different histories.

6 changed files with 65 additions and 116 deletions

View File

@ -42,6 +42,7 @@ pub fn init(url: Url, orders: &mut impl Orders<Msg>) -> Model {
context: Context::None, context: Context::None,
query: "".to_string(), query: "".to_string(),
refreshing_state: RefreshingState::None, refreshing_state: RefreshingState::None,
ui_error: UIError::NoError,
tags: None, tags: None,
} }
} }
@ -449,6 +450,7 @@ pub struct Model {
pub query: String, pub query: String,
pub context: Context, pub context: Context,
pub refreshing_state: RefreshingState, pub refreshing_state: RefreshingState,
pub ui_error: UIError,
pub tags: Option<Vec<Tag>>, pub tags: Option<Vec<Tag>>,
} }

View File

@ -9,28 +9,20 @@ use crate::{
#[topo::nested] #[topo::nested]
pub(super) fn view(model: &Model) -> Node<Msg> { pub(super) fn view(model: &Model) -> Node<Msg> {
let show_icon_text = true;
// Do two queries, one without `unread` so it loads fast, then a second with unread. // Do two queries, one without `unread` so it loads fast, then a second with unread.
let content = match &model.context { let content = match &model.context {
Context::None => div![h1!["Loading"]], Context::None => div![h1!["Loading"]],
Context::ThreadResult { Context::ThreadResult {
thread, thread,
open_messages, open_messages,
} => view::thread(thread, open_messages, show_icon_text), } => view::thread(thread, open_messages),
Context::SearchResult { Context::SearchResult {
query, query,
results, results,
count, count,
pager, pager,
selected_threads, selected_threads,
} => view_search_results( } => view_search_results(&query, results.as_slice(), *count, pager, selected_threads),
&query,
results.as_slice(),
*count,
pager,
selected_threads,
show_icon_text,
),
}; };
fn view_tag_li(display_name: &str, indent: usize, t: &Tag, search_unread: bool) -> Node<Msg> { fn view_tag_li(display_name: &str, indent: usize, t: &Tag, search_unread: bool) -> Node<Msg> {
let href = if search_unread { let href = if search_unread {

View File

@ -10,27 +10,19 @@ use crate::{
}; };
pub(super) fn view(model: &Model) -> Node<Msg> { pub(super) fn view(model: &Model) -> Node<Msg> {
let show_icon_text = false;
let content = match &model.context { let content = match &model.context {
Context::None => div![h1!["Loading"]], Context::None => div![h1!["Loading"]],
Context::ThreadResult { Context::ThreadResult {
thread, thread,
open_messages, open_messages,
} => view::thread(thread, open_messages, show_icon_text), } => view::thread(thread, open_messages),
Context::SearchResult { Context::SearchResult {
query, query,
results, results,
count, count,
pager, pager,
selected_threads, selected_threads,
} => search_results( } => search_results(&query, results.as_slice(), *count, pager, selected_threads),
&query,
results.as_slice(),
*count,
pager,
selected_threads,
show_icon_text,
),
}; };
div![ div![
view_header(&model.query, &model.refreshing_state), view_header(&model.query, &model.refreshing_state),
@ -45,7 +37,6 @@ fn search_results(
count: usize, count: usize,
pager: &FrontPageQuerySearchPageInfo, pager: &FrontPageQuerySearchPageInfo,
selected_threads: &HashSet<String>, selected_threads: &HashSet<String>,
show_icon_text: bool,
) -> Node<Msg> { ) -> Node<Msg> {
if query.is_empty() { if query.is_empty() {
set_title("all mail"); set_title("all mail");
@ -105,8 +96,8 @@ fn search_results(
let show_bulk_edit = !selected_threads.is_empty(); let show_bulk_edit = !selected_threads.is_empty();
div![ div![
C!["search-results"], C!["search-results"],
search_toolbar(count, pager, show_bulk_edit, show_icon_text), search_toolbar(count, pager, show_bulk_edit),
div![C!["index"], rows], div![C!["index"], rows],
search_toolbar(count, pager, show_bulk_edit, show_icon_text), search_toolbar(count, pager, show_bulk_edit),
] ]
} }

View File

@ -116,7 +116,6 @@ fn view_search_results(
count: usize, count: usize,
pager: &FrontPageQuerySearchPageInfo, pager: &FrontPageQuerySearchPageInfo,
selected_threads: &HashSet<String>, selected_threads: &HashSet<String>,
show_icon_text: bool,
) -> Node<Msg> { ) -> Node<Msg> {
if query.is_empty() { if query.is_empty() {
set_title("all mail"); set_title("all mail");
@ -204,7 +203,7 @@ fn view_search_results(
div![ div![
C!["search-results"], C!["search-results"],
search_toolbar(count, pager, show_bulk_edit, show_icon_text), search_toolbar(count, pager, show_bulk_edit),
table![ table![
C![ C![
"table", "table",
@ -240,7 +239,7 @@ fn view_search_results(
]], ]],
tbody![rows] tbody![rows]
], ],
search_toolbar(count, pager, show_bulk_edit, show_icon_text) search_toolbar(count, pager, show_bulk_edit)
] ]
} }
@ -248,7 +247,6 @@ fn search_toolbar(
count: usize, count: usize,
pager: &FrontPageQuerySearchPageInfo, pager: &FrontPageQuerySearchPageInfo,
show_bulk_edit: bool, show_bulk_edit: bool,
show_icon_text: bool,
) -> Node<Msg> { ) -> Node<Msg> {
let start = pager let start = pager
.start_cursor .start_cursor
@ -256,42 +254,36 @@ fn search_toolbar(
.map(|i| i.parse().unwrap_or(0)) .map(|i| i.parse().unwrap_or(0))
.unwrap_or(0); .unwrap_or(0);
nav![ nav![
C!["level", "is-mobile"], C!["level"],
IF!(show_bulk_edit => div![
div![ C!["level-left"],
C!["level-left"], IF!(show_bulk_edit =>
div![ span![
C!["level-item"], // TODO(wathiede): add "Mark as spam"
div![C!["buttons", "has-addons"], C!["level-item", "buttons", "has-addons"],
button![ button![
C!["button", "spam"], C!["button"],
attrs!{At::Title => "Mark as spam"}, attrs!{At::Title => "Mark as spam"},
span![C!["icon", "is-small"], i![C!["far", "fa-hand"]]], span![C!["icon", "is-small"], i![C!["far", "fa-hand"]]],
IF!(show_icon_text=>span!["Spam"]), span!["Spam"],
ev(Ev::Click, |_| Msg::SelectionAddTag("Spam".to_string())) ev(Ev::Click, |_| Msg::SelectionAddTag("Spam".to_string()))
],
],
], ],
div![ button![
C!["level-item"], C!["button"],
div![C!["buttons", "has-addons"], attrs!{At::Title => "Mark as read"},
button![
C!["button", "mark-read"],
attrs!{At::Title => "Mark as read"},
span![C!["icon", "is-small"], i![C!["far", "fa-envelope-open"]]], span![C!["icon", "is-small"], i![C!["far", "fa-envelope-open"]]],
IF!(show_icon_text=>span!["Read"]), span!["Read"],
ev(Ev::Click, |_| Msg::SelectionMarkAsRead) ev(Ev::Click, |_| Msg::SelectionMarkAsRead)
], ],
button![ button![
C!["button", "mark-unread"], C!["button"],
attrs!{At::Title => "Mark as unread"}, attrs!{At::Title => "Mark as unread"},
span![C!["icon", "is-small"], i![C!["far", "fa-envelope"]]], span![C!["icon", "is-small"], i![C!["far", "fa-envelope"]]],
IF!(show_icon_text=>span!["Unread"]), span!["Unread"],
ev(Ev::Click, |_| Msg::SelectionMarkAsUnread) ev(Ev::Click, |_| Msg::SelectionMarkAsUnread)
] ]
] ]),
] ],
]),
div![ div![
C!["level-right"], C!["level-right"],
nav![ nav![
@ -712,11 +704,7 @@ fn message_render(msg: &ShowThreadQueryThreadMessages, open: bool) -> Node<Msg>
} }
#[topo::nested] #[topo::nested]
fn thread( fn thread(thread: &ShowThreadQueryThread, open_messages: &HashSet<String>) -> Node<Msg> {
thread: &ShowThreadQueryThread,
open_messages: &HashSet<String>,
show_icon_text: bool,
) -> Node<Msg> {
// TODO(wathiede): show per-message subject if it changes significantly from top-level subject // TODO(wathiede): show per-message subject if it changes significantly from top-level subject
let subject = if thread.subject.is_empty() { let subject = if thread.subject.is_empty() {
"(no subject)" "(no subject)"
@ -745,49 +733,37 @@ fn thread(
C!["thread"], C!["thread"],
h3![C!["is-size-5"], subject], h3![C!["is-size-5"], subject],
span![C!["tags"], tags_chiclet(&tags, false)], span![C!["tags"], tags_chiclet(&tags, false)],
div![ span![
C!["level", "is-mobile"], C!["level-item", "buttons", "has-addons"],
div![ button![
C!["level-item"], C!["button"],
div![ attrs! {At::Title => "Spam"},
C!["buttons", "has-addons"], span![C!["icon", "is-small"], i![C!["far", "fa-hand"]]],
button![ span!["Spam"],
C!["button", "spam"], ev(Ev::Click, move |_| Msg::AddTag(
attrs! {At::Title => "Spam"}, format!("thread:{spam_thread_id}"),
span![C!["icon", "is-small"], i![C!["far", "fa-hand"]]], "Spam".to_string()
IF!(show_icon_text=>span!["Spam"]), )),
ev(Ev::Click, move |_| Msg::AddTag(
format!("thread:{spam_thread_id}"),
"Spam".to_string()
)),
],
],
], ],
div![ button![
C!["level-item"], C!["button"],
div![ attrs! {At::Title => "Mark as read"},
C!["buttons", "has-addons"], span![C!["icon", "is-small"], i![C!["far", "fa-envelope-open"]]],
button![ span!["Read"],
C!["button", "mark-read"], ev(Ev::Click, move |_| Msg::SetUnread(
attrs! {At::Title => "Mark as read"}, format!("thread:{read_thread_id}"),
span![C!["icon", "is-small"], i![C!["far", "fa-envelope-open"]]], false
IF!(show_icon_text=>span!["Read"]), )),
ev(Ev::Click, move |_| Msg::SetUnread( ],
format!("thread:{read_thread_id}"), button![
false C!["button"],
)), attrs! {At::Title => "Mark as unread"},
], span![C!["icon", "is-small"], i![C!["far", "fa-envelope"]]],
button![ span!["Unread"],
C!["button", "mark-unread"], ev(Ev::Click, move |_| Msg::SetUnread(
attrs! {At::Title => "Mark as unread"}, format!("thread:{unread_thread_id}"),
span![C!["icon", "is-small"], i![C!["far", "fa-envelope"]]], true
IF!(show_icon_text=>span!["Unread"]), )),
ev(Ev::Click, move |_| Msg::SetUnread(
format!("thread:{unread_thread_id}"),
true
)),
],
],
], ],
], ],
messages, messages,

View File

@ -6,28 +6,20 @@ use crate::{
}; };
pub(super) fn view(model: &Model) -> Node<Msg> { pub(super) fn view(model: &Model) -> Node<Msg> {
let show_icon_text = false;
// Do two queries, one without `unread` so it loads fast, then a second with unread. // Do two queries, one without `unread` so it loads fast, then a second with unread.
let content = match &model.context { let content = match &model.context {
Context::None => div![h1!["Loading"]], Context::None => div![h1!["Loading"]],
Context::ThreadResult { Context::ThreadResult {
thread, thread,
open_messages, open_messages,
} => view::thread(thread, open_messages, show_icon_text), } => view::thread(thread, open_messages),
Context::SearchResult { Context::SearchResult {
query, query,
results, results,
count, count,
pager, pager,
selected_threads, selected_threads,
} => view_search_results( } => view_search_results(&query, results.as_slice(), *count, pager, selected_threads),
&query,
results.as_slice(),
*count,
pager,
selected_threads,
show_icon_text,
),
}; };
div![ div![
C!["main-content"], C!["main-content"],

View File

@ -282,7 +282,3 @@ display: none;
.attachment .card-content { .attachment .card-content {
padding: 0.5rem 1.5rem; padding: 0.5rem 1.5rem;
} }
.button.spam {
color: #f00;
}