forked from cybrespace/mastodon
		
	Add batch approve/reject for pending hashtags in admin UI (#11791)
This commit is contained in:
		
							parent
							
								
									3feacd2b14
								
							
						
					
					
						commit
						261e52268c
					
				
					 7 changed files with 142 additions and 19 deletions
				
			
		| 
						 | 
					@ -3,12 +3,33 @@
 | 
				
			||||||
module Admin
 | 
					module Admin
 | 
				
			||||||
  class TagsController < BaseController
 | 
					  class TagsController < BaseController
 | 
				
			||||||
    before_action :set_tags, only: :index
 | 
					    before_action :set_tags, only: :index
 | 
				
			||||||
    before_action :set_tag, except: :index
 | 
					    before_action :set_tag, except: [:index, :batch, :approve_all, :reject_all]
 | 
				
			||||||
    before_action :set_usage_by_domain, except: :index
 | 
					    before_action :set_usage_by_domain, except: [:index, :batch, :approve_all, :reject_all]
 | 
				
			||||||
    before_action :set_counters, except: :index
 | 
					    before_action :set_counters, except: [:index, :batch, :approve_all, :reject_all]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def index
 | 
					    def index
 | 
				
			||||||
      authorize :tag, :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
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def show
 | 
					    def show
 | 
				
			||||||
| 
						 | 
					@ -61,7 +82,7 @@ module Admin
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def filter_params
 | 
					    def filter_params
 | 
				
			||||||
      params.slice(:context, :review).permit(:context, :review)
 | 
					      params.slice(:context, :review, :page).permit(:context, :review, :page)
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def tag_params
 | 
					    def tag_params
 | 
				
			||||||
| 
						 | 
					@ -75,5 +96,17 @@ module Admin
 | 
				
			||||||
        date.to_time(:utc).beginning_of_day.to_i
 | 
					        date.to_time(:utc).beginning_of_day.to_i
 | 
				
			||||||
      end
 | 
					      end
 | 
				
			||||||
    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
 | 
				
			||||||
end
 | 
					end
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -211,6 +211,16 @@ a.table-action-link {
 | 
				
			||||||
        padding: 0;
 | 
					        padding: 0;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    .directory__tag {
 | 
				
			||||||
 | 
					      margin: 0;
 | 
				
			||||||
 | 
					      width: 100%;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      a {
 | 
				
			||||||
 | 
					        background: transparent;
 | 
				
			||||||
 | 
					        border-radius: 0;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  .status__content {
 | 
					  .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,4 +1,8 @@
 | 
				
			||||||
.directory__tag
 | 
					.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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  .directory__tag
 | 
				
			||||||
    = link_to admin_tag_path(tag.id) do
 | 
					    = link_to admin_tag_path(tag.id) do
 | 
				
			||||||
      %h4
 | 
					      %h4
 | 
				
			||||||
        = fa_icon 'hashtag'
 | 
					        = fa_icon 'hashtag'
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,9 @@
 | 
				
			||||||
- content_for :page_title do
 | 
					- content_for :page_title do
 | 
				
			||||||
  = t('admin.tags.title')
 | 
					  = t('admin.tags.title')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- content_for :header_tags do
 | 
				
			||||||
 | 
					  = javascript_pack_tag 'admin', integrity: true, async: true, crossorigin: 'anonymous'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.filters
 | 
					.filters
 | 
				
			||||||
  .filter-subset
 | 
					  .filter-subset
 | 
				
			||||||
    %strong= t('admin.tags.context')
 | 
					    %strong= t('admin.tags.context')
 | 
				
			||||||
| 
						 | 
					@ -18,5 +21,37 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
%hr.spacer/
 | 
					%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
 | 
					= 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
 | 
					    all: All
 | 
				
			||||||
    changes_saved_msg: Changes successfully saved!
 | 
					    changes_saved_msg: Changes successfully saved!
 | 
				
			||||||
    copy: Copy
 | 
					    copy: Copy
 | 
				
			||||||
 | 
					    no_batch_actions_available: No batch actions available on this page
 | 
				
			||||||
    order_by: Order by
 | 
					    order_by: Order by
 | 
				
			||||||
    save_changes: Save changes
 | 
					    save_changes: Save changes
 | 
				
			||||||
    validation_errors:
 | 
					    validation_errors:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -251,7 +251,14 @@ Rails.application.routes.draw do
 | 
				
			||||||
    end
 | 
					    end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    resources :account_moderation_notes, only: [:create, :destroy]
 | 
					    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
 | 
					  end
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  get '/admin', to: redirect('/admin/dashboard', status: 302)
 | 
					  get '/admin', to: redirect('/admin/dashboard', status: 302)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue