diff --git a/app/components/comment_component.rb b/app/components/comment_component.rb index 77fbdafdc..39793e0c3 100644 --- a/app/components/comment_component.rb +++ b/app/components/comment_component.rb @@ -28,12 +28,16 @@ class CommentComponent < ApplicationComponent def upvoted? return false if current_user.is_anonymous? - comment.votes.active.select(&:is_positive?).map(&:user_id).include?(current_user.id) + current_vote&.is_positive? end def downvoted? return false if current_user.is_anonymous? - comment.votes.active.select(&:is_negative?).map(&:user_id).include?(current_user.id) + current_vote&.is_negative? + end + + def current_vote + @current_vote ||= comment.votes.active.find { |v| v.user_id == current_user.id } end def reported? diff --git a/app/components/comment_component/comment_component.html.erb b/app/components/comment_component/comment_component.html.erb index 987e80783..bf29ec764 100644 --- a/app/components/comment_component/comment_component.html.erb +++ b/app/components/comment_component/comment_component.html.erb @@ -48,7 +48,7 @@ <% if current_user.is_anonymous? %> <%= link_to upvote_icon, login_path(url: request.fullpath), class: "comment-upvote-link inactive-link" %> <% elsif upvoted? %> - <%= link_to upvote_icon, comment_comment_votes_path(comment_id: comment.id), class: "comment-upvote-link comment-unvote-link active-link", method: :delete, remote: true %> + <%= link_to upvote_icon, comment_vote_path(current_vote), class: "comment-upvote-link comment-unvote-link active-link", method: :delete, remote: true %> <% else %> <%= link_to upvote_icon, comment_comment_votes_path(comment_id: comment.id, score: "1"), class: "comment-upvote-link inactive-link", method: :post, remote: true %> <% end %> @@ -64,7 +64,7 @@ <% if current_user.is_anonymous? %> <%= link_to downvote_icon, login_path(url: request.fullpath), class: "comment-downvote-link inactive-link" %> <% elsif downvoted? %> - <%= link_to downvote_icon, comment_comment_votes_path(comment_id: comment.id), class: "comment-downvote-link comment-unvote-link active-link", method: :delete, remote: true %> + <%= link_to downvote_icon, comment_vote_path(current_vote), class: "comment-downvote-link comment-unvote-link active-link", method: :delete, remote: true %> <% else %> <%= link_to downvote_icon, comment_comment_votes_path(comment_id: comment.id, score: "-1"), class: "comment-downvote-link inactive-link", method: :post, remote: true %> <% end %> diff --git a/app/controllers/comment_votes_controller.rb b/app/controllers/comment_votes_controller.rb index 4235e8492..5b53dab0d 100644 --- a/app/controllers/comment_votes_controller.rb +++ b/app/controllers/comment_votes_controller.rb @@ -26,8 +26,7 @@ class CommentVotesController < ApplicationController end def destroy - # XXX should find by comment vote id. - @comment_vote = authorize CommentVote.active.find_by!(comment_id: params[:comment_id], user: CurrentUser.user) + @comment_vote = authorize CommentVote.find(params[:id]) @comment_vote.soft_delete(updater: CurrentUser.user) respond_with(@comment_vote) diff --git a/app/policies/comment_vote_policy.rb b/app/policies/comment_vote_policy.rb index 25706185c..3ca44bb6b 100644 --- a/app/policies/comment_vote_policy.rb +++ b/app/policies/comment_vote_policy.rb @@ -4,7 +4,7 @@ class CommentVotePolicy < ApplicationPolicy end def destroy? - record.user_id == user.id + !record.is_deleted? && (record.user_id == user.id || user.is_admin?) end def can_see_votes? diff --git a/app/views/comment_votes/_search.html.erb b/app/views/comment_votes/_search.html.erb index 2fcdde6a0..b33796678 100644 --- a/app/views/comment_votes/_search.html.erb +++ b/app/views/comment_votes/_search.html.erb @@ -6,6 +6,7 @@ <%= fc.input :post_id, label: "Post", input_html: { value: params.dig(:search, :comment, :post_id) } %> <% end %> <%= f.input :comment_id, label: "Comment", input_html: { value: params[:search][:comment_id] } %> + <%= f.input :is_deleted, label: "Deleted?", as: :select, include_blank: true, selected: params[:search][:is_deleted] %> <%= f.input :score, collection: [["+1", "1"], ["-1", "-1"]], include_blank: true, selected: params[:search][:score] %> <%= f.submit "Search" %> <% end %> diff --git a/app/views/comment_votes/destroy.js+listing.erb b/app/views/comment_votes/destroy.js+listing.erb new file mode 100644 index 000000000..2edde040f --- /dev/null +++ b/app/views/comment_votes/destroy.js+listing.erb @@ -0,0 +1,2 @@ +Danbooru.Utility.notice("Vote removed"); +location.reload(); diff --git a/app/views/comment_votes/index.html+compact.erb b/app/views/comment_votes/index.html+compact.erb index 053c3b37e..f3cf672f4 100644 --- a/app/views/comment_votes/index.html+compact.erb +++ b/app/views/comment_votes/index.html+compact.erb @@ -14,9 +14,23 @@ <%= link_to "»", comment_votes_path(search: { user_name: vote.user.name }) %> <% end %> + <% t.column "Status" do |vote| %> + <%= "Deleted" if vote.is_deleted? %> + <% end %> + <% t.column "Created" do |vote| %> <%= time_ago_in_words_tagged(vote.created_at) %> <% end %> + + <% t.column column: "control" do |vote| %> + <% if policy(vote).destroy? %> + <%= render PopupMenuComponent.new do |menu| %> + <%= menu.item do %> + <%= link_to "Remove", comment_vote_path(vote, variant: "listing"), remote: true, method: :delete %> + <% end %> + <% end %> + <% end %> + <% end %> <% end %> <%= numbered_paginator(@comment_votes) %> diff --git a/app/views/comment_votes/index.html.erb b/app/views/comment_votes/index.html.erb index 8c17a05d7..ce6b3e902 100644 --- a/app/views/comment_votes/index.html.erb +++ b/app/views/comment_votes/index.html.erb @@ -8,27 +8,40 @@ <% t.column "Post" do |vote| %> <%= post_preview(vote.comment.post, show_deleted: true) %> <% end %> + <% t.column "Comment", td: {class: "col-expand"} do |vote| %>