@@ -3,12 +3,33 @@ | |||
module Admin | |||
class TagsController < BaseController | |||
before_action :set_tags, only: :index | |||
before_action :set_tag, except: :index | |||
before_action :set_usage_by_domain, except: :index | |||
before_action :set_counters, except: :index | |||
before_action :set_tag, except: [:index, :batch, :approve_all, :reject_all] | |||
before_action :set_usage_by_domain, except: [:index, :batch, :approve_all, :reject_all] | |||
before_action :set_counters, except: [:index, :batch, :approve_all, :reject_all] | |||
def index | |||
authorize :tag, :index? | |||
@form = Form::TagBatch.new | |||
end | |||
def batch | |||
@form = Form::TagBatch.new(form_tag_batch_params.merge(current_account: current_account, action: action_from_button)) | |||
@form.save | |||
rescue ActionController::ParameterMissing | |||
flash[:alert] = I18n.t('admin.accounts.no_account_selected') | |||
ensure | |||
redirect_to admin_tags_path(filter_params) | |||
end | |||
def approve_all | |||
Form::TagBatch.new(current_account: current_account, tag_ids: Tag.pending_review.pluck(:id), action: 'approve').save | |||
redirect_to admin_tags_path(filter_params) | |||
end | |||
def reject_all | |||
Form::TagBatch.new(current_account: current_account, tag_ids: Tag.pending_review.pluck(:id), action: 'reject').save | |||
redirect_to admin_tags_path(filter_params) | |||
end | |||
def show | |||
@@ -61,7 +82,7 @@ module Admin | |||
end | |||
def filter_params | |||
params.slice(:context, :review).permit(:context, :review) | |||
params.slice(:context, :review, :page).permit(:context, :review, :page) | |||
end | |||
def tag_params | |||
@@ -75,5 +96,17 @@ module Admin | |||
date.to_time(:utc).beginning_of_day.to_i | |||
end | |||
end | |||
def form_tag_batch_params | |||
params.require(:form_tag_batch).permit(:action, tag_ids: []) | |||
end | |||
def action_from_button | |||
if params[:approve] | |||
'approve' | |||
elsif params[:reject] | |||
'reject' | |||
end | |||
end | |||
end | |||
end |
@@ -211,6 +211,16 @@ a.table-action-link { | |||
padding: 0; | |||
} | |||
} | |||
.directory__tag { | |||
margin: 0; | |||
width: 100%; | |||
a { | |||
background: transparent; | |||
border-radius: 0; | |||
} | |||
} | |||
} | |||
.status__content { | |||
@@ -0,0 +1,33 @@ | |||
# frozen_string_literal: true | |||
class Form::TagBatch | |||
include ActiveModel::Model | |||
include Authorization | |||
attr_accessor :tag_ids, :action, :current_account | |||
def save | |||
case action | |||
when 'approve' | |||
approve! | |||
when 'reject' | |||
reject! | |||
end | |||
end | |||
private | |||
def tags | |||
Tag.where(id: tag_ids) | |||
end | |||
def approve! | |||
tags.each { |tag| authorize(tag, :update?) } | |||
tags.update_all(trendable: true, reviewed_at: Time.now.utc) | |||
end | |||
def reject! | |||
tags.each { |tag| authorize(tag, :update?) } | |||
tags.update_all(trendable: false, reviewed_at: Time.now.utc) | |||
end | |||
end |
@@ -1,16 +1,20 @@ | |||
.directory__tag | |||
= link_to admin_tag_path(tag.id) do | |||
%h4 | |||
= fa_icon 'hashtag' | |||
= tag.name | |||
.batch-table__row | |||
%label.batch-table__row__select.batch-table__row__select--aligned.batch-checkbox | |||
= f.check_box :tag_ids, { multiple: true, include_hidden: false }, tag.id | |||
%small | |||
= t('admin.tags.in_directory', count: tag.accounts_count) | |||
• | |||
= t('admin.tags.unique_uses_today', count: tag.history.first[:accounts]) | |||
.directory__tag | |||
= link_to admin_tag_path(tag.id) do | |||
%h4 | |||
= fa_icon 'hashtag' | |||
= tag.name | |||
- if tag.trending? | |||
= fa_icon 'fire fw' | |||
= t('admin.tags.trending_right_now') | |||
%small | |||
= t('admin.tags.in_directory', count: tag.accounts_count) | |||
• | |||
= t('admin.tags.unique_uses_today', count: tag.history.first[:accounts]) | |||
.trends__item__current= number_to_human tag.history.first[:uses], strip_insignificant_zeros: true | |||
- if tag.trending? | |||
= fa_icon 'fire fw' | |||
= t('admin.tags.trending_right_now') | |||
.trends__item__current= number_to_human tag.history.first[:uses], strip_insignificant_zeros: true |
@@ -1,6 +1,9 @@ | |||
- content_for :page_title do | |||
= t('admin.tags.title') | |||
- content_for :header_tags do | |||
= javascript_pack_tag 'admin', integrity: true, async: true, crossorigin: 'anonymous' | |||
.filters | |||
.filter-subset | |||
%strong= t('admin.tags.context') | |||
@@ -18,5 +21,37 @@ | |||
%hr.spacer/ | |||
= render @tags | |||
= form_for(@form, url: batch_admin_tags_path) do |f| | |||
= hidden_field_tag :page, params[:page] || 1 | |||
= hidden_field_tag :context, params[:context] | |||
= hidden_field_tag :review, params[:review] | |||
.batch-table | |||
.batch-table__toolbar | |||
%label.batch-table__toolbar__select.batch-checkbox-all | |||
= check_box_tag :batch_checkbox_all, nil, false | |||
.batch-table__toolbar__actions | |||
- if params[:review] == 'pending_review' | |||
= f.button safe_join([fa_icon('check'), t('admin.accounts.approve')]), name: :approve, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } | |||
= f.button safe_join([fa_icon('times'), t('admin.accounts.reject')]), name: :reject, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') } | |||
- else | |||
%span.neutral-hint= t('generic.no_batch_actions_available') | |||
.batch-table__body | |||
- if @tags.empty? | |||
= nothing_here 'nothing-here--under-tabs' | |||
- else | |||
= render partial: 'tag', collection: @tags, locals: { f: f } | |||
= paginate @tags | |||
- if params[:review] == 'pending_review' | |||
%hr.spacer/ | |||
%div{ style: 'overflow: hidden' } | |||
%div{ style: 'float: right' } | |||
= link_to t('admin.accounts.reject_all'), reject_all_admin_tags_path, method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button button--destructive' | |||
%div | |||
= link_to t('admin.accounts.approve_all'), approve_all_admin_tags_path, method: :post, data: { confirm: t('admin.accounts.are_you_sure') }, class: 'button' |
@@ -727,6 +727,7 @@ en: | |||
all: All | |||
changes_saved_msg: Changes successfully saved! | |||
copy: Copy | |||
no_batch_actions_available: No batch actions available on this page | |||
order_by: Order by | |||
save_changes: Save changes | |||
validation_errors: | |||
@@ -251,7 +251,14 @@ Rails.application.routes.draw do | |||
end | |||
resources :account_moderation_notes, only: [:create, :destroy] | |||
resources :tags, only: [:index, :show, :update] | |||
resources :tags, only: [:index, :show, :update] do | |||
collection do | |||
post :approve_all | |||
post :reject_all | |||
post :batch | |||
end | |||
end | |||
end | |||
get '/admin', to: redirect('/admin/dashboard', status: 302) | |||