mirror of
https://github.com/lingble/chatwoot.git
synced 2025-11-03 12:37:56 +00:00
Fixes https://github.com/chatwoot/chatwoot/issues/8436 Fixes https://github.com/chatwoot/chatwoot/issues/9767 Fixes https://github.com/chatwoot/chatwoot/issues/10156 Fixes https://github.com/chatwoot/chatwoot/issues/6031 Fixes https://github.com/chatwoot/chatwoot/issues/5696 Fixes https://github.com/chatwoot/chatwoot/issues/9250 Fixes https://github.com/chatwoot/chatwoot/issues/9762 --------- Co-authored-by: Pranav <pranavrajs@gmail.com> Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com>
370 lines
12 KiB
JavaScript
370 lines
12 KiB
JavaScript
import { computed } from 'vue';
|
|
import { useStoreGetters, useMapGetter } from 'dashboard/composables/store';
|
|
import { useAlert } from 'dashboard/composables';
|
|
import { useI18n } from 'vue-i18n';
|
|
import languages from 'dashboard/components/widgets/conversation/advancedFilterItems/languages';
|
|
import countries from 'shared/constants/countries';
|
|
import {
|
|
generateCustomAttributeTypes,
|
|
getActionOptions,
|
|
getConditionOptions,
|
|
getCustomAttributeInputType,
|
|
getDefaultConditions,
|
|
getDefaultActions,
|
|
filterCustomAttributes,
|
|
getStandardAttributeInputType,
|
|
isCustomAttribute,
|
|
generateCustomAttributes,
|
|
} from 'dashboard/helper/automationHelper';
|
|
|
|
/**
|
|
* Composable for handling automation-related functionality.
|
|
* @returns {Object} An object containing various automation-related functions and computed properties.
|
|
*/
|
|
export function useAutomation() {
|
|
const getters = useStoreGetters();
|
|
const { t } = useI18n();
|
|
|
|
const agents = useMapGetter('agents/getAgents');
|
|
const campaigns = useMapGetter('campaigns/getAllCampaigns');
|
|
const contacts = useMapGetter('contacts/getContacts');
|
|
const inboxes = useMapGetter('inboxes/getInboxes');
|
|
const labels = useMapGetter('labels/getLabels');
|
|
const teams = useMapGetter('teams/getTeams');
|
|
const slaPolicies = useMapGetter('sla/getSLA');
|
|
|
|
const booleanFilterOptions = computed(() => [
|
|
{ id: true, name: t('FILTER.ATTRIBUTE_LABELS.TRUE') },
|
|
{ id: false, name: t('FILTER.ATTRIBUTE_LABELS.FALSE') },
|
|
]);
|
|
|
|
const statusFilterItems = computed(() => {
|
|
return {
|
|
open: {
|
|
TEXT: t('CHAT_LIST.CHAT_STATUS_FILTER_ITEMS.open.TEXT'),
|
|
},
|
|
resolved: {
|
|
TEXT: t('CHAT_LIST.CHAT_STATUS_FILTER_ITEMS.resolved.TEXT'),
|
|
},
|
|
pending: {
|
|
TEXT: t('CHAT_LIST.CHAT_STATUS_FILTER_ITEMS.pending.TEXT'),
|
|
},
|
|
snoozed: {
|
|
TEXT: t('CHAT_LIST.CHAT_STATUS_FILTER_ITEMS.snoozed.TEXT'),
|
|
},
|
|
all: {
|
|
TEXT: t('CHAT_LIST.CHAT_STATUS_FILTER_ITEMS.all.TEXT'),
|
|
},
|
|
};
|
|
});
|
|
|
|
const statusFilterOptions = computed(() => {
|
|
const statusFilters = statusFilterItems.value;
|
|
return [
|
|
...Object.keys(statusFilters).map(status => ({
|
|
id: status,
|
|
name: statusFilters[status].TEXT,
|
|
})),
|
|
{ id: 'all', name: t('CHAT_LIST.FILTER_ALL') },
|
|
];
|
|
});
|
|
|
|
/**
|
|
* Handles the event change for an automation.
|
|
* @param {Object} automation - The automation object to update.
|
|
*/
|
|
const onEventChange = automation => {
|
|
automation.conditions = getDefaultConditions(automation.event_name);
|
|
automation.actions = getDefaultActions();
|
|
};
|
|
|
|
/**
|
|
* Gets the condition dropdown values for a given type.
|
|
* @param {string} type - The type of condition.
|
|
* @returns {Array} An array of condition dropdown values.
|
|
*/
|
|
const getConditionDropdownValues = type => {
|
|
return getConditionOptions({
|
|
agents: agents.value,
|
|
booleanFilterOptions: booleanFilterOptions.value,
|
|
campaigns: campaigns.value,
|
|
contacts: contacts.value,
|
|
customAttributes: getters['attributes/getAttributes'].value,
|
|
inboxes: inboxes.value,
|
|
statusFilterOptions: statusFilterOptions.value,
|
|
teams: teams.value,
|
|
languages,
|
|
countries,
|
|
type,
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Appends a new condition to the automation.
|
|
* @param {Object} automation - The automation object to update.
|
|
*/
|
|
const appendNewCondition = automation => {
|
|
automation.conditions.push(...getDefaultConditions(automation.event_name));
|
|
};
|
|
|
|
/**
|
|
* Appends a new action to the automation.
|
|
* @param {Object} automation - The automation object to update.
|
|
*/
|
|
const appendNewAction = automation => {
|
|
automation.actions.push(...getDefaultActions());
|
|
};
|
|
|
|
/**
|
|
* Removes a filter from the automation.
|
|
* @param {Object} automation - The automation object to update.
|
|
* @param {number} index - The index of the filter to remove.
|
|
*/
|
|
const removeFilter = (automation, index) => {
|
|
if (automation.conditions.length <= 1) {
|
|
useAlert(t('AUTOMATION.CONDITION.DELETE_MESSAGE'));
|
|
} else {
|
|
automation.conditions.splice(index, 1);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Removes an action from the automation.
|
|
* @param {Object} automation - The automation object to update.
|
|
* @param {number} index - The index of the action to remove.
|
|
*/
|
|
const removeAction = (automation, index) => {
|
|
if (automation.actions.length <= 1) {
|
|
useAlert(t('AUTOMATION.ACTION.DELETE_MESSAGE'));
|
|
} else {
|
|
automation.actions.splice(index, 1);
|
|
}
|
|
};
|
|
|
|
/**
|
|
* Resets a filter in the automation.
|
|
* @param {Object} automation - The automation object to update.
|
|
* @param {Object} automationTypes - The automation types object.
|
|
* @param {number} index - The index of the filter to reset.
|
|
* @param {Object} currentCondition - The current condition object.
|
|
*/
|
|
const resetFilter = (
|
|
automation,
|
|
automationTypes,
|
|
index,
|
|
currentCondition
|
|
) => {
|
|
automation.conditions[index].filter_operator = automationTypes[
|
|
automation.event_name
|
|
].conditions.find(
|
|
condition => condition.key === currentCondition.attribute_key
|
|
).filterOperators[0].value;
|
|
automation.conditions[index].values = '';
|
|
};
|
|
|
|
/**
|
|
* Resets an action in the automation.
|
|
* @param {Object} automation - The automation object to update.
|
|
* @param {number} index - The index of the action to reset.
|
|
*/
|
|
const resetAction = (automation, index) => {
|
|
automation.actions[index].action_params = [];
|
|
};
|
|
|
|
/**
|
|
* This function sets the conditions for automation.
|
|
* It help to format the conditions for the automation when we open the edit automation modal.
|
|
* @param {Object} automation - The automation object containing conditions to manifest.
|
|
* @param {Array} allCustomAttributes - List of all custom attributes.
|
|
* @param {Object} automationTypes - Object containing automation type definitions.
|
|
* @returns {Array} An array of manifested conditions.
|
|
*/
|
|
const manifestConditions = (
|
|
automation,
|
|
allCustomAttributes,
|
|
automationTypes
|
|
) => {
|
|
const customAttributes = filterCustomAttributes(allCustomAttributes);
|
|
return automation.conditions.map(condition => {
|
|
const customAttr = isCustomAttribute(
|
|
customAttributes,
|
|
condition.attribute_key
|
|
);
|
|
let inputType = 'plain_text';
|
|
if (customAttr) {
|
|
inputType = getCustomAttributeInputType(customAttr.type);
|
|
} else {
|
|
inputType = getStandardAttributeInputType(
|
|
automationTypes,
|
|
automation.event_name,
|
|
condition.attribute_key
|
|
);
|
|
}
|
|
if (inputType === 'plain_text' || inputType === 'date') {
|
|
return { ...condition, values: condition.values[0] };
|
|
}
|
|
if (inputType === 'comma_separated_plain_text') {
|
|
return { ...condition, values: condition.values.join(',') };
|
|
}
|
|
return {
|
|
...condition,
|
|
query_operator: condition.query_operator || 'and',
|
|
values: [...getConditionDropdownValues(condition.attribute_key)].filter(
|
|
item => [...condition.values].includes(item.id)
|
|
),
|
|
};
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Gets the action dropdown values for a given type.
|
|
* @param {string} type - The type of action.
|
|
* @returns {Array} An array of action dropdown values.
|
|
*/
|
|
const getActionDropdownValues = type => {
|
|
return getActionOptions({
|
|
agents: agents.value,
|
|
labels: labels.value,
|
|
teams: teams.value,
|
|
slaPolicies: slaPolicies.value,
|
|
languages,
|
|
type,
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Generates an array of actions for the automation.
|
|
* @param {Object} action - The action object.
|
|
* @param {Array} automationActionTypes - List of available automation action types.
|
|
* @returns {Array|Object} Generated actions array or object based on input type.
|
|
*/
|
|
const generateActionsArray = (action, automationActionTypes) => {
|
|
const params = action.action_params;
|
|
const inputType = automationActionTypes.find(
|
|
item => item.key === action.action_name
|
|
).inputType;
|
|
if (inputType === 'multi_select' || inputType === 'search_select') {
|
|
return [...getActionDropdownValues(action.action_name)].filter(item =>
|
|
[...params].includes(item.id)
|
|
);
|
|
}
|
|
if (inputType === 'team_message') {
|
|
return {
|
|
team_ids: [...getActionDropdownValues(action.action_name)].filter(
|
|
item => [...params[0].team_ids].includes(item.id)
|
|
),
|
|
message: params[0].message,
|
|
};
|
|
}
|
|
return [...params];
|
|
};
|
|
|
|
/**
|
|
* This function sets the actions for automation.
|
|
* It help to format the actions for the automation when we open the edit automation modal.
|
|
* @param {Object} automation - The automation object containing actions.
|
|
* @param {Array} automationActionTypes - List of available automation action types.
|
|
* @returns {Array} An array of manifested actions.
|
|
*/
|
|
const manifestActions = (automation, automationActionTypes) => {
|
|
return automation.actions.map(action => ({
|
|
...action,
|
|
action_params: action.action_params.length
|
|
? generateActionsArray(action, automationActionTypes)
|
|
: [],
|
|
}));
|
|
};
|
|
|
|
/**
|
|
* Formats the automation object for use when we edit the automation.
|
|
* It help to format the conditions and actions for the automation when we open the edit automation modal.
|
|
* @param {Object} automation - The automation object to format.
|
|
* @param {Array} allCustomAttributes - List of all custom attributes.
|
|
* @param {Object} automationTypes - Object containing automation type definitions.
|
|
* @param {Array} automationActionTypes - List of available automation action types.
|
|
* @returns {Object} A new object with formatted automation data, including automation conditions and actions.
|
|
*/
|
|
const formatAutomation = (
|
|
automation,
|
|
allCustomAttributes,
|
|
automationTypes,
|
|
automationActionTypes
|
|
) => {
|
|
return {
|
|
...automation,
|
|
conditions: manifestConditions(
|
|
automation,
|
|
allCustomAttributes,
|
|
automationTypes
|
|
),
|
|
actions: manifestActions(automation, automationActionTypes),
|
|
};
|
|
};
|
|
|
|
/**
|
|
* This function formats the custom attributes for automation types.
|
|
* It retrieves custom attributes for conversations and contacts,
|
|
* generates custom attribute types, and adds them to the relevant automation types.
|
|
* @param {Object} automationTypes - The automation types object to update with custom attributes.
|
|
*/
|
|
const manifestCustomAttributes = automationTypes => {
|
|
const conversationCustomAttributesRaw = getters[
|
|
'attributes/getAttributesByModel'
|
|
].value('conversation_attribute');
|
|
const contactCustomAttributesRaw =
|
|
getters['attributes/getAttributesByModel'].value('contact_attribute');
|
|
|
|
const conversationCustomAttributeTypes = generateCustomAttributeTypes(
|
|
conversationCustomAttributesRaw,
|
|
'conversation_attribute'
|
|
);
|
|
const contactCustomAttributeTypes = generateCustomAttributeTypes(
|
|
contactCustomAttributesRaw,
|
|
'contact_attribute'
|
|
);
|
|
|
|
const manifestedCustomAttributes = generateCustomAttributes(
|
|
conversationCustomAttributeTypes,
|
|
contactCustomAttributeTypes,
|
|
t('AUTOMATION.CONDITION.CONVERSATION_CUSTOM_ATTR_LABEL'),
|
|
t('AUTOMATION.CONDITION.CONTACT_CUSTOM_ATTR_LABEL')
|
|
);
|
|
|
|
automationTypes.message_created.conditions.push(
|
|
...manifestedCustomAttributes
|
|
);
|
|
automationTypes.conversation_created.conditions.push(
|
|
...manifestedCustomAttributes
|
|
);
|
|
automationTypes.conversation_updated.conditions.push(
|
|
...manifestedCustomAttributes
|
|
);
|
|
automationTypes.conversation_opened.conditions.push(
|
|
...manifestedCustomAttributes
|
|
);
|
|
};
|
|
|
|
return {
|
|
agents,
|
|
campaigns,
|
|
contacts,
|
|
inboxes,
|
|
labels,
|
|
teams,
|
|
slaPolicies,
|
|
booleanFilterOptions,
|
|
statusFilterOptions,
|
|
onEventChange,
|
|
getConditionDropdownValues,
|
|
appendNewCondition,
|
|
appendNewAction,
|
|
removeFilter,
|
|
removeAction,
|
|
resetFilter,
|
|
resetAction,
|
|
formatAutomation,
|
|
getActionDropdownValues,
|
|
manifestCustomAttributes,
|
|
};
|
|
}
|