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 54d10ad917..0555a8b08d 100644 --- a/app/controllers/admin/reports/actions_controller.rb +++ b/app/controllers/admin/reports/actions_controller.rb @@ -18,8 +18,8 @@ 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?, - send_in_app_notification: !@report.spam?, text: params[:text] ) @@ -30,8 +30,8 @@ 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?, - send_in_app_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 396f0c992a..cb64219a67 100644 --- a/app/controllers/api/v1/admin/account_actions_controller.rb +++ b/app/controllers/api/v1/admin/account_actions_controller.rb @@ -32,7 +32,7 @@ class Api::V1::Admin::AccountActionsController < Api::BaseController :warning_preset_id, :text, :send_email_notification, - :send_in_app_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 8242551b44..c7a08fe455 100644 --- a/app/models/admin/account_action.rb +++ b/app/models/admin/account_action.rb @@ -20,18 +20,18 @@ class Admin::AccountAction :report_id, :warning_preset_id - attr_reader :warning, :send_email_notification, :send_in_app_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 send_in_app_notification? send_in_app_notification alias include_statuses? include_statuses validates :type, :target_account, :current_account, presence: true validates :type, inclusion: { in: TYPES } def initialize(attributes = {}) + @send_notification = true @send_email_notification = true - @send_in_app_notification = true @include_statuses = true super @@ -41,8 +41,8 @@ class Admin::AccountAction @send_email_notification = ActiveModel::Type::Boolean.new.cast(value) end - def send_in_app_notification=(value) - @send_in_app_notification = ActiveModel::Type::Boolean.new.cast(value) + def send_notification=(value) + @send_notification = ActiveModel::Type::Boolean.new.cast(value) end def include_statuses=(value) @@ -173,10 +173,14 @@ class Admin::AccountAction end def process_notification! - return unless target_account.local? + return unless warnable? UserMailer.warning(target_account.user, warning).deliver_later! if send_email_notification? - LocalNotificationWorker.perform_async(target_account.id, warning.id, 'AccountWarning', 'moderation_warning') if send_in_app_notification? + LocalNotificationWorker.perform_async(target_account.id, warning.id, 'AccountWarning', 'moderation_warning') + end + + def warnable? + 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 f8018b4464..a56bb100f4 100644 --- a/app/models/admin/status_batch_action.rb +++ b/app/models/admin/status_batch_action.rb @@ -9,14 +9,14 @@ class Admin::StatusBatchAction :status_ids, :report_id, :text - attr_reader :send_email_notification, :send_in_app_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_in_app_notification=(value) - @send_in_app_notification = ActiveModel::Type::Boolean.new.cast(value) + def send_notification=(value) + @send_notification = ActiveModel::Type::Boolean.new.cast(value) end def save! @@ -133,10 +133,14 @@ class Admin::StatusBatchAction end def process_notification! - return unless target_account.local? + return unless warnable? UserMailer.warning(target_account.user, @warning).deliver_later! if send_email_notification - LocalNotificationWorker.perform_async(target_account.id, @warning.id, 'AccountWarning', 'moderation_warning') if send_in_app_notification + LocalNotificationWorker.perform_async(target_account.id, @warning.id, 'AccountWarning', 'moderation_warning') + end + + def warnable? + 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 f98286d8d5..f372a564ea 100644 --- a/app/views/admin/account_actions/new.html.haml +++ b/app/views/admin/account_actions/new.html.haml @@ -26,11 +26,12 @@ %hr.spacer/ .fields-group - = f.input :send_email_notification, + = f.input :send_notification, as: :boolean, wrapper: :with_label - = f.input :send_in_app_notification, + .fields-group + = f.input :send_email_notification, as: :boolean, wrapper: :with_label diff --git a/config/locales/simple_form.en.yml b/config/locales/simple_form.en.yml index d45205c062..52ef43c5e0 100644 --- a/config/locales/simple_form.en.yml +++ b/config/locales/simple_form.en.yml @@ -21,7 +21,7 @@ en: 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 email with an explanation of what happened with their account - send_in_app_notification: The user will receive an in-app notification 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: @@ -174,8 +174,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_in_app_notification: Notify the user in the application + send_email_notification: Also notify the user per e-mail + send_notification: Notify the user in the application text: Custom warning type: Action types: