Add instance search feature (#4925)

signup-info-prompt
nullkal 2017-09-13 19:30:07 +09:00 committed by Eugen Rochko
parent 9e2ff3ef71
commit da77f65c46
4 changed files with 50 additions and 1 deletions

View File

@ -14,8 +14,12 @@ module Admin
private private
def filtered_instances
InstanceFilter.new(filter_params).results
end
def paginated_instances def paginated_instances
Account.remote.by_domain_accounts.page(params[:page]) filtered_instances.page(params[:page])
end end
helper_method :paginated_instances helper_method :paginated_instances
@ -27,5 +31,11 @@ module Admin
def subscribeable_accounts def subscribeable_accounts
Account.with_followers.remote.where(domain: params[:by_domain]) Account.with_followers.remote.where(domain: params[:by_domain])
end end
def filter_params
params.permit(
:domain_name
)
end
end end
end end

View File

@ -104,6 +104,7 @@ class Account < ApplicationRecord
scope :by_domain_accounts, -> { group(:domain).select(:domain, 'COUNT(*) AS accounts_count').order('accounts_count desc') } 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_username, ->(value) { where(arel_table[:username].matches("#{value}%")) }
scope :matches_display_name, ->(value) { where(arel_table[:display_name].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, delegate :email,
:current_sign_in_ip, :current_sign_in_ip,

View 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

View File

@ -1,6 +1,16 @@
- content_for :page_title do - content_for :page_title do
= t('admin.instances.title') = 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-wrapper
%table.table %table.table
%thead %thead