mirror of
https://github.com/lingble/chatwoot.git
synced 2025-11-03 04:27:53 +00:00
feat: Activity message for label addition & deletion (#1291)
Fixes: #1022
This commit is contained in:
@@ -156,6 +156,7 @@ class Conversation < ApplicationRecord
|
|||||||
|
|
||||||
create_status_change_message(user_name) if saved_change_to_status?
|
create_status_change_message(user_name) if saved_change_to_status?
|
||||||
create_assignee_change(user_name) if saved_change_to_assignee_id?
|
create_assignee_change(user_name) if saved_change_to_assignee_id?
|
||||||
|
create_label_change(user_name) if saved_change_to_label_list?
|
||||||
end
|
end
|
||||||
|
|
||||||
def activity_message_params(content)
|
def activity_message_params(content)
|
||||||
@@ -216,6 +217,32 @@ class Conversation < ApplicationRecord
|
|||||||
messages.create(activity_message_params(content))
|
messages.create(activity_message_params(content))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def create_label_change(user_name)
|
||||||
|
previous_labels, current_labels = previous_changes[:label_list]
|
||||||
|
return unless (previous_labels.is_a? Array) && (current_labels.is_a? Array)
|
||||||
|
|
||||||
|
create_label_added(user_name, current_labels - previous_labels)
|
||||||
|
create_label_removed(user_name, previous_labels - current_labels)
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_label_added(user_name, labels = [])
|
||||||
|
return unless labels.size.positive?
|
||||||
|
|
||||||
|
params = { user_name: user_name, labels: labels.join(', ') }
|
||||||
|
content = I18n.t('conversations.activity.labels.added', **params)
|
||||||
|
|
||||||
|
messages.create(activity_message_params(content))
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_label_removed(user_name, labels = [])
|
||||||
|
return unless labels.size.positive?
|
||||||
|
|
||||||
|
params = { user_name: user_name, labels: labels.join(', ') }
|
||||||
|
content = I18n.t('conversations.activity.labels.removed', **params)
|
||||||
|
|
||||||
|
messages.create(activity_message_params(content))
|
||||||
|
end
|
||||||
|
|
||||||
def mute_key
|
def mute_key
|
||||||
format('CONVERSATION::%<id>d::MUTED', id: id)
|
format('CONVERSATION::%<id>d::MUTED', id: id)
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -51,6 +51,9 @@ en:
|
|||||||
self_assigned: "%{user_name} self-assigned this conversation"
|
self_assigned: "%{user_name} self-assigned this conversation"
|
||||||
assigned: "Assigned to %{assignee_name} by %{user_name}"
|
assigned: "Assigned to %{assignee_name} by %{user_name}"
|
||||||
removed: "Conversation unassigned by %{user_name}"
|
removed: "Conversation unassigned by %{user_name}"
|
||||||
|
labels:
|
||||||
|
added: "%{user_name} added %{labels}"
|
||||||
|
removed: "%{user_name} removed %{labels}"
|
||||||
templates:
|
templates:
|
||||||
greeting_message_body: "%{account_name} typically replies in a few hours."
|
greeting_message_body: "%{account_name} typically replies in a few hours."
|
||||||
ways_to_reach_you_message_body: "Give the team a way to reach you."
|
ways_to_reach_you_message_body: "Give the team a way to reach you."
|
||||||
|
|||||||
@@ -58,6 +58,7 @@ RSpec.describe Conversation, type: :model do
|
|||||||
create(:user, email: 'agent2@example.com', account: account, role: :agent)
|
create(:user, email: 'agent2@example.com', account: account, role: :agent)
|
||||||
end
|
end
|
||||||
let(:assignment_mailer) { double(deliver: true) }
|
let(:assignment_mailer) { double(deliver: true) }
|
||||||
|
let(:label) { create(:label, account: account) }
|
||||||
|
|
||||||
before do
|
before do
|
||||||
conversation
|
conversation
|
||||||
@@ -70,7 +71,8 @@ RSpec.describe Conversation, type: :model do
|
|||||||
status: :resolved,
|
status: :resolved,
|
||||||
locked: true,
|
locked: true,
|
||||||
contact_last_seen_at: Time.now,
|
contact_last_seen_at: Time.now,
|
||||||
assignee: new_assignee
|
assignee: new_assignee,
|
||||||
|
label_list: [label.title]
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -90,6 +92,7 @@ RSpec.describe Conversation, type: :model do
|
|||||||
# create_activity
|
# create_activity
|
||||||
expect(conversation.messages.pluck(:content)).to include("Conversation was marked resolved by #{old_assignee.available_name}")
|
expect(conversation.messages.pluck(:content)).to include("Conversation was marked resolved by #{old_assignee.available_name}")
|
||||||
expect(conversation.messages.pluck(:content)).to include("Assigned to #{new_assignee.available_name} by #{old_assignee.available_name}")
|
expect(conversation.messages.pluck(:content)).to include("Assigned to #{new_assignee.available_name} by #{old_assignee.available_name}")
|
||||||
|
expect(conversation.messages.pluck(:content)).to include("#{old_assignee.available_name} added #{label.title}")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -195,6 +198,48 @@ RSpec.describe Conversation, type: :model do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#update_labels' do
|
||||||
|
let(:account) { create(:account) }
|
||||||
|
let(:conversation) { create(:conversation, account: account) }
|
||||||
|
let(:agent) do
|
||||||
|
create(:user, email: 'agent@example.com', account: account, role: :agent)
|
||||||
|
end
|
||||||
|
let(:first_label) { create(:label, account: account) }
|
||||||
|
let(:second_label) { create(:label, account: account) }
|
||||||
|
let(:third_label) { create(:label, account: account) }
|
||||||
|
let(:fourth_label) { create(:label, account: account) }
|
||||||
|
|
||||||
|
before do
|
||||||
|
conversation
|
||||||
|
Current.user = agent
|
||||||
|
|
||||||
|
first_label
|
||||||
|
second_label
|
||||||
|
third_label
|
||||||
|
fourth_label
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'adds one label to conversation' do
|
||||||
|
labels = [first_label].map(&:title)
|
||||||
|
expect(conversation.update_labels(labels)).to eq(true)
|
||||||
|
expect(conversation.label_list).to match_array(labels)
|
||||||
|
expect(conversation.messages.pluck(:content)).to include("#{agent.available_name} added #{labels.join(', ')}")
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'adds and removes previously added labels' do
|
||||||
|
labels = [first_label, fourth_label].map(&:title)
|
||||||
|
expect(conversation.update_labels(labels)).to eq(true)
|
||||||
|
expect(conversation.label_list).to match_array(labels)
|
||||||
|
expect(conversation.messages.pluck(:content)).to include("#{agent.available_name} added #{labels.join(', ')}")
|
||||||
|
|
||||||
|
updated_labels = [second_label, third_label].map(&:title)
|
||||||
|
expect(conversation.update_labels(updated_labels)).to eq(true)
|
||||||
|
expect(conversation.label_list).to match_array(updated_labels)
|
||||||
|
expect(conversation.messages.pluck(:content)).to include("#{agent.available_name} added #{updated_labels.join(', ')}")
|
||||||
|
expect(conversation.messages.pluck(:content)).to include("#{agent.available_name} removed #{labels.join(', ')}")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe '#toggle_status' do
|
describe '#toggle_status' do
|
||||||
subject(:toggle_status) { conversation.toggle_status }
|
subject(:toggle_status) { conversation.toggle_status }
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user