diff --git a/app/javascript/dashboard/helper/filterQueryGenerator.js b/app/javascript/dashboard/helper/filterQueryGenerator.js
index d70a30a6b..b2eff3d84 100644
--- a/app/javascript/dashboard/helper/filterQueryGenerator.js
+++ b/app/javascript/dashboard/helper/filterQueryGenerator.js
@@ -1,21 +1,34 @@
const setArrayValues = item => {
return item.values[0]?.id ? item.values.map(val => val.id) : item.values;
};
+
+const generateValues = item => {
+ if (item.attribute_key === 'content') {
+ const values = item.values || '';
+ return values.split(',');
+ }
+ if (Array.isArray(item.values)) {
+ return setArrayValues(item);
+ }
+ if (typeof item.values === 'object') {
+ return [item.values.id];
+ }
+ if (!item.values) {
+ return [];
+ }
+ return [item.values];
+};
+
const generatePayload = data => {
// Make a copy of data to avoid vue data reactivity issues
const filters = JSON.parse(JSON.stringify(data));
let payload = filters.map(item => {
- if (Array.isArray(item.values)) {
- item.values = setArrayValues(item);
- } else if (typeof item.values === 'object') {
- item.values = [item.values.id];
- } else if (!item.values) {
- item.values = [];
- } else {
- item.values = [item.values];
- }
+ // If item key is content, we will split it using comma and return as array
+ // FIX ME: Make this generic option instead of using the key directly here
+ item.values = generateValues(item);
return item;
});
+
// For every query added, the query_operator is set default to and so the
// last query will have an extra query_operator, this would break the api.
// Setting this to null for all query payload
diff --git a/app/javascript/dashboard/mixins/automations/methodsMixin.js b/app/javascript/dashboard/mixins/automations/methodsMixin.js
index 611d5ad38..723cef22c 100644
--- a/app/javascript/dashboard/mixins/automations/methodsMixin.js
+++ b/app/javascript/dashboard/mixins/automations/methodsMixin.js
@@ -199,6 +199,12 @@ export default {
values: condition.values[0],
};
}
+ if (inputType === 'comma_separated_plain_text') {
+ return {
+ ...condition,
+ values: condition.values.join(','),
+ };
+ }
return {
...condition,
query_operator: condition.query_operator || 'and',
diff --git a/app/javascript/dashboard/routes/dashboard/settings/automation/EditAutomationRule.vue b/app/javascript/dashboard/routes/dashboard/settings/automation/EditAutomationRule.vue
index 74dac7cf9..3ac454868 100644
--- a/app/javascript/dashboard/routes/dashboard/settings/automation/EditAutomationRule.vue
+++ b/app/javascript/dashboard/routes/dashboard/settings/automation/EditAutomationRule.vue
@@ -52,7 +52,7 @@
{{ $t('AUTOMATION.ADD.FORM.CONDITIONS.LABEL') }}
> 'browser_language' IN (?) AND status IN (?)", ['en'], [1, 2])
- expect(result.length).to be conversations.count
+ expect(result[:count][:all_count]).to be conversations.count
end
it 'filter conversations by additional_attributes and status with pagination' do
@@ -83,7 +82,45 @@ describe Conversations::FilterService do
params[:page] = 2
result = filter_service.new(params, user_1).perform
conversations = Conversation.where("additional_attributes ->> 'browser_language' IN (?) AND status IN (?)", ['en'], [1, 2])
- expect(result.length).to be conversations.count
+ expect(result[:count][:all_count]).to be conversations.count
+ end
+
+ it 'filters items with contains filter_operator with values being an array' do
+ params[:payload] = [{
+ attribute_key: 'browser_language',
+ filter_operator: 'contains',
+ values: %w[tr fr],
+ query_operator: '',
+ custom_attribute_type: ''
+ }.with_indifferent_access]
+
+ create(:conversation, account: account, inbox: inbox, assignee: user_1, campaign_id: campaign_1.id,
+ status: 'pending', additional_attributes: { 'browser_language': 'fr' })
+ create(:conversation, account: account, inbox: inbox, assignee: user_1, campaign_id: campaign_1.id,
+ status: 'pending', additional_attributes: { 'browser_language': 'tr' })
+
+ result = filter_service.new(params, user_1).perform
+ expect(result[:count][:all_count]).to be 2
+ end
+
+ it 'filters items with does not contain filter operator with values being an array' do
+ params[:payload] = [{
+ attribute_key: 'browser_language',
+ filter_operator: 'does_not_contain',
+ values: %w[tr en],
+ query_operator: '',
+ custom_attribute_type: ''
+ }.with_indifferent_access]
+
+ create(:conversation, account: account, inbox: inbox, assignee: user_1, campaign_id: campaign_1.id,
+ status: 'pending', additional_attributes: { 'browser_language': 'fr' })
+ create(:conversation, account: account, inbox: inbox, assignee: user_1, campaign_id: campaign_1.id,
+ status: 'pending', additional_attributes: { 'browser_language': 'tr' })
+
+ result = filter_service.new(params, user_1).perform
+
+ expect(result[:count][:all_count]).to be 1
+ expect(result[:conversations].first.additional_attributes['browser_language']).to eq 'fr'
end
it 'filter conversations by additional_attributes with NOT_IN filter' do
@@ -98,7 +135,7 @@ describe Conversations::FilterService do
end
it 'filter conversations by tags' do
- unassigned_conversation.update_labels('support')
+ user_2_assigned_conversation.update_labels('support')
params[:payload] = [
{
attribute_key: 'assignee_id',
@@ -119,7 +156,7 @@ describe Conversations::FilterService do
}.with_indifferent_access
]
result = filter_service.new(params, user_1).perform
- expect(result.length).to be 2
+ expect(result[:count][:all_count]).to be 1
end
it 'filter conversations by is_present filter_operator' do