Merge branch 'master' into notifications

This commit is contained in:
Juanjo Bazán
2016-01-08 15:07:16 +01:00
13 changed files with 100 additions and 32 deletions

View File

@@ -1645,7 +1645,6 @@ table {
font-family: $font-sans;
font-size: $small-font-size;
line-height: $line-height;
margin: rem-calc(10) $line-height/2 $line-height/4 0;
a {
color: $text-light;
@@ -1666,15 +1665,12 @@ table {
.comment-body {
margin-left: rem-calc(42);
p {
font-size: $small-font-size;
}
.reply {
background: white;
border: 1px solid $border;
font-family: $font-sans;
font-size: rem-calc(12);
border-left: 0;
border-right: 0;
font-size: $small-font-size;
margin: rem-calc(6) 0;
padding: rem-calc(6);

View File

@@ -1,5 +1,5 @@
class CommentsController < ApplicationController
before_action :authenticate_user!
before_action :authenticate_user!, only: :create
before_action :load_commentable, only: :create
before_action :build_comment, only: :create
@@ -15,6 +15,11 @@ class CommentsController < ApplicationController
end
end
def show
@comment = Comment.find(params[:id])
set_comment_flags(@comment.subtree)
end
def vote
@comment.vote_by(voter: current_user, vote: params[:value])
respond_with @comment

View File

@@ -13,8 +13,11 @@ module CommentsHelper
end
def child_comments_of(parent)
return [] unless @comment_tree
@comment_tree.children_of(parent)
if @comment_tree.present?
@comment_tree.ordered_children_of(parent)
else
parent.children
end
end
def user_level_class(comment)

View File

@@ -5,6 +5,7 @@ module Abilities
def initialize(user)
can :read, Debate
can :read, Proposal
can :read, Comment
can :read, Legislation
can :read, User
can [:search, :read], Annotation

View File

@@ -1,9 +1,9 @@
<% cache [locale_and_user_status(comment), comment, commentable_cache_key(@commentable), comment.author, (@comment_flags[comment.id] if @comment_flags)] do %>
<% cache [locale_and_user_status(comment), comment, commentable_cache_key(comment.commentable), comment.author, (@comment_flags[comment.id] if @comment_flags)] do %>
<div class="row">
<div id="<%= dom_id(comment) %>" class="comment small-12 column">
<% if comment.hidden? || comment.user.hidden? %>
<% if child_comments_of(comment).size > 0 %>
<% if comment.children.size > 0 %>
<div class="is-deleted">
<p><%= t("comments.comment.deleted") %></p>
</div>
@@ -49,7 +49,7 @@
<%= t("shared.collective") %>
</span>
<% end %>
<% if comment.user_id == @commentable.author_id %>
<% if comment.user_id == comment.commentable.author_id %>
&nbsp;&bull;&nbsp;
<span class="label round is-author">
<%= t("comments.comment.author") %>
@@ -63,16 +63,16 @@
<div class="comment-user
<%= user_level_class comment %>
<%= comment_author_class comment, @commentable.author_id %>">
<%= comment_author_class comment, comment.commentable.author_id %>">
<%= simple_format text_with_links comment.body %>
</div>
<span id="<%= dom_id(comment) %>_votes" class="comment-votes right">
<%= render 'comments/votes', comment: comment %>
</span>
<div class="reply">
<span id="<%= dom_id(comment) %>_votes" class="comment-votes right">
<%= render 'comments/votes', comment: comment %>
</span>
<div id="<%= dom_id(comment) %>_reply" class="reply">
<%= t("comments.comment.responses", count: child_comments_of(comment).size) %>
<%= t("comments.comment.responses", count: comment.children.size) %>
<% if user_signed_in? %>
<span class="divider">&nbsp;|&nbsp;</span>
@@ -81,11 +81,12 @@
<%= render 'comments/actions', comment: comment %>
<%= render 'comments/form', {commentable: @commentable, parent_id: comment.id, toggeable: true} %>
<%= render 'comments/form', {commentable: comment.commentable, parent_id: comment.id, toggeable: true} %>
<% end %>
</div>
</div>
<% end %>
<div class="comment-children">
<% child_comments_of(comment).each do |child| %>
<%= render 'comments/comment', comment: child %>

View File

@@ -0,0 +1,16 @@
<div class="row">
<div class="small-12 column margin-top">
<%= link_to @comment.commentable, class: "left back" do %>
<i class="icon-angle-left left"></i>
<%= t("comments.show.return_to_commentable") + @comment.commentable.title %>
<% end %>
</div>
</div>
<section class="comments">
<div class="row">
<div id="comments" class="small-12 column">
<%= render @comment %>
</div>
</div>
</section>

View File

@@ -243,6 +243,8 @@ en:
form:
submit_button: "Save changes"
comments:
show:
return_to_commentable: "Go back to "
select_order: "Sort by"
orders:
most_voted: "Most voted"

View File

@@ -243,6 +243,8 @@ es:
form:
submit_button: "Guardar cambios"
comments:
show:
return_to_commentable: "Volver a "
select_order: "Ordenar por"
orders:
most_voted: "Más votados"

View File

@@ -53,7 +53,7 @@ Rails.application.routes.draw do
end
end
resources :comments, only: :create, shallow: true do
resources :comments, only: [:create, :show], shallow: true do
member do
post :vote
put :flag

View File

@@ -2,24 +2,34 @@ class CommentTree
ROOT_COMMENTS_PER_PAGE = 10
attr_accessor :root_comments, :comments
attr_accessor :root_comments, :comments, :commentable, :page, :order
def initialize(commentable, page, order = 'confidence_score')
@root_comments = commentable.comments.roots.send("sort_by_#{order}").page(page).per(ROOT_COMMENTS_PER_PAGE).for_render
root_descendants = @root_comments.each_with_object([]) do |root, col|
col.concat(Comment.descendants_of(root).send("sort_descendants_by_#{order}").for_render.to_a)
end
@commentable = commentable
@page = page
@order = order
@comments = root_comments + root_descendants
end
@comments_by_parent_id = @comments.each_with_object({}) do |comment, col|
(col[comment.parent_id] ||= []) << comment
def root_comments
commentable.comments.roots.send("sort_by_#{order}").page(page).per(ROOT_COMMENTS_PER_PAGE).for_render
end
def root_descendants
root_comments.each_with_object([]) do |root, array|
array.concat(Comment.descendants_of(root).send("sort_descendants_by_#{order}").for_render.to_a)
end
end
def children_of(parent)
@comments_by_parent_id[parent.id] || []
def ordered_children_of(parent)
comments_by_parent_id[parent.id] || []
end
def comments_by_parent_id
comments.each_with_object({}) do |comment, array|
(array[comment.parent_id] ||= []) << comment
end
end
def comment_authors

View File

@@ -20,6 +20,21 @@ feature 'Commenting debates' do
end
end
scenario 'Show' do
parent_comment = create(:comment, commentable: debate)
first_child = create(:comment, commentable: debate, parent: parent_comment)
second_child = create(:comment, commentable: debate, parent: parent_comment)
visit comment_path(parent_comment)
expect(page).to have_css(".comment", count: 3)
expect(page).to have_content parent_comment.body
expect(page).to have_content first_child.body
expect(page).to have_content second_child.body
expect(page).to have_link "Go back to #{debate.title}", debate_path(debate)
end
scenario 'Comment order' do
c1 = create(:comment, :with_confidence_score, commentable: debate, cached_votes_up: 100, cached_votes_total: 120, created_at: Time.now - 2)
c2 = create(:comment, :with_confidence_score, commentable: debate, cached_votes_up: 10, cached_votes_total: 12, created_at: Time.now - 1)
@@ -254,7 +269,7 @@ feature 'Commenting debates' do
fill_in "comment-body-debate_#{debate.id}", with: 'Testing submit button!'
click_button 'Publish comment'
# The button's text should now be "..."
# This should be checked before the Ajax request is finished
expect(page).to_not have_button 'Publish comment'

View File

@@ -20,6 +20,21 @@ feature 'Commenting proposals' do
end
end
scenario 'Show' do
parent_comment = create(:comment, commentable: proposal)
first_child = create(:comment, commentable: proposal, parent: parent_comment)
second_child = create(:comment, commentable: proposal, parent: parent_comment)
visit comment_path(parent_comment)
expect(page).to have_css(".comment", count: 3)
expect(page).to have_content parent_comment.body
expect(page).to have_content first_child.body
expect(page).to have_content second_child.body
expect(page).to have_link "Go back to #{proposal.title}", proposal_path(proposal)
end
scenario 'Comment order' do
c1 = create(:comment, :with_confidence_score, commentable: proposal, cached_votes_up: 100, cached_votes_total: 120, created_at: Time.now - 2)
c2 = create(:comment, :with_confidence_score, commentable: proposal, cached_votes_up: 10, cached_votes_total: 12, created_at: Time.now - 1)

View File

@@ -21,4 +21,6 @@ describe "Abilities::Everyone" do
it { should_not be_able_to(:vote, Proposal) }
it { should_not be_able_to(:flag, Proposal) }
it { should_not be_able_to(:unflag, Proposal) }
it { should be_able_to(:show, Comment) }
end