Add padding for responses in comments, to let threads appear
Fixes #144
This commit is contained in:
parent
4e07fdbd05
commit
44172b67d5
@ -69,13 +69,17 @@ impl Comment {
|
|||||||
.len()
|
.len()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn to_json(&self, conn: &PgConnection) -> serde_json::Value {
|
pub fn to_json(&self, conn: &PgConnection, others: &Vec<Comment>) -> serde_json::Value {
|
||||||
let mut json = serde_json::to_value(self).unwrap();
|
let mut json = serde_json::to_value(self).unwrap();
|
||||||
json["author"] = self.get_author(conn).to_json(conn);
|
json["author"] = self.get_author(conn).to_json(conn);
|
||||||
let mentions = Mention::list_for_comment(conn, self.id).into_iter()
|
let mentions = Mention::list_for_comment(conn, self.id).into_iter()
|
||||||
.map(|m| m.get_mentioned(conn).map(|u| u.get_fqn(conn)).unwrap_or(String::new()))
|
.map(|m| m.get_mentioned(conn).map(|u| u.get_fqn(conn)).unwrap_or(String::new()))
|
||||||
.collect::<Vec<String>>();
|
.collect::<Vec<String>>();
|
||||||
json["mentions"] = serde_json::to_value(mentions).unwrap();
|
json["mentions"] = serde_json::to_value(mentions).unwrap();
|
||||||
|
json["responses"] = json!(others.into_iter()
|
||||||
|
.filter(|c| c.in_response_to_id.map(|id| id == self.id).unwrap_or(false))
|
||||||
|
.map(|c| c.to_json(conn, others))
|
||||||
|
.collect::<Vec<_>>());
|
||||||
json
|
json
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,19 +48,20 @@ fn create(blog_name: String, slug: String, data: LenientForm<NewCommentForm>, us
|
|||||||
.map_err(|errors| {
|
.map_err(|errors| {
|
||||||
// TODO: de-duplicate this code
|
// TODO: de-duplicate this code
|
||||||
let comments = Comment::list_by_post(&*conn, post.id);
|
let comments = Comment::list_by_post(&*conn, post.id);
|
||||||
|
let comms = comments.clone();
|
||||||
|
|
||||||
Template::render("posts/details", json!({
|
Template::render("posts/details", json!({
|
||||||
"author": post.get_authors(&*conn)[0].to_json(&*conn),
|
"author": post.get_authors(&*conn)[0].to_json(&*conn),
|
||||||
"post": post,
|
"post": post,
|
||||||
"blog": blog,
|
"blog": blog,
|
||||||
"comments": comments.into_iter().map(|c| c.to_json(&*conn)).collect::<Vec<serde_json::Value>>(),
|
"comments": &comments.into_iter().map(|c| c.to_json(&*conn, &comms)).collect::<Vec<serde_json::Value>>(),
|
||||||
"n_likes": post.get_likes(&*conn).len(),
|
"n_likes": post.get_likes(&*conn).len(),
|
||||||
"has_liked": user.has_liked(&*conn, &post),
|
"has_liked": user.has_liked(&*conn, &post),
|
||||||
"n_reshares": post.get_reshares(&*conn).len(),
|
"n_reshares": post.get_reshares(&*conn).len(),
|
||||||
"has_reshared": user.has_reshared(&*conn, &post),
|
"has_reshared": user.has_reshared(&*conn, &post),
|
||||||
"account": user,
|
"account": user,
|
||||||
"date": &post.creation_date.timestamp(),
|
"date": &post.creation_date.timestamp(),
|
||||||
"previous": form.responding_to.map(|r| Comment::get(&*conn, r).expect("Error retrieving previous comment").to_json(&*conn)),
|
"previous": form.responding_to.map(|r| Comment::get(&*conn, r).expect("Error retrieving previous comment").to_json(&*conn, &vec![])),
|
||||||
"user_fqn": user.get_fqn(&*conn),
|
"user_fqn": user.get_fqn(&*conn),
|
||||||
"errors": errors
|
"errors": errors
|
||||||
}))
|
}))
|
||||||
|
@ -36,19 +36,24 @@ fn details_response(blog: String, slug: String, conn: DbConn, user: Option<User>
|
|||||||
may_fail!(user, Blog::find_by_fqn(&*conn, blog), "Couldn't find this blog", |blog| {
|
may_fail!(user, Blog::find_by_fqn(&*conn, blog), "Couldn't find this blog", |blog| {
|
||||||
may_fail!(user, Post::find_by_slug(&*conn, slug, blog.id), "Couldn't find this post", |post| {
|
may_fail!(user, Post::find_by_slug(&*conn, slug, blog.id), "Couldn't find this post", |post| {
|
||||||
let comments = Comment::list_by_post(&*conn, post.id);
|
let comments = Comment::list_by_post(&*conn, post.id);
|
||||||
|
let comms = comments.clone();
|
||||||
|
|
||||||
Template::render("posts/details", json!({
|
Template::render("posts/details", json!({
|
||||||
"author": post.get_authors(&*conn)[0].to_json(&*conn),
|
"author": post.get_authors(&*conn)[0].to_json(&*conn),
|
||||||
"post": post,
|
"post": post,
|
||||||
"blog": blog,
|
"blog": blog,
|
||||||
"comments": comments.into_iter().map(|c| c.to_json(&*conn)).collect::<Vec<serde_json::Value>>(),
|
"comments": &comments.into_iter().filter_map(|c| if c.in_response_to_id.is_none() {
|
||||||
|
Some(c.to_json(&*conn, &comms))
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}).collect::<Vec<serde_json::Value>>(),
|
||||||
"n_likes": post.get_likes(&*conn).len(),
|
"n_likes": post.get_likes(&*conn).len(),
|
||||||
"has_liked": user.clone().map(|u| u.has_liked(&*conn, &post)).unwrap_or(false),
|
"has_liked": user.clone().map(|u| u.has_liked(&*conn, &post)).unwrap_or(false),
|
||||||
"n_reshares": post.get_reshares(&*conn).len(),
|
"n_reshares": post.get_reshares(&*conn).len(),
|
||||||
"has_reshared": user.clone().map(|u| u.has_reshared(&*conn, &post)).unwrap_or(false),
|
"has_reshared": user.clone().map(|u| u.has_reshared(&*conn, &post)).unwrap_or(false),
|
||||||
"account": user,
|
"account": user,
|
||||||
"date": &post.creation_date.timestamp(),
|
"date": &post.creation_date.timestamp(),
|
||||||
"previous": query.and_then(|q| q.responding_to.map(|r| Comment::get(&*conn, r).expect("Error retrieving previous comment").to_json(&*conn))),
|
"previous": query.and_then(|q| q.responding_to.map(|r| Comment::get(&*conn, r).expect("Error retrieving previous comment").to_json(&*conn, &vec![]))),
|
||||||
"user_fqn": user.map(|u| u.get_fqn(&*conn)).unwrap_or(String::new())
|
"user_fqn": user.map(|u| u.get_fqn(&*conn)).unwrap_or(String::new())
|
||||||
}))
|
}))
|
||||||
})
|
})
|
||||||
|
@ -281,16 +281,21 @@ main .article-meta .comments > a.button { margin-bottom: 1em; }
|
|||||||
main .article-meta .comments .list {
|
main .article-meta .comments .list {
|
||||||
display: grid;
|
display: grid;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
padding: 0 20%;
|
||||||
|
background: #ECECEC;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ~ Comment ~ */
|
/* ~ Comment ~ */
|
||||||
|
|
||||||
.comments .list .comment {
|
.comments .list .comment {
|
||||||
background: #ECECEC;
|
padding: 2em;
|
||||||
padding: 2em 20%;
|
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.comments .list > .comment {
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
.comments .list .comment .author {
|
.comments .list .comment .author {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
|
@ -45,3 +45,16 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
{% macro comment(comm) %}
|
||||||
|
<div class="comment" id="comment-{{ comm.id }}">
|
||||||
|
<a class="author" href="{{ comm.author.ap_url }}">
|
||||||
|
<span class="display-name">{{ comm.author.display_name | default(value=comm.author.username) }}</span>
|
||||||
|
<small>@{{ comm.author.username }}</small>
|
||||||
|
</a>
|
||||||
|
<div class="text">{{ comm.content | safe }}</div>
|
||||||
|
<a class="button" href="?responding_to={{ comm.id }}">{{ "Respond" | _ }}</a>
|
||||||
|
{% for res in comm.responses %}
|
||||||
|
{{ self::comment(comm=res) }}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% endmacro %}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
{% extends "base" %}
|
{% extends "base" %}
|
||||||
|
{% import "macros" as macros %}
|
||||||
|
|
||||||
{% block title %}
|
{% block title %}
|
||||||
{{ post.title }}
|
{{ post.title }}
|
||||||
@ -78,20 +79,7 @@
|
|||||||
|
|
||||||
<div class="list">
|
<div class="list">
|
||||||
{% for comment in comments %}
|
{% for comment in comments %}
|
||||||
{% if comment.author.display_name %}
|
{{ macros::comment(comm=comment) }}
|
||||||
{% set comment_author_name = comment.author.display_name %}
|
|
||||||
{% else %}
|
|
||||||
{% set comment_author_name = comment.author.username %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<div class="comment" id="comment-{{ comment.id }}">
|
|
||||||
<a class="author" href="{{ comment.author.ap_url }}">
|
|
||||||
<span class="display-name">{{ comment.author.display_name }}</span>
|
|
||||||
<small>@{{ comment.author.username }}</small>
|
|
||||||
</a>
|
|
||||||
<div class="text">{{ comment.content | safe }}</div>
|
|
||||||
<a class="button" href="?responding_to={{ comment.id }}">{{ "Respond" | _ }}</a>
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user