Compare commits
5 Commits
c3f897c61a
...
01e5ea14ab
| Author | SHA1 | Date | |
|---|---|---|---|
| 01e5ea14ab | |||
| 042d475c75 | |||
| dd0af52feb | |||
| 130f9bbeba | |||
| 0a05b32a7a |
557
Cargo.lock
generated
557
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
2
dev.sh
2
dev.sh
@ -1,7 +1,7 @@
|
|||||||
cd -- "$( dirname -- "${BASH_SOURCE[0]}" )"
|
cd -- "$( dirname -- "${BASH_SOURCE[0]}" )"
|
||||||
tmux new-session -d -s letterbox-dev
|
tmux new-session -d -s letterbox-dev
|
||||||
tmux rename-window web
|
tmux rename-window web
|
||||||
tmux send-keys "cd web; trunk serve --release --address 0.0.0.0 --port 6758 --proxy-backend http://localhost:9345/ --proxy-rewrite=/api/ -w ../shared -w ../notmuch -w ./" C-m
|
tmux send-keys "cd web; trunk serve -w ../shared -w ../notmuch -w ./" C-m
|
||||||
tmux new-window -n server
|
tmux new-window -n server
|
||||||
tmux send-keys "cd server; cargo watch -x run -w ../shared -w ../notmuch -w ./" C-m
|
tmux send-keys "cd server; cargo watch -x run -w ../shared -w ../notmuch -w ./" C-m
|
||||||
tmux attach -d -t letterbox-dev
|
tmux attach -d -t letterbox-dev
|
||||||
|
|||||||
@ -454,6 +454,8 @@ pub enum NotmuchError {
|
|||||||
SerdeJson(#[from] serde_json::Error),
|
SerdeJson(#[from] serde_json::Error),
|
||||||
#[error("failed to parse bytes as str")]
|
#[error("failed to parse bytes as str")]
|
||||||
Utf8Error(#[from] std::str::Utf8Error),
|
Utf8Error(#[from] std::str::Utf8Error),
|
||||||
|
#[error("failed to parse bytes as String")]
|
||||||
|
StringUtf8Error(#[from] std::string::FromUtf8Error),
|
||||||
#[error("failed to parse str as int")]
|
#[error("failed to parse str as int")]
|
||||||
ParseIntError(#[from] std::num::ParseIntError),
|
ParseIntError(#[from] std::num::ParseIntError),
|
||||||
}
|
}
|
||||||
|
|||||||
@ -16,6 +16,7 @@ serde = { version = "1.0.147", features = ["derive"] }
|
|||||||
log = "0.4.17"
|
log = "0.4.17"
|
||||||
tokio = "1.26.0"
|
tokio = "1.26.0"
|
||||||
glog = "0.1.0"
|
glog = "0.1.0"
|
||||||
|
urlencoding = "2.1.3"
|
||||||
|
|
||||||
[dependencies.rocket_contrib]
|
[dependencies.rocket_contrib]
|
||||||
version = "0.4.11"
|
version = "0.4.11"
|
||||||
|
|||||||
@ -4,7 +4,7 @@ extern crate rocket;
|
|||||||
use std::{error::Error, io::Cursor, str::FromStr};
|
use std::{error::Error, io::Cursor, str::FromStr};
|
||||||
|
|
||||||
use glog::Flags;
|
use glog::Flags;
|
||||||
use notmuch::{Notmuch, NotmuchError, SearchSummary, ThreadSet};
|
use notmuch::{Notmuch, NotmuchError, ThreadSet};
|
||||||
use rocket::{
|
use rocket::{
|
||||||
http::{ContentType, Header},
|
http::{ContentType, Header},
|
||||||
request::Request,
|
request::Request,
|
||||||
@ -40,13 +40,14 @@ async fn search(
|
|||||||
) -> Result<Json<shared::SearchResult>, Debug<NotmuchError>> {
|
) -> Result<Json<shared::SearchResult>, Debug<NotmuchError>> {
|
||||||
let page = page.unwrap_or(0);
|
let page = page.unwrap_or(0);
|
||||||
let results_per_page = results_per_page.unwrap_or(10);
|
let results_per_page = results_per_page.unwrap_or(10);
|
||||||
|
let query = urlencoding::decode(query).map_err(NotmuchError::from)?;
|
||||||
info!(" search '{query}'");
|
info!(" search '{query}'");
|
||||||
let res = shared::SearchResult {
|
let res = shared::SearchResult {
|
||||||
summary: nm.search(query, page * results_per_page, results_per_page)?,
|
summary: nm.search(&query, page * results_per_page, results_per_page)?,
|
||||||
query: query.to_string(),
|
query: query.to_string(),
|
||||||
page,
|
page,
|
||||||
results_per_page,
|
results_per_page,
|
||||||
total: nm.count(query)?,
|
total: nm.count(&query)?,
|
||||||
};
|
};
|
||||||
Ok(Json(res))
|
Ok(Json(res))
|
||||||
}
|
}
|
||||||
@ -56,13 +57,15 @@ async fn show_pretty(
|
|||||||
nm: &State<Notmuch>,
|
nm: &State<Notmuch>,
|
||||||
query: &str,
|
query: &str,
|
||||||
) -> Result<Json<ThreadSet>, Debug<NotmuchError>> {
|
) -> Result<Json<ThreadSet>, Debug<NotmuchError>> {
|
||||||
let res = nm.show(query)?;
|
let query = urlencoding::decode(query).map_err(NotmuchError::from)?;
|
||||||
|
let res = nm.show(&query)?;
|
||||||
Ok(Json(res))
|
Ok(Json(res))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[get("/show/<query>")]
|
#[get("/show/<query>")]
|
||||||
async fn show(nm: &State<Notmuch>, query: &str) -> Result<Json<ThreadSet>, Debug<NotmuchError>> {
|
async fn show(nm: &State<Notmuch>, query: &str) -> Result<Json<ThreadSet>, Debug<NotmuchError>> {
|
||||||
let res = nm.show(query)?;
|
let query = urlencoding::decode(query).map_err(NotmuchError::from)?;
|
||||||
|
let res = nm.show(&query)?;
|
||||||
Ok(Json(res))
|
Ok(Json(res))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
11
web/Trunk.toml
Normal file
11
web/Trunk.toml
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[build]
|
||||||
|
release = true
|
||||||
|
|
||||||
|
[serve]
|
||||||
|
# The address to serve on.
|
||||||
|
address = "0.0.0.0"
|
||||||
|
port = 6758
|
||||||
|
|
||||||
|
[[proxy]]
|
||||||
|
backend = "http://localhost:9345/"
|
||||||
|
rewrite= "/api/"
|
||||||
@ -4,18 +4,19 @@
|
|||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
|
||||||
<link rel="modulepreload" href="/pkg/package.js" as="script" type="text/javascript">
|
|
||||||
<link rel="preload" href="/pkg/package_bg.wasm" as="fetch" type="application/wasm" crossorigin="anonymous">
|
|
||||||
<link rel="stylesheet", href="https://jenil.github.io/bulmaswatch/cyborg/bulmaswatch.min.css">
|
<link rel="stylesheet", href="https://jenil.github.io/bulmaswatch/cyborg/bulmaswatch.min.css">
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css" integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ==" crossorigin="anonymous" referrerpolicy="no-referrer" />
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.3.0/css/all.min.css" integrity="sha512-SzlrxWUlpfuzQ+pcUCosxcglQRNAq/DZjVsC0lE40xsADsfeQoEypE+enwcOiGjk/bSuGGKHEyjSoQ1zVisanQ==" crossorigin="anonymous" referrerpolicy="no-referrer" />
|
||||||
<style>
|
<style>
|
||||||
.message {
|
.message {
|
||||||
padding-left: 0.5em;
|
padding: 0.5em;*/
|
||||||
}
|
}
|
||||||
.body {
|
.body {
|
||||||
background: white;
|
background: white;
|
||||||
color: black;
|
color: black;
|
||||||
padding-bottom: 1em;
|
padding: 0.5em;
|
||||||
|
margin-left: -0.5em;
|
||||||
|
margin-right: -0.5em;
|
||||||
|
margin-top: 0.5em;
|
||||||
}
|
}
|
||||||
.error {
|
.error {
|
||||||
background-color: red;
|
background-color: red;
|
||||||
@ -83,10 +84,6 @@ input::placeholder, .input::placeholder{
|
|||||||
|
|
||||||
<body>
|
<body>
|
||||||
<section id="app"></section>
|
<section id="app"></section>
|
||||||
<script type="module">
|
|
||||||
import init from '/pkg/package.js';
|
|
||||||
init('/pkg/package_bg.wasm');
|
|
||||||
</script>
|
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@ -323,7 +323,6 @@ fn view_message(thread: &ThreadNode) -> Node<Msg> {
|
|||||||
div![C!["header"], "From: ", &message.headers.from],
|
div![C!["header"], "From: ", &message.headers.from],
|
||||||
div![C!["header"], "Date: ", &message.headers.date],
|
div![C!["header"], "Date: ", &message.headers.date],
|
||||||
div![C!["header"], "To: ", &message.headers.to],
|
div![C!["header"], "To: ", &message.headers.to],
|
||||||
hr![],
|
|
||||||
div![
|
div![
|
||||||
C!["body"],
|
C!["body"],
|
||||||
match &message.body {
|
match &message.body {
|
||||||
@ -360,7 +359,7 @@ fn view_part(part: &Part) -> Node<Msg> {
|
|||||||
.build();
|
.build();
|
||||||
let inlined = inliner.inline(html).expect("failed to inline CSS");
|
let inlined = inliner.inline(html).expect("failed to inline CSS");
|
||||||
|
|
||||||
return div![C!["view-part-text-html"], div!["TEST"], raw![&inlined]];
|
return div![C!["view-part-text-html"], raw![&inlined]];
|
||||||
} else {
|
} else {
|
||||||
div![
|
div![
|
||||||
C!["error"],
|
C!["error"],
|
||||||
@ -513,7 +512,6 @@ fn view_mobile_search_results(query: &str, search_results: &shared::SearchResult
|
|||||||
span![C!["tags"], tags_chiclet(&r.tags, true)],
|
span![C!["tags"], tags_chiclet(&r.tags, true)],
|
||||||
],
|
],
|
||||||
span![C!["date"], &r.date_relative],
|
span![C!["date"], &r.date_relative],
|
||||||
hr![],
|
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
let first = search_results.page * search_results.results_per_page;
|
let first = search_results.page * search_results.results_per_page;
|
||||||
@ -610,17 +608,19 @@ fn view_thread(thread_set: &ThreadSet) -> Node<Msg> {
|
|||||||
let subject = first_subject(&thread_node).unwrap_or("<No subject>".to_string());
|
let subject = first_subject(&thread_node).unwrap_or("<No subject>".to_string());
|
||||||
set_title(&subject);
|
set_title(&subject);
|
||||||
div![
|
div![
|
||||||
h1![subject],
|
h1![C!["title"], subject],
|
||||||
|
view_message(&thread_node),
|
||||||
a![
|
a![
|
||||||
attrs! {At::Href=>api::original(&thread_node.0.as_ref().expect("message missing").id)},
|
attrs! {At::Href=>api::original(&thread_node.0.as_ref().expect("message missing").id)},
|
||||||
"Original"
|
"Original"
|
||||||
],
|
],
|
||||||
view_message(&thread_node),
|
/*
|
||||||
div![
|
div![
|
||||||
C!["debug"],
|
C!["debug"],
|
||||||
"Add zippy for debug dump",
|
"Add zippy for debug dump",
|
||||||
view_debug_thread_set(thread_set)
|
view_debug_thread_set(thread_set)
|
||||||
] /* pre![format!("Thread: {:#?}", thread_set).replace(" ", " ")] */
|
] /* pre![format!("Thread: {:#?}", thread_set).replace(" ", " ")] */
|
||||||
|
*/
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user