diff --git a/src/apps/support/src/pages/ticket-details/TicketDetailPage.spec.tsx b/src/apps/support/src/pages/ticket-details/TicketDetailPage.spec.tsx index 9e69ac6a5..0c2298da4 100644 --- a/src/apps/support/src/pages/ticket-details/TicketDetailPage.spec.tsx +++ b/src/apps/support/src/pages/ticket-details/TicketDetailPage.spec.tsx @@ -285,6 +285,47 @@ describe('TicketDetailPage reply access', () => { .toBeUndefined() }) + it('identifies support team replies without labelling the ticket owner', () => { + mockUseSWR.mockReturnValue({ + data: { + ...closedTicket, + responseCount: 2, + responses: [{ + createdAt: '2026-08-07T01:30:00.000Z', + id: 'response-owner', + markdown: 'Member follow-up.', + readBy: [], + userHandle: 'ticket-owner', + userId: '12345', + }, { + createdAt: '2026-08-07T01:45:00.000Z', + id: 'response-support', + markdown: 'Support follow-up.', + readBy: [], + userHandle: 'support-agent', + userId: '67890', + }], + }, + error: undefined, + isValidating: false, + mutate: mockMutate, + }) + + render() + + const ownerReply = screen.getByText('Member follow-up.') + .closest('article') + const supportReply = screen.getByText('Support follow-up.') + .closest('article') + + expect(ownerReply?.textContent) + .toContain('ticket-owner') + expect(ownerReply?.textContent) + .not.toContain('(Support Team)') + expect(supportReply?.textContent) + .toContain('support-agent (Support Team)') + }) + it('requires non-owner support staff to assign an open ticket before replying or closing it', () => { mockProfile = { roles: ['Topcoder Support Team'], diff --git a/src/apps/support/src/pages/ticket-details/TicketDetailPage.tsx b/src/apps/support/src/pages/ticket-details/TicketDetailPage.tsx index 8ac4bfeb5..e0a731c86 100644 --- a/src/apps/support/src/pages/ticket-details/TicketDetailPage.tsx +++ b/src/apps/support/src/pages/ticket-details/TicketDetailPage.tsx @@ -43,7 +43,7 @@ import { import styles from './TicketDetailPage.module.scss' /** - * Renders the original request followed by ascending replies and authorized actions. + * Renders the original request followed by ascending, role-labelled replies and authorized actions. * * @returns support ticket detail page. * @throws Does not throw; request failures are shown with recovery actions. @@ -316,6 +316,7 @@ export const TicketDetailPage: FC = () => { color={response.userHandleColor} handle={response.userHandle} /> + {response.userId !== data.memberUserId && ' (Support Team)'} diff --git a/src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeEditorForm.spec.tsx b/src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeEditorForm.spec.tsx index 579e4a5a7..978510484 100644 --- a/src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeEditorForm.spec.tsx +++ b/src/apps/work/src/pages/challenges/ChallengeEditorPage/components/ChallengeEditorForm.spec.tsx @@ -3107,7 +3107,7 @@ describe('ChallengeEditorForm', () => { render( - + , ) @@ -3131,7 +3131,7 @@ describe('ChallengeEditorForm', () => { { render( - + , ) @@ -4443,7 +4443,7 @@ describe('ChallengeEditorForm', () => { isLoading: false, }) mockedPatchChallenge.mockResolvedValue({ - ...designChallengeWithDeferredScreener, + ...designChallengeWithDeferredScreeners, metadata: [], status: 'DRAFT', }) @@ -4452,7 +4452,7 @@ describe('ChallengeEditorForm', () => {