Refactor to reuse the one status partial across moderation tools (#35644)
Some checks failed
Check i18n / check-i18n (push) Waiting to run
Chromatic / Run Chromatic (push) Waiting to run
CodeQL / Analyze (javascript) (push) Waiting to run
CodeQL / Analyze (ruby) (push) Waiting to run
Crowdin / Upload translations / upload-translations (push) Waiting to run
Check formatting / lint (push) Waiting to run
CSS Linting / lint (push) Waiting to run
JavaScript Linting / lint (push) Waiting to run
JavaScript Testing / test (push) Waiting to run
Ruby Testing / build (production) (push) Waiting to run
Ruby Testing / build (test) (push) Waiting to run
Ruby Testing / test (.ruby-version) (push) Blocked by required conditions
Ruby Testing / test (3.2) (push) Blocked by required conditions
Ruby Testing / test (3.3) (push) Blocked by required conditions
Ruby Testing / ImageMagick tests (.ruby-version) (push) Blocked by required conditions
Ruby Testing / ImageMagick tests (3.2) (push) Blocked by required conditions
Ruby Testing / ImageMagick tests (3.3) (push) Blocked by required conditions
Ruby Testing / End to End testing (.ruby-version) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.2) (push) Blocked by required conditions
Ruby Testing / End to End testing (3.3) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, docker.elastic.co/elasticsearch/elasticsearch:8.10.2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (.ruby-version, opensearchproject/opensearch:2) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.2, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Ruby Testing / Elastic Search integration testing (3.3, docker.elastic.co/elasticsearch/elasticsearch:7.17.13) (push) Blocked by required conditions
Bundler Audit / security (push) Has been cancelled
Haml Linting / lint (push) Has been cancelled
Ruby Linting / lint (push) Has been cancelled
Historical data migration test / test (14-alpine) (push) Has been cancelled
Historical data migration test / test (15-alpine) (push) Has been cancelled
Historical data migration test / test (16-alpine) (push) Has been cancelled
Historical data migration test / test (17-alpine) (push) Has been cancelled

This commit is contained in:
Emelia Smith 2025-08-21 16:51:11 +02:00 committed by GitHub
parent f85f0eee1b
commit 4f494781c1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 88 additions and 119 deletions

View File

@ -102,6 +102,16 @@ module ApplicationHelper
policy(record).public_send(:"#{action}?")
end
def conditional_link_to(condition, name, options = {}, html_options = {}, &block)
if condition && !current_page?(block_given? ? name : options)
link_to(name, options, html_options, &block)
elsif block_given?
content_tag(:span, options, html_options, &block)
else
content_tag(:span, name, html_options)
end
end
def material_symbol(icon, attributes = {})
safe_join(
[

View File

@ -2384,6 +2384,7 @@ a .account__avatar {
.detailed-status__display-name,
.detailed-status__datetime,
.detailed-status__application,
.detailed-status__link,
.account__display-name {
text-decoration: none;
}
@ -2416,7 +2417,8 @@ a.account__display-name {
}
.detailed-status__application,
.detailed-status__datetime {
.detailed-status__datetime,
.detailed-status__link {
color: inherit;
}
@ -2602,8 +2604,9 @@ a.account__display-name {
}
.status__relative-time,
.detailed-status__datetime {
&:hover {
.detailed-status__datetime,
.detailed-status__link {
&:is(a):hover {
text-decoration: underline;
}
}

View File

@ -45,6 +45,10 @@ class StatusEdit < ApplicationRecord
delegate :local?, :application, :edited?, :edited_at,
:discarded?, :visibility, :language, to: :status
def with_media?
ordered_media_attachments.any?
end
def emojis
return @emojis if defined?(@emojis)

View File

@ -1,6 +0,0 @@
- if status.ordered_media_attachments.first.video?
= render_video_component(status, visible: false)
- elsif status.ordered_media_attachments.first.audio?
= render_audio_component(status)
- else
= render_media_gallery_component(status, visible: false)

View File

@ -1,53 +0,0 @@
.batch-table__row
%label.batch-table__row__select.batch-checkbox
= f.check_box :status_ids, { multiple: true, include_hidden: false }, status.id
.batch-table__row__content
.status__card
- if status.reblog?
.status__prepend
= material_symbol('repeat')
= t('statuses.boosted_from_html', acct_link: admin_account_inline_link_to(status.proper.account, path: admin_account_status_path(status.proper.account.id, status.proper.id)))
- elsif status.reply? && status.in_reply_to_id.present?
.status__prepend
= material_symbol('reply')
= t('admin.statuses.replied_to_html', acct_link: admin_account_inline_link_to(status.in_reply_to_account, path: status.thread.present? ? admin_account_status_path(status.thread.account_id, status.in_reply_to_id) : nil))
.status__content><
- if status.proper.spoiler_text.blank?
= prerender_custom_emojis(status_content_format(status.proper), status.proper.emojis)
- else
%details<
%summary><
%strong> Content warning: #{prerender_custom_emojis(h(status.proper.spoiler_text), status.proper.emojis)}
= prerender_custom_emojis(status_content_format(status.proper), status.proper.emojis)
- unless status.proper.ordered_media_attachments.empty?
= render partial: 'admin/reports/media_attachments', locals: { status: status.proper }
.detailed-status__meta
- if status.application
= status.application.name
·
= link_to admin_account_status_path(status.account.id, status), class: 'detailed-status__datetime' do
%time.formatted{ datetime: status.created_at.iso8601, title: l(status.created_at) }= l(status.created_at)
- if status.edited?
·
= link_to t('statuses.edited_at_html', date: content_tag(:time, l(status.edited_at), datetime: status.edited_at.iso8601, title: l(status.edited_at), class: 'formatted')),
admin_account_status_path(status.account_id, status),
class: 'detailed-status__datetime'
- if status.discarded?
·
%span.negative-hint= t('admin.statuses.deleted')
·
= material_symbol visibility_icon(status)
= t("statuses.visibilities.#{status.visibility}")
·
= link_to ActivityPub::TagManager.instance.url_for(status.proper), class: 'detailed-status__link', rel: 'noopener' do
= t('admin.statuses.view_publicly')
- if status.proper.sensitive?
·
= material_symbol('visibility_off')
= t('stream_entries.sensitive_content')

View File

@ -57,7 +57,7 @@
- if @statuses.empty?
= nothing_here 'nothing-here--under-tabs'
- else
= render partial: 'admin/reports/status', collection: @statuses, locals: { f: f }
= render partial: 'admin/shared/status_batch_row', collection: @statuses, as: :status, locals: { f: f }
- if @report.unresolved?
%hr.spacer/

View File

@ -0,0 +1,40 @@
-# locals: (status:)
.status__card><
- if status.reblog?
.status__prepend
= material_symbol('repeat')
= t('statuses.boosted_from_html', acct_link: admin_account_inline_link_to(status.proper.account, path: admin_account_status_path(status.proper.account.id, status.proper.id)))
- elsif status.reply? && status.in_reply_to_id.present?
.status__prepend
= material_symbol('reply')
= t('admin.statuses.replied_to_html', acct_link: admin_account_inline_link_to(status.in_reply_to_account, path: status.thread.present? ? admin_account_status_path(status.thread.account_id, status.in_reply_to_id) : nil))
= render partial: 'admin/shared/status_content', locals: { status: status.proper }
.detailed-status__meta
- if status.application
= status.application.name
·
= conditional_link_to can?(:show, status), admin_account_status_path(status.account.id, status), class: 'detailed-status__datetime' do
%time.formatted{ datetime: status.created_at.iso8601, title: l(status.created_at) }><= l(status.created_at)
- if status.edited?
&nbsp;·
= conditional_link_to can?(:show, status), admin_account_status_path(status.account.id, status, { anchor: 'history' }), class: 'detailed-status__datetime' do
%span><= t('statuses.edited_at_html', date: content_tag(:time, l(status.edited_at), datetime: status.edited_at.iso8601, title: l(status.edited_at), class: 'relative-formatted'))
- if status.discarded?
&nbsp;·
%span.negative-hint= t('admin.statuses.deleted')
- unless status.reblog?
&nbsp;·
%span<
= material_symbol(visibility_icon(status))
= t("statuses.visibilities.#{status.visibility}")
- if status.proper.sensitive?
&nbsp;·
= material_symbol('visibility_off')
= t('stream_entries.sensitive_content')
- unless status.direct_visibility?
&nbsp;·
= link_to ActivityPub::TagManager.instance.url_for(status.proper), class: 'detailed-status__link', target: 'blank', rel: 'noopener' do
= t('admin.statuses.view_publicly')

View File

@ -0,0 +1,7 @@
- if status.with_media?
- if status.ordered_media_attachments.first.video?
= render_video_component(status, visible: false)
- elsif status.ordered_media_attachments.first.audio?
= render_audio_component(status)
- else
= render_media_gallery_component(status, visible: false)

View File

@ -0,0 +1,5 @@
.batch-table__row
%label.batch-table__row__select.batch-checkbox
= f.check_box :status_ids, { multiple: true, include_hidden: false }, status.id
.batch-table__row__content
= render partial: 'admin/shared/status', object: status

View File

@ -0,0 +1,10 @@
.status__content><
- if status.spoiler_text.present?
%details<
%summary><
%strong> Content warning: #{prerender_custom_emojis(h(status.spoiler_text), status.emojis)}
= prerender_custom_emojis(status_content_format(status), status.emojis)
= render partial: 'admin/shared/status_attachments', locals: { status: status.proper }
- else
= prerender_custom_emojis(status_content_format(status), status.emojis)
= render partial: 'admin/shared/status_attachments', locals: { status: status.proper }

View File

@ -9,17 +9,7 @@
%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 }
= render partial: 'admin/shared/status_content', 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)

View File

@ -47,6 +47,6 @@
- if @statuses.empty?
= nothing_here 'nothing-here--under-tabs'
- else
= render partial: 'admin/reports/status', collection: @statuses, locals: { f: f }
= render partial: 'admin/shared/status_batch_row', collection: @statuses, as: :status, locals: { f: f }
= paginate @statuses

View File

@ -53,52 +53,11 @@
%h3= t('admin.statuses.contents')
.status__card
- if @status.reblog?
.status__prepend
= material_symbol('repeat')
= t('statuses.boosted_from_html', acct_link: admin_account_inline_link_to(@status.proper.account, path: admin_account_status_path(@status.proper.account.id, @status.proper.id)))
- elsif @status.reply? && @status.in_reply_to_id.present?
.status__prepend
= material_symbol('reply')
= t('admin.statuses.replied_to_html', acct_link: admin_account_inline_link_to(@status.in_reply_to_account, path: @status.thread.present? ? admin_account_status_path(@status.thread.account_id, @status.in_reply_to_id) : nil))
.status__content><
- if @status.proper.spoiler_text.blank?
= prerender_custom_emojis(status_content_format(@status.proper), @status.proper.emojis)
- else
%details<
%summary><
%strong> Content warning: #{prerender_custom_emojis(h(@status.proper.spoiler_text), @status.proper.emojis)}
= prerender_custom_emojis(status_content_format(@status.proper), @status.proper.emojis)
- unless @status.proper.ordered_media_attachments.empty?
= render partial: 'admin/reports/media_attachments', locals: { status: @status.proper }
.detailed-status__meta
- if @status.application
= @status.application.name
·
%span.detailed-status__datetime
%time.formatted{ datetime: @status.created_at.iso8601, title: l(@status.created_at) }= l(@status.created_at)
- if @status.edited?
·
%span.detailed-status__datetime
= t('statuses.edited_at_html', date: content_tag(:time, l(@status.edited_at), datetime: @status.edited_at.iso8601, title: l(@status.edited_at), class: 'formatted'))
- if @status.discarded?
·
%span.negative-hint= t('admin.statuses.deleted')
- unless @status.reblog?
·
= material_symbol(visibility_icon(@status))
= t("statuses.visibilities.#{@status.visibility}")
- if @status.proper.sensitive?
·
= material_symbol('visibility_off')
= t('stream_entries.sensitive_content')
= render partial: 'admin/shared/status', object: @status
%hr.spacer/
%h3= t('admin.statuses.history')
%h3#history= t('admin.statuses.history')
- if @status.edits.empty?
%p= t('admin.statuses.no_history')
- else

View File

@ -1915,7 +1915,7 @@ en:
public: Everyone
title: '%{name}: "%{quote}"'
visibilities:
direct: Direct
direct: Private mention
private: Followers-only
private_long: Only show to followers
public: Public