diff --git a/app/controllers/admin/account_actions_controller.rb b/app/controllers/admin/account_actions_controller.rb index 91849811e3..843c8c4440 100644 --- a/app/controllers/admin/account_actions_controller.rb +++ b/app/controllers/admin/account_actions_controller.rb @@ -7,7 +7,7 @@ module Admin def new authorize @account, :show? - @account_action = Admin::AccountAction.new(type: params[:type], report_id: params[:report_id], send_email_notification: true, include_statuses: true) + @account_action = Admin::AccountAction.new(type: params[:type], report_id: params[:report_id], send_email_notification: true, send_notification: true, include_statuses: true) @warning_presets = AccountWarningPreset.all end @@ -35,7 +35,7 @@ module Admin def resource_params params - .expect(admin_account_action: [:type, :report_id, :warning_preset_id, :text, :send_email_notification, :include_statuses]) + .expect(admin_account_action: [:type, :report_id, :warning_preset_id, :text, :send_email_notification, :send_notification, :include_statuses]) end end end diff --git a/app/controllers/admin/reports/actions_controller.rb b/app/controllers/admin/reports/actions_controller.rb index 554f7906f8..0555a8b08d 100644 --- a/app/controllers/admin/reports/actions_controller.rb +++ b/app/controllers/admin/reports/actions_controller.rb @@ -18,6 +18,7 @@ class Admin::Reports::ActionsController < Admin::BaseController status_ids: @report.status_ids, current_account: current_account, report_id: @report.id, + send_notification: !@report.spam?, send_email_notification: !@report.spam?, text: params[:text] ) @@ -29,6 +30,7 @@ class Admin::Reports::ActionsController < Admin::BaseController report_id: @report.id, target_account: @report.target_account, current_account: current_account, + send_notification: !@report.spam?, send_email_notification: !@report.spam?, text: params[:text] ) diff --git a/app/controllers/api/v1/admin/account_actions_controller.rb b/app/controllers/api/v1/admin/account_actions_controller.rb index 7249797a40..cb64219a67 100644 --- a/app/controllers/api/v1/admin/account_actions_controller.rb +++ b/app/controllers/api/v1/admin/account_actions_controller.rb @@ -31,7 +31,8 @@ class Api::V1::Admin::AccountActionsController < Api::BaseController :report_id, :warning_preset_id, :text, - :send_email_notification + :send_email_notification, + :send_notification ) end end diff --git a/app/javascript/entrypoints/admin.tsx b/app/javascript/entrypoints/admin.tsx index 225cb16330..ef4ac3fb35 100644 --- a/app/javascript/entrypoints/admin.tsx +++ b/app/javascript/entrypoints/admin.tsx @@ -285,6 +285,51 @@ async function mountReactComponent(element: Element) { ); } +// In the account warning interface, email notifications imply in-app notifications, so update accordingly +Rails.delegate( + document, + '#admin_account_action_send_email_notification', + 'change', + () => { + const sendNotificationElement = document.querySelector( + 'input#admin_account_action_send_notification', + ); + + const sendEmailNotificationElement = + document.querySelector( + 'input#admin_account_action_send_email_notification', + ); + + if (sendNotificationElement && sendEmailNotificationElement?.checked) { + sendNotificationElement.checked = true; + } + }, +); + +Rails.delegate( + document, + '#admin_account_action_send_notification', + 'change', + () => { + const sendNotificationElement = document.querySelector( + 'input#admin_account_action_send_notification', + ); + + const sendEmailNotificationElement = + document.querySelector( + 'input#admin_account_action_send_email_notification', + ); + + if ( + sendNotificationElement && + sendEmailNotificationElement && + !sendNotificationElement.checked + ) { + sendEmailNotificationElement.checked = false; + } + }, +); + ready(() => { const domainBlockSeveritySelect = document.querySelector( 'select#domain_block_severity', diff --git a/app/models/admin/account_action.rb b/app/models/admin/account_action.rb index 7c66b6e646..c7a08fe455 100644 --- a/app/models/admin/account_action.rb +++ b/app/models/admin/account_action.rb @@ -20,8 +20,9 @@ class Admin::AccountAction :report_id, :warning_preset_id - attr_reader :warning, :send_email_notification, :include_statuses + attr_reader :warning, :send_notification, :send_email_notification, :include_statuses + alias send_notification? send_notification alias send_email_notification? send_email_notification alias include_statuses? include_statuses @@ -29,8 +30,9 @@ class Admin::AccountAction validates :type, inclusion: { in: TYPES } def initialize(attributes = {}) + @send_notification = true @send_email_notification = true - @include_statuses = true + @include_statuses = true super end @@ -39,6 +41,10 @@ class Admin::AccountAction @send_email_notification = ActiveModel::Type::Boolean.new.cast(value) end + def send_notification=(value) + @send_notification = ActiveModel::Type::Boolean.new.cast(value) + end + def include_statuses=(value) @include_statuses = ActiveModel::Type::Boolean.new.cast(value) end @@ -169,12 +175,12 @@ class Admin::AccountAction def process_notification! return unless warnable? - UserMailer.warning(target_account.user, warning).deliver_later! + UserMailer.warning(target_account.user, warning).deliver_later! if send_email_notification? LocalNotificationWorker.perform_async(target_account.id, warning.id, 'AccountWarning', 'moderation_warning') end def warnable? - send_email_notification? && target_account.local? + send_notification && target_account.local? end def status_ids diff --git a/app/models/admin/status_batch_action.rb b/app/models/admin/status_batch_action.rb index 4a10001935..a56bb100f4 100644 --- a/app/models/admin/status_batch_action.rb +++ b/app/models/admin/status_batch_action.rb @@ -9,12 +9,16 @@ class Admin::StatusBatchAction :status_ids, :report_id, :text - attr_reader :send_email_notification + attr_reader :send_notification, :send_email_notification def send_email_notification=(value) @send_email_notification = ActiveModel::Type::Boolean.new.cast(value) end + def send_notification=(value) + @send_notification = ActiveModel::Type::Boolean.new.cast(value) + end + def save! process_action! end @@ -131,12 +135,12 @@ class Admin::StatusBatchAction def process_notification! return unless warnable? - UserMailer.warning(target_account.user, @warning).deliver_later! + UserMailer.warning(target_account.user, @warning).deliver_later! if send_email_notification LocalNotificationWorker.perform_async(target_account.id, @warning.id, 'AccountWarning', 'moderation_warning') end def warnable? - send_email_notification && target_account.local? + send_notification && target_account.local? end def target_account diff --git a/app/views/admin/account_actions/new.html.haml b/app/views/admin/account_actions/new.html.haml index c4311eba96..f372a564ea 100644 --- a/app/views/admin/account_actions/new.html.haml +++ b/app/views/admin/account_actions/new.html.haml @@ -25,6 +25,11 @@ - if @account.local? %hr.spacer/ + .fields-group + = f.input :send_notification, + as: :boolean, + wrapper: :with_label + .fields-group = f.input :send_email_notification, as: :boolean, diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index 5e162a0d64..2db144146f 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -20,7 +20,8 @@ en: title: Optional. Not visible to the recipient admin_account_action: include_statuses: The user will see which posts have caused the moderation action or warning - send_email_notification: The user will receive an explanation of what happened with their account + send_email_notification: The user will receive an email with an explanation of what happened with their account + send_notification: The user will receive an in-app notification with an explanation of what happened with their account text_html: Optional. You can use post syntax. You can add warning presets to save time type_html: Choose what to do with %{acct} types: @@ -179,7 +180,8 @@ en: title: Title admin_account_action: include_statuses: Include reported posts in the e-mail - send_email_notification: Notify the user per e-mail + send_email_notification: Also notify the user per e-mail + send_notification: Notify the user in the application text: Custom warning type: Action types: