Add batch approve/reject for pending hashtags in admin UI (#11791)
This commit is contained in:
		
							parent
							
								
									3feacd2b14
								
							
						
					
					
						commit
						261e52268c
					
				@ -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 {
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										33
									
								
								app/models/form/tag_batch.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								app/models/form/tag_batch.rb
									
									
									
									
									
										Normal file
									
								
							@ -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)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user