From af1adfae64e79e1d350641f31f2730edf7d57e22 Mon Sep 17 00:00:00 2001 From: Bharath Balan <62698609+bhabalan@users.noreply.github.com> Date: Fri, 27 Feb 2026 12:08:53 +0530 Subject: [PATCH] fix(task): use dialed number (dn) instead of ANI for outdial task titles IncomingTask and TaskList widgets displayed the entrypoint/ANI number instead of the dialed destination number for outdial calls. This aligns them with CallControlCAD which was already fixed in ce826f24. CAI-7359 --- .../task/IncomingTask/incoming-task.utils.tsx | 6 +- .../task/TaskList/task-list.utils.ts | 5 +- .../src/components/task/task.types.ts | 1 + .../task/IncomingTask/incoming-task.utils.tsx | 41 +++++++++++++ .../task/TaskList/task-list.utils.tsx | 59 +++++++++++++++++++ 5 files changed, 110 insertions(+), 2 deletions(-) diff --git a/packages/contact-center/cc-components/src/components/task/IncomingTask/incoming-task.utils.tsx b/packages/contact-center/cc-components/src/components/task/IncomingTask/incoming-task.utils.tsx index 4da1f8745..8903bf5de 100644 --- a/packages/contact-center/cc-components/src/components/task/IncomingTask/incoming-task.utils.tsx +++ b/packages/contact-center/cc-components/src/components/task/IncomingTask/incoming-task.utils.tsx @@ -3,6 +3,7 @@ import {ITask} from '@webex/cc-store'; export interface IncomingTaskData { ani: string; + dn: string; customerName: string; virtualTeamName: string; ronaTimeout: number | null; @@ -35,6 +36,7 @@ export const extractIncomingTaskData = ( //@ts-expect-error To be fixed in SDK - https://jira-eng-sjc12.cisco.com/jira/browse/CAI-6762 const callAssociationDetails = incomingTask?.data?.interaction?.callAssociatedDetails; const ani = callAssociationDetails?.ani; + const dn = callAssociationDetails?.dn; const customerName = callAssociationDetails?.customerName; const virtualTeamName = callAssociationDetails?.virtualTeamName; const ronaTimeout = callAssociationDetails?.ronaTimeout ? Number(callAssociationDetails?.ronaTimeout) : null; @@ -56,7 +58,7 @@ export const extractIncomingTaskData = ( const declineText = !incomingTask.data.wrapUpRequired && isTelephony && isBrowser ? 'Decline' : undefined; // Compute title based on media type - const title = isSocial ? customerName : ani; + const title = isSocial ? customerName : dn || ani; // Compute disable state for accept button when auto-answering const isAutoAnswering = incomingTask.data.isAutoAnswering || false; @@ -67,6 +69,7 @@ export const extractIncomingTaskData = ( return { ani, + dn, customerName, virtualTeamName, ronaTimeout, @@ -90,6 +93,7 @@ export const extractIncomingTaskData = ( // Return safe default return { ani: '', + dn: '', customerName: '', virtualTeamName: '', ronaTimeout: null, diff --git a/packages/contact-center/cc-components/src/components/task/TaskList/task-list.utils.ts b/packages/contact-center/cc-components/src/components/task/TaskList/task-list.utils.ts index aa1591ffc..fecc7bc95 100644 --- a/packages/contact-center/cc-components/src/components/task/TaskList/task-list.utils.ts +++ b/packages/contact-center/cc-components/src/components/task/TaskList/task-list.utils.ts @@ -17,6 +17,7 @@ export const extractTaskListItemData = ( //@ts-expect-error To be fixed in SDK - https://jira-eng-sjc12.cisco.com/jira/browse/CAI-6762 const callAssociationDetails = task?.data?.interaction?.callAssociatedDetails; const ani = callAssociationDetails?.ani; + const dn = callAssociationDetails?.dn; const customerName = callAssociationDetails?.customerName; const virtualTeamName = callAssociationDetails?.virtualTeamName; @@ -39,7 +40,7 @@ export const extractTaskListItemData = ( const declineText = isTaskIncoming && isTelephony && isBrowser ? 'Decline' : undefined; // Compute title based on media type - const title = isSocial ? customerName : ani; + const title = isSocial ? customerName : dn || ani; const isAutoAnswering = task.data.isAutoAnswering || false; @@ -56,6 +57,7 @@ export const extractTaskListItemData = ( return { ani, + dn, customerName, virtualTeamName, ronaTimeout, @@ -82,6 +84,7 @@ export const extractTaskListItemData = ( // Return safe default return { ani: '', + dn: '', customerName: '', virtualTeamName: '', ronaTimeout: null, diff --git a/packages/contact-center/cc-components/src/components/task/task.types.ts b/packages/contact-center/cc-components/src/components/task/task.types.ts index aac63d7ca..78263f11c 100644 --- a/packages/contact-center/cc-components/src/components/task/task.types.ts +++ b/packages/contact-center/cc-components/src/components/task/task.types.ts @@ -753,6 +753,7 @@ export interface TaskComponentData { export interface TaskListItemData { ani: string; + dn: string; customerName: string; virtualTeamName: string; ronaTimeout: number | null; diff --git a/packages/contact-center/cc-components/tests/components/task/IncomingTask/incoming-task.utils.tsx b/packages/contact-center/cc-components/tests/components/task/IncomingTask/incoming-task.utils.tsx index 0198dd810..a9e8bbb27 100644 --- a/packages/contact-center/cc-components/tests/components/task/IncomingTask/incoming-task.utils.tsx +++ b/packages/contact-center/cc-components/tests/components/task/IncomingTask/incoming-task.utils.tsx @@ -105,6 +105,47 @@ describe('incoming-task.utils', () => { }); }); + describe('Outdial tasks (dn field)', () => { + it('should use dn as title when dn is provided for telephony task', () => { + const originalCallAssociatedDetails = mockTask.data.interaction.callAssociatedDetails; + + mockTask.data.interaction.callAssociatedDetails = { + ani: '+18005551000', + dn: '+14155559999', + customerName: '', + virtualTeamName: 'Outbound Team', + ronaTimeout: '30', + }; + + const result = extractIncomingTaskData(mockTask, true); + + expect(result.dn).toBe('+14155559999'); + expect(result.ani).toBe('+18005551000'); + expect(result.title).toBe('+14155559999'); // dn takes priority over ani + + mockTask.data.interaction.callAssociatedDetails = originalCallAssociatedDetails; + }); + + it('should fall back to ani when dn is not provided', () => { + const originalCallAssociatedDetails = mockTask.data.interaction.callAssociatedDetails; + + mockTask.data.interaction.callAssociatedDetails = { + ani: '+14155551234', + customerName: '', + virtualTeamName: 'Support Team', + ronaTimeout: '30', + }; + + const result = extractIncomingTaskData(mockTask, true); + + expect(result.dn).toBeUndefined(); + expect(result.ani).toBe('+14155551234'); + expect(result.title).toBe('+14155551234'); // falls back to ani + + mockTask.data.interaction.callAssociatedDetails = originalCallAssociatedDetails; + }); + }); + describe('Edge cases', () => { it('should handle missing call association details', () => { const originalCallAssociatedDetails = mockTask.data.interaction.callAssociatedDetails; diff --git a/packages/contact-center/cc-components/tests/components/task/TaskList/task-list.utils.tsx b/packages/contact-center/cc-components/tests/components/task/TaskList/task-list.utils.tsx index ac93a7a84..f8d37cf0b 100644 --- a/packages/contact-center/cc-components/tests/components/task/TaskList/task-list.utils.tsx +++ b/packages/contact-center/cc-components/tests/components/task/TaskList/task-list.utils.tsx @@ -107,6 +107,65 @@ describe('task-list.utils', () => { }); }); + describe('Outdial tasks (dn field)', () => { + it('should use dn as title when dn is provided for telephony task', () => { + const originalState = mockTask.data.interaction.state; + const originalCallAssociatedDetails = mockTask.data.interaction.callAssociatedDetails; + const originalWrapUpRequired = mockTask.data.wrapUpRequired; + const originalMediaType = mockTask.data.interaction.mediaType; + + mockTask.data.interaction.state = 'active'; + mockTask.data.interaction.callAssociatedDetails = { + ani: '+18005551000', + dn: '+14155559999', + customerName: '', + virtualTeamName: 'Outbound Team', + ronaTimeout: '30', + }; + mockTask.data.wrapUpRequired = false; + mockTask.data.interaction.mediaType = MEDIA_CHANNEL.TELEPHONY; + + const result = extractTaskListItemData(mockTask, true, mockTask.data.agentId); + + expect(result.dn).toBe('+14155559999'); + expect(result.ani).toBe('+18005551000'); + expect(result.title).toBe('+14155559999'); // dn takes priority over ani + + mockTask.data.interaction.state = originalState; + mockTask.data.interaction.callAssociatedDetails = originalCallAssociatedDetails; + mockTask.data.wrapUpRequired = originalWrapUpRequired; + mockTask.data.interaction.mediaType = originalMediaType; + }); + + it('should fall back to ani when dn is not provided', () => { + const originalState = mockTask.data.interaction.state; + const originalCallAssociatedDetails = mockTask.data.interaction.callAssociatedDetails; + const originalWrapUpRequired = mockTask.data.wrapUpRequired; + const originalMediaType = mockTask.data.interaction.mediaType; + + mockTask.data.interaction.state = 'active'; + mockTask.data.interaction.callAssociatedDetails = { + ani: '+14155551234', + customerName: '', + virtualTeamName: 'Support Team', + ronaTimeout: '30', + }; + mockTask.data.wrapUpRequired = false; + mockTask.data.interaction.mediaType = MEDIA_CHANNEL.TELEPHONY; + + const result = extractTaskListItemData(mockTask, true, mockTask.data.agentId); + + expect(result.dn).toBeUndefined(); + expect(result.ani).toBe('+14155551234'); + expect(result.title).toBe('+14155551234'); // falls back to ani + + mockTask.data.interaction.state = originalState; + mockTask.data.interaction.callAssociatedDetails = originalCallAssociatedDetails; + mockTask.data.wrapUpRequired = originalWrapUpRequired; + mockTask.data.interaction.mediaType = originalMediaType; + }); + }); + describe('Incoming tasks', () => { it('should extract correct data for incoming telephony task on browser', () => { // Mock isIncomingTask to return true for this test