about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2018-11-26 15:53:27 +0100
committerGitHub <noreply@github.com>2018-11-26 15:53:27 +0100
commit73faadad28b897cd61cc1d6c8bee47e7d72a51a1 (patch)
treefd3570cfa52aa1c31924b6d11af1257308f4db66
parentdb9aea34dead1b230e44b4235ff8af8100108b7f (diff)
Redesign admin accounts index (#9340)
* Improve overview of accounts in admin UI

- Display suspended status, role, last activity and IP prominently
- Default to showing local accounts
- Default to not showing suspended accounts

* Remove unused strings

* Fix tests

* Allow filtering accounts by IP mask
-rw-r--r--app/controllers/admin/accounts_controller.rb2
-rw-r--r--app/helpers/admin/account_moderation_notes_helper.rb2
-rw-r--r--app/helpers/admin/filter_helper.rb2
-rw-r--r--app/helpers/stream_entries_helper.rb8
-rw-r--r--app/javascript/packs/public.js2
-rw-r--r--app/models/account.rb1
-rw-r--r--app/models/account_filter.rb23
-rw-r--r--app/models/user.rb1
-rw-r--r--app/views/admin/accounts/_account.html.haml23
-rw-r--r--app/views/admin/accounts/index.html.haml38
-rw-r--r--app/views/admin/accounts/show.html.haml2
-rw-r--r--config/locales/ar.yml4
-rw-r--r--config/locales/ca.yml4
-rw-r--r--config/locales/co.yml4
-rw-r--r--config/locales/cs.yml4
-rw-r--r--config/locales/cy.yml4
-rw-r--r--config/locales/da.yml4
-rw-r--r--config/locales/de.yml4
-rw-r--r--config/locales/el.yml4
-rw-r--r--config/locales/en.yml4
-rw-r--r--config/locales/eo.yml4
-rw-r--r--config/locales/es.yml4
-rw-r--r--config/locales/eu.yml4
-rw-r--r--config/locales/fa.yml4
-rw-r--r--config/locales/fi.yml4
-rw-r--r--config/locales/fr.yml4
-rw-r--r--config/locales/gl.yml4
-rw-r--r--config/locales/he.yml4
-rw-r--r--config/locales/hu.yml4
-rw-r--r--config/locales/id.yml4
-rw-r--r--config/locales/io.yml4
-rw-r--r--config/locales/it.yml4
-rw-r--r--config/locales/ja.yml4
-rw-r--r--config/locales/ka.yml4
-rw-r--r--config/locales/ko.yml4
-rw-r--r--config/locales/nl.yml4
-rw-r--r--config/locales/no.yml4
-rw-r--r--config/locales/oc.yml4
-rw-r--r--config/locales/pl.yml4
-rw-r--r--config/locales/pt-BR.yml4
-rw-r--r--config/locales/pt.yml4
-rw-r--r--config/locales/ru.yml4
-rw-r--r--config/locales/sk.yml4
-rw-r--r--config/locales/sl.yml4
-rw-r--r--config/locales/sr-Latn.yml4
-rw-r--r--config/locales/sr.yml4
-rw-r--r--config/locales/sv.yml4
-rw-r--r--config/locales/th.yml4
-rw-r--r--config/locales/tr.yml4
-rw-r--r--config/locales/uk.yml4
-rw-r--r--config/locales/zh-CN.yml4
-rw-r--r--config/locales/zh-HK.yml4
-rw-r--r--config/locales/zh-TW.yml4
-rw-r--r--spec/controllers/admin/accounts_controller_spec.rb4
-rw-r--r--spec/models/account_filter_spec.rb25
-rw-r--r--spec/models/user_spec.rb12
56 files changed, 47 insertions, 266 deletions
diff --git a/app/controllers/admin/accounts_controller.rb b/app/controllers/admin/accounts_controller.rb
index 5d57fe361..f155543ce 100644
--- a/app/controllers/admin/accounts_controller.rb
+++ b/app/controllers/admin/accounts_controller.rb
@@ -94,8 +94,8 @@ module Admin
         :local,
         :remote,
         :by_domain,
+        :active,
         :silenced,
-        :alphabetic,
         :suspended,
         :username,
         :display_name,
diff --git a/app/helpers/admin/account_moderation_notes_helper.rb b/app/helpers/admin/account_moderation_notes_helper.rb
index 4d8f0352e..40b2a5289 100644
--- a/app/helpers/admin/account_moderation_notes_helper.rb
+++ b/app/helpers/admin/account_moderation_notes_helper.rb
@@ -24,7 +24,7 @@ module Admin::AccountModerationNotesHelper
 
   def name_tag_classes(account, inline = false)
     classes = [inline ? 'inline-name-tag' : 'name-tag']
-    classes << 'suspended' if account.suspended?
+    classes << 'suspended' if account.suspended? || (account.local? && account.user.nil?)
     classes.join(' ')
   end
 end
diff --git a/app/helpers/admin/filter_helper.rb b/app/helpers/admin/filter_helper.rb
index 60e5142e3..9a663051c 100644
--- a/app/helpers/admin/filter_helper.rb
+++ b/app/helpers/admin/filter_helper.rb
@@ -1,7 +1,7 @@
 # frozen_string_literal: true
 
 module Admin::FilterHelper
-  ACCOUNT_FILTERS      = %i(local remote by_domain silenced suspended alphabetic username display_name email ip staff).freeze
+  ACCOUNT_FILTERS      = %i(local remote by_domain active silenced suspended username display_name email ip staff).freeze
   REPORT_FILTERS       = %i(resolved account_id target_account_id).freeze
   INVITE_FILTER        = %i(available expired).freeze
   CUSTOM_EMOJI_FILTERS = %i(local remote by_domain shortcode).freeze
diff --git a/app/helpers/stream_entries_helper.rb b/app/helpers/stream_entries_helper.rb
index ac655f622..033d435c4 100644
--- a/app/helpers/stream_entries_helper.rb
+++ b/app/helpers/stream_entries_helper.rb
@@ -34,12 +34,14 @@ module StreamEntriesHelper
     end
   end
 
-  def account_badge(account)
+  def account_badge(account, all: false)
     if account.bot?
       content_tag(:div, content_tag(:div, t('accounts.roles.bot'), class: 'account-role bot'), class: 'roles')
-    elsif Setting.show_staff_badge && account.user_staff?
+    elsif (Setting.show_staff_badge && account.user_staff?) || all
       content_tag(:div, class: 'roles') do
-        if account.user_admin?
+        if all && !account.user_staff?
+          content_tag(:div, t('admin.accounts.roles.user'), class: 'account-role')
+        elsif account.user_admin?
           content_tag(:div, t('accounts.roles.admin'), class: 'account-role admin')
         elsif account.user_moderator?
           content_tag(:div, t('accounts.roles.moderator'), class: 'account-role moderator')
diff --git a/app/javascript/packs/public.js b/app/javascript/packs/public.js
index 3b02b7c39..36b1fd26b 100644
--- a/app/javascript/packs/public.js
+++ b/app/javascript/packs/public.js
@@ -63,7 +63,7 @@ function main() {
       content.textContent = timeAgoString({
         formatMessage: ({ id, defaultMessage }, values) => (new IntlMessageFormat(messages[id] || defaultMessage, locale)).format(values),
         formatDate: (date, options) => (new Intl.DateTimeFormat(locale, options)).format(date),
-      }, datetime, now, datetime.getFullYear());
+      }, datetime, now, now.getFullYear());
     });
 
     const reactComponents = document.querySelectorAll('[data-component]');
diff --git a/app/models/account.rb b/app/models/account.rb
index 593ee29f7..46d32a36e 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -123,6 +123,7 @@ class Account < ApplicationRecord
   scope :suspended, -> { where(suspended: true) }
   scope :without_suspended, -> { where(suspended: false) }
   scope :recent, -> { reorder(id: :desc) }
+  scope :bots, -> { where(actor_type: %w(Application Service)) }
   scope :alphabetic, -> { order(domain: :asc, username: :asc) }
   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}%")) }
diff --git a/app/models/account_filter.rb b/app/models/account_filter.rb
index 84364bf1b..b10f50db7 100644
--- a/app/models/account_filter.rb
+++ b/app/models/account_filter.rb
@@ -5,13 +5,14 @@ class AccountFilter
 
   def initialize(params)
     @params = params
+    set_defaults!
   end
 
   def results
-    scope = Account.recent
+    scope = Account.recent.includes(:user)
 
     params.each do |key, value|
-      scope.merge!(scope_for(key, value)) if value.present?
+      scope.merge!(scope_for(key, value.to_s.strip)) if value.present?
     end
 
     scope
@@ -19,6 +20,11 @@ class AccountFilter
 
   private
 
+  def set_defaults!
+    params['local']  = '1' if params['remote'].blank?
+    params['active'] = '1' if params['suspended'].blank? && params['silenced'].blank?
+  end
+
   def scope_for(key, value)
     case key.to_s
     when 'local'
@@ -27,10 +33,10 @@ class AccountFilter
       Account.remote
     when 'by_domain'
       Account.where(domain: value)
+    when 'active'
+      Account.without_suspended
     when 'silenced'
       Account.silenced
-    when 'alphabetic'
-      Account.reorder(nil).alphabetic
     when 'suspended'
       Account.suspended
     when 'username'
@@ -40,11 +46,7 @@ class AccountFilter
     when 'email'
       accounts_with_users.merge User.matches_email(value)
     when 'ip'
-      if valid_ip?(value)
-        accounts_with_users.merge User.with_recent_ip_address(value)
-      else
-        Account.default_scoped
-      end
+      valid_ip?(value) ? accounts_with_users.where('users.current_sign_in_ip <<= ?', value) : Account.none
     when 'staff'
       accounts_with_users.merge User.staff
     else
@@ -57,8 +59,7 @@ class AccountFilter
   end
 
   def valid_ip?(value)
-    IPAddr.new(value)
-    true
+    IPAddr.new(value) && true
   rescue IPAddr::InvalidAddressError
     false
   end
diff --git a/app/models/user.rb b/app/models/user.rb
index 69fa0688a..453ffa8b0 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -83,7 +83,6 @@ class User < ApplicationRecord
   scope :inactive, -> { where(arel_table[:current_sign_in_at].lt(ACTIVE_DURATION.ago)) }
   scope :active, -> { confirmed.where(arel_table[:current_sign_in_at].gteq(ACTIVE_DURATION.ago)).joins(:account).where(accounts: { suspended: false }) }
   scope :matches_email, ->(value) { where(arel_table[:email].matches("#{value}%")) }
-  scope :with_recent_ip_address, ->(value) { where(arel_table[:current_sign_in_ip].eq(value).or(arel_table[:last_sign_in_ip].eq(value))) }
 
   before_validation :sanitize_languages
 
diff --git a/app/views/admin/accounts/_account.html.haml b/app/views/admin/accounts/_account.html.haml
index c6e63152d..0fadaae1e 100644
--- a/app/views/admin/accounts/_account.html.haml
+++ b/app/views/admin/accounts/_account.html.haml
@@ -1,18 +1,15 @@
 %tr
-  %td.username
-    = account.username
   %td
-    - unless account.local?
-      = link_to account.domain, admin_accounts_path(by_domain: account.domain)
+    = admin_account_link_to(account)
   %td
-    - if account.local?
-      - if account.user.nil?
-        = t("admin.accounts.moderation.suspended")
-      - else
-        = t("admin.accounts.roles.#{account.user.role}")
+    %div{ style: 'margin: -2px 0' }= account_badge(account, all: true)
+  %td
+    - if account.user_current_sign_in_ip
+      %samp= account.user_current_sign_in_ip
     - else
-      = account.protocol.humanize
+      \-
   %td
-    = table_link_to 'circle', t('admin.accounts.web'), web_path("accounts/#{account.id}")
-    = table_link_to 'globe', t('admin.accounts.public'), TagManager.instance.url_for(account)
-    = table_link_to 'pencil', t('admin.accounts.edit'), admin_account_path(account.id)
+    - if account.user_current_sign_in_at
+      %time.time-ago{ datetime: account.user_current_sign_in_at.iso8601, title: l(account.user_current_sign_in_at) }= l account.user_current_sign_in_at
+    - else
+      \-
diff --git a/app/views/admin/accounts/index.html.haml b/app/views/admin/accounts/index.html.haml
index 4bee73adc..0d31eee36 100644
--- a/app/views/admin/accounts/index.html.haml
+++ b/app/views/admin/accounts/index.html.haml
@@ -5,41 +5,19 @@
   .filter-subset
     %strong= t('admin.accounts.location.title')
     %ul
-      %li= filter_link_to t('admin.accounts.location.all'), local: nil, remote: nil
-      %li
-        - if selected? local: '1', remote: nil
-          = filter_link_to t('admin.accounts.location.local'), {local: nil, remote: nil}, {local: '1', remote: nil}
-        - else
-          = filter_link_to t('admin.accounts.location.local'), local: '1', remote: nil
-      %li
-        - if selected? remote: '1', local: nil
-          = filter_link_to t('admin.accounts.location.remote'), {remote: nil, local: nil}, {remote: '1', local: nil}
-        - else
-          = filter_link_to t('admin.accounts.location.remote'), remote: '1', local: nil
+      %li= filter_link_to t('admin.accounts.location.local'), remote: nil
+      %li= filter_link_to t('admin.accounts.location.remote'), remote: '1'
   .filter-subset
     %strong= t('admin.accounts.moderation.title')
     %ul
-      %li= filter_link_to t('admin.accounts.moderation.all'), silenced: nil, suspended: nil
-      %li
-        - if selected? silenced: '1'
-          = filter_link_to t('admin.accounts.moderation.silenced'), {silenced: nil}, {silenced: '1'}
-        - else
-          = filter_link_to t('admin.accounts.moderation.silenced'), silenced: '1'
-      %li
-        - if selected? suspended: '1'
-          = filter_link_to t('admin.accounts.moderation.suspended'), {suspended: nil}, {suspended: '1'}
-        - else
-          = filter_link_to t('admin.accounts.moderation.suspended'), suspended: '1'
+      %li= filter_link_to t('admin.accounts.moderation.active'), silenced: nil, suspended: nil
+      %li= filter_link_to t('admin.accounts.moderation.silenced'), silenced: '1', suspended: nil
+      %li= filter_link_to t('admin.accounts.moderation.suspended'), suspended: '1', silenced: nil
   .filter-subset
     %strong= t('admin.accounts.role')
     %ul
       %li= filter_link_to t('admin.accounts.moderation.all'), staff: nil
       %li= filter_link_to t('admin.accounts.roles.staff'), staff: '1'
-  .filter-subset
-    %strong= t('admin.accounts.order.title')
-    %ul
-      %li= filter_link_to t('admin.accounts.order.most_recent'), alphabetic: nil
-      %li= filter_link_to t('admin.accounts.order.alphabetic'), alphabetic: '1'
 
 = form_tag admin_accounts_url, method: 'GET', class: 'simple_form' do
   .fields-group
@@ -60,9 +38,9 @@
     %thead
       %tr
         %th= t('admin.accounts.username')
-        %th= t('admin.accounts.domain')
-        %th
-        %th
+        %th= t('admin.accounts.role')
+        %th= t('admin.accounts.most_recent_ip')
+        %th= t('admin.accounts.most_recent_activity')
     %tbody
       = render @accounts
 
diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml
index 17f1f224d..c1a5fc1bd 100644
--- a/app/views/admin/accounts/show.html.haml
+++ b/app/views/admin/accounts/show.html.haml
@@ -68,7 +68,7 @@
               %time.formatted{ datetime: @account.user_current_sign_in_at.iso8601, title: l(@account.user_current_sign_in_at) }
                 = l @account.user_current_sign_in_at
             - else
-              Never
+              \-
       - else
         %tr
           %th= t('admin.accounts.profile_url')
diff --git a/config/locales/ar.yml b/config/locales/ar.yml
index 095b1f584..e9d9c03cd 100644
--- a/config/locales/ar.yml
+++ b/config/locales/ar.yml
@@ -115,10 +115,6 @@ ar:
       most_recent_ip: أحدث عنوان إيبي
       no_limits_imposed: مِن دون حدود مشروطة
       not_subscribed: غير مشترك
-      order:
-        alphabetic: أبجديًا
-        most_recent: الأحدث
-        title: الترتيب
       outbox_url: رابط صندوق الصادر
       perform_full_suspension: تعطيل
       profile_url: رابط الملف الشخصي
diff --git a/config/locales/ca.yml b/config/locales/ca.yml
index b74d7a00b..29a75f13b 100644
--- a/config/locales/ca.yml
+++ b/config/locales/ca.yml
@@ -123,10 +123,6 @@ ca:
       most_recent_ip: IP més recent
       no_limits_imposed: Sense límits imposats
       not_subscribed: No subscrit
-      order:
-        alphabetic: Alfabètic
-        most_recent: Més recent
-        title: Ordre
       outbox_url: URL de la bústia de sortida
       perform_full_suspension: Suspèn
       profile_url: URL del perfil
diff --git a/config/locales/co.yml b/config/locales/co.yml
index 9306c6c33..8c68aff69 100644
--- a/config/locales/co.yml
+++ b/config/locales/co.yml
@@ -123,10 +123,6 @@ co:
       most_recent_ip: IP più ricente
       no_limits_imposed: Nisuna limita imposta
       not_subscribed: Micca abbunatu
-      order:
-        alphabetic: Alfabeticu
-        most_recent: Più ricente
-        title: Urdine
       outbox_url: URL di l’outbox
       perform_full_suspension: Suspende
       profile_url: URL di u prufile
diff --git a/config/locales/cs.yml b/config/locales/cs.yml
index 05f65653b..9e749a951 100644
--- a/config/locales/cs.yml
+++ b/config/locales/cs.yml
@@ -115,10 +115,6 @@ cs:
       most_recent_ip: Nejnovější IP
       no_limits_imposed: Nejsou nastavena žádná omezení
       not_subscribed: Neodebírá
-      order:
-        alphabetic: Abecedně
-        most_recent: Nejnovější
-        title: Pořadí
       outbox_url: URL odchozích zpráv
       perform_full_suspension: Suspendovat
       profile_url: URL profilu
diff --git a/config/locales/cy.yml b/config/locales/cy.yml
index a4df28b61..e238abc37 100644
--- a/config/locales/cy.yml
+++ b/config/locales/cy.yml
@@ -115,10 +115,6 @@ cy:
       most_recent_ip: IP diweddaraf
       no_limits_imposed: Dim terfynau wedi'i gosod
       not_subscribed: Heb danysgrifio
-      order:
-        alphabetic: Allfabetig
-        most_recent: Diweddaraf
-        title: Trefnu
       outbox_url: Allflwch URL
       perform_full_suspension: Atal
       profile_url: URL proffil
diff --git a/config/locales/da.yml b/config/locales/da.yml
index d9ce9d55d..fb6cac828 100644
--- a/config/locales/da.yml
+++ b/config/locales/da.yml
@@ -122,10 +122,6 @@ da:
       most_recent_activity: Seneste aktivitet
       most_recent_ip: Senest IP
       not_subscribed: Ikke abonneret
-      order:
-        alphabetic: Alfabetisk
-        most_recent: Seneste
-        title: Rækkefølge
       outbox_url: Link til udgående
       perform_full_suspension: Udeluk
       profile_url: Link til profil
diff --git a/config/locales/de.yml b/config/locales/de.yml
index 587b9dfc9..51b4818bd 100644
--- a/config/locales/de.yml
+++ b/config/locales/de.yml
@@ -123,10 +123,6 @@ de:
       most_recent_ip: Letzte IP-Adresse
       no_limits_imposed: Keine Limits eingesetzt
       not_subscribed: Nicht abonniert
-      order:
-        alphabetic: Alphabetisch
-        most_recent: Neueste
-        title: Sortierung
       outbox_url: Postausgangs-URL
       perform_full_suspension: Sperren
       profile_url: Profil-URL
diff --git a/config/locales/el.yml b/config/locales/el.yml
index 8f718a849..757133c9b 100644
--- a/config/locales/el.yml
+++ b/config/locales/el.yml
@@ -123,10 +123,6 @@ el:
       most_recent_ip: Πιο πρόσφατη IP
       no_limits_imposed: Χωρίς όρια
       not_subscribed: Άνευ συνδρομής
-      order:
-        alphabetic: Αλφαβητικά
-        most_recent: Πιο πρόσφατα
-        title: Ταξινόμηση
       outbox_url: URL εξερχομένων
       perform_full_suspension: Κάνε πλήρη αναστολή
       profile_url: URL προφίλ
diff --git a/config/locales/en.yml b/config/locales/en.yml
index a2859aa5d..2d27a4ac7 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -123,10 +123,6 @@ en:
       most_recent_ip: Most recent IP
       no_limits_imposed: No limits imposed
       not_subscribed: Not subscribed
-      order:
-        alphabetic: Alphabetic
-        most_recent: Most recent
-        title: Order
       outbox_url: Outbox URL
       perform_full_suspension: Suspend
       profile_url: Profile URL
diff --git a/config/locales/eo.yml b/config/locales/eo.yml
index 72628a944..eddefab05 100644
--- a/config/locales/eo.yml
+++ b/config/locales/eo.yml
@@ -112,10 +112,6 @@ eo:
       most_recent_activity: Lasta ago
       most_recent_ip: Lasta IP
       not_subscribed: Ne abonita
-      order:
-        alphabetic: Laŭalfabete
-        most_recent: Plej lastatempa
-        title: Ordo
       outbox_url: Elira URL
       perform_full_suspension: Tute haltigi
       profile_url: Profila URL
diff --git a/config/locales/es.yml b/config/locales/es.yml
index f7531161c..4cd1e2a38 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -123,10 +123,6 @@ es:
       most_recent_ip: IP más reciente
       no_limits_imposed: Sin límites impuestos
       not_subscribed: No se está suscrito
-      order:
-        alphabetic: Alfabético
-        most_recent: Más reciente
-        title: Orden
       outbox_url: URL de bandeja de salida
       perform_full_suspension: Suspender
       profile_url: URL del perfil
diff --git a/config/locales/eu.yml b/config/locales/eu.yml
index 206b439b0..122b074eb 100644
--- a/config/locales/eu.yml
+++ b/config/locales/eu.yml
@@ -123,10 +123,6 @@ eu:
       most_recent_ip: Azken IP-a
       no_limits_imposed: Ez da mugarik ezarri
       not_subscribed: Harpidetu gabe
-      order:
-        alphabetic: Alfabetikoa
-        most_recent: Azkena
-        title: Ordena
       outbox_url: Irteera ontziaren URL-a
       perform_full_suspension: Kanporatu
       profile_url: Profilaren URL-a
diff --git a/config/locales/fa.yml b/config/locales/fa.yml
index 4209a2c00..769b3a0fd 100644
--- a/config/locales/fa.yml
+++ b/config/locales/fa.yml
@@ -123,10 +123,6 @@ fa:
       most_recent_ip: آخرین IP ها
       no_limits_imposed: بدون محدودیت
       not_subscribed: عضو نیست
-      order:
-        alphabetic: الفبایی
-        most_recent: تازه‌ترین‌ها
-        title: ترتیب
       outbox_url: نشانی صندوق خروجی
       perform_full_suspension: تعلیق
       profile_url: نشانی نمایه
diff --git a/config/locales/fi.yml b/config/locales/fi.yml
index c90490212..77fca8dec 100644
--- a/config/locales/fi.yml
+++ b/config/locales/fi.yml
@@ -102,10 +102,6 @@ fi:
       most_recent_activity: Viimeisin toiminta
       most_recent_ip: Viimeisin IP
       not_subscribed: Ei tilaaja
-      order:
-        alphabetic: Aakkosjärjestys
-        most_recent: Uusin
-        title: Järjestys
       outbox_url: Lähtevän postilaatikon osoite
       perform_full_suspension: Siirrä kokonaan jäähylle
       profile_url: Profiilin osoite
diff --git a/config/locales/fr.yml b/config/locales/fr.yml
index e3128b569..51b4fb1f8 100644
--- a/config/locales/fr.yml
+++ b/config/locales/fr.yml
@@ -123,10 +123,6 @@ fr:
       most_recent_ip: Adresse IP la plus récente
       no_limits_imposed: Aucune limite imposée
       not_subscribed: Non abonné
-      order:
-        alphabetic: Alphabétique
-        most_recent: Plus récent
-        title: Tri
       outbox_url: URL de sortie
       perform_full_suspension: Suspendre
       profile_url: URL du profil
diff --git a/config/locales/gl.yml b/config/locales/gl.yml
index b9b9a37ad..726b6e400 100644
--- a/config/locales/gl.yml
+++ b/config/locales/gl.yml
@@ -123,10 +123,6 @@ gl:
       most_recent_ip: IP máis recente
       no_limits_imposed: Sen límites impostos
       not_subscribed: Non suscrita
-      order:
-        alphabetic: Alfabética
-        most_recent: Máis recente
-        title: Orde
       outbox_url: URL caixa de saída
       perform_full_suspension: Suspender
       profile_url: URL do perfil
diff --git a/config/locales/he.yml b/config/locales/he.yml
index 79b1ed822..65ca617b2 100644
--- a/config/locales/he.yml
+++ b/config/locales/he.yml
@@ -95,10 +95,6 @@ he:
       most_recent_activity: פעילות עדכנית
       most_recent_ip: כתובות אחרונות
       not_subscribed: לא רשום
-      order:
-        alphabetic: אלפביתי
-        most_recent: עדכני
-        title: סידור
       outbox_url: כתובת תיבת דואר יוצא
       perform_full_suspension: ביצוע השעייה מלאה
       profile_url: כתובת פרופיל
diff --git a/config/locales/hu.yml b/config/locales/hu.yml
index faa52fabc..cf2c5f1e4 100644
--- a/config/locales/hu.yml
+++ b/config/locales/hu.yml
@@ -92,10 +92,6 @@ hu:
       most_recent_activity: Legutóbbi tevékenységek
       most_recent_ip: Legutóbbi IP-cím
       not_subscribed: Nincs feliratkozás
-      order:
-        alphabetic: Alfabetikus
-        most_recent: Legutóbbi
-        title: Rendezés
       outbox_url: Kimenő üzenetek URL
       perform_full_suspension: Teljes felfüggesztés
       profile_url: Profil URL
diff --git a/config/locales/id.yml b/config/locales/id.yml
index 38b08a257..235bc0bcb 100644
--- a/config/locales/id.yml
+++ b/config/locales/id.yml
@@ -50,10 +50,6 @@ id:
       most_recent_activity: Aktivitas terbaru
       most_recent_ip: IP terbaru
       not_subscribed: Tidak berlangganan
-      order:
-        alphabetic: Alfabetik
-        most_recent: Terbaru
-        title: Urutan
       perform_full_suspension: Lakukan suspen penuh
       profile_url: URL profil
       public: Publik
diff --git a/config/locales/io.yml b/config/locales/io.yml
index 0c1e6520b..342fcbc28 100644
--- a/config/locales/io.yml
+++ b/config/locales/io.yml
@@ -44,10 +44,6 @@ io:
       most_recent_activity: Most recent activity
       most_recent_ip: Most recent IP
       not_subscribed: Not subscribed
-      order:
-        alphabetic: Alphabetic
-        most_recent: Most recent
-        title: Order
       perform_full_suspension: Perform full suspension
       profile_url: Profile URL
       public: Public
diff --git a/config/locales/it.yml b/config/locales/it.yml
index 4fffded5f..dc62b1bea 100644
--- a/config/locales/it.yml
+++ b/config/locales/it.yml
@@ -123,10 +123,6 @@ it:
       most_recent_ip: IP più recenti
       no_limits_imposed: Nessun limite imposto
       not_subscribed: Non sottoscritto
-      order:
-        alphabetic: Alfabetico
-        most_recent: Più recente
-        title: Ordine
       outbox_url: URL outbox
       perform_full_suspension: Sospendi
       profile_url: URL profilo
diff --git a/config/locales/ja.yml b/config/locales/ja.yml
index 90ff66acb..415665944 100644
--- a/config/locales/ja.yml
+++ b/config/locales/ja.yml
@@ -123,10 +123,6 @@ ja:
       most_recent_ip: 直近のIP
       no_limits_imposed: 制限なし
       not_subscribed: 購読していない
-      order:
-        alphabetic: アルファベット順
-        most_recent: 直近の活動順
-        title: 順序
       outbox_url: Outbox URL
       perform_full_suspension: 完全に活動停止させる
       profile_url: プロフィールURL
diff --git a/config/locales/ka.yml b/config/locales/ka.yml
index 1b74405d2..b0d1087c3 100644
--- a/config/locales/ka.yml
+++ b/config/locales/ka.yml
@@ -112,10 +112,6 @@ ka:
       most_recent_activity: უახლესი აქტივობა
       most_recent_ip: უახლესი აი-პი
       not_subscribed: გამოუწერელი
-      order:
-        alphabetic: ანბანური
-        most_recent: უახლესი
-        title: წესრიგი
       outbox_url: აუთბოქსის ურლ
       perform_full_suspension: მოახდინეთ სრული შეჩერება
       profile_url: პროფილის ურლ
diff --git a/config/locales/ko.yml b/config/locales/ko.yml
index e1cb350d1..7c948e8ba 100644
--- a/config/locales/ko.yml
+++ b/config/locales/ko.yml
@@ -123,10 +123,6 @@ ko:
       most_recent_ip: 최근 IP
       no_limits_imposed: 제한 없음
       not_subscribed: 구독하지 않음
-      order:
-        alphabetic: 알파벳 순
-        most_recent: 최근 순
-        title: 순서
       outbox_url: 발신함 URL
       perform_full_suspension: 정지시키기
       profile_url: 프로필 URL
diff --git a/config/locales/nl.yml b/config/locales/nl.yml
index ab5a72a66..3c101fd77 100644
--- a/config/locales/nl.yml
+++ b/config/locales/nl.yml
@@ -123,10 +123,6 @@ nl:
       most_recent_ip: Laatst gebruikt IP-adres
       no_limits_imposed: Geen limieten ingesteld
       not_subscribed: Niet geabonneerd
-      order:
-        alphabetic: Alfabetisch
-        most_recent: Meest recent
-        title: Sorteren
       outbox_url: Outbox-URL
       perform_full_suspension: Opschorten
       profile_url: Profiel-URL
diff --git a/config/locales/no.yml b/config/locales/no.yml
index 61466fa20..5e06564ac 100644
--- a/config/locales/no.yml
+++ b/config/locales/no.yml
@@ -92,10 +92,6 @@
       most_recent_activity: Nyligste aktivitet
       most_recent_ip: Nyligste IP
       not_subscribed: Ikke abonnért
-      order:
-        alphabetic: Alfabetisk
-        most_recent: Nyligst
-        title: Rekkefølge
       outbox_url: Utboks URL
       perform_full_suspension: Utfør full utvisning
       profile_url: Profil-URL
diff --git a/config/locales/oc.yml b/config/locales/oc.yml
index 428bbfffe..36d5ddda4 100644
--- a/config/locales/oc.yml
+++ b/config/locales/oc.yml
@@ -123,10 +123,6 @@ oc:
       most_recent_ip: IP mai recenta
       no_limits_imposed: Cap de limit impausat
       not_subscribed: Pas seguidor
-      order:
-        alphabetic: Alfabetic
-        most_recent: Mai recent
-        title: Ordre
       outbox_url: URL Outbox
       perform_full_suspension: Suspendre
       profile_url: URL del perfil
diff --git a/config/locales/pl.yml b/config/locales/pl.yml
index 9c893b605..2f79f5f6b 100644
--- a/config/locales/pl.yml
+++ b/config/locales/pl.yml
@@ -131,10 +131,6 @@ pl:
       most_recent_ip: Ostatnie IP
       no_limits_imposed: Nie nałożono ograniczeń
       not_subscribed: Nie zasubskrybowano
-      order:
-        alphabetic: Alfabetycznie
-        most_recent: Najnowsze
-        title: Kolejność
       outbox_url: Adres skrzynki nadawczej
       perform_full_suspension: Zawieś
       profile_url: Adres profilu
diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml
index 2b9bf747d..1d778e60f 100644
--- a/config/locales/pt-BR.yml
+++ b/config/locales/pt-BR.yml
@@ -123,10 +123,6 @@ pt-BR:
       most_recent_ip: IP mais recente
       no_limits_imposed: Nenhum limite imposto
       not_subscribed: Não está inscrito
-      order:
-        alphabetic: Alfabética
-        most_recent: Mais recente
-        title: Ordem
       outbox_url: URL da caixa de saída
       perform_full_suspension: Suspender
       profile_url: URL do perfil
diff --git a/config/locales/pt.yml b/config/locales/pt.yml
index b68ffbd7f..4c23c9cf4 100644
--- a/config/locales/pt.yml
+++ b/config/locales/pt.yml
@@ -92,10 +92,6 @@ pt:
       most_recent_activity: Actividade mais recente
       most_recent_ip: IP mais recente
       not_subscribed: Não inscrito
-      order:
-        alphabetic: Alfabética
-        most_recent: Mais recente
-        title: Ordem
       outbox_url: URL da caixa de saída
       perform_full_suspension: Fazer suspensão completa
       profile_url: URL do perfil
diff --git a/config/locales/ru.yml b/config/locales/ru.yml
index a3ac754f2..9fa85b7c2 100644
--- a/config/locales/ru.yml
+++ b/config/locales/ru.yml
@@ -128,10 +128,6 @@ ru:
       most_recent_activity: Последняя активность
       most_recent_ip: Последний IP
       not_subscribed: Не подписаны
-      order:
-        alphabetic: По алфавиту
-        most_recent: По дате
-        title: Порядок
       outbox_url: URL исходящих
       perform_full_suspension: Полная блокировка
       profile_url: URL профиля
diff --git a/config/locales/sk.yml b/config/locales/sk.yml
index 2b928169a..cc06b2d6c 100644
--- a/config/locales/sk.yml
+++ b/config/locales/sk.yml
@@ -113,10 +113,6 @@ sk:
       most_recent_activity: Posledná aktivita
       most_recent_ip: Posledná IP
       not_subscribed: Nezaregistrované
-      order:
-        alphabetic: Abecedne
-        most_recent: Podľa času
-        title: Zoradiť
       outbox_url: URL poslaných
       perform_full_suspension: Suspendovať
       profile_url: URL profilu
diff --git a/config/locales/sl.yml b/config/locales/sl.yml
index 0e9d7d3aa..46f83876c 100644
--- a/config/locales/sl.yml
+++ b/config/locales/sl.yml
@@ -102,10 +102,6 @@ sl:
       moderation_notes: Opombe moderiranja
       most_recent_activity: Zadnja aktivnost
       most_recent_ip: Zadnji IP
-      order:
-        alphabetic: Po abecedi
-        most_recent: Najnovejše
-        title: Red
       promote: Spodbujanje
   remote_interaction:
     prompt: 'Želite interakcijo s tem trobom:'
diff --git a/config/locales/sr-Latn.yml b/config/locales/sr-Latn.yml
index 1e32190cc..50802945f 100644
--- a/config/locales/sr-Latn.yml
+++ b/config/locales/sr-Latn.yml
@@ -92,10 +92,6 @@ sr-Latn:
       most_recent_activity: Najskorija aktivnost
       most_recent_ip: Najskorija IP adresa
       not_subscribed: Nije pretplaćen
-      order:
-        alphabetic: Abecedni
-        most_recent: Najskoriji
-        title: Redosled
       outbox_url: Odlazno sanduče
       perform_full_suspension: Izvrši kompletno isključenje
       profile_url: Adresa profila
diff --git a/config/locales/sr.yml b/config/locales/sr.yml
index 1ade87f9e..14354f8a6 100644
--- a/config/locales/sr.yml
+++ b/config/locales/sr.yml
@@ -113,10 +113,6 @@ sr:
       most_recent_activity: Најскорија активност
       most_recent_ip: Најскорија IP адреса
       not_subscribed: Није претплаћен
-      order:
-        alphabetic: Абецедни
-        most_recent: Најскорији
-        title: Редослед
       outbox_url: Одлазно сандуче
       perform_full_suspension: Изврши комплетно искључење
       profile_url: Адреса профила
diff --git a/config/locales/sv.yml b/config/locales/sv.yml
index 465a9b127..55ab9b2ba 100644
--- a/config/locales/sv.yml
+++ b/config/locales/sv.yml
@@ -103,10 +103,6 @@ sv:
       most_recent_activity: Senaste aktivitet
       most_recent_ip: Senaste IP
       not_subscribed: Inte prenumererat
-      order:
-        alphabetic: Alfabetiskt
-        most_recent: Senaste
-        title: Ordning
       outbox_url: Utkorg URL
       perform_full_suspension: Utför full avstängning
       profile_url: Profil URL
diff --git a/config/locales/th.yml b/config/locales/th.yml
index b0b8e9ba0..42d52af26 100644
--- a/config/locales/th.yml
+++ b/config/locales/th.yml
@@ -49,10 +49,6 @@ th:
       most_recent_activity: กิจกรรมล่าสุด
       most_recent_ip: IP ล่าสุด
       not_subscribed: Not subscribed
-      order:
-        alphabetic: ตามตัวอักษร
-        most_recent: ล่าสุด
-        title: จัดเรียง
       perform_full_suspension: Perform full suspension
       profile_url: Profile URL
       public: สาธารณะ
diff --git a/config/locales/tr.yml b/config/locales/tr.yml
index bc0a558e1..14d356eef 100644
--- a/config/locales/tr.yml
+++ b/config/locales/tr.yml
@@ -48,10 +48,6 @@ tr:
       most_recent_activity: Son aktivite
       most_recent_ip: Son IP
       not_subscribed: Abone edilmedi
-      order:
-        alphabetic: Alfabetik
-        most_recent: En son
-        title: Sıralama
       perform_full_suspension: Tamamen uzaklaştır
       profile_url: Profil linki
       public: Herkese açık
diff --git a/config/locales/uk.yml b/config/locales/uk.yml
index e4ea774ec..28dd7f579 100644
--- a/config/locales/uk.yml
+++ b/config/locales/uk.yml
@@ -108,10 +108,6 @@ uk:
       most_recent_activity: Остання активність
       most_recent_ip: Останній IP
       not_subscribed: Не підписані
-      order:
-        alphabetic: За алфавітом
-        most_recent: За датою
-        title: Порядок
       outbox_url: Вихідний URL
       perform_full_suspension: Повне блокування
       profile_url: URL профілю
diff --git a/config/locales/zh-CN.yml b/config/locales/zh-CN.yml
index a32f36e32..744648921 100644
--- a/config/locales/zh-CN.yml
+++ b/config/locales/zh-CN.yml
@@ -114,10 +114,6 @@ zh-CN:
       most_recent_activity: 最后一次活跃的时间
       most_recent_ip: 最后一次活跃的 IP 地址
       not_subscribed: 未订阅
-      order:
-        alphabetic: 按字母
-        most_recent: 按时间
-        title: 排序
       outbox_url: 发件箱(Outbox)URL
       perform_full_suspension: 永久封禁
       profile_url: 个人资料页面 URL
diff --git a/config/locales/zh-HK.yml b/config/locales/zh-HK.yml
index 7296587a3..abbaa77d6 100644
--- a/config/locales/zh-HK.yml
+++ b/config/locales/zh-HK.yml
@@ -103,10 +103,6 @@ zh-HK:
       most_recent_activity: 最新活動
       most_recent_ip: 最新 IP 位域
       not_subscribed: 未訂閱
-      order:
-        alphabetic: 按字母
-        most_recent: 按時間
-        title: 排序
       outbox_url: 寄件箱(Outbox)URL
       perform_full_suspension: 完全停權
       profile_url: 個人檔案 URL
diff --git a/config/locales/zh-TW.yml b/config/locales/zh-TW.yml
index 9a7c2b293..b4c15f6f1 100644
--- a/config/locales/zh-TW.yml
+++ b/config/locales/zh-TW.yml
@@ -108,10 +108,6 @@ zh-TW:
       most_recent_activity: 最近活動
       most_recent_ip: 最近 IP 位址
       not_subscribed: 未訂閱
-      order:
-        alphabetic: 按字母
-        most_recent: 按時間
-        title: 排序
       outbox_url: 寄件箱 (Outbox) URL
       perform_full_suspension: 進行停權
       profile_url: 個人檔案 URL
diff --git a/spec/controllers/admin/accounts_controller_spec.rb b/spec/controllers/admin/accounts_controller_spec.rb
index ae9e058c8..dbcad3c2d 100644
--- a/spec/controllers/admin/accounts_controller_spec.rb
+++ b/spec/controllers/admin/accounts_controller_spec.rb
@@ -24,8 +24,8 @@ RSpec.describe Admin::AccountsController, type: :controller do
         expect(h[:local]).to eq '1'
         expect(h[:remote]).to eq '1'
         expect(h[:by_domain]).to eq 'domain'
+        expect(h[:active]).to eq '1'
         expect(h[:silenced]).to eq '1'
-        expect(h[:alphabetic]).to eq '1'
         expect(h[:suspended]).to eq '1'
         expect(h[:username]).to eq 'username'
         expect(h[:display_name]).to eq 'display name'
@@ -39,8 +39,8 @@ RSpec.describe Admin::AccountsController, type: :controller do
         local: '1',
         remote: '1',
         by_domain: 'domain',
+        active: '1',
         silenced: '1',
-        alphabetic: '1',
         suspended: '1',
         username: 'username',
         display_name: 'display name',
diff --git a/spec/models/account_filter_spec.rb b/spec/models/account_filter_spec.rb
index 0a0252642..176a0eeac 100644
--- a/spec/models/account_filter_spec.rb
+++ b/spec/models/account_filter_spec.rb
@@ -2,10 +2,10 @@ require 'rails_helper'
 
 describe AccountFilter do
   describe 'with empty params' do
-    it 'defaults to recent account list' do
+    it 'defaults to recent local not-suspended account list' do
       filter = described_class.new({})
 
-      expect(filter.results).to eq Account.recent
+      expect(filter.results).to eq Account.local.recent.without_suspended
     end
   end
 
@@ -17,23 +17,6 @@ describe AccountFilter do
     end
   end
 
-  describe 'when an IP address is provided' do
-    it 'filters with IP when valid' do
-      filter = described_class.new(ip: '127.0.0.1')
-      allow(User).to receive(:with_recent_ip_address).and_return(User.none)
-
-      filter.results
-      expect(User).to have_received(:with_recent_ip_address).with('127.0.0.1')
-    end
-
-    it 'skips IP when invalid' do
-      filter = described_class.new(ip: '345.678.901.234')
-      expect(User).not_to receive(:with_recent_ip_address)
-
-      filter.results
-    end
-  end
-
   describe 'with valid params' do
     it 'combines filters on Account' do
       filter = described_class.new(
@@ -60,13 +43,13 @@ describe AccountFilter do
     end
 
     describe 'that call account methods' do
-      %i(local remote silenced alphabetic suspended).each do |option|
+      %i(local remote silenced suspended).each do |option|
         it "delegates the #{option} option" do
           allow(Account).to receive(option).and_return(Account.none)
           filter = described_class.new({ option => true })
           filter.results
 
-          expect(Account).to have_received(option)
+          expect(Account).to have_received(option).at_least(1)
         end
       end
     end
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index 8c6778edc..c82919597 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -89,18 +89,6 @@ RSpec.describe User, type: :model do
         expect(User.matches_email('specified')).to match_array([specified])
       end
     end
-
-    describe 'with_recent_ip_address' do
-      it 'returns a relation of users who is, or was at last time, online with the given IP address' do
-        specifieds = [
-          Fabricate(:user, current_sign_in_ip: '0.0.0.42', last_sign_in_ip: '0.0.0.0'),
-          Fabricate(:user, current_sign_in_ip: nil, last_sign_in_ip: '0.0.0.42')
-        ]
-        Fabricate(:user, current_sign_in_ip: '0.0.0.0', last_sign_in_ip: '0.0.0.0')
-
-        expect(User.with_recent_ip_address('0.0.0.42')).to match_array(specifieds)
-      end
-    end
   end
 
   let(:account) { Fabricate(:account, username: 'alice') }