Add breakdown of usage by source to admin UI for hashtags (#11517)
Allows determining where the majority of posts in a hashtag come from on a given day at a glance.gh/stable
parent
bced70469a
commit
3a6b6c63f2
|
@ -4,6 +4,8 @@ module Admin
|
||||||
class TagsController < BaseController
|
class TagsController < BaseController
|
||||||
before_action :set_tags, only: :index
|
before_action :set_tags, only: :index
|
||||||
before_action :set_tag, except: :index
|
before_action :set_tag, except: :index
|
||||||
|
before_action :set_usage_by_domain, except: :index
|
||||||
|
before_action :set_counters, except: :index
|
||||||
|
|
||||||
def index
|
def index
|
||||||
authorize :tag, :index?
|
authorize :tag, :index?
|
||||||
|
@ -33,6 +35,21 @@ module Admin
|
||||||
@tag = Tag.find(params[:id])
|
@tag = Tag.find(params[:id])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def set_usage_by_domain
|
||||||
|
@usage_by_domain = @tag.statuses
|
||||||
|
.where(visibility: :public)
|
||||||
|
.where(Status.arel_table[:id].gteq(Mastodon::Snowflake.id_at(Time.now.utc.beginning_of_day)))
|
||||||
|
.joins(:account)
|
||||||
|
.group('accounts.domain')
|
||||||
|
.reorder('statuses_count desc')
|
||||||
|
.pluck('accounts.domain, count(*) AS statuses_count')
|
||||||
|
end
|
||||||
|
|
||||||
|
def set_counters
|
||||||
|
@accounts_today = @tag.history.first[:accounts]
|
||||||
|
@accounts_week = Redis.current.pfcount(*current_week_days.map { |day| "activity:tags:#{@tag.id}:#{day}:accounts" })
|
||||||
|
end
|
||||||
|
|
||||||
def filtered_tags
|
def filtered_tags
|
||||||
scope = Tag
|
scope = Tag
|
||||||
scope = scope.discoverable if filter_params[:context] == 'directory'
|
scope = scope.discoverable if filter_params[:context] == 'directory'
|
||||||
|
@ -49,5 +66,13 @@ module Admin
|
||||||
def tag_params
|
def tag_params
|
||||||
params.require(:tag).permit(:name, :trendable, :usable, :listable)
|
params.require(:tag).permit(:name, :trendable, :usable, :listable)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def current_week_days
|
||||||
|
now = Time.now.utc.beginning_of_day.to_date
|
||||||
|
|
||||||
|
(Date.commercial(now.cwyear, now.cweek)..now).map do |date|
|
||||||
|
date.to_time.utc.beginning_of_day.to_i
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,6 +1,22 @@
|
||||||
- content_for :page_title do
|
- content_for :page_title do
|
||||||
= "##{@tag.name}"
|
= "##{@tag.name}"
|
||||||
|
|
||||||
|
.dashboard__counters
|
||||||
|
%div
|
||||||
|
= link_to web_url("timelines/tag/#{@tag.name}") do
|
||||||
|
.dashboard__counters__num= number_with_delimiter @accounts_today
|
||||||
|
.dashboard__counters__label= t 'admin.tags.accounts_today'
|
||||||
|
%div
|
||||||
|
%div
|
||||||
|
.dashboard__counters__num= number_with_delimiter @accounts_week
|
||||||
|
.dashboard__counters__label= t 'admin.tags.accounts_week'
|
||||||
|
%div
|
||||||
|
= link_to explore_hashtag_path(@tag) do
|
||||||
|
.dashboard__counters__num= number_with_delimiter @tag.accounts_count
|
||||||
|
.dashboard__counters__label= t 'admin.tags.directory'
|
||||||
|
|
||||||
|
%hr.spacer/
|
||||||
|
|
||||||
= simple_form_for @tag, url: admin_tag_path(@tag.id) do |f|
|
= simple_form_for @tag, url: admin_tag_path(@tag.id) do |f|
|
||||||
= render 'shared/error_messages', object: @tag
|
= render 'shared/error_messages', object: @tag
|
||||||
|
|
||||||
|
@ -14,3 +30,16 @@
|
||||||
|
|
||||||
.actions
|
.actions
|
||||||
= f.button :button, t('generic.save_changes'), type: :submit
|
= f.button :button, t('generic.save_changes'), type: :submit
|
||||||
|
|
||||||
|
%hr.spacer/
|
||||||
|
|
||||||
|
%h3= t 'admin.tags.breakdown'
|
||||||
|
|
||||||
|
.table-wrapper
|
||||||
|
%table.table
|
||||||
|
%tbody
|
||||||
|
- @usage_by_domain.each do |(domain, count)|
|
||||||
|
%tr
|
||||||
|
%th= domain || site_hostname
|
||||||
|
%td= "#{number_with_delimiter((count.to_f / @tag.history[0][:uses].to_f) * 100)}%"
|
||||||
|
%td= number_with_delimiter count
|
||||||
|
|
|
@ -498,6 +498,9 @@ en:
|
||||||
title: Account statuses
|
title: Account statuses
|
||||||
with_media: With media
|
with_media: With media
|
||||||
tags:
|
tags:
|
||||||
|
accounts_today: Unique uses today
|
||||||
|
accounts_week: Unique uses this week
|
||||||
|
breakdown: Breakdown of today's usage by source
|
||||||
context: Context
|
context: Context
|
||||||
directory: In directory
|
directory: In directory
|
||||||
in_directory: "%{count} in directory"
|
in_directory: "%{count} in directory"
|
||||||
|
|
Reference in New Issue