diff options
author | Vincent Ambo <tazjin@gmail.com> | 2018-04-15T19·13+0200 |
---|---|---|
committer | Vincent Ambo <tazjin@gmail.com> | 2018-04-15T19·13+0200 |
commit | ec712cc4c0e12329f51d10d9bd626d1859a011b8 (patch) | |
tree | e5b51d31c4bfb66eaca5c29e9d796b1a7599dee5 /src | |
parent | 4c0e6552e80e70de55fa0ab4310dfec0078b18b9 (diff) |
refactor(templates/render): Add generic post editing template
Adds a generic template that can be used for submitting, responding to and editing posts.
Diffstat (limited to 'src')
-rw-r--r-- | src/db.rs | 4 | ||||
-rw-r--r-- | src/handlers.rs | 14 | ||||
-rw-r--r-- | src/render.rs | 49 |
3 files changed, 52 insertions, 15 deletions
diff --git a/src/db.rs b/src/db.rs index 22438d2b8766..ad1c148a7072 100644 --- a/src/db.rs +++ b/src/db.rs @@ -80,7 +80,7 @@ impl Handler<GetThread> for DbExecutor { /// Message used to create a new thread pub struct CreateThread { pub new_thread: NewThread, - pub body: String, + pub post: String, } impl Message for CreateThread { @@ -105,7 +105,7 @@ impl Handler<CreateThread> for DbExecutor { // ... then create the first post in the thread. let new_post = NewPost { thread_id: thread.id, - body: msg.body, + body: msg.post, author_name: msg.new_thread.author_name.clone(), author_email: msg.new_thread.author_email.clone(), }; diff --git a/src/handlers.rs b/src/handlers.rs index 1cd596aad1d2..8bfd3c1511e6 100644 --- a/src/handlers.rs +++ b/src/handlers.rs @@ -99,7 +99,7 @@ fn anonymous() -> Author { #[derive(Deserialize)] pub struct NewThreadForm { pub title: String, - pub body: String, + pub post: String, } const NEW_THREAD_LENGTH_ERR: &'static str = "Title and body can not be empty!"; @@ -112,16 +112,16 @@ pub fn submit_thread(state: State<AppState>, // Trim whitespace out of inputs: let input = NewThreadForm { title: input.title.trim().into(), - body: input.body.trim().into(), + post: input.post.trim().into(), }; // Perform simple validation and abort here if it fails: - if input.title.is_empty() || input.body.is_empty() { + if input.title.is_empty() || input.post.is_empty() { return state.renderer .send(NewThreadPage { alerts: vec![NEW_THREAD_LENGTH_ERR], title: Some(input.title), - body: Some(input.body), + post: Some(input.post), }) .flatten() .map(|res| HttpResponse::Ok().content_type(HTML).body(res)) @@ -140,7 +140,7 @@ pub fn submit_thread(state: State<AppState>, let msg = CreateThread { new_thread, - body: input.body, + post: input.post, }; state.db.send(msg) @@ -158,7 +158,7 @@ pub fn submit_thread(state: State<AppState>, #[derive(Deserialize)] pub struct NewPostForm { pub thread_id: i32, - pub body: String, + pub post: String, } /// This handler receives a "Reply"-form and redirects the user to the @@ -172,7 +172,7 @@ pub fn reply_thread(state: State<AppState>, let new_post = NewPost { thread_id: input.thread_id, - body: input.body.trim().into(), + body: input.post.trim().into(), author_name: author.name, author_email: author.email, }; diff --git a/src/render.rs b/src/render.rs index 9cc9efd4d10e..d95fb693478b 100644 --- a/src/render.rs +++ b/src/render.rs @@ -159,6 +159,41 @@ impl Handler<ThreadPage> for Renderer { } } +/// The different types of editing modes supported by the editing +/// template: +#[derive(Debug, Serialize)] +pub enum EditingMode { + NewThread, + PostReply, + EditPost, +} + +impl Default for EditingMode { + fn default() -> EditingMode { EditingMode::NewThread } +} + +/// This struct represents the context submitted to the template used +/// for rendering the new thread, edit post and reply to thread forms. +#[derive(Default, Serialize)] +pub struct FormContext { + /// Which editing mode is to be used by the template? + pub mode: EditingMode, + + /// Potential alerts to display to the user (e.g. input validation + /// results) + pub alerts: Vec<&'static str>, + + /// Either the title to be used in the subject field or the title + /// of the thread the user is responding to. + pub title: Option<String>, + + /// Body of the post being edited, if present. + pub post: Option<String>, + + /// ID of the thread being replied to or the post being edited. + pub id: Option<i32>, +} + /// Message used to render new thread page. /// /// It can optionally contain a vector of warnings to display to the @@ -167,7 +202,7 @@ impl Handler<ThreadPage> for Renderer { pub struct NewThreadPage { pub alerts: Vec<&'static str>, pub title: Option<String>, - pub body: Option<String>, + pub post: Option<String>, } impl Message for NewThreadPage { @@ -178,11 +213,13 @@ impl Handler<NewThreadPage> for Renderer { type Result = Result<String>; fn handle(&mut self, msg: NewThreadPage, _: &mut Self::Context) -> Self::Result { - let mut ctx = Context::new(); - ctx.add("alerts", &msg.alerts); - ctx.add("title", &msg.title.map(|s| escape_html(&s))); - ctx.add("body", &msg.body.map(|s| escape_html(&s))); - Ok(self.tera.render("new-thread.html", &ctx)?) + let ctx: FormContext = FormContext { + alerts: msg.alerts, + title: msg.title, + post: msg.post, + ..Default::default() + }; + Ok(self.tera.render("post.html", &ctx)?) } } |