mirror of https://github.com/mastodon/mastodon
Implement UI for Admin Search of Hashtags (#30880)
parent
6d2ed0dcba
commit
c40e481169
@ -0,0 +1,15 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
module Admin::TagsHelper
|
||||
def admin_tags_moderation_options
|
||||
[
|
||||
[t('admin.tags.moderation.reviewed'), 'reviewed'],
|
||||
[t('admin.tags.moderation.review_requested'), 'review_requested'],
|
||||
[t('admin.tags.moderation.unreviewed'), 'unreviewed'],
|
||||
[t('admin.tags.moderation.trendable'), 'trendable'],
|
||||
[t('admin.tags.moderation.not_trendable'), 'not_trendable'],
|
||||
[t('admin.tags.moderation.usable'), 'usable'],
|
||||
[t('admin.tags.moderation.not_usable'), 'not_usable'],
|
||||
]
|
||||
end
|
||||
end
|
@ -0,0 +1,74 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
class Admin::TagFilter
|
||||
KEYS = %i(
|
||||
status
|
||||
name
|
||||
order
|
||||
).freeze
|
||||
|
||||
attr_reader :params
|
||||
|
||||
def initialize(params)
|
||||
@params = params.to_h.symbolize_keys
|
||||
end
|
||||
|
||||
def results
|
||||
scope = Tag.reorder(nil)
|
||||
|
||||
params.each do |key, value|
|
||||
next if key == :page
|
||||
|
||||
scope.merge!(scope_for(key, value)) if value.present?
|
||||
end
|
||||
|
||||
scope
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def scope_for(key, value)
|
||||
case key
|
||||
when :status
|
||||
status_scope(value)
|
||||
when :name
|
||||
Tag.search_for(value.to_s.strip, params[:limit], params[:offset], exclude_unlistable: false)
|
||||
when :order
|
||||
order_scope(value)
|
||||
else
|
||||
raise Mastodon::InvalidParameterError, "Unknown filter: #{key}"
|
||||
end
|
||||
end
|
||||
|
||||
def status_scope(value)
|
||||
case value.to_s
|
||||
when 'reviewed'
|
||||
Tag.reviewed
|
||||
when 'review_requested'
|
||||
Tag.pending_review
|
||||
when 'unreviewed'
|
||||
Tag.unreviewed
|
||||
when 'trendable'
|
||||
Tag.trendable
|
||||
when 'not_trendable'
|
||||
Tag.not_trendable
|
||||
when 'usable'
|
||||
Tag.usable
|
||||
when 'not_usable'
|
||||
Tag.not_usable
|
||||
else
|
||||
raise Mastodon::InvalidParameterError, "Unknown status: #{value}"
|
||||
end
|
||||
end
|
||||
|
||||
def order_scope(value)
|
||||
case value.to_s
|
||||
when 'newest'
|
||||
Tag.order(created_at: :desc)
|
||||
when 'oldest'
|
||||
Tag.order(created_at: :asc)
|
||||
else
|
||||
raise Mastodon::InvalidParameterError, "Unknown order: #{value}"
|
||||
end
|
||||
end
|
||||
end
|
@ -0,0 +1,27 @@
|
||||
.batch-table__row{ class: [!tag.requires_review? && !tag.usable? && 'batch-table__row--muted'] }
|
||||
.batch-table__row__content.batch-table__row__content--padded.pending-account
|
||||
.pending-account__header
|
||||
%strong
|
||||
= link_to tag.formatted_name, admin_tag_path(tag.id)
|
||||
|
||||
%br/
|
||||
|
||||
- if tag.usable?
|
||||
= t('admin.tags.moderation.usable')
|
||||
- else
|
||||
= t('admin.tags.moderation.not_usable')
|
||||
|
||||
·
|
||||
- if tag.trendable?
|
||||
= t('admin.tags.moderation.trendable')
|
||||
- else
|
||||
= t('admin.tags.moderation.not_trendable')
|
||||
|
||||
- if tag.requested_review? || tag.requires_review?
|
||||
·
|
||||
- if tag.requested_review?
|
||||
%span.negative-hint
|
||||
= t('admin.tags.moderation.review_requested')
|
||||
- else
|
||||
%span.warning-hint
|
||||
= t('admin.tags.moderation.pending_review')
|
@ -0,0 +1,39 @@
|
||||
- content_for :page_title do
|
||||
= t('admin.tags.title')
|
||||
|
||||
= form_with url: admin_tags_url, method: :get, class: :simple_form do |form|
|
||||
.filters
|
||||
.filter-subset.filter-subset--with-select
|
||||
%strong= t('admin.tags.moderation.title')
|
||||
.input.select.optional
|
||||
= form.select :status,
|
||||
options_for_select(admin_tags_moderation_options, params[:status]),
|
||||
prompt: t('generic.all')
|
||||
|
||||
.filter-subset.filter-subset--with-select
|
||||
%strong= t 'generic.order_by'
|
||||
.input.select
|
||||
= form.select :order,
|
||||
options_for_select([[t('admin.tags.newest'), 'newest'], [t('admin.tags.oldest'), 'oldest']], params[:order])
|
||||
|
||||
.fields-group
|
||||
.input.string.optional
|
||||
= form.text_field :name,
|
||||
value: params[:name],
|
||||
class: 'string optional',
|
||||
placeholder: t('admin.tags.name')
|
||||
|
||||
.actions
|
||||
%button.button= t('admin.tags.search')
|
||||
= link_to t('admin.tags.reset'), admin_tags_path, class: 'button negative'
|
||||
|
||||
%hr.spacer/
|
||||
|
||||
.batch-table
|
||||
.batch-table__body
|
||||
- if @tags.empty?
|
||||
= nothing_here 'nothing-here--under-tabs'
|
||||
- else
|
||||
= render partial: 'tag', collection: @tags
|
||||
|
||||
= paginate @tags
|
@ -0,0 +1,36 @@
|
||||
# frozen_string_literal: true
|
||||
|
||||
require 'rails_helper'
|
||||
|
||||
describe Admin::TagFilter do
|
||||
describe 'with invalid params' do
|
||||
it 'raises with key error' do
|
||||
filter = described_class.new(wrong: true)
|
||||
|
||||
expect { filter.results }.to raise_error(/wrong/)
|
||||
end
|
||||
|
||||
it 'raises with status scope error' do
|
||||
filter = described_class.new(status: 'unknown')
|
||||
|
||||
expect { filter.results }.to raise_error(/Unknown status: unknown/)
|
||||
end
|
||||
|
||||
it 'raises with order value error' do
|
||||
filter = described_class.new(order: 'unknown')
|
||||
|
||||
expect { filter.results }.to raise_error(/Unknown order: unknown/)
|
||||
end
|
||||
end
|
||||
|
||||
describe '#results' do
|
||||
let(:listable_tag) { Fabricate(:tag, name: 'test1', listable: true) }
|
||||
let(:not_listable_tag) { Fabricate(:tag, name: 'test2', listable: false) }
|
||||
|
||||
it 'returns tags filtered by name' do
|
||||
filter = described_class.new(name: 'test')
|
||||
|
||||
expect(filter.results).to eq([listable_tag, not_listable_tag])
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in New Issue