Denote previously reported and suspended users in vomit reactions (#6619) [deploy]
* Break feedback_messages view into partials * Standardize capitalization * Add visual cues for banned and vommitted users * Use helper methods to construct urls * Rename vomitted? to vomitted_on? vomitted_on? is a slightly more clear method name. This change takes Rhymes' suggestion to use the AR method exists? over where(...).exists?
This commit is contained in:
parent
8b0cfaf48a
commit
19b91129d8
6 changed files with 127 additions and 114 deletions
|
|
@ -344,6 +344,10 @@ class User < ApplicationRecord
|
|||
end
|
||||
end
|
||||
|
||||
def vomitted_on?
|
||||
Reaction.exists?(reactable_id: id, reactable_type: "User", category: "vomit", status: "confirmed")
|
||||
end
|
||||
|
||||
def trusted
|
||||
Rails.cache.fetch("user-#{id}/has_trusted_role", expires_in: 200.hours) do
|
||||
has_role? :trusted
|
||||
|
|
|
|||
69
app/views/internal/feedback_messages/_abuse_reports.html.erb
Normal file
69
app/views/internal/feedback_messages/_abuse_reports.html.erb
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
<h2>Abuse Reports</h2>
|
||||
|
||||
<div class="row my-3">
|
||||
<div class="col">
|
||||
<ul class="nav nav-pills">
|
||||
<li class="nav-item">
|
||||
<a href="<%= internal_reports_path(state: @feedback_type, status: "Open") %>" class="nav-link <%= "active" if @status == "Open" %>">Open/Unresolved</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="<%= internal_reports_path(state: @feedback_type, status: "Resolved") %>" class="nav-link <%= "active" if @status == "Resolved" %>">Resolved</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="<%= internal_reports_path(state: @feedback_type, status: "Invalid") %>" class="nav-link <%= "active" if @status == "Invalid" %>">Invalid</a>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row my-3" id="vomitReactions">
|
||||
<div class="card w-100">
|
||||
<div class="card-header" id="vomitReactionsHeader">
|
||||
<h2 class="d-inline">Vomit Reactions</h2>
|
||||
<button class="btn btn-secondary float-right" type="button" data-toggle="collapse" data-target="#vomitReactionsBodyContainer" aria-expanded="false" aria-controls="vomitReactionsBodyContainer">
|
||||
Toggle
|
||||
</button>
|
||||
</div>
|
||||
<div id="vomitReactionsBodyContainer" class="collapse hide" aria-labelledby="vomitReactionsHeader" data-parent="#vomitReactions">
|
||||
<div class="card-body" style="overflow: scroll; max-height: 500px;">
|
||||
<% @vomits.each do |reaction| %>
|
||||
<% next if (reaction.reactable_type == "Article" && !reaction.reactable.published) || (reaction.reactable_type == "User" && reaction.reactable&.banished?) %>
|
||||
<div class="d-flex justify-content-between">
|
||||
<span>
|
||||
🤢 <a href="<%= reaction.user.path %>">@<%= reaction.user.username %></a>
|
||||
</span>
|
||||
<span>
|
||||
<strong><%= reaction.reactable_type %>:</strong>
|
||||
<a href="<%= reaction.reactable.path %>"><%= reaction.reactable.title %></a>
|
||||
<% if reaction.reactable_type == "User" && reaction.reactable.banned %>
|
||||
<span class="badge badge-danger">Suspended</span>
|
||||
<% end %>
|
||||
<% if reaction.reactable_type == "User" && reaction.reactable.vomitted_on? %>
|
||||
<span class="badge badge-warning">Vomitted</span>
|
||||
<% end %>
|
||||
</span>
|
||||
<span>
|
||||
<% if params[:status] == "Open" || params[:status].blank? %>
|
||||
<% if reaction.reactable_type == "User" %>
|
||||
<%= form_for [:internal, reaction], html: { class: "d-inline" } do |f| %>
|
||||
<%= f.hidden_field :status, value: "confirmed" %>
|
||||
<%= f.submit "CONFIRMED", class: "btn btn-success btn-sm", data: { confirm: "Are you sure?" } %>
|
||||
<% end %>
|
||||
<% else %>
|
||||
<%= form_for [:internal, reaction], html: { class: "d-inline" } do |f| %>
|
||||
<%= f.hidden_field :status, value: "confirmed" %>
|
||||
<%= f.submit "CONFIRMED", class: "btn btn-success btn-sm" %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<%= form_for [:internal, reaction], html: { class: "d-inline" } do |f| %>
|
||||
<%= f.hidden_field :status, value: "invalid" %>
|
||||
<%= f.submit "INVALID", class: "btn btn-danger btn-sm" %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</span>
|
||||
</div>
|
||||
<hr>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -92,7 +92,7 @@
|
|||
</ul>
|
||||
<div class="tab-content my-3">
|
||||
<div role="tabcard" class="tab-pane fade active show" data-id="<%= feedback_message.id %>" data-userType="reporter" id="reporter-<%= feedback_message.id %>">
|
||||
<h3>Send to:</h3>
|
||||
<h3>Send To:</h3>
|
||||
<%= email_field_tag :reporter_email_to, feedback_message.reporter&.email, class: "form-control my-1", id: "reporter__emailto__#{feedback_message.id}", required: true %>
|
||||
<h3>Subject:</h3>
|
||||
<%= text_field_tag :reporter_email_subject, reporter_email_details[:subject], class: "form-control my-1", id: "reporter__subject__#{feedback_message.id}" %>
|
||||
|
|
@ -100,7 +100,7 @@
|
|||
<%= text_area_tag :reporter_email_body, reporter_email_details[:body], class: "form-control my-1", style: "height: 300px;", id: "reporter__body__#{feedback_message.id}" %>
|
||||
</div>
|
||||
<div role="tabcard" class="tab-pane fade" data-id="<%= feedback_message.id %>" data-userType="offender" id="offender-<%= feedback_message.id %>">
|
||||
<h3>Send to:</h3>
|
||||
<h3>Send To:</h3>
|
||||
<%= email_field_tag :offender_email_to, feedback_message.offender&.email, class: "form-control my-1", id: "offender__emailto__#{feedback_message.id}", required: true %>
|
||||
<h3>Subject:</h3>
|
||||
<%= text_field_tag :offender_email_subject, offender_email_details[:subject], class: "form-control my-1", id: "offender__subject__#{feedback_message.id}" %>
|
||||
|
|
@ -108,7 +108,7 @@
|
|||
<%= text_area_tag :offender_email_body, offender_email_details[:body], class: "form-control my-1", style: "height: 300px;", id: "offender__body__#{feedback_message.id}" %>
|
||||
</div>
|
||||
<div role="tabcard" class="tab-pane fade" data-id="<%= feedback_message.id %>" data-userType="affected" id="affected-<%= feedback_message.id %>">
|
||||
<h3>Send to:</h3>
|
||||
<h3>Send To:</h3>
|
||||
<%= email_field_tag :affected_email_to, feedback_message.affected&.email, class: "form-control my-1", id: "affected__emailto__#{feedback_message.id}", required: true %>
|
||||
<h3>Subject:</h3>
|
||||
<%= text_field_tag :affected_email_subject, affected_email_details[:subject], class: "form-control my-1", id: "affected__subject__#{feedback_message.id}" %>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,26 @@
|
|||
<div class="row my-3" id="latestArticles">
|
||||
<div class="card w-100">
|
||||
<div class="card-header" id="articlesHeader">
|
||||
<h2 class="d-inline">Latest Articles</h2>
|
||||
<button class="btn btn-secondary float-right" type="button" data-toggle="collapse" data-target="#articlesBodyContainer" aria-expanded="false" aria-controls="articlesBodyContainer">
|
||||
Toggle
|
||||
</button>
|
||||
</div>
|
||||
<div id="articlesBodyContainer" class="collapse hide" aria-labelledby="articleHeader" data-parent="#latestArticles">
|
||||
<div class="card-body" style="overflow: scroll; max-height: 500px;">
|
||||
<% @new_articles.each do |article| %>
|
||||
<% next if article.user.badge_achievements_count > 2 %>
|
||||
<a href="<%= article.path %>"><%= article.title %></a>
|
||||
<span class="float-right">
|
||||
<a href="<%= article.path %>/mod" class="btn btn-secondary btn-sm">Mod</a>
|
||||
<a href="<%= article.path %>/moderate" class="btn btn-secondary btn-sm">Internal</a>
|
||||
<a href="<%= article.user.path %>" class="btn btn-secondary btn-sm">Profile</a>
|
||||
<a href="/internal/users/<%= article.user_id %>" class="btn btn-secondary btn-sm">Internal User</a>
|
||||
<a href="/internal/users/<%= article.user_id %>/edit" class="btn btn-danger btn-sm">Destructive Actions</a>
|
||||
</span>
|
||||
<hr>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -0,0 +1,22 @@
|
|||
<div class="row my-3" id="possibleSpamUsers">
|
||||
<div class="card w-100">
|
||||
<div class="card-header" id="possibleSpamUsersHeader">
|
||||
<h2 class="d-inline">Possible Spam/Abuse Users</h2>
|
||||
<button class="btn btn-secondary float-right" type="button" data-toggle="collapse" data-target="#possibleSpamUsersBodyContainer" aria-expanded="false" aria-controls="possibleSpamUsersBodyContainer">
|
||||
Toggle
|
||||
</button>
|
||||
</div>
|
||||
<div id="possibleSpamUsersBodyContainer" class="collapse hide" aria-labelledby="possibleSpamUsersHeader" data-parent="#possibleSpamUsers">
|
||||
<div class="card-body" style="overflow: scroll; max-height: 500px;">
|
||||
<% @possible_spam_users.each do |user| %>
|
||||
<a href="<%= user.path %>">@<%= user.username %></a> - <%= user.name %>
|
||||
<span class="float-right">
|
||||
<a href="/internal/users/<%= user.id %>" class="btn btn-secondary btn-sm">Internal User</a>
|
||||
<a href="/internal/users/<%= user.id %>/edit" class="btn btn-danger btn-sm">Destructive Actions</a>
|
||||
</span>
|
||||
<hr>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -2,119 +2,11 @@
|
|||
|
||||
<h2>Suspicious Activity</h2>
|
||||
|
||||
<div class="row my-3" id="latestArticles">
|
||||
<div class="card w-100">
|
||||
<div class="card-header" id="articlesHeader">
|
||||
<h2 class="d-inline">Latest Articles</h2>
|
||||
<button class="btn btn-secondary float-right" type="button" data-toggle="collapse" data-target="#articlesBodyContainer" aria-expanded="false" aria-controls="articlesBodyContainer">
|
||||
Toggle
|
||||
</button>
|
||||
</div>
|
||||
<div id="articlesBodyContainer" class="collapse hide" aria-labelledby="articleHeader" data-parent="#latestArticles">
|
||||
<div class="card-body" style="overflow: scroll; max-height: 500px;">
|
||||
<% @new_articles.each do |article| %>
|
||||
<% next if article.user.badge_achievements_count > 2 %>
|
||||
<a href="<%= article.path %>"><%= article.title %></a>
|
||||
<span class="float-right">
|
||||
<a href="<%= article.path %>/mod" class="btn btn-secondary btn-sm">Mod</a>
|
||||
<a href="<%= article.path %>/moderate" class="btn btn-secondary btn-sm">Internal</a>
|
||||
<a href="<%= article.user.path %>" class="btn btn-secondary btn-sm">Profile</a>
|
||||
<a href="/internal/users/<%= article.user_id %>" class="btn btn-secondary btn-sm">Internal User</a>
|
||||
<a href="/internal/users/<%= article.user_id %>/edit" class="btn btn-danger btn-sm">Destructive Actions</a>
|
||||
</span>
|
||||
<hr>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<%= render "latest_articles" %>
|
||||
|
||||
<div class="row my-3" id="possibleSpamUsers">
|
||||
<div class="card w-100">
|
||||
<div class="card-header" id="possibleSpamUsersHeader">
|
||||
<h2 class="d-inline">Possible Spam/Abuse Users</h2>
|
||||
<button class="btn btn-secondary float-right" type="button" data-toggle="collapse" data-target="#possibleSpamUsersBodyContainer" aria-expanded="false" aria-controls="possibleSpamUsersBodyContainer">
|
||||
Toggle
|
||||
</button>
|
||||
</div>
|
||||
<div id="possibleSpamUsersBodyContainer" class="collapse hide" aria-labelledby="possibleSpamUsersHeader" data-parent="#possibleSpamUsers">
|
||||
<div class="card-body" style="overflow: scroll; max-height: 500px;">
|
||||
<% @possible_spam_users.each do |user| %>
|
||||
<a href="<%= user.path %>">@<%= user.username %></a> - <%= user.name %>
|
||||
<span class="float-right">
|
||||
<a href="/internal/users/<%= user.id %>" class="btn btn-secondary btn-sm">Internal User</a>
|
||||
<a href="/internal/users/<%= user.id %>/edit" class="btn btn-danger btn-sm">Destructive Actions</a>
|
||||
</span>
|
||||
<hr>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<%= render "potential_spam_users" %>
|
||||
|
||||
<h2>Abuse Reports</h2>
|
||||
|
||||
<div class="row my-3">
|
||||
<div class="col">
|
||||
<ul class="nav nav-pills">
|
||||
<li class="nav-item">
|
||||
<a href="/internal/reports?state=<%= @feedback_type %>&status=Open" class="nav-link <%= "active" if @status == "Open" %>">Open/Unresolved</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="/internal/reports?state=<%= @feedback_type %>&status=Resolved" class="nav-link <%= "active" if @status == "Resolved" %>">Resolved</a>
|
||||
</li>
|
||||
<li class="nav-item">
|
||||
<a href="/internal/reports?state=<%= @feedback_type %>&status=Invalid" class="nav-link <%= "active" if @status == "Invalid" %>">Invalid</a>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="row my-3" id="vomitReactions">
|
||||
<div class="card w-100">
|
||||
<div class="card-header" id="vomitReactionsHeader">
|
||||
<h2 class="d-inline">Vomit Reactions</h2>
|
||||
<button class="btn btn-secondary float-right" type="button" data-toggle="collapse" data-target="#vomitReactionsBodyContainer" aria-expanded="false" aria-controls="vomitReactionsBodyContainer">
|
||||
Toggle
|
||||
</button>
|
||||
</div>
|
||||
<div id="vomitReactionsBodyContainer" class="collapse hide" aria-labelledby="vomitReactionsHeader" data-parent="#vomitReactions">
|
||||
<div class="card-body" style="overflow: scroll; max-height: 500px;">
|
||||
<% @vomits.each do |reaction| %>
|
||||
<% next if (reaction.reactable_type == "Article" && !reaction.reactable.published) || (reaction.reactable_type == "User" && reaction.reactable&.banished?) %>
|
||||
<div class="d-flex justify-content-between">
|
||||
<span>
|
||||
🤢 <a href="<%= reaction.user.path %>">@<%= reaction.user.username %></a>
|
||||
</span>
|
||||
<span>
|
||||
<strong><%= reaction.reactable_type %>:</strong>
|
||||
<a href="<%= reaction.reactable.path %>"><%= reaction.reactable.title %></a>
|
||||
</span>
|
||||
<span>
|
||||
<% if params[:status] == "Open" || params[:status].blank? %>
|
||||
<% if reaction.reactable_type == "User" %>
|
||||
<%= form_for [:internal, reaction], html: { class: "d-inline" } do |f| %>
|
||||
<%= f.hidden_field :status, value: "confirmed" %>
|
||||
<%= f.submit "CONFIRMED", class: "btn btn-success btn-sm", data: { confirm: "Are you sure?" } %>
|
||||
<% end %>
|
||||
<% else %>
|
||||
<%= form_for [:internal, reaction], html: { class: "d-inline" } do |f| %>
|
||||
<%= f.hidden_field :status, value: "confirmed" %>
|
||||
<%= f.submit "CONFIRMED", class: "btn btn-success btn-sm" %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
<%= form_for [:internal, reaction], html: { class: "d-inline" } do |f| %>
|
||||
<%= f.hidden_field :status, value: "invalid" %>
|
||||
<%= f.submit "INVALID", class: "btn btn-danger btn-sm" %>
|
||||
<% end %>
|
||||
<% end %>
|
||||
</span>
|
||||
</div>
|
||||
<hr>
|
||||
<% end %>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<%= render "abuse_reports" %>
|
||||
|
||||
<%= search_form_for @q, url: internal_feedback_messages_path, class: "form-inline justify-content-end" do |f| %>
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue