refactor(templates/render): Add generic post editing template
Adds a generic template that can be used for submitting, responding to and editing posts.
This commit is contained in:
parent
4c0e6552e8
commit
ec712cc4c0
6 changed files with 156 additions and 72 deletions
|
|
@ -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(),
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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)?)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue