diff --git a/app/javascript/dashboard/composables/spec/useAgentsList.spec.js b/app/javascript/dashboard/composables/spec/useAgentsList.spec.js index 2f7f74e98..7f6d8e757 100644 --- a/app/javascript/dashboard/composables/spec/useAgentsList.spec.js +++ b/app/javascript/dashboard/composables/spec/useAgentsList.spec.js @@ -5,9 +5,26 @@ import { useMapGetter } from 'dashboard/composables/store'; import { allAgentsData, formattedAgentsData } from './fixtures/agentFixtures'; import * as agentHelper from 'dashboard/helper/agentHelper'; +// Mock vue-i18n +vi.mock('vue-i18n', () => ({ + useI18n: () => ({ + t: key => (key === 'AGENT_MGMT.MULTI_SELECTOR.LIST.NONE' ? 'None' : key), + }), +})); + vi.mock('dashboard/composables/store'); vi.mock('dashboard/helper/agentHelper'); +// Create a mock None agent +const mockNoneAgent = { + confirmed: true, + name: 'None', + id: 0, + role: 'agent', + account_id: 0, + email: 'None', +}; + const mockUseMapGetter = (overrides = {}) => { const defaultGetters = { getCurrentUser: ref(allAgentsData[0]), @@ -28,14 +45,6 @@ describe('useAgentsList', () => { agentHelper.getSortedAgentsByAvailability.mockReturnValue( formattedAgentsData.slice(1) ); - agentHelper.getCombinedAgents.mockImplementation( - (agents, includeNone, isAgentSelected) => { - if (includeNone && isAgentSelected) { - return [agentHelper.createNoneAgent, ...agents]; - } - return agents; - } - ); mockUseMapGetter(); }); @@ -44,24 +53,26 @@ describe('useAgentsList', () => { const { agentsList, assignableAgents } = useAgentsList(); expect(assignableAgents.value).toEqual(allAgentsData); - expect(agentsList.value).toEqual([ - agentHelper.createNoneAgent, - ...formattedAgentsData.slice(1), - ]); + expect(agentsList.value[0]).toEqual(mockNoneAgent); + expect(agentsList.value.length).toBe( + formattedAgentsData.slice(1).length + 1 + ); }); it('includes None agent when includeNoneAgent is true', () => { const { agentsList } = useAgentsList(true); - expect(agentsList.value[0]).toEqual(agentHelper.createNoneAgent); - expect(agentsList.value.length).toBe(formattedAgentsData.length); + expect(agentsList.value[0]).toEqual(mockNoneAgent); + expect(agentsList.value.length).toBe( + formattedAgentsData.slice(1).length + 1 + ); }); it('excludes None agent when includeNoneAgent is false', () => { const { agentsList } = useAgentsList(false); - expect(agentsList.value[0]).not.toEqual(agentHelper.createNoneAgent); - expect(agentsList.value.length).toBe(formattedAgentsData.length - 1); + expect(agentsList.value[0].id).not.toBe(0); + expect(agentsList.value.length).toBe(formattedAgentsData.slice(1).length); }); it('handles empty assignable agents', () => { @@ -73,7 +84,7 @@ describe('useAgentsList', () => { const { agentsList, assignableAgents } = useAgentsList(); expect(assignableAgents.value).toEqual([]); - expect(agentsList.value).toEqual([agentHelper.createNoneAgent]); + expect(agentsList.value).toEqual([mockNoneAgent]); }); it('handles missing inbox_id', () => { @@ -86,6 +97,6 @@ describe('useAgentsList', () => { const { agentsList, assignableAgents } = useAgentsList(); expect(assignableAgents.value).toEqual([]); - expect(agentsList.value).toEqual([agentHelper.createNoneAgent]); + expect(agentsList.value).toEqual([mockNoneAgent]); }); }); diff --git a/app/javascript/dashboard/composables/useAgentsList.js b/app/javascript/dashboard/composables/useAgentsList.js index b22493bd1..47e843be6 100644 --- a/app/javascript/dashboard/composables/useAgentsList.js +++ b/app/javascript/dashboard/composables/useAgentsList.js @@ -1,9 +1,9 @@ import { computed } from 'vue'; import { useMapGetter } from 'dashboard/composables/store'; +import { useI18n } from 'vue-i18n'; import { getAgentsByUpdatedPresence, getSortedAgentsByAvailability, - getCombinedAgents, } from 'dashboard/helper/agentHelper'; /** @@ -13,6 +13,7 @@ import { * @returns {Object} An object containing the agents list and assignable agents. */ export function useAgentsList(includeNoneAgent = true) { + const { t } = useI18n(); const currentUser = useMapGetter('getCurrentUser'); const currentChat = useMapGetter('getSelectedChat'); const currentAccountId = useMapGetter('getCurrentAccountId'); @@ -21,6 +22,19 @@ export function useAgentsList(includeNoneAgent = true) { const inboxId = computed(() => currentChat.value?.inbox_id); const isAgentSelected = computed(() => currentChat.value?.meta?.assignee); + /** + * Creates a 'None' agent object + * @returns {Object} None agent object + */ + const createNoneAgent = () => ({ + confirmed: true, + name: t('AGENT_MGMT.MULTI_SELECTOR.LIST.NONE') || 'None', + id: 0, + role: 'agent', + account_id: 0, + email: 'None', + }); + /** * @type {import('vue').ComputedRef} */ @@ -43,11 +57,10 @@ export function useAgentsList(includeNoneAgent = true) { agentsByUpdatedPresence ); - return getCombinedAgents( - filteredAgentsByAvailability, - includeNoneAgent, - isAgentSelected.value - ); + return [ + ...(includeNoneAgent && isAgentSelected.value ? [createNoneAgent()] : []), + ...filteredAgentsByAvailability, + ]; }); return { diff --git a/app/javascript/dashboard/helper/agentHelper.js b/app/javascript/dashboard/helper/agentHelper.js index c32680561..d521e7241 100644 --- a/app/javascript/dashboard/helper/agentHelper.js +++ b/app/javascript/dashboard/helper/agentHelper.js @@ -1,16 +1,3 @@ -/** - * 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 @@ -62,22 +49,3 @@ export const getAgentsByUpdatedPresence = ( ); 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, - ]; -}; diff --git a/app/javascript/dashboard/helper/specs/agentHelper.spec.js b/app/javascript/dashboard/helper/specs/agentHelper.spec.js index 5b670a9b3..273834a11 100644 --- a/app/javascript/dashboard/helper/specs/agentHelper.spec.js +++ b/app/javascript/dashboard/helper/specs/agentHelper.spec.js @@ -2,8 +2,6 @@ import { getAgentsByAvailability, getSortedAgentsByAvailability, getAgentsByUpdatedPresence, - getCombinedAgents, - createNoneAgent, } from '../agentHelper'; import { allAgentsData, @@ -93,39 +91,4 @@ describe('agentHelper', () => { ).toEqual([]); }); }); - - describe('getCombinedAgents', () => { - it('includes None agent when includeNoneAgent is true and isAgentSelected is true', () => { - const result = getCombinedAgents(sortedByAvailability, true, true); - expect(result).toEqual([createNoneAgent, ...sortedByAvailability]); - expect(result.length).toBe(sortedByAvailability.length + 1); - expect(result[0]).toEqual(createNoneAgent); - }); - - it('excludes None agent when includeNoneAgent is false', () => { - const result = getCombinedAgents(sortedByAvailability, false, true); - expect(result).toEqual(sortedByAvailability); - expect(result.length).toBe(sortedByAvailability.length); - expect(result[0]).not.toEqual(createNoneAgent); - }); - - it('excludes None agent when isAgentSelected is false', () => { - const result = getCombinedAgents(sortedByAvailability, true, false); - expect(result).toEqual(sortedByAvailability); - expect(result.length).toBe(sortedByAvailability.length); - expect(result[0]).not.toEqual(createNoneAgent); - }); - - it('returns only filtered agents when both includeNoneAgent and isAgentSelected are false', () => { - const result = getCombinedAgents(sortedByAvailability, false, false); - expect(result).toEqual(sortedByAvailability); - expect(result.length).toBe(sortedByAvailability.length); - }); - - it('handles empty filteredAgentsByAvailability array', () => { - const result = getCombinedAgents([], true, true); - expect(result).toEqual([createNoneAgent]); - expect(result.length).toBe(1); - }); - }); }); diff --git a/app/javascript/dashboard/i18n/locale/en/agentMgmt.json b/app/javascript/dashboard/i18n/locale/en/agentMgmt.json index 364fa7d50..448994e69 100644 --- a/app/javascript/dashboard/i18n/locale/en/agentMgmt.json +++ b/app/javascript/dashboard/i18n/locale/en/agentMgmt.json @@ -105,6 +105,9 @@ "AGENT": "Select agent", "TEAM": "Select team" }, + "LIST": { + "NONE": "None" + }, "SEARCH": { "NO_RESULTS": { "AGENT": "No agents found",