Merge tag 'v3.4.0' into hometown-dev

This commit is contained in:
Darius Kazemi
2021-05-17 13:48:27 -07:00
897 changed files with 26918 additions and 14941 deletions

View File

@ -5,7 +5,7 @@
= f.input :report_id, as: :hidden
.fields-group
= f.input :type, collection: Admin::AccountAction.types_for_account(@account), include_blank: false, wrapper: :with_block_label, label_method: ->(type) { I18n.t("simple_form.labels.admin_account_action.types.#{type}")}, hint: t('simple_form.hints.admin_account_action.type_html', acct: @account.acct)
= f.input :type, as: :radio_buttons, collection: Admin::AccountAction.types_for_account(@account), include_blank: false, wrapper: :with_block_label, label_method: ->(type) { safe_join([I18n.t("simple_form.labels.admin_account_action.types.#{type}"), content_tag(:span, I18n.t("simple_form.hints.admin_account_action.types.#{type}"), class: 'hint')])}, hint: t('simple_form.hints.admin_account_action.type_html', acct: @account.acct)
- if @account.local?
%hr.spacer/

View File

@ -51,6 +51,6 @@
%th= t('admin.accounts.most_recent_activity')
%th
%tbody
= render @accounts
= render partial: 'account', collection: @accounts
= paginate @accounts

View File

@ -4,6 +4,6 @@
= image_tag action_log.account.avatar.url(:original), alt: '', width: 40, height: 40, class: 'avatar'
.log-entry__content
.log-entry__title
= t("admin.action_logs.actions.#{action_log.action}_#{action_log.target_type.underscore}", name: content_tag(:span, action_log.account.username, class: 'username'), target: content_tag(:span, log_target(action_log), class: 'target')).html_safe
= t("admin.action_logs.actions.#{action_log.action}_#{action_log.target_type.underscore}_html", name: content_tag(:span, action_log.account.username, class: 'username'), target: content_tag(:span, log_target(action_log), class: 'target'))
.log-entry__timestamp
%time.formatted{ datetime: action_log.created_at.iso8601 }

View File

@ -23,6 +23,6 @@
= t 'admin.action_logs.empty'
- else
.announcements-list
= render @action_logs
= render partial: 'action_log', collection: @action_logs
= paginate @action_logs

View File

@ -1,6 +1,14 @@
- content_for :page_title do
= t('admin.dashboard.title')
- unless @system_checks.empty?
.flash-message-stack
- @system_checks.each do |message|
.flash-message.warning
= t("admin.system_checks.#{message.key}.message_html", value: message.value ? content_tag(:strong, message.value) : nil)
- if message.action
= link_to t("admin.system_checks.#{message.key}.action"), message.action
.dashboard__counters
%div
= link_to admin_accounts_url(local: 1, recent: 1) do
@ -69,8 +77,6 @@
= feature_hint(link_to(t('admin.dashboard.trends'), edit_admin_settings_path), @trends_enabled)
%li
= feature_hint(link_to(t('admin.dashboard.feature_relay'), admin_relays_path), @relay_enabled)
%li
= feature_hint(link_to(t('admin.dashboard.feature_spam_check'), edit_admin_settings_path), @spam_check_enabled)
.dashboard__widgets__versions
%div

View File

@ -14,6 +14,6 @@
%th= t('admin.email_domain_blocks.domain')
%th
%tbody
= render @email_domain_blocks
= render partial: 'email_domain_block', collection: @email_domain_blocks
= paginate @email_domain_blocks

View File

@ -0,0 +1,20 @@
.batch-table__row
%label.batch-table__row__select.batch-table__row__select--aligned.batch-checkbox
= f.check_box :account_ids, { multiple: true, include_hidden: false }, account.id
.batch-table__row__content.batch-table__row__content--unpadded
%table.accounts-table
%tbody
%tr
%td= account_link_to account
%td.accounts-table__count.optional
= number_to_human account.statuses_count, strip_insignificant_zeros: true
%small= t('accounts.posts', count: account.statuses_count).downcase
%td.accounts-table__count.optional
= number_to_human account.followers_count, strip_insignificant_zeros: true
%small= t('accounts.followers', count: account.followers_count).downcase
%td.accounts-table__count
- if account.last_status_at.present?
%time.time-ago{ datetime: account.last_status_at.to_date.iso8601, title: l(account.last_status_at.to_date) }= l account.last_status_at
- else
\-
%small= t('accounts.last_active')

View File

@ -0,0 +1,41 @@
- content_for :page_title do
= t('admin.follow_recommendations.title')
- content_for :header_tags do
= javascript_pack_tag 'admin', async: true, crossorigin: 'anonymous'
%p= t('admin.follow_recommendations.description_html')
%hr.spacer/
= form_tag admin_follow_recommendations_path, method: 'GET', class: 'simple_form' do
.filters
.filter-subset.filter-subset--with-select
%strong= t('admin.follow_recommendations.language')
.input.select.optional
= select_tag :language, options_for_select(I18n.available_locales.map { |key| [human_locale(key), key]}, @language)
.filter-subset
%strong= t('admin.follow_recommendations.status')
%ul
%li= filter_link_to t('admin.accounts.moderation.active'), status: nil
%li= filter_link_to t('admin.follow_recommendations.suppressed'), status: 'suppressed'
= form_for(@form, url: admin_follow_recommendations_path, method: :patch) do |f|
- RelationshipFilter::KEYS.each do |key|
= hidden_field_tag key, params[key] if params[key].present?
.batch-table
.batch-table__toolbar
%label.batch-table__toolbar__select.batch-checkbox-all
= check_box_tag :batch_checkbox_all, nil, false
.batch-table__toolbar__actions
- if params[:status].blank? && can?(:suppress, :follow_recommendation)
= f.button safe_join([fa_icon('times'), t('admin.follow_recommendations.suppress')]), name: :suppress, class: 'table-action-link', type: :submit, data: { confirm: t('admin.reports.are_you_sure') }
- if params[:status] == 'suppressed' && can?(:unsuppress, :follow_recommendation)
= f.button safe_join([fa_icon('plus'), t('admin.follow_recommendations.unsuppress')]), name: :unsuppress, class: 'table-action-link', type: :submit
.batch-table__body
- if @accounts.empty?
= nothing_here 'nothing-here--under-tabs'
- else
= render partial: 'account', collection: @accounts, locals: { f: f }

View File

@ -0,0 +1,2 @@
%li.negative-hint
= l(exhausted_deliveries_days)

View File

@ -22,4 +22,12 @@
= t('admin.accounts.whitelisted')
- else
= t('admin.accounts.no_limits_imposed')
- if instance.failure_days
= ' / '
%span.negative-hint
= t('admin.instances.delivery.warning_message', count: instance.failure_days)
- if instance.unavailable_domain
= ' / '
%span.negative-hint
= t('admin.instances.delivery.unavailable_message')
.trends__item__current{ title: t('admin.instances.known_accounts', count: instance.accounts_count) }= number_to_human instance.accounts_count, strip_insignificant_zeros: true

View File

@ -16,6 +16,24 @@
- unless whitelist_mode?
%li= filter_link_to t('admin.instances.moderation.limited'), limited: '1'
.filter-subset
%strong= t('admin.instances.delivery.title')
%ul
%li= filter_link_to t('admin.instances.delivery.all'), warning: nil, unavailable: nil
%li= filter_link_to t('admin.instances.delivery.warning'), warning: '1', unavailable: nil
%li= filter_link_to t('admin.instances.delivery.unavailable'), warning: nil, unavailable: '1'
.back-link
= link_to admin_instances_path() do
%i.fa.fa-chevron-left.fa-fw
= t('admin.instances.back_to_all')
= link_to admin_instances_path(limited: 1) do
%i.fa.fa-chevron-left.fa-fw
= t('admin.instances.back_to_limited')
= link_to admin_instances_path(warning: 1) do
%i.fa.fa-chevron-left.fa-fw
= t('admin.instances.back_to_warning')
- unless whitelist_mode?
= form_tag admin_instances_url, method: 'GET', class: 'simple_form' do
.fields-group
@ -36,6 +54,6 @@
%div.muted-hint.center-text
= t 'admin.instances.empty'
- else
= render @instances
= render partial: 'instance', collection: @instances
= paginate @instances

View File

@ -1,6 +1,18 @@
- content_for :page_title do
= @instance.domain
.filters
.back-link
= link_to admin_instances_path() do
%i.fa.fa-chevron-left.fa-fw
= t('admin.instances.back_to_all')
= link_to admin_instances_path(limited: 1) do
%i.fa.fa-chevron-left.fa-fw
= t('admin.instances.back_to_limited')
= link_to admin_instances_path(warning: 1) do
%i.fa.fa-chevron-left.fa-fw
= t('admin.instances.back_to_warning')
.dashboard__counters
%div
= link_to admin_accounts_path(remote: '1', by_domain: @instance.domain) do
@ -48,6 +60,13 @@
= simple_format(h(@instance.public_comment))
.speech-bubble__owner= t 'admin.instances.public_comment'
- unless @exhausted_deliveries_days.empty?
%h4= t 'admin.instances.delivery_error_days'
%ul
= render partial: 'exhausted_deliveries_days', collection: @exhausted_deliveries_days
%p.hint
= t 'admin.instances.delivery_error_hint', count: DeliveryFailureTracker::FAILURE_DAYS_THRESHOLD
%hr.spacer/
%div.action-buttons
@ -59,3 +78,9 @@
= link_to t('admin.domain_blocks.undo'), admin_domain_block_path(@instance.domain_block), class: 'button'
- else
= link_to t('admin.domain_blocks.add_new'), new_admin_domain_block_path(_domain: @instance.domain), class: 'button'
- if @instance.delivery_failure_tracker.available?
- unless @exhausted_deliveries_days.empty?
= link_to t('admin.instances.delivery.clear'), clear_delivery_errors_admin_instance_path(@instance), data: { confirm: t('admin.accounts.are_you_sure'), method: :post }, class: 'button'
= link_to t('admin.instances.delivery.stop'), stop_delivery_admin_instance_path(@instance), data: { confirm: t('admin.accounts.are_you_sure'), method: :post }, class: 'button'
- else
= link_to t('admin.instances.delivery.restart'), restart_delivery_admin_instance_path(@instance), data: { confirm: t('admin.accounts.are_you_sure'), method: :post }, class: 'button'

View File

@ -1,6 +1,6 @@
.speech-bubble.positive
.speech-bubble__bubble
= t("admin.action_logs.actions.#{action_log.action}_#{action_log.target_type.underscore}", name: content_tag(:span, action_log.account.username, class: 'username'), target: content_tag(:span, log_target(action_log), class: 'target')).html_safe
= t("admin.action_logs.actions.#{action_log.action}_#{action_log.target_type.underscore}_html", name: content_tag(:span, action_log.account.username, class: 'username'), target: content_tag(:span, log_target(action_log), class: 'target'))
.speech-bubble__owner
= admin_account_link_to(action_log.account)
%time.formatted{ datetime: action_log.created_at.iso8601 }= l action_log.created_at

View File

@ -14,7 +14,7 @@
- unless status.proper.media_attachments.empty?
- if status.proper.media_attachments.first.video?
- video = status.proper.media_attachments.first
= react_component :video, src: video.file.url(:original), preview: video.file.url(:small), blurhash: video.blurhash, sensitive: status.proper.sensitive?, visible: false, width: 610, height: 343, inline: true, alt: video.description
= react_component :video, src: video.file.url(:original), preview: video.file.url(:small), frameRate: video.file.meta.dig('original', 'frame_rate'), blurhash: video.blurhash, sensitive: status.proper.sensitive?, visible: false, width: 610, height: 343, inline: true, alt: video.description, media: [ActiveModelSerializers::SerializableResource.new(video, serializer: REST::MediaAttachmentSerializer)].as_json
- elsif status.proper.media_attachments.first.audio?
- audio = status.proper.media_attachments.first
= react_component :audio, src: audio.file.url(:original), height: 110, alt: audio.description, duration: audio.file.meta.dig(:original, :duration)

View File

@ -0,0 +1,11 @@
.announcements-list__item
= link_to edit_admin_rule_path(rule), class: 'announcements-list__item__title' do
= "#{rule_counter + 1}."
= truncate(rule.text)
.announcements-list__item__action-bar
.announcements-list__item__meta
= rule.text
%div
= table_link_to 'trash', t('admin.rules.delete'), admin_rule_path(rule), method: :delete, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:destroy, rule)

View File

@ -0,0 +1,11 @@
- content_for :page_title do
= t('admin.rules.edit')
= simple_form_for @rule, url: admin_rule_path(@rule) do |f|
= render 'shared/error_messages', object: @rule
.fields-group
= f.input :text, wrapper: :with_block_label
.actions
= f.button :button, t('generic.save_changes'), type: :submit

View File

@ -0,0 +1,25 @@
- content_for :page_title do
= t('admin.rules.title')
%p= t('admin.rules.description_html')
%hr.spacer/
- if can? :create, :rule
= simple_form_for @rule, url: admin_rules_path do |f|
= render 'shared/error_messages', object: @rule
.fields-group
= f.input :text, wrapper: :with_block_label
.actions
= f.button :button, t('admin.rules.add_new'), type: :submit
%hr.spacer/
- if @rules.empty?
%div.muted-hint.center-text
= t 'admin.rules.empty'
- else
.announcements-list
= render partial: 'rule', collection: @rules

View File

@ -50,10 +50,7 @@
%hr.spacer/
.fields-group
= f.input :enable_bootstrap_timeline_accounts, as: :boolean, wrapper: :with_label, label: t('admin.settings.enable_bootstrap_timeline_accounts.title'), hint: t('admin.settings.enable_bootstrap_timeline_accounts.desc_html')
.fields-group
= f.input :bootstrap_timeline_accounts, wrapper: :with_block_label, label: t('admin.settings.bootstrap_timeline_accounts.title'), hint: t('admin.settings.bootstrap_timeline_accounts.desc_html'), disabled: !Setting.enable_bootstrap_timeline_accounts
= f.input :bootstrap_timeline_accounts, wrapper: :with_block_label, label: t('admin.settings.bootstrap_timeline_accounts.title'), hint: t('admin.settings.bootstrap_timeline_accounts.desc_html')
%hr.spacer/
@ -72,10 +69,10 @@
- unless whitelist_mode?
.fields-group
= f.input :activity_api_enabled, as: :boolean, wrapper: :with_label, label: t('admin.settings.activity_api_enabled.title'), hint: t('admin.settings.activity_api_enabled.desc_html')
= f.input :activity_api_enabled, as: :boolean, wrapper: :with_label, label: t('admin.settings.activity_api_enabled.title'), hint: t('admin.settings.activity_api_enabled.desc_html'), recommended: true
.fields-group
= f.input :peers_api_enabled, as: :boolean, wrapper: :with_label, label: t('admin.settings.peers_api_enabled.title'), hint: t('admin.settings.peers_api_enabled.desc_html')
= f.input :peers_api_enabled, as: :boolean, wrapper: :with_label, label: t('admin.settings.peers_api_enabled.title'), hint: t('admin.settings.peers_api_enabled.desc_html'), recommended: true
.fields-group
= f.input :preview_sensitive_media, as: :boolean, wrapper: :with_label, label: t('admin.settings.preview_sensitive_media.title'), hint: t('admin.settings.preview_sensitive_media.desc_html')
@ -92,9 +89,6 @@
.fields-group
= f.input :noindex, as: :boolean, wrapper: :with_label, label: t('admin.settings.default_noindex.title'), hint: t('admin.settings.default_noindex.desc_html')
.fields-group
= f.input :spam_check_enabled, as: :boolean, wrapper: :with_label, label: t('admin.settings.spam_check_enabled.title'), hint: t('admin.settings.spam_check_enabled.desc_html')
%hr.spacer/
.fields-group

View File

@ -10,8 +10,6 @@
= tag.name
%small
= t('admin.tags.in_directory', count: tag.accounts_count)
•
= t('admin.tags.unique_uses_today', count: tag.history.first[:accounts])
- if tag.trending?

View File

@ -5,12 +5,6 @@
= javascript_pack_tag 'admin', async: true, crossorigin: 'anonymous'
.filters
.filter-subset
%strong= t('admin.tags.context')
%ul
%li= filter_link_to t('generic.all'), directory: nil
%li= filter_link_to t('admin.tags.directory'), directory: '1'
.filter-subset
%strong= t('admin.tags.review')
%ul
@ -23,8 +17,9 @@
%strong= t('generic.order_by')
%ul
%li= filter_link_to t('admin.tags.most_recent'), popular: nil, active: nil
%li= filter_link_to t('admin.tags.most_popular'), popular: '1', active: nil
%li= filter_link_to t('admin.tags.last_active'), active: '1', popular: nil
%li= filter_link_to t('admin.tags.most_popular'), popular: '1', active: nil
= form_tag admin_tags_url, method: 'GET', class: 'simple_form' do
.fields-group

View File

@ -10,15 +10,6 @@
%div
.dashboard__counters__num= number_with_delimiter @accounts_week
.dashboard__counters__label= t 'admin.tags.accounts_week'
%div
- if @tag.accounts_count > 0
= link_to explore_hashtag_path(@tag) do
.dashboard__counters__num= number_with_delimiter @tag.accounts_count
.dashboard__counters__label= t 'admin.tags.directory'
- else
%div
.dashboard__counters__num= number_with_delimiter @tag.accounts_count
.dashboard__counters__label= t 'admin.tags.directory'
%hr.spacer/
@ -30,8 +21,8 @@
.fields-group
= f.input :usable, as: :boolean, wrapper: :with_label
= f.input :trendable, as: :boolean, wrapper: :with_label, disabled: !Setting.trends
= f.input :listable, as: :boolean, wrapper: :with_label, disabled: !Setting.profile_directory
= f.input :trendable, as: :boolean, wrapper: :with_label
= f.input :listable, as: :boolean, wrapper: :with_label
.actions
= f.button :button, t('generic.save_changes'), type: :submit