Add instance search feature (#4925)
This commit is contained in:
		| @ -14,8 +14,12 @@ module Admin | ||||
|  | ||||
|     private | ||||
|  | ||||
|     def filtered_instances | ||||
|       InstanceFilter.new(filter_params).results | ||||
|     end | ||||
|  | ||||
|     def paginated_instances | ||||
|       Account.remote.by_domain_accounts.page(params[:page]) | ||||
|       filtered_instances.page(params[:page]) | ||||
|     end | ||||
|  | ||||
|     helper_method :paginated_instances | ||||
| @ -27,5 +31,11 @@ module Admin | ||||
|     def subscribeable_accounts | ||||
|       Account.with_followers.remote.where(domain: params[:by_domain]) | ||||
|     end | ||||
|  | ||||
|     def filter_params | ||||
|       params.permit( | ||||
|         :domain_name | ||||
|       ) | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | ||||
| @ -104,6 +104,7 @@ class Account < ApplicationRecord | ||||
|   scope :by_domain_accounts, -> { group(:domain).select(:domain, 'COUNT(*) AS accounts_count').order('accounts_count desc') } | ||||
|   scope :matches_username, ->(value) { where(arel_table[:username].matches("#{value}%")) } | ||||
|   scope :matches_display_name, ->(value) { where(arel_table[:display_name].matches("#{value}%")) } | ||||
|   scope :matches_domain, ->(value) { where(arel_table[:domain].matches("%#{value}%")) } | ||||
|  | ||||
|   delegate :email, | ||||
|            :current_sign_in_ip, | ||||
|  | ||||
							
								
								
									
										28
									
								
								app/models/instance_filter.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								app/models/instance_filter.rb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | ||||
| # frozen_string_literal: true | ||||
|  | ||||
| class InstanceFilter | ||||
|   attr_reader :params | ||||
|  | ||||
|   def initialize(params) | ||||
|     @params = params | ||||
|   end | ||||
|  | ||||
|   def results | ||||
|     scope = Account.remote.by_domain_accounts | ||||
|     params.each do |key, value| | ||||
|       scope.merge!(scope_for(key, value)) if value.present? | ||||
|     end | ||||
|     scope | ||||
|   end | ||||
|  | ||||
|   private | ||||
|  | ||||
|   def scope_for(key, value) | ||||
|     case key.to_s | ||||
|     when 'domain_name' | ||||
|       Account.matches_domain(value) | ||||
|     else | ||||
|       raise "Unknown filter: #{key}" | ||||
|     end | ||||
|   end | ||||
| end | ||||
| @ -1,6 +1,16 @@ | ||||
| - content_for :page_title do | ||||
|   = t('admin.instances.title') | ||||
|  | ||||
| = form_tag admin_instances_url, method: 'GET', class: 'simple_form' do | ||||
|   .fields-group | ||||
|     - %i(domain_name).each do |key| | ||||
|       .input.string.optional | ||||
|         = text_field_tag key, params[key], class: 'string optional', placeholder: I18n.t("admin.instances.#{key}") | ||||
|  | ||||
|     .actions | ||||
|       %button= t('admin.instances.search') | ||||
|       = link_to t('admin.instances.reset'), admin_instances_path, class: 'button negative' | ||||
|  | ||||
| .table-wrapper | ||||
|   %table.table | ||||
|     %thead | ||||
|  | ||||
		Reference in New Issue
	
	Block a user