Refactor to reuse the one status partial across moderation tools (#35644)
This commit is contained in:
@@ -102,6 +102,16 @@ module ApplicationHelper
|
|||||||
policy(record).public_send(:"#{action}?")
|
policy(record).public_send(:"#{action}?")
|
||||||
end
|
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 = {})
|
def material_symbol(icon, attributes = {})
|
||||||
safe_join(
|
safe_join(
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -2333,6 +2333,7 @@ a .account__avatar {
|
|||||||
.detailed-status__display-name,
|
.detailed-status__display-name,
|
||||||
.detailed-status__datetime,
|
.detailed-status__datetime,
|
||||||
.detailed-status__application,
|
.detailed-status__application,
|
||||||
|
.detailed-status__link,
|
||||||
.account__display-name {
|
.account__display-name {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
@@ -2365,7 +2366,8 @@ a.account__display-name {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.detailed-status__application,
|
.detailed-status__application,
|
||||||
.detailed-status__datetime {
|
.detailed-status__datetime,
|
||||||
|
.detailed-status__link {
|
||||||
color: inherit;
|
color: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2551,8 +2553,9 @@ a.account__display-name {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.status__relative-time,
|
.status__relative-time,
|
||||||
.detailed-status__datetime {
|
.detailed-status__datetime,
|
||||||
&:hover {
|
.detailed-status__link {
|
||||||
|
&:is(a):hover {
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,6 +45,10 @@ class StatusEdit < ApplicationRecord
|
|||||||
delegate :local?, :application, :edited?, :edited_at,
|
delegate :local?, :application, :edited?, :edited_at,
|
||||||
:discarded?, :visibility, :language, to: :status
|
:discarded?, :visibility, :language, to: :status
|
||||||
|
|
||||||
|
def with_media?
|
||||||
|
ordered_media_attachments.any?
|
||||||
|
end
|
||||||
|
|
||||||
def emojis
|
def emojis
|
||||||
return @emojis if defined?(@emojis)
|
return @emojis if defined?(@emojis)
|
||||||
|
|
||||||
|
|||||||
@@ -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)
|
|
||||||
@@ -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')
|
|
||||||
@@ -57,7 +57,7 @@
|
|||||||
- if @statuses.empty?
|
- if @statuses.empty?
|
||||||
= nothing_here 'nothing-here--under-tabs'
|
= nothing_here 'nothing-here--under-tabs'
|
||||||
- else
|
- 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?
|
- if @report.unresolved?
|
||||||
%hr.spacer/
|
%hr.spacer/
|
||||||
|
|||||||
40
app/views/admin/shared/_status.html.haml
Normal file
40
app/views/admin/shared/_status.html.haml
Normal 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?
|
||||||
|
·
|
||||||
|
= 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?
|
||||||
|
·
|
||||||
|
%span.negative-hint= t('admin.statuses.deleted')
|
||||||
|
- unless status.reblog?
|
||||||
|
·
|
||||||
|
%span<
|
||||||
|
= material_symbol(visibility_icon(status))
|
||||||
|
= t("statuses.visibilities.#{status.visibility}")
|
||||||
|
- if status.proper.sensitive?
|
||||||
|
·
|
||||||
|
= material_symbol('visibility_off')
|
||||||
|
= t('stream_entries.sensitive_content')
|
||||||
|
- unless status.direct_visibility?
|
||||||
|
·
|
||||||
|
= link_to ActivityPub::TagManager.instance.url_for(status.proper), class: 'detailed-status__link', target: 'blank', rel: 'noopener' do
|
||||||
|
= t('admin.statuses.view_publicly')
|
||||||
7
app/views/admin/shared/_status_attachments.html.haml
Normal file
7
app/views/admin/shared/_status_attachments.html.haml
Normal 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)
|
||||||
5
app/views/admin/shared/_status_batch_row.html.haml
Normal file
5
app/views/admin/shared/_status_batch_row.html.haml
Normal 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
|
||||||
10
app/views/admin/shared/_status_content.html.haml
Normal file
10
app/views/admin/shared/_status_content.html.haml
Normal 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 }
|
||||||
@@ -9,17 +9,7 @@
|
|||||||
%time.formatted{ datetime: status_edit.created_at.iso8601, title: l(status_edit.created_at) }= l(status_edit.created_at)
|
%time.formatted{ datetime: status_edit.created_at.iso8601, title: l(status_edit.created_at) }= l(status_edit.created_at)
|
||||||
|
|
||||||
.status
|
.status
|
||||||
.status__content><
|
= render partial: 'admin/shared/status_content', locals: { status: status_edit }
|
||||||
- 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
|
.detailed-status__meta
|
||||||
%time.formatted{ datetime: status_edit.created_at.iso8601, title: l(status_edit.created_at) }= l(status_edit.created_at)
|
%time.formatted{ datetime: status_edit.created_at.iso8601, title: l(status_edit.created_at) }= l(status_edit.created_at)
|
||||||
|
|||||||
@@ -47,6 +47,6 @@
|
|||||||
- if @statuses.empty?
|
- if @statuses.empty?
|
||||||
= nothing_here 'nothing-here--under-tabs'
|
= nothing_here 'nothing-here--under-tabs'
|
||||||
- else
|
- 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
|
= paginate @statuses
|
||||||
|
|||||||
@@ -53,52 +53,11 @@
|
|||||||
|
|
||||||
%h3= t('admin.statuses.contents')
|
%h3= t('admin.statuses.contents')
|
||||||
|
|
||||||
.status__card
|
= render partial: 'admin/shared/status', object: @status
|
||||||
- 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')
|
|
||||||
|
|
||||||
%hr.spacer/
|
%hr.spacer/
|
||||||
|
|
||||||
%h3= t('admin.statuses.history')
|
%h3#history= t('admin.statuses.history')
|
||||||
- if @status.edits.empty?
|
- if @status.edits.empty?
|
||||||
%p= t('admin.statuses.no_history')
|
%p= t('admin.statuses.no_history')
|
||||||
- else
|
- else
|
||||||
|
|||||||
@@ -1881,7 +1881,7 @@ en:
|
|||||||
public: Everyone
|
public: Everyone
|
||||||
title: '%{name}: "%{quote}"'
|
title: '%{name}: "%{quote}"'
|
||||||
visibilities:
|
visibilities:
|
||||||
direct: Direct
|
direct: Private mention
|
||||||
private: Followers-only
|
private: Followers-only
|
||||||
private_long: Only show to followers
|
private_long: Only show to followers
|
||||||
public: Public
|
public: Public
|
||||||
|
|||||||
Reference in New Issue
Block a user