diff --git a/app/javascript/dashboard/routes/dashboard/conversation/Macros/MacroPreview.vue b/app/javascript/dashboard/routes/dashboard/conversation/Macros/MacroPreview.vue index c9f4258dd..9bca3a139 100644 --- a/app/javascript/dashboard/routes/dashboard/conversation/Macros/MacroPreview.vue +++ b/app/javascript/dashboard/routes/dashboard/conversation/Macros/MacroPreview.vue @@ -54,6 +54,7 @@ export default { mute_conversation: null, snooze_conversation: null, resolve_conversation: null, + remove_assigned_team: null, send_webhook_event: params[0], send_message: params[0], send_email_transcript: params[0], diff --git a/app/javascript/dashboard/routes/dashboard/settings/macros/MacroEditor.vue b/app/javascript/dashboard/routes/dashboard/settings/macros/MacroEditor.vue index 5004aec5b..3849a3541 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/macros/MacroEditor.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/macros/MacroEditor.vue @@ -41,8 +41,8 @@ export default { ...mapGetters({ uiFlags: 'macros/getUIFlags', labels: 'labels/getLabels', - teams: 'teams/getTeams', agents: 'agents/getAgents', + teams: 'teams/getTeams', }), macroId() { return this.$route.params.macroId; diff --git a/app/javascript/dashboard/routes/dashboard/settings/macros/MacroForm.vue b/app/javascript/dashboard/routes/dashboard/settings/macros/MacroForm.vue index fb7d992a2..404980cf8 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/macros/MacroForm.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/macros/MacroForm.vue @@ -84,7 +84,8 @@ export default { return !( prop.action_name === 'mute_conversation' || prop.action_name === 'snooze_conversation' || - prop.action_name === 'resolve_conversation' + prop.action_name === 'resolve_conversation' || + prop.action_name === 'remove_assigned_team' ); }), }, diff --git a/app/javascript/dashboard/routes/dashboard/settings/macros/constants.js b/app/javascript/dashboard/routes/dashboard/settings/macros/constants.js index 713e47a92..9e92d3bfe 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/macros/constants.js +++ b/app/javascript/dashboard/routes/dashboard/settings/macros/constants.js @@ -19,6 +19,11 @@ export const MACRO_ACTION_TYPES = [ label: 'Remove a label', inputType: 'multi_select', }, + { + key: 'remove_assigned_team', + label: 'Remove Assigned Team', + inputType: null, + }, { key: 'send_email_transcript', label: 'Send an email transcript', diff --git a/app/models/macro.rb b/app/models/macro.rb index d9275ca8f..386184419 100644 --- a/app/models/macro.rb +++ b/app/models/macro.rb @@ -30,7 +30,7 @@ class Macro < ApplicationRecord validate :json_actions_format - ACTIONS_ATTRS = %w[send_message add_label assign_team assign_agent mute_conversation change_status remove_label + ACTIONS_ATTRS = %w[send_message add_label assign_team assign_agent mute_conversation change_status remove_label remove_assigned_team resolve_conversation snooze_conversation send_email_transcript send_attachment add_private_note].freeze def set_visibility(user, params) diff --git a/app/services/action_service.rb b/app/services/action_service.rb index 5cde001bb..927d0ed1b 100644 --- a/app/services/action_service.rb +++ b/app/services/action_service.rb @@ -41,11 +41,16 @@ class ActionService end def assign_team(team_ids = []) + return unassign_team if team_ids[0].zero? return unless team_belongs_to_account?(team_ids) @conversation.update!(team_id: team_ids[0]) end + def remove_assigned_team(_params) + @conversation.update!(team_id: nil) + end + def send_email_transcript(emails) emails.each do |email| ConversationReplyMailer.with(account: @conversation.account).conversation_transcript(@conversation, email)&.deliver_later diff --git a/spec/controllers/api/v1/accounts/macros_controller_spec.rb b/spec/controllers/api/v1/accounts/macros_controller_spec.rb index 6ab8424bd..77229afaa 100644 --- a/spec/controllers/api/v1/accounts/macros_controller_spec.rb +++ b/spec/controllers/api/v1/accounts/macros_controller_spec.rb @@ -78,6 +78,9 @@ RSpec.describe 'Api::V1::Accounts::MacrosController', type: :request do 'action_name': :add_label, 'action_params': %w[support priority_customer] }, + { + 'action_name': :remove_assigned_team + }, { 'action_name': :send_message, 'action_params': ['Welcome to the chatwoot platform.'] @@ -379,6 +382,34 @@ RSpec.describe 'Api::V1::Accounts::MacrosController', type: :request do expect(conversation.messages.last.sender).to eq(administrator) expect(conversation.messages.last.private).to be_truthy end + + it 'Assign the team if team_ids are present' do + expect(conversation.team).to be_nil + + perform_enqueued_jobs do + post "/api/v1/accounts/#{account.id}/macros/#{macro.id}/execute", + params: { conversation_ids: [conversation.display_id] }, + headers: administrator.create_new_auth_token + end + + expect(conversation.reload.team_id).to eq(team.id) + end + + it 'Unassign the team' do + macro.update!(actions: [ + { 'action_name' => 'remove_assigned_team' } + ]) + conversation.update!(team_id: team.id) + expect(conversation.reload.team).not_to be_nil + + perform_enqueued_jobs do + post "/api/v1/accounts/#{account.id}/macros/#{macro.id}/execute", + params: { conversation_ids: [conversation.display_id] }, + headers: administrator.create_new_auth_token + end + + expect(conversation.reload.team_id).to be_nil + end end end end