Update parent comment responses count when a new reply is created

Extract the needed portion of code to a new partial to be able to update
only the elements needed when a new comment is added keeping UI properly
updated.
This commit is contained in:
Senén Rodero Rodríguez
2020-05-08 07:00:30 +02:00
parent 095abbf9a7
commit 956f002738
12 changed files with 144 additions and 9 deletions

View File

@@ -14,6 +14,9 @@
$(this).text(new_val); $(this).text(new_val);
}); });
}, },
update_responses_count: function(comment_id, responses_count_html) {
$(comment_id + "_reply .responses-count").html(responses_count_html);
},
display_error: function(field_with_errors, error_html) { display_error: function(field_with_errors, error_html) {
$(error_html).insertAfter($("" + field_with_errors)); $(error_html).insertAfter($("" + field_with_errors));
}, },

View File

@@ -85,15 +85,9 @@
</div> </div>
<% end %> <% end %>
<% if comment.children.size > 0 %> <span class="responses-count">
<%= link_to "", class: "js-toggle-children relative" do %> <%= render "comments/responses_count", count: comment.children.size %>
<span class="far fa-minus-square"></span> </span>
<span class="js-child-toggle" style="display: none;"><%= t("comments.comment.responses_show", count: comment.children.size) %></span>
<span class="js-child-toggle"><%= t("comments.comment.responses_collapse", count: comment.children.size) %></span>
<% end %>
<% else %>
<%= t("comments.comment.responses", count: 0) %>
<% end %>
<% if user_signed_in? && !comments_closed_for_commentable?(comment.commentable) && !require_verified_resident_for_commentable?(comment.commentable, current_user) %> <% if user_signed_in? && !comments_closed_for_commentable?(comment.commentable) && !require_verified_resident_for_commentable?(comment.commentable, current_user) %>
<span class="divider">&nbsp;|&nbsp;</span> <span class="divider">&nbsp;|&nbsp;</span>

View File

@@ -0,0 +1,9 @@
<% if count > 0 %>
<%= link_to "", class: "js-toggle-children relative" do %>
<span class="far fa-minus-square"></span>
<span class="js-child-toggle" style="display: none;"><%= t("comments.comment.responses_show", count: count) %></span>
<span class="js-child-toggle"><%= t("comments.comment.responses_collapse", count: count) %></span>
<% end %>
<% else %>
<%= t("comments.comment.responses", count: 0) %>
<% end %>

View File

@@ -2,6 +2,8 @@
var parent_id = ""; var parent_id = "";
<% else -%> <% else -%>
var parent_id = "#" + "<%= "comment_#{@comment.parent_id}" %>"; var parent_id = "#" + "<%= "comment_#{@comment.parent_id}" %>";
var responses_count_html = "<%= j(render "comments/responses_count", count: @comment.parent.children.size) %>"
App.Comments.update_responses_count(parent_id, responses_count_html);
<% end -%> <% end -%>
App.Comments.reset_form(parent_id); App.Comments.reset_form(parent_id);

View File

@@ -242,6 +242,21 @@ describe "Commenting Budget::Investments" do
expect(page).not_to have_selector("#js-comment-form-comment_#{comment.id}", visible: true) expect(page).not_to have_selector("#js-comment-form-comment_#{comment.id}", visible: true)
end end
scenario "Reply update parent comment responses count", :js do
comment = create(:comment, commentable: investment)
login_as(create(:user))
visit budget_investment_path(investment.budget, investment)
within ".comment", text: comment.body do
click_link "Reply"
fill_in "Leave your comment", with: "It will be done next week."
click_button "Publish reply"
expect(page).to have_content("1 response (collapse)")
end
end
scenario "Errors on reply", :js do scenario "Errors on reply", :js do
comment = create(:comment, commentable: investment, user: user) comment = create(:comment, commentable: investment, user: user)

View File

@@ -216,6 +216,21 @@ describe "Internal valuation comments on Budget::Investments" do
expect(page).not_to have_content("It will be done next week.") expect(page).not_to have_content("It will be done next week.")
end end
scenario "Reply update parent comment responses count", :js do
comment = create(:comment, :valuation, author: admin_user, commentable: investment)
login_as(valuator_user)
visit valuation_budget_budget_investment_path(budget, investment)
within ".comment", text: comment.body do
click_link "Reply"
fill_in "Leave your comment", with: "It will be done next week."
click_button "Publish reply"
expect(page).to have_content("1 response (collapse)")
end
end
scenario "Errors on reply without comment text", :js do scenario "Errors on reply without comment text", :js do
comment = create(:comment, :valuation, author: admin_user, commentable: investment) comment = create(:comment, :valuation, author: admin_user, commentable: investment)

View File

@@ -281,6 +281,21 @@ describe "Commenting debates" do
end end
end end
scenario "Reply update parent comment responses count", :js do
comment = create(:comment, commentable: debate)
login_as(create(:user))
visit debate_path(debate)
within ".comment", text: comment.body do
click_link "Reply"
fill_in "Leave your comment", with: "It will be done next week."
click_button "Publish reply"
expect(page).to have_content("1 response (collapse)")
end
end
scenario "Errors on reply", :js do scenario "Errors on reply", :js do
comment = create(:comment, commentable: debate, user: user) comment = create(:comment, commentable: debate, user: user)

View File

@@ -278,6 +278,25 @@ describe "Commenting legislation questions" do
expect(page).not_to have_selector("#js-comment-form-comment_#{comment.id}", visible: true) expect(page).not_to have_selector("#js-comment-form-comment_#{comment.id}", visible: true)
end end
scenario "Reply update parent comment responses count", :js do
manuela = create(:user, :level_two, username: "Manuela")
legislation_annotation = create(:legislation_annotation)
comment = legislation_annotation.comments.first
login_as(manuela)
visit legislation_process_draft_version_annotation_path(legislation_annotation.draft_version.process,
legislation_annotation.draft_version,
legislation_annotation)
within ".comment", text: comment.body do
click_link "Reply"
fill_in "Leave your comment", with: "It will be done next week."
click_button "Publish reply"
expect(page).to have_content("1 response (collapse)")
end
end
scenario "Errors on reply", :js do scenario "Errors on reply", :js do
comment = legislation_annotation.comments.first comment = legislation_annotation.comments.first

View File

@@ -260,6 +260,22 @@ describe "Commenting legislation questions" do
expect(page).not_to have_selector("#js-comment-form-comment_#{comment.id}", visible: true) expect(page).not_to have_selector("#js-comment-form-comment_#{comment.id}", visible: true)
end end
scenario "Reply update parent comment responses count", :js do
manuela = create(:user, :level_two, username: "Manuela")
comment = create(:comment, commentable: legislation_question)
login_as(manuela)
visit legislation_process_question_path(legislation_question.process, legislation_question)
within ".comment", text: comment.body do
click_link "Reply"
fill_in "Leave your answer", with: "It will be done next week."
click_button "Publish reply"
expect(page).to have_content("1 response (collapse)")
end
end
scenario "Errors on reply", :js do scenario "Errors on reply", :js do
comment = create(:comment, commentable: legislation_question, user: user) comment = create(:comment, commentable: legislation_question, user: user)

View File

@@ -240,6 +240,21 @@ describe "Commenting polls" do
expect(page).not_to have_selector("#js-comment-form-comment_#{comment.id}", visible: true) expect(page).not_to have_selector("#js-comment-form-comment_#{comment.id}", visible: true)
end end
scenario "Reply update parent comment responses count", :js do
comment = create(:comment, commentable: poll)
login_as(create(:user))
visit poll_path(poll)
within ".comment", text: comment.body do
click_link "Reply"
fill_in "Leave your comment", with: "It will be done next week."
click_button "Publish reply"
expect(page).to have_content("1 response (collapse)")
end
end
scenario "Errors on reply", :js do scenario "Errors on reply", :js do
comment = create(:comment, commentable: poll, user: user) comment = create(:comment, commentable: poll, user: user)

View File

@@ -238,6 +238,21 @@ describe "Commenting proposals" do
expect(page).not_to have_selector("#js-comment-form-comment_#{comment.id}", visible: true) expect(page).not_to have_selector("#js-comment-form-comment_#{comment.id}", visible: true)
end end
scenario "Reply update parent comment responses count", :js do
comment = create(:comment, commentable: proposal)
login_as(create(:user))
visit proposal_path(proposal)
within ".comment", text: comment.body do
click_link "Reply"
fill_in "Leave your comment", with: "It will be done next week."
click_button "Publish reply"
expect(page).to have_content("1 response (collapse)")
end
end
scenario "Errors on reply", :js do scenario "Errors on reply", :js do
comment = create(:comment, commentable: proposal, user: user) comment = create(:comment, commentable: proposal, user: user)

View File

@@ -264,6 +264,23 @@ describe "Commenting topics from proposals" do
expect(page).not_to have_selector("#js-comment-form-comment_#{comment.id}", visible: true) expect(page).not_to have_selector("#js-comment-form-comment_#{comment.id}", visible: true)
end end
scenario "Reply update parent comment responses count", :js do
community = proposal.community
topic = create(:topic, community: community)
comment = create(:comment, commentable: topic)
login_as(create(:user))
visit community_topic_path(community, topic)
within ".comment", text: comment.body do
click_link "Reply"
fill_in "Leave your comment", with: "It will be done next week."
click_button "Publish reply"
expect(page).to have_content("1 response (collapse)")
end
end
scenario "Errors on reply", :js do scenario "Errors on reply", :js do
community = proposal.community community = proposal.community
topic = create(:topic, community: community) topic = create(:topic, community: community)