Add filter to AccountFilter (#2968)
This commit is contained in:
parent
abe0d9421f
commit
e89e4355eb
|
@ -23,7 +23,11 @@ module Admin
|
|||
:by_domain,
|
||||
:silenced,
|
||||
:recent,
|
||||
:suspended
|
||||
:suspended,
|
||||
:username,
|
||||
:display_name,
|
||||
:email,
|
||||
:ip
|
||||
)
|
||||
end
|
||||
end
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module Admin::FilterHelper
|
||||
ACCOUNT_FILTERS = %i(local remote by_domain silenced suspended recent).freeze
|
||||
ACCOUNT_FILTERS = %i(local remote by_domain silenced suspended recent username display_name email ip).freeze
|
||||
REPORT_FILTERS = %i(resolved account_id target_account_id).freeze
|
||||
|
||||
FILTERS = ACCOUNT_FILTERS + REPORT_FILTERS
|
||||
|
|
|
@ -10,27 +10,49 @@ class AccountFilter
|
|||
def results
|
||||
scope = Account.alphabetic
|
||||
params.each do |key, value|
|
||||
scope = scope.merge scope_for(key, value)
|
||||
scope.merge!(scope_for(key, value)) if value.present?
|
||||
end
|
||||
scope
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def scope_for(key, value)
|
||||
case key
|
||||
when /local/
|
||||
accounts = Account.arel_table
|
||||
|
||||
case key.to_s
|
||||
when 'local'
|
||||
Account.local
|
||||
when /remote/
|
||||
when 'remote'
|
||||
Account.remote
|
||||
when /by_domain/
|
||||
when 'by_domain'
|
||||
Account.where(domain: value)
|
||||
when /silenced/
|
||||
when 'silenced'
|
||||
Account.silenced
|
||||
when /recent/
|
||||
when 'recent'
|
||||
Account.recent
|
||||
when /suspended/
|
||||
when 'suspended'
|
||||
Account.suspended
|
||||
when 'username'
|
||||
Account.where(accounts[:username].matches("#{value}%"))
|
||||
when 'display_name'
|
||||
Account.where(accounts[:display_name].matches("#{value}%"))
|
||||
when 'email'
|
||||
users = User.arel_table
|
||||
Account.joins(:user).merge(User.where(users[:email].matches("#{value}%")))
|
||||
when 'ip'
|
||||
return Account.default_scoped unless valid_ip?(value)
|
||||
matches_ip = User.where(current_sign_in_ip: value).or(User.where(last_sign_in_ip: value))
|
||||
Account.joins(:user).merge(matches_ip)
|
||||
else
|
||||
raise "Unknown filter: #{key}"
|
||||
end
|
||||
end
|
||||
|
||||
def valid_ip?(value)
|
||||
IPAddr.new(value)
|
||||
true
|
||||
rescue IPAddr::InvalidAddressError
|
||||
false
|
||||
end
|
||||
end
|
||||
|
|
|
@ -20,6 +20,21 @@
|
|||
%li= filter_link_to t('admin.accounts.order.alphabetic'), recent: nil
|
||||
%li= filter_link_to t('admin.accounts.order.most_recent'), recent: '1'
|
||||
|
||||
= form_tag(admin_accounts_url, { method: 'GET', class: 'simple_form' }) do
|
||||
.fields-group
|
||||
- Admin::FilterHelper::ACCOUNT_FILTERS.each do |key|
|
||||
- if params[key].present?
|
||||
= hidden_field_tag key, params[key]
|
||||
|
||||
- %i(username display_name email ip).each do |key|
|
||||
.input.string.optional
|
||||
.label_input
|
||||
%label.string.optional= t("admin.accounts.#{key}")
|
||||
= text_field_tag key, params[key], class: 'string optional'
|
||||
|
||||
.actions
|
||||
%button.btn= t('admin.accounts.search')
|
||||
|
||||
%table.table
|
||||
%thead
|
||||
%tr
|
||||
|
|
|
@ -62,6 +62,7 @@ en:
|
|||
feed_url: Feed URL
|
||||
followers: Followers
|
||||
follows: Follows
|
||||
ip: IP
|
||||
location:
|
||||
all: All
|
||||
local: Local
|
||||
|
@ -86,6 +87,7 @@ en:
|
|||
push_subscription_expires: PuSH subscription expires
|
||||
reset_password: Reset password
|
||||
salmon_url: Salmon URL
|
||||
search: Search
|
||||
show:
|
||||
created_reports: Reports created by this account
|
||||
report: report
|
||||
|
|
|
@ -62,6 +62,7 @@ ja:
|
|||
feed_url: フィードURL
|
||||
followers: フォロワー数
|
||||
follows: フォロー数
|
||||
ip: IP
|
||||
location:
|
||||
all: すべて
|
||||
local: ローカル
|
||||
|
@ -86,6 +87,7 @@ ja:
|
|||
push_subscription_expires: PuSH購読期限切れ
|
||||
reset_password: パスワード再設定
|
||||
salmon_url: Salmon URL
|
||||
search: 検索
|
||||
show:
|
||||
created_reports: このアカウントで作られたレポート
|
||||
report: レポート
|
||||
|
|
Reference in a new issue