mirror of
https://github.com/lingble/chatwoot.git
synced 2025-11-02 12:08:01 +00:00
# Pull Request Template ## Description This PR will replace the usage of `agentMixin`with the utility helpers functions. **Files updated** 1. dashboard/components/widgets/conversation/contextMenu/Index.vue 2. dashboard/components/widgets/conversation/ConversationHeader.vue **(Not used)** 3. dashboard/routes/dashboard/commands/commandbar.vue 4. dashboard/routes/dashboard/conversation/ConversationAction.vue 5. dashboard/routes/dashboard/conversation/ConversationParticipant.vue Fixes https://linear.app/chatwoot/issue/CW-3442/rewrite-agentmixin-mixin-to-a-composable ## Type of change - [x] New feature (non-breaking change which adds functionality) ## How Has This Been Tested? **Test cases** 1. See agent list sorting based on availability, if agents are on the same status, then sorted by name. 2. Test actions like assigning/unassigning agent from conversation sidebar, CMD bar, Context menu. 3. Test actions like adding/removing participants from conversation sidebar. 4. See agent list is generated properly, none value. ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [x] I have commented on my code, particularly in hard-to-understand areas - [ ] I have made corresponding changes to the documentation - [x] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules
84 lines
2.6 KiB
JavaScript
84 lines
2.6 KiB
JavaScript
/**
|
|
* Default agent object representing 'None'
|
|
* @type {Object}
|
|
*/
|
|
export const createNoneAgent = {
|
|
confirmed: true,
|
|
name: 'None',
|
|
id: 0,
|
|
role: 'agent',
|
|
account_id: 0,
|
|
email: 'None',
|
|
};
|
|
|
|
/**
|
|
* Filters and sorts agents by availability status
|
|
* @param {Array} agents - List of agents
|
|
* @param {string} availability - Availability status to filter by
|
|
* @returns {Array} Filtered and sorted list of agents
|
|
*/
|
|
export const getAgentsByAvailability = (agents, availability) => {
|
|
return agents
|
|
.filter(agent => agent.availability_status === availability)
|
|
.sort((a, b) => a.name.localeCompare(b.name));
|
|
};
|
|
|
|
/**
|
|
* Sorts agents by availability status: online, busy, then offline
|
|
* @param {Array} agents - List of agents
|
|
* @returns {Array} Sorted list of agents
|
|
*/
|
|
export const getSortedAgentsByAvailability = agents => {
|
|
const onlineAgents = getAgentsByAvailability(agents, 'online');
|
|
const busyAgents = getAgentsByAvailability(agents, 'busy');
|
|
const offlineAgents = getAgentsByAvailability(agents, 'offline');
|
|
const filteredAgents = [...onlineAgents, ...busyAgents, ...offlineAgents];
|
|
return filteredAgents;
|
|
};
|
|
|
|
/**
|
|
* Updates the availability status of the current user based on the current account
|
|
* @param {Array} agents - List of agents
|
|
* @param {Object} currentUser - Current user object
|
|
* @param {number} currentAccountId - ID of the current account
|
|
* @returns {Array} Updated list of agents with dynamic presence
|
|
*/
|
|
// Here we are updating the availability status of the current user dynamically
|
|
// based on the current account availability status
|
|
export const getAgentsByUpdatedPresence = (
|
|
agents,
|
|
currentUser,
|
|
currentAccountId
|
|
) => {
|
|
const agentsWithDynamicPresenceUpdate = agents.map(item =>
|
|
item.id === currentUser.id
|
|
? {
|
|
...item,
|
|
availability_status: currentUser.accounts.find(
|
|
account => account.id === currentAccountId
|
|
).availability_status,
|
|
}
|
|
: item
|
|
);
|
|
return agentsWithDynamicPresenceUpdate;
|
|
};
|
|
|
|
/**
|
|
* Combines the filtered agents with the 'None' agent option if applicable.
|
|
*
|
|
* @param {Array} filteredAgentsByAvailability - The list of agents sorted by availability.
|
|
* @param {boolean} includeNoneAgent - Whether to include the 'None' agent option.
|
|
* @param {boolean} isAgentSelected - Whether an agent is currently selected.
|
|
* @returns {Array} The combined list of agents, potentially including the 'None' agent.
|
|
*/
|
|
export const getCombinedAgents = (
|
|
filteredAgentsByAvailability,
|
|
includeNoneAgent,
|
|
isAgentSelected
|
|
) => {
|
|
return [
|
|
...(includeNoneAgent && isAgentSelected ? [createNoneAgent] : []),
|
|
...filteredAgentsByAvailability,
|
|
];
|
|
};
|