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
end
def filter_params
- params.slice(:context, :review).permit(:context, :review)
+ params.slice(:context, :review, :page).permit(:context, :review, :page)
end
def tag_params
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
padding: 0;
}
}
+
+ .directory__tag {
+ margin: 0;
+ width: 100%;
+
+ a {
+ background: transparent;
+ border-radius: 0;
+ }
+ }
}
.status__content {
--- /dev/null
+# 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
-.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
- 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')
%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'
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:
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)