mirror of
https://github.com/lingble/chatwoot.git
synced 2025-10-30 18:47:51 +00:00
feat: sort conversation on priority (#6943)
* feat: update seed script to include prioritt * feat: add sort_handler for conversations * test: sort on priority order --------- Co-authored-by: Muhsin Keloth <muhsinkeramam@gmail.com>
This commit is contained in:
@@ -21,5 +21,13 @@ module SortHandler
|
|||||||
'grouped_conversations.message_type', 'grouped_conversations.created_at ASC'
|
'grouped_conversations.message_type', 'grouped_conversations.created_at ASC'
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def self.sort_on_priority
|
||||||
|
order(
|
||||||
|
Arel::Nodes::SqlLiteral.new(
|
||||||
|
sanitize_sql_for_order('CASE WHEN priority IS NULL THEN 0 ELSE priority END DESC, last_activity_at DESC')
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -90,6 +90,7 @@ class Seeders::AccountSeeder
|
|||||||
inbox: contact_inbox.inbox, assignee: assignee)
|
inbox: contact_inbox.inbox, assignee: assignee)
|
||||||
create_messages(conversation: conversation, messages: conversation_data['messages'])
|
create_messages(conversation: conversation, messages: conversation_data['messages'])
|
||||||
conversation.update_labels(conversation_data[:labels]) if conversation_data[:labels].present?
|
conversation.update_labels(conversation_data[:labels]) if conversation_data[:labels].present?
|
||||||
|
conversation.update!(priority: conversation_data[:priority]) if conversation_data[:priority].present?
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_messages(conversation:, messages:)
|
def create_messages(conversation:, messages:)
|
||||||
|
|||||||
@@ -308,6 +308,7 @@ contacts:
|
|||||||
conversations:
|
conversations:
|
||||||
- channel: Channel::Email
|
- channel: Channel::Email
|
||||||
source_id: "mpetrukd@wunderground.test"
|
source_id: "mpetrukd@wunderground.test"
|
||||||
|
priority: urgent
|
||||||
messages:
|
messages:
|
||||||
- message_type: incoming
|
- message_type: incoming
|
||||||
content: hello world
|
content: hello world
|
||||||
@@ -316,6 +317,7 @@ contacts:
|
|||||||
gender: 'male'
|
gender: 'male'
|
||||||
conversations:
|
conversations:
|
||||||
- channel: Channel::FacebookPage
|
- channel: Channel::FacebookPage
|
||||||
|
priority: high
|
||||||
messages:
|
messages:
|
||||||
- message_type: incoming
|
- message_type: incoming
|
||||||
content: "Hey there,I need some help with billing, my card is not working on the website."
|
content: "Hey there,I need some help with billing, my card is not working on the website."
|
||||||
@@ -324,6 +326,7 @@ contacts:
|
|||||||
gender: 'female'
|
gender: 'female'
|
||||||
conversations:
|
conversations:
|
||||||
- channel: Channel::WebWidget
|
- channel: Channel::WebWidget
|
||||||
|
priority: high
|
||||||
assignee: michael_scott@paperlayer.test
|
assignee: michael_scott@paperlayer.test
|
||||||
messages:
|
messages:
|
||||||
- message_type: incoming
|
- message_type: incoming
|
||||||
@@ -333,6 +336,7 @@ contacts:
|
|||||||
gender: 'female'
|
gender: 'female'
|
||||||
conversations:
|
conversations:
|
||||||
- channel: Channel::Whatsapp
|
- channel: Channel::Whatsapp
|
||||||
|
priority: high
|
||||||
source_id: "1223423567"
|
source_id: "1223423567"
|
||||||
labels:
|
labels:
|
||||||
- billing
|
- billing
|
||||||
@@ -347,6 +351,7 @@ contacts:
|
|||||||
gender: 'male'
|
gender: 'male'
|
||||||
conversations:
|
conversations:
|
||||||
- channel: Channel::WebWidget
|
- channel: Channel::WebWidget
|
||||||
|
priority: medium
|
||||||
labels:
|
labels:
|
||||||
- software
|
- software
|
||||||
- ops-handover
|
- ops-handover
|
||||||
@@ -358,6 +363,7 @@ contacts:
|
|||||||
gender: 'female'
|
gender: 'female'
|
||||||
conversations:
|
conversations:
|
||||||
- channel: Channel::WebWidget
|
- channel: Channel::WebWidget
|
||||||
|
priority: low
|
||||||
assignee: michael_scott@paperlayer.test
|
assignee: michael_scott@paperlayer.test
|
||||||
labels:
|
labels:
|
||||||
- billing
|
- billing
|
||||||
@@ -371,6 +377,7 @@ contacts:
|
|||||||
gender: 'female'
|
gender: 'female'
|
||||||
conversations:
|
conversations:
|
||||||
- channel: Channel::Email
|
- channel: Channel::Email
|
||||||
|
priority: urgent
|
||||||
source_id: "cmathersonj@va.test"
|
source_id: "cmathersonj@va.test"
|
||||||
assignee: michael_scott@paperlayer.test
|
assignee: michael_scott@paperlayer.test
|
||||||
labels:
|
labels:
|
||||||
|
|||||||
@@ -691,15 +691,17 @@ RSpec.describe Conversation, type: :model do
|
|||||||
describe 'Custom Sort' do
|
describe 'Custom Sort' do
|
||||||
include ActiveJob::TestHelper
|
include ActiveJob::TestHelper
|
||||||
|
|
||||||
let!(:conversation_4) { create(:conversation, created_at: DateTime.now - 10.days, last_activity_at: DateTime.now - 10.days) }
|
let!(:conversation_7) { create(:conversation, created_at: DateTime.now - 10.days, last_activity_at: DateTime.now - 13.days) }
|
||||||
let!(:conversation_3) { create(:conversation, created_at: DateTime.now - 9.days, last_activity_at: DateTime.now - 9.days) }
|
let!(:conversation_6) { create(:conversation, created_at: DateTime.now - 10.days, last_activity_at: DateTime.now - 10.days) }
|
||||||
let!(:conversation_1) { create(:conversation, created_at: DateTime.now - 8.days, last_activity_at: DateTime.now - 8.days) }
|
let!(:conversation_5) { create(:conversation, created_at: DateTime.now - 10.days, last_activity_at: DateTime.now - 12.days, priority: :urgent) }
|
||||||
let!(:conversation_2) { create(:conversation, created_at: DateTime.now - 6.days, last_activity_at: DateTime.now - 6.days) }
|
let!(:conversation_4) { create(:conversation, created_at: DateTime.now - 10.days, last_activity_at: DateTime.now - 10.days, priority: :urgent) }
|
||||||
|
let!(:conversation_3) { create(:conversation, created_at: DateTime.now - 9.days, last_activity_at: DateTime.now - 9.days, priority: :low) }
|
||||||
|
let!(:conversation_2) { create(:conversation, created_at: DateTime.now - 6.days, last_activity_at: DateTime.now - 6.days, priority: :high) }
|
||||||
|
let!(:conversation_1) { create(:conversation, created_at: DateTime.now - 8.days, last_activity_at: DateTime.now - 8.days, priority: :medium) }
|
||||||
|
|
||||||
it 'Sort conversations based on created_at' do
|
it 'Sort conversations based on created_at' do
|
||||||
records = described_class.sort_on_created_at
|
records = described_class.sort_on_created_at
|
||||||
|
expect(records.first.id).to eq(conversation_7.id)
|
||||||
expect(records.first.id).to eq(conversation_4.id)
|
|
||||||
expect(records.last.id).to eq(conversation_2.id)
|
expect(records.last.id).to eq(conversation_2.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -778,5 +780,28 @@ RSpec.describe Conversation, type: :model do
|
|||||||
expect(records.first.id).to eq(conversation_3.id)
|
expect(records.first.id).to eq(conversation_3.id)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
context 'when sort on priority' do
|
||||||
|
it 'Sort conversations with the following order high > medium > low > nil' do
|
||||||
|
# ensure they are not pre-sorted
|
||||||
|
records = described_class.sort_on_created_at
|
||||||
|
expect(records.pluck(:priority)).not_to eq(['urgent', 'urgent', 'high', 'medium', 'low', nil, nil])
|
||||||
|
|
||||||
|
records = described_class.sort_on_priority
|
||||||
|
expect(records.pluck(:priority)).to eq(['urgent', 'urgent', 'high', 'medium', 'low', nil, nil])
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'sorts conversation with last_activity for the same priority' do
|
||||||
|
records = described_class.where(priority: 'urgent').sort_on_priority
|
||||||
|
# ensure that the conversation 4 last_activity_at is more recent than conversation 5
|
||||||
|
expect(conversation_4.last_activity_at > conversation_5.last_activity_at).to be(true)
|
||||||
|
expect(records.pluck(:priority, :id)).to eq([['urgent', conversation_4.id], ['urgent', conversation_5.id]])
|
||||||
|
|
||||||
|
records = described_class.where(priority: nil).sort_on_priority
|
||||||
|
# ensure that the conversation 6 last_activity_at is more recent than conversation 7
|
||||||
|
expect(conversation_6.last_activity_at > conversation_7.last_activity_at).to be(true)
|
||||||
|
expect(records.pluck(:priority, :id)).to eq([[nil, conversation_6.id], [nil, conversation_7.id]])
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user