Merge remote-tracking branch 'parent/main' into upstream-20240326

This commit is contained in:
KMY 2024-03-26 09:08:20 +09:00
commit 6c9b221cb2
263 changed files with 4628 additions and 1518 deletions

View file

@ -30,7 +30,7 @@
= render 'admin/accounts/counters', account: @account
- if @account.local? && @account.user.nil?
= link_to t('admin.accounts.unblock_email'), unblock_email_admin_account_path(@account.id), method: :post, class: 'button' if can?(:unblock_email, @account) && CanonicalEmailBlock.exists?(reference_account_id: @account.id)
= link_to t('admin.accounts.unblock_email'), unblock_email_admin_account_path(@account.id), method: :post, class: 'button' if can?(:unblock_email, @account) && CanonicalEmailBlock.matching_account(@account).exists?
- else
.table-wrapper
%table.table.inline-table

View file

@ -16,19 +16,43 @@
.dashboard
.dashboard__item
= react_admin_component :counter, measure: 'new_users', start_at: @time_period.first, end_at: @time_period.last, label: t('admin.dashboard.new_users'), href: admin_accounts_path(origin: 'local')
= react_admin_component :counter,
end_at: @time_period.last,
href: admin_accounts_path(origin: 'local'),
label: t('admin.dashboard.new_users'),
measure: 'new_users',
start_at: @time_period.first
.dashboard__item
= react_admin_component :counter, measure: 'active_users', start_at: @time_period.first, end_at: @time_period.last, label: t('admin.dashboard.active_users'), href: admin_accounts_path(origin: 'local')
= react_admin_component :counter,
end_at: @time_period.last,
href: admin_accounts_path(origin: 'local'),
label: t('admin.dashboard.active_users'),
measure: 'active_users',
start_at: @time_period.first
.dashboard__item
= react_admin_component :counter, measure: 'interactions', start_at: @time_period.first, end_at: @time_period.last, label: t('admin.dashboard.interactions')
= react_admin_component :counter,
end_at: @time_period.last,
label: t('admin.dashboard.interactions'),
measure: 'interactions',
start_at: @time_period.first
.dashboard__item
= react_admin_component :counter, measure: 'opened_reports', start_at: @time_period.first, end_at: @time_period.last, label: t('admin.dashboard.opened_reports'), href: admin_reports_path
= react_admin_component :counter,
end_at: @time_period.last,
href: admin_reports_path,
label: t('admin.dashboard.opened_reports'),
measure: 'opened_reports',
start_at: @time_period.first
.dashboard__item
= react_admin_component :counter, measure: 'resolved_reports', start_at: @time_period.first, end_at: @time_period.last, label: t('admin.dashboard.resolved_reports'), href: admin_reports_path(resolved: '1')
= react_admin_component :counter,
end_at: @time_period.last,
href: admin_reports_path(resolved: '1'),
label: t('admin.dashboard.resolved_reports'),
measure: 'resolved_reports',
start_at: @time_period.first
.dashboard__item
= link_to admin_reports_path, class: 'dashboard__quick-access' do
@ -47,22 +71,51 @@
%span= t('admin.dashboard.pending_appeals_html', count: @pending_appeals_count)
= fa_icon 'chevron-right fw'
.dashboard__item
= react_admin_component :dimension, dimension: 'sources', start_at: @time_period.first, end_at: @time_period.last, limit: 8, label: t('admin.dashboard.sources')
= react_admin_component :dimension,
dimension: 'sources',
end_at: @time_period.last,
label: t('admin.dashboard.sources'),
limit: 8,
start_at: @time_period.first
.dashboard__item
= react_admin_component :dimension, dimension: 'languages', start_at: @time_period.first, end_at: @time_period.last, limit: 8, label: t('admin.dashboard.top_languages')
= react_admin_component :dimension,
dimension: 'languages',
end_at: @time_period.last,
label: t('admin.dashboard.top_languages'),
limit: 8,
start_at: @time_period.first
.dashboard__item
= react_admin_component :dimension, dimension: 'servers', start_at: @time_period.first, end_at: @time_period.last, limit: 8, label: t('admin.dashboard.top_servers')
= react_admin_component :dimension,
dimension: 'servers',
end_at: @time_period.last,
label: t('admin.dashboard.top_servers'),
limit: 8,
start_at: @time_period.first
.dashboard__item.dashboard__item--span-double-column
= react_admin_component :retention, start_at: @time_period.last - 6.months, end_at: @time_period.last, frequency: 'month'
= react_admin_component :retention,
end_at: @time_period.last,
frequency: 'month',
start_at: @time_period.last - 6.months
.dashboard__item.dashboard__item--span-double-row
= react_admin_component :trends, limit: 7
= react_admin_component :trends,
limit: 7
.dashboard__item
= react_admin_component :dimension, dimension: 'software_versions', start_at: @time_period.first, end_at: @time_period.last, limit: 4, label: t('admin.dashboard.software')
= react_admin_component :dimension,
dimension: 'software_versions',
end_at: @time_period.last,
label: t('admin.dashboard.software'),
limit: 4,
start_at: @time_period.first
.dashboard__item
= react_admin_component :dimension, dimension: 'space_usage', start_at: @time_period.first, end_at: @time_period.last, limit: 3, label: t('admin.dashboard.space')
= react_admin_component :dimension,
dimension: 'space_usage',
end_at: @time_period.last,
label: t('admin.dashboard.space'),
limit: 3,
start_at: @time_period.first

View file

@ -14,7 +14,8 @@
%hr.spacer
= react_admin_component :impact_report, domain: @domain_block.domain
= react_admin_component :impact_report,
domain: @domain_block.domain
.actions
= link_to t('.cancel'), admin_instances_path, class: 'button button-tertiary'

View file

@ -18,21 +18,66 @@
.dashboard
.dashboard__item
= react_admin_component :counter, measure: 'instance_accounts', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_accounts_measure'), href: admin_accounts_path(origin: 'remote', by_domain: @instance.domain)
= react_admin_component :counter,
end_at: @time_period.last,
href: admin_accounts_path(origin: 'remote', by_domain: @instance.domain),
label: t('admin.instances.dashboard.instance_accounts_measure'),
measure: 'instance_accounts',
params: { domain: @instance.domain },
start_at: @time_period.first
.dashboard__item
= react_admin_component :counter, measure: 'instance_statuses', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_statuses_measure')
= react_admin_component :counter,
end_at: @time_period.last,
label: t('admin.instances.dashboard.instance_statuses_measure'),
measure: 'instance_statuses',
params: { domain: @instance.domain },
start_at: @time_period.first
.dashboard__item
= react_admin_component :counter, measure: 'instance_media_attachments', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_media_attachments_measure')
= react_admin_component :counter,
end_at: @time_period.last,
label: t('admin.instances.dashboard.instance_media_attachments_measure'),
measure: 'instance_media_attachments',
params: { domain: @instance.domain },
start_at: @time_period.first
.dashboard__item
= react_admin_component :counter, measure: 'instance_follows', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_follows_measure')
= react_admin_component :counter,
end_at: @time_period.last,
label: t('admin.instances.dashboard.instance_follows_measure'),
measure: 'instance_follows',
params: { domain: @instance.domain },
start_at: @time_period.first
.dashboard__item
= react_admin_component :counter, measure: 'instance_followers', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_followers_measure')
= react_admin_component :counter,
end_at: @time_period.last,
label: t('admin.instances.dashboard.instance_followers_measure'),
measure: 'instance_followers',
params: { domain: @instance.domain },
start_at: @time_period.first
.dashboard__item
= react_admin_component :counter, measure: 'instance_reports', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, label: t('admin.instances.dashboard.instance_reports_measure'), href: admin_reports_path(by_target_domain: @instance.domain)
= react_admin_component :counter,
end_at: @time_period.last,
href: admin_reports_path(by_target_domain: @instance.domain),
label: t('admin.instances.dashboard.instance_reports_measure'),
measure: 'instance_reports',
params: { domain: @instance.domain },
start_at: @time_period.first
.dashboard__item
= react_admin_component :dimension, dimension: 'instance_accounts', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, limit: 8, label: t('admin.instances.dashboard.instance_accounts_dimension')
= react_admin_component :dimension,
dimension: 'instance_accounts',
end_at: @time_period.last,
label: t('admin.instances.dashboard.instance_accounts_dimension'),
limit: 8,
params: { domain: @instance.domain },
start_at: @time_period.first
.dashboard__item
= react_admin_component :dimension, dimension: 'instance_languages', start_at: @time_period.first, end_at: @time_period.last, params: { domain: @instance.domain }, limit: 8, label: t('admin.instances.dashboard.instance_languages_dimension')
= react_admin_component :dimension,
dimension: 'instance_languages',
end_at: @time_period.last,
label: t('admin.instances.dashboard.instance_languages_dimension'),
limit: 8,
params: { domain: @instance.domain },
start_at: @time_period.first
- else
%p
= t('admin.instances.unknown_instance')

View file

@ -1,5 +1,11 @@
.report-header__card
.account-card
- if report.target_account.suspended?
.account-card__warning-badge
- if report.target_account.suspension_origin_local?
= t('admin.reports.already_suspended_badges.local')
- else
= t('admin.reports.already_suspended_badges.remote')
.account-card__header
= image_tag report.target_account.header.url, alt: ''
.account-card__title

View file

@ -20,7 +20,11 @@
%p= t 'admin.reports.category_description_html'
= react_admin_component :report_reason_selector, id: @report.id, category: @report.category, rule_ids: @report.rule_ids&.map(&:to_s), disabled: @report.action_taken?
= react_admin_component :report_reason_selector,
category: @report.category,
disabled: @report.action_taken?,
id: @report.id,
rule_ids: @report.rule_ids&.map(&:to_s)
- if @report.comment.present?
= render 'admin/reports/comment', report: @report

View file

@ -1,20 +1,30 @@
.status
.status__content><
- if status_edit.spoiler_text.blank?
= prerender_custom_emojis(status_content_format(status_edit), status_edit.emojis)
- else
%details<
%summary><
%strong> Content warning: #{prerender_custom_emojis(h(status_edit.spoiler_text), status_edit.emojis)}
= prerender_custom_emojis(status_content_format(status_edit), status_edit.emojis)
- unless status_edit.ordered_media_attachments.empty?
= render partial: 'admin/reports/media_attachments', locals: { status: status_edit }
.detailed-status__meta
%time.formatted{ datetime: status_edit.created_at.iso8601, title: l(status_edit.created_at) }= l(status_edit.created_at)
- if status_edit.sensitive?
%li
.history__entry
%h5
- if status_edit_iteration.first?
= t('admin.statuses.original_status')
- else
= t('admin.statuses.status_changed')
·
= fa_icon('eye-slash fw')
= t('stream_entries.sensitive_content')
%time.formatted{ datetime: status_edit.created_at.iso8601, title: l(status_edit.created_at) }= l(status_edit.created_at)
.status
.status__content><
- if status_edit.spoiler_text.blank?
= prerender_custom_emojis(status_content_format(status_edit), status_edit.emojis)
- else
%details<
%summary><
%strong> Content warning: #{prerender_custom_emojis(h(status_edit.spoiler_text), status_edit.emojis)}
= prerender_custom_emojis(status_content_format(status_edit), status_edit.emojis)
- unless status_edit.ordered_media_attachments.empty?
= render partial: 'admin/reports/media_attachments', locals: { status: status_edit }
.detailed-status__meta
%time.formatted{ datetime: status_edit.created_at.iso8601, title: l(status_edit.created_at) }= l(status_edit.created_at)
- if status_edit.sensitive?
·
= fa_icon('eye-slash fw')
= t('stream_entries.sensitive_content')

View file

@ -60,15 +60,4 @@
%h3= t('admin.statuses.history')
%ol.history
- batched_ordered_status_edits.with_index do |status_edit, i|
%li
.history__entry
%h5
- if i.zero?
= t('admin.statuses.original_status')
- else
= t('admin.statuses.status_changed')
·
%time.formatted{ datetime: status_edit.created_at.iso8601, title: l(status_edit.created_at) }= l(status_edit.created_at)
= render status_edit
= render partial: 'admin/status_edits/status_edit', collection: batched_ordered_status_edits

View file

@ -9,15 +9,45 @@
.dashboard
.dashboard__item
= react_admin_component :counter, measure: 'tag_accounts', start_at: @time_period.first, end_at: @time_period.last, params: { id: @tag.id }, label: t('admin.trends.tags.dashboard.tag_accounts_measure'), href: tag_url(@tag), target: '_blank', rel: 'noopener noreferrer'
= react_admin_component :counter,
end_at: @time_period.last,
href: tag_url(@tag),
label: t('admin.trends.tags.dashboard.tag_accounts_measure'),
measure: 'tag_accounts',
params: { id: @tag.id },
rel: 'noopener noreferrer',
start_at: @time_period.first,
target: '_blank'
.dashboard__item
= react_admin_component :counter, measure: 'tag_uses', start_at: @time_period.first, end_at: @time_period.last, params: { id: @tag.id }, label: t('admin.trends.tags.dashboard.tag_uses_measure')
= react_admin_component :counter,
end_at: @time_period.last,
label: t('admin.trends.tags.dashboard.tag_uses_measure'),
measure: 'tag_uses',
params: { id: @tag.id },
start_at: @time_period.first
.dashboard__item
= react_admin_component :counter, measure: 'tag_servers', start_at: @time_period.first, end_at: @time_period.last, params: { id: @tag.id }, label: t('admin.trends.tags.dashboard.tag_servers_measure')
= react_admin_component :counter,
end_at: @time_period.last,
label: t('admin.trends.tags.dashboard.tag_servers_measure'),
measure: 'tag_servers',
params: { id: @tag.id },
start_at: @time_period.first
.dashboard__item
= react_admin_component :dimension, dimension: 'tag_servers', start_at: @time_period.first, end_at: @time_period.last, params: { id: @tag.id }, limit: 8, label: t('admin.trends.tags.dashboard.tag_servers_dimension')
= react_admin_component :dimension,
dimension: 'tag_servers',
end_at: @time_period.last,
label: t('admin.trends.tags.dashboard.tag_servers_dimension'),
limit: 8,
params: { id: @tag.id },
start_at: @time_period.first
.dashboard__item
= react_admin_component :dimension, dimension: 'tag_languages', start_at: @time_period.first, end_at: @time_period.last, params: { id: @tag.id }, limit: 8, label: t('admin.trends.tags.dashboard.tag_languages_dimension')
= react_admin_component :dimension,
dimension: 'tag_languages',
end_at: @time_period.last,
label: t('admin.trends.tags.dashboard.tag_languages_dimension'),
limit: 8,
params: { id: @tag.id },
start_at: @time_period.first
.dashboard__item
= link_to admin_tag_path(@tag.id), class: ['dashboard__quick-access', @tag.usable? ? 'positive' : 'negative'] do
- if @tag.usable?

View file

@ -44,5 +44,5 @@
= content_for?(:content) ? yield(:content) : yield
.logo-resources{ 'tabindex' => '-1', 'inert' => true, 'aria-hidden' => true }
= render_symbol :icon
= render_symbol :wordmark
= inline_svg_tag 'logo-symbol-icon.svg'
= inline_svg_tag 'logo-symbol-wordmark.svg'

View file

@ -22,4 +22,4 @@
= yield
.logo-resources{ 'tabindex' => '-1', 'inert' => true, 'aria-hidden' => true }
= render_symbol :icon
= inline_svg_tag 'logo-symbol-icon.svg'

View file

@ -99,7 +99,6 @@
= ff.input :'web.reblog_modal', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_boost_modal'), hint: I18n.t('simple_form.hints.defaults.setting_boost_modal')
.fields-group
= ff.input :'web.unfollow_modal', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_unfollow_modal')
= ff.input :'web.delete_modal', wrapper: :with_label, label: I18n.t('simple_form.labels.defaults.setting_delete_modal')
%h4= t 'appearance.sensitive_content'

View file

@ -0,0 +1,34 @@
- content_for :page_title do
= t('settings.severed_relationships')
%p.muted-hint= t('severed_relationships.preamble')
- unless @events.empty?
.table-wrapper
%table.table
%thead
%tr
%th= t('exports.archive_takeout.date')
%th= t('severed_relationships.type')
%th= t('severed_relationships.lost_follows')
%th= t('severed_relationships.lost_followers')
%tbody
- @events.each do |event|
%tr
%td= l event.created_at
%td= t("severed_relationships.event_type.#{event.type}", target_name: event.target_name)
- if event.purged?
%td{ rowspan: 2 }= t('severed_relationships.purged')
- else
%td
- count = event.following_count
- if count.zero?
= t('generic.none')
- else
= table_link_to 'download', t('severed_relationships.download', count: count), following_severed_relationship_path(event, format: :csv)
%td
- count = event.followers_count
- if count.zero?
= t('generic.none')
- else
= table_link_to 'download', t('severed_relationships.download', count: count), followers_severed_relationship_path(event, format: :csv)