From 2bb9a5caac4e5594be3b5db477eba4a69e6c3db4 Mon Sep 17 00:00:00 2001 From: NogaNHS <127490765+NogaNHS@users.noreply.github.com> Date: Mon, 5 Jan 2026 14:45:19 +0000 Subject: [PATCH 01/15] [PRMP-915] Add support for ODS review summary report in download functionality --- .../DownloadReportSelectStage.tsx | 4 ++-- app/src/helpers/requests/downloadReport.test.ts | 4 +++- app/src/helpers/requests/downloadReport.ts | 8 ++++---- app/src/types/generic/reports.ts | 12 +++++++++++- lambdas/services/ods_report_service.py | 2 +- 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx index 71ce19f83c..cc76858751 100644 --- a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx +++ b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx @@ -1,5 +1,5 @@ import { useNavigate } from 'react-router-dom'; -import { FileTypeData, ReportData } from '../../../../types/generic/reports'; +import { FileTypeData, REPORT_TYPE, ReportData } from '../../../../types/generic/reports'; import { routeChildren, routes } from '../../../../types/generic/routes'; import { BackLink, Button } from 'nhsuk-react-components'; import downloadReport from '../../../../helpers/requests/downloadReport'; @@ -85,7 +85,7 @@ const DownloadReportSelectStage = (props: Props): JSX.Element => { setDownloading(true); try { - await downloadReport({ report: props.report, fileType, baseUrl, baseHeaders }); + await downloadReport({ report: props.report, fileType, baseUrl, baseHeaders, odsReportType: REPORT_TYPE.ODS_PATIENT_SUMMARY }); handleSuccess(); } catch (e) { const error = e as AxiosError; diff --git a/app/src/helpers/requests/downloadReport.test.ts b/app/src/helpers/requests/downloadReport.test.ts index 0001848c52..4c68e62574 100644 --- a/app/src/helpers/requests/downloadReport.test.ts +++ b/app/src/helpers/requests/downloadReport.test.ts @@ -1,6 +1,6 @@ import axios, { AxiosError } from 'axios'; import downloadReport from './downloadReport'; -import { ReportData } from '../../types/generic/reports'; +import { REPORT_TYPE, ReportData } from '../../types/generic/reports'; import { AuthHeaders } from '../../types/blocks/authHeaders'; import { describe, expect, it, vi, Mocked, beforeEach, afterEach, Mock } from 'vitest'; import { Procedure } from '@vitest/spy'; @@ -47,6 +47,7 @@ describe('downloadReport', () => { 'Content-Type': '', Authorization: 'token', } as AuthHeaders, + odsReportType: REPORT_TYPE.ODS_REVIEW_SUMMARY }; const getSpy = vi.spyOn(mockedAxios, 'get'); @@ -76,6 +77,7 @@ describe('downloadReport', () => { 'Content-Type': '', Authorization: 'token', } as AuthHeaders, + odsReportType: REPORT_TYPE.ODS_REVIEW_SUMMARY }; let errorCode; diff --git a/app/src/helpers/requests/downloadReport.ts b/app/src/helpers/requests/downloadReport.ts index 25a213e431..6a74369a44 100644 --- a/app/src/helpers/requests/downloadReport.ts +++ b/app/src/helpers/requests/downloadReport.ts @@ -1,19 +1,19 @@ import { AuthHeaders } from '../../types/blocks/authHeaders'; import axios, { AxiosError } from 'axios'; -import { ReportData } from '../../types/generic/reports'; +import { REPORT_TYPE, ReportData } from '../../types/generic/reports'; type Args = { report: ReportData; fileType: string; baseUrl: string; baseHeaders: AuthHeaders; + odsReportType: REPORT_TYPE; }; type DownloadReportResponseData = { data: { url: string }; }; - -const downloadReport = async ({ report, fileType, baseUrl, baseHeaders }: Args): Promise => { +const downloadReport = async ({ report, fileType, baseUrl, baseHeaders, odsReportType }: Args): Promise => { const gatewayUrl = baseUrl + report.endpoint; try { @@ -23,7 +23,7 @@ const downloadReport = async ({ report, fileType, baseUrl, baseHeaders }: Args): }, params: { outputFileFormat: fileType, - odsReportType: 'PATIENT', + odsReportType: odsReportType, }, }); diff --git a/app/src/types/generic/reports.ts b/app/src/types/generic/reports.ts index 69fec15640..468ef7eef0 100644 --- a/app/src/types/generic/reports.ts +++ b/app/src/types/generic/reports.ts @@ -2,7 +2,8 @@ import LloydGeorgeSummaryDescription from '../../components/blocks/_downloadRepo import { endpoints } from './endpoints'; export enum REPORT_TYPE { - ODS_PATIENT_SUMMARY = '0', + ODS_PATIENT_SUMMARY = 'PATIENT', + ODS_REVIEW_SUMMARY = 'REVIEW', } export type FileTypeData = { @@ -34,4 +35,13 @@ export const reports: ReportData[] = [ reportType: REPORT_TYPE.ODS_PATIENT_SUMMARY, endpoint: endpoints.ODS_REPORT, }, + { + title: 'Documents review summary report', + description: LloydGeorgeSummaryDescription, + fileTypes: [ + { extension: 'csv', label: 'a CSV' }, + ], + reportType: REPORT_TYPE.ODS_REVIEW_SUMMARY, + endpoint: endpoints.ODS_REPORT, + }, ]; diff --git a/lambdas/services/ods_report_service.py b/lambdas/services/ods_report_service.py index 71aac847dc..e892b09004 100644 --- a/lambdas/services/ods_report_service.py +++ b/lambdas/services/ods_report_service.py @@ -64,7 +64,7 @@ def get_documents_for_review( if output_file_type != FileType.CSV: raise OdsReportException(400, LambdaError.UnsupportedFileType) - query_filter = self.document_upload_review_service.build_review_query_filter() + query_filter = self.document_upload_review_service.build_review_dynamo_filter() results = self.document_upload_review_service.fetch_documents_from_table( search_key="Custodian", From a5bfdfb7825536e894d53eabe756e30478ffb96d Mon Sep 17 00:00:00 2001 From: NogaNHS <127490765+NogaNHS@users.noreply.github.com> Date: Mon, 5 Jan 2026 15:23:41 +0000 Subject: [PATCH 02/15] Add download link for ODS review summary report in ReviewsPage --- .../components/blocks/_admin/reviewsPage/ReviewsPage.tsx | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.tsx b/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.tsx index b49c3f745a..198f5ca07f 100644 --- a/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.tsx +++ b/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.tsx @@ -19,6 +19,8 @@ import BackButton from '../../../generic/backButton/BackButton'; import { Pagination } from '../../../generic/paginationV2/Pagination'; import SpinnerButton from '../../../generic/spinnerButton/SpinnerButton'; import SpinnerV2 from '../../../generic/spinnerV2/SpinnerV2'; +import {REPORT_TYPE} from "../../../../types/generic/reports"; + export type ReviewsPageProps = { setReviewData: Dispatch>; @@ -270,6 +272,11 @@ export const ReviewsPage = ({ setReviewData }: ReviewsPageProps): React.JSX.Elem

+
+ + Download a report on this data + +
{/* Search box */}
Date: Mon, 5 Jan 2026 15:48:30 +0000 Subject: [PATCH 03/15] [PRMP-915] Refactor download report functionality to support dynamic report types --- .../blocks/_admin/reviewsPage/ReviewsPage.tsx | 6 ++++-- .../DownloadReportSelectStage.tsx | 8 +++++++- .../ReviewSummaryDescription.tsx | 15 +++++++++++++++ app/src/helpers/requests/downloadReport.test.ts | 6 +++--- app/src/helpers/requests/downloadReport.ts | 8 +++++++- app/src/types/generic/reports.ts | 9 ++++----- 6 files changed, 40 insertions(+), 12 deletions(-) create mode 100644 app/src/components/blocks/_downloadReport/downloadReportSelectStage/ReportDescriptions/ReviewSummaryDescription.tsx diff --git a/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.tsx b/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.tsx index 198f5ca07f..441bec98f5 100644 --- a/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.tsx +++ b/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.tsx @@ -19,7 +19,7 @@ import BackButton from '../../../generic/backButton/BackButton'; import { Pagination } from '../../../generic/paginationV2/Pagination'; import SpinnerButton from '../../../generic/spinnerButton/SpinnerButton'; import SpinnerV2 from '../../../generic/spinnerV2/SpinnerV2'; -import {REPORT_TYPE} from "../../../../types/generic/reports"; +import { REPORT_TYPE } from '../../../../types/generic/reports'; export type ReviewsPageProps = { @@ -273,7 +273,9 @@ export const ReviewsPage = ({ setReviewData }: ReviewsPageProps): React.JSX.Elem diff --git a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx index cc76858751..a1b3100650 100644 --- a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx +++ b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx @@ -85,7 +85,13 @@ const DownloadReportSelectStage = (props: Props): JSX.Element => { setDownloading(true); try { - await downloadReport({ report: props.report, fileType, baseUrl, baseHeaders, odsReportType: REPORT_TYPE.ODS_PATIENT_SUMMARY }); + await downloadReport({ + report: props.report, + fileType, + baseUrl, + baseHeaders, + odsReportType: props.report.reportType, + }); handleSuccess(); } catch (e) { const error = e as AxiosError; diff --git a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/ReportDescriptions/ReviewSummaryDescription.tsx b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/ReportDescriptions/ReviewSummaryDescription.tsx new file mode 100644 index 0000000000..85635c9531 --- /dev/null +++ b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/ReportDescriptions/ReviewSummaryDescription.tsx @@ -0,0 +1,15 @@ +const ReviewSummaryDescription = (): React.JSX.Element => { + return ( + <> +

This report contains:

+
    +
  • + the details of pending document records stored within this service for your + organisation +
  • +
+ + ); +}; + +export default ReviewSummaryDescription; diff --git a/app/src/helpers/requests/downloadReport.test.ts b/app/src/helpers/requests/downloadReport.test.ts index 4c68e62574..cdb490645c 100644 --- a/app/src/helpers/requests/downloadReport.test.ts +++ b/app/src/helpers/requests/downloadReport.test.ts @@ -47,7 +47,7 @@ describe('downloadReport', () => { 'Content-Type': '', Authorization: 'token', } as AuthHeaders, - odsReportType: REPORT_TYPE.ODS_REVIEW_SUMMARY + odsReportType: REPORT_TYPE.ODS_PATIENT_SUMMARY, }; const getSpy = vi.spyOn(mockedAxios, 'get'); @@ -77,7 +77,7 @@ describe('downloadReport', () => { 'Content-Type': '', Authorization: 'token', } as AuthHeaders, - odsReportType: REPORT_TYPE.ODS_REVIEW_SUMMARY + odsReportType: REPORT_TYPE.ODS_REVIEW_SUMMARY, }; let errorCode; @@ -92,7 +92,7 @@ describe('downloadReport', () => { expect(errorCode).toBe(404); expect(getSpy).toHaveBeenCalledWith(args.baseUrl + report.endpoint, { headers: args.baseHeaders, - params: { outputFileFormat: args.fileType, odsReportType: 'PATIENT' }, + params: { outputFileFormat: args.fileType, odsReportType: 'REVIEW' }, }); }); }); diff --git a/app/src/helpers/requests/downloadReport.ts b/app/src/helpers/requests/downloadReport.ts index 6a74369a44..a9bd222718 100644 --- a/app/src/helpers/requests/downloadReport.ts +++ b/app/src/helpers/requests/downloadReport.ts @@ -13,7 +13,13 @@ type Args = { type DownloadReportResponseData = { data: { url: string }; }; -const downloadReport = async ({ report, fileType, baseUrl, baseHeaders, odsReportType }: Args): Promise => { +const downloadReport = async ({ + report, + fileType, + baseUrl, + baseHeaders, + odsReportType, +}: Args): Promise => { const gatewayUrl = baseUrl + report.endpoint; try { diff --git a/app/src/types/generic/reports.ts b/app/src/types/generic/reports.ts index 468ef7eef0..90846dda7e 100644 --- a/app/src/types/generic/reports.ts +++ b/app/src/types/generic/reports.ts @@ -1,5 +1,6 @@ import LloydGeorgeSummaryDescription from '../../components/blocks/_downloadReport/downloadReportSelectStage/ReportDescriptions/LloydGeorgeSummaryDescription'; import { endpoints } from './endpoints'; +import ReviewSummaryDescription from '../../components/blocks/_downloadReport/downloadReportSelectStage/ReportDescriptions/ReviewSummaryDescription'; export enum REPORT_TYPE { ODS_PATIENT_SUMMARY = 'PATIENT', @@ -35,12 +36,10 @@ export const reports: ReportData[] = [ reportType: REPORT_TYPE.ODS_PATIENT_SUMMARY, endpoint: endpoints.ODS_REPORT, }, - { + { title: 'Documents review summary report', - description: LloydGeorgeSummaryDescription, - fileTypes: [ - { extension: 'csv', label: 'a CSV' }, - ], + description: ReviewSummaryDescription, + fileTypes: [{ extension: 'csv', label: 'a CSV' }], reportType: REPORT_TYPE.ODS_REVIEW_SUMMARY, endpoint: endpoints.ODS_REPORT, }, From 73de2c14fd83a037eb13955695c261030cb58096 Mon Sep 17 00:00:00 2001 From: NogaNHS <127490765+NogaNHS@users.noreply.github.com> Date: Mon, 5 Jan 2026 16:11:51 +0000 Subject: [PATCH 04/15] [PRMP-915] Update download report functionality to use dynamic report types and add tests for download link --- .../_admin/reviewsPage/ReviewsPage.test.tsx | 59 +++++++++++++++++++ .../DownloadReportSelectStage.tsx | 1 - .../helpers/requests/downloadReport.test.ts | 7 +-- app/src/helpers/requests/downloadReport.ts | 6 +- 4 files changed, 64 insertions(+), 9 deletions(-) diff --git a/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.test.tsx b/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.test.tsx index 1fb2240638..0885f268c2 100644 --- a/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.test.tsx +++ b/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.test.tsx @@ -746,4 +746,63 @@ describe('ReviewsPage', () => { }); }); }); + + describe('Date Display', () => { + it('displays date uploaded correctly', async () => { + renderComponent(); + + await waitFor(() => { + expect(screen.getByText('2024-01-15')).toBeInTheDocument(); + }); + + expect(screen.getByText('2024-01-16')).toBeInTheDocument(); + }); + }); + + describe('Report Download Link', () => { + it('renders download report link with correct href', async () => { + renderComponent(); + + await waitFor(() => { + expect(screen.getByText('900 000 0001')).toBeInTheDocument(); + }); + + const downloadLink = screen.getByText('Download a report on this data'); + expect(downloadLink).toBeInTheDocument(); + expect(downloadLink).toHaveAttribute('href', '/create-report?reportType=REVIEW'); + }); + }); + + describe('Multiple Reviews', () => { + it('renders all review items correctly', async () => { + const multipleReviewsResponse: ReviewsResponse = { + documentReviewReferences: [ + ...mockReviewsResponse.documentReviewReferences, + { + id: '3', + nhsNumber: '9000000003', + document_snomed_code_type: '16521000000101' as DOCUMENT_TYPE, + odsCode: 'Y11111', + dateUploaded: '2024-01-17', + reviewReason: 'Another reason', + }, + ], + nextPageToken: '4', + count: 3, + }; + + mockGetReviews.mockResolvedValue(multipleReviewsResponse); + renderComponent(); + + await waitFor(() => { + expect(screen.getByText('900 000 0001')).toBeInTheDocument(); + }); + + expect(screen.getByText('900 000 0002')).toBeInTheDocument(); + expect(screen.getByText('900 000 0003')).toBeInTheDocument(); + expect(screen.getByTestId('view-record-link-1')).toBeInTheDocument(); + expect(screen.getByTestId('view-record-link-2')).toBeInTheDocument(); + expect(screen.getByTestId('view-record-link-3')).toBeInTheDocument(); + }); + }); }); diff --git a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx index a1b3100650..473b0f1bfe 100644 --- a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx +++ b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx @@ -90,7 +90,6 @@ const DownloadReportSelectStage = (props: Props): JSX.Element => { fileType, baseUrl, baseHeaders, - odsReportType: props.report.reportType, }); handleSuccess(); } catch (e) { diff --git a/app/src/helpers/requests/downloadReport.test.ts b/app/src/helpers/requests/downloadReport.test.ts index cdb490645c..9e45730eff 100644 --- a/app/src/helpers/requests/downloadReport.test.ts +++ b/app/src/helpers/requests/downloadReport.test.ts @@ -2,7 +2,7 @@ import axios, { AxiosError } from 'axios'; import downloadReport from './downloadReport'; import { REPORT_TYPE, ReportData } from '../../types/generic/reports'; import { AuthHeaders } from '../../types/blocks/authHeaders'; -import { describe, expect, it, vi, Mocked, beforeEach, afterEach, Mock } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, Mock, Mocked, vi } from 'vitest'; import { Procedure } from '@vitest/spy'; vi.mock('axios'); @@ -12,6 +12,7 @@ const mockedAxios = axios as Mocked; describe('downloadReport', () => { const report = { endpoint: '/download', + reportType: REPORT_TYPE.ODS_REVIEW_SUMMARY, } as ReportData; let clickSpy: Mock; @@ -47,7 +48,6 @@ describe('downloadReport', () => { 'Content-Type': '', Authorization: 'token', } as AuthHeaders, - odsReportType: REPORT_TYPE.ODS_PATIENT_SUMMARY, }; const getSpy = vi.spyOn(mockedAxios, 'get'); @@ -56,7 +56,7 @@ describe('downloadReport', () => { expect(getSpy).toHaveBeenCalledWith(args.baseUrl + report.endpoint, { headers: args.baseHeaders, - params: { outputFileFormat: args.fileType, odsReportType: 'PATIENT' }, + params: { outputFileFormat: args.fileType, odsReportType: 'REVIEW' }, }); expect(mockAnchor.setAttribute).toHaveBeenCalledWith('download', ''); @@ -77,7 +77,6 @@ describe('downloadReport', () => { 'Content-Type': '', Authorization: 'token', } as AuthHeaders, - odsReportType: REPORT_TYPE.ODS_REVIEW_SUMMARY, }; let errorCode; diff --git a/app/src/helpers/requests/downloadReport.ts b/app/src/helpers/requests/downloadReport.ts index a9bd222718..f9cd84e826 100644 --- a/app/src/helpers/requests/downloadReport.ts +++ b/app/src/helpers/requests/downloadReport.ts @@ -1,13 +1,12 @@ import { AuthHeaders } from '../../types/blocks/authHeaders'; import axios, { AxiosError } from 'axios'; -import { REPORT_TYPE, ReportData } from '../../types/generic/reports'; +import { ReportData } from '../../types/generic/reports'; type Args = { report: ReportData; fileType: string; baseUrl: string; baseHeaders: AuthHeaders; - odsReportType: REPORT_TYPE; }; type DownloadReportResponseData = { @@ -18,7 +17,6 @@ const downloadReport = async ({ fileType, baseUrl, baseHeaders, - odsReportType, }: Args): Promise => { const gatewayUrl = baseUrl + report.endpoint; @@ -29,7 +27,7 @@ const downloadReport = async ({ }, params: { outputFileFormat: fileType, - odsReportType: odsReportType, + odsReportType: report.reportType, }, }); From 26662668e2b663aa6a921633772a4a93b2caece6 Mon Sep 17 00:00:00 2001 From: NogaNHS <127490765+NogaNHS@users.noreply.github.com> Date: Mon, 5 Jan 2026 16:15:33 +0000 Subject: [PATCH 05/15] [PRMP-915] clean up --- .../DownloadReportSelectStage.tsx | 2 +- app/src/helpers/requests/downloadReport.ts | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx index 473b0f1bfe..9ec9238d39 100644 --- a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx +++ b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx @@ -1,5 +1,5 @@ import { useNavigate } from 'react-router-dom'; -import { FileTypeData, REPORT_TYPE, ReportData } from '../../../../types/generic/reports'; +import { FileTypeData, ReportData } from '../../../../types/generic/reports'; import { routeChildren, routes } from '../../../../types/generic/routes'; import { BackLink, Button } from 'nhsuk-react-components'; import downloadReport from '../../../../helpers/requests/downloadReport'; diff --git a/app/src/helpers/requests/downloadReport.ts b/app/src/helpers/requests/downloadReport.ts index f9cd84e826..32c1d3b5f0 100644 --- a/app/src/helpers/requests/downloadReport.ts +++ b/app/src/helpers/requests/downloadReport.ts @@ -12,12 +12,7 @@ type Args = { type DownloadReportResponseData = { data: { url: string }; }; -const downloadReport = async ({ - report, - fileType, - baseUrl, - baseHeaders, -}: Args): Promise => { +const downloadReport = async ({ report, fileType, baseUrl, baseHeaders }: Args): Promise => { const gatewayUrl = baseUrl + report.endpoint; try { From 9681edb027f2a7daf38327f62c616bffcc317f20 Mon Sep 17 00:00:00 2001 From: NogaNHS <127490765+NogaNHS@users.noreply.github.com> Date: Mon, 5 Jan 2026 16:33:47 +0000 Subject: [PATCH 06/15] [PRMP-915] Rename build_review_query_filter to build_review_dynamo_filter in test_ods_report_service.py --- lambdas/tests/unit/services/test_ods_report_service.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lambdas/tests/unit/services/test_ods_report_service.py b/lambdas/tests/unit/services/test_ods_report_service.py index 81d95c3374..f554129a71 100644 --- a/lambdas/tests/unit/services/test_ods_report_service.py +++ b/lambdas/tests/unit/services/test_ods_report_service.py @@ -422,7 +422,7 @@ def test_get_documents_for_review( mocker.patch.object( ods_report_service.document_upload_review_service, - "build_review_query_filter", + "build_review_dynamo_filter", return_value=expected_query_filter, ) From 36bd6e14a9d5ef64e9855c6c25c0302fc1a0164e Mon Sep 17 00:00:00 2001 From: NogaNHS <127490765+NogaNHS@users.noreply.github.com> Date: Mon, 5 Jan 2026 16:54:33 +0000 Subject: [PATCH 07/15] [PRMP-915] Update report type in URL for Lloyd George summary downloads --- .../e2e/0-ndr-core-tests/download_lloyd_george_summary.cy.js | 2 +- .../download_lloyd_george_summary_report_workflow.cy.js | 2 +- app/cypress/support/e2e.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/cypress/e2e/0-ndr-core-tests/download_lloyd_george_summary.cy.js b/app/cypress/e2e/0-ndr-core-tests/download_lloyd_george_summary.cy.js index b561a64d2d..cf8265fa1f 100644 --- a/app/cypress/e2e/0-ndr-core-tests/download_lloyd_george_summary.cy.js +++ b/app/cypress/e2e/0-ndr-core-tests/download_lloyd_george_summary.cy.js @@ -33,7 +33,7 @@ describe('GP Workflow: Download Lloyd George summary report', () => { cy.wait('@downloadReportFinished', { timeout: 20000 }); - cy.url().should('contain', Cypress.config('baseUrl') + `${routes.createReportComplete}?reportType=0`); + cy.url().should('contain', Cypress.config('baseUrl') + `${routes.createReportComplete}?reportType=PATIENT`); }, ); }); diff --git a/app/cypress/e2e/1-ndr-smoke-tests/gp_user_workflows/download_lloyd_george_summary_report_workflow.cy.js b/app/cypress/e2e/1-ndr-smoke-tests/gp_user_workflows/download_lloyd_george_summary_report_workflow.cy.js index f1a629025b..f49ce8be79 100644 --- a/app/cypress/e2e/1-ndr-smoke-tests/gp_user_workflows/download_lloyd_george_summary_report_workflow.cy.js +++ b/app/cypress/e2e/1-ndr-smoke-tests/gp_user_workflows/download_lloyd_george_summary_report_workflow.cy.js @@ -33,7 +33,7 @@ describe('GP Workflow: Download Lloyd George summary report', () => { cy.url().should( 'contain', - Cypress.config('baseUrl') + `${routes.createReportComplete}?reportType=0`, + Cypress.config('baseUrl') + `${routes.createReportComplete}?reportType=PATIENT`, ); cy.getByTestId('logout-btn').click(); diff --git a/app/cypress/support/e2e.ts b/app/cypress/support/e2e.ts index 3c60cc17d5..ffc2fec768 100644 --- a/app/cypress/support/e2e.ts +++ b/app/cypress/support/e2e.ts @@ -122,7 +122,7 @@ Cypress.Commands.add('navigateToDownloadReportPage', () => { cy.getByTestId('download-report-btn').should('exist'); cy.getByTestId('download-report-btn').click(); - cy.url().should('contain', baseUrl + `${routes.createReport}?reportType=0`); + cy.url().should('contain', baseUrl + `${routes.createReport}?reportType=PATIENT`); }); declare global { From 057f9e1110244797abc8cfc2f652db98ff4b2246 Mon Sep 17 00:00:00 2001 From: NogaNHS <127490765+NogaNHS@users.noreply.github.com> Date: Tue, 13 Jan 2026 14:45:25 +0000 Subject: [PATCH 08/15] [PRMP-915] clean up after rebase --- .../_admin/reviewsPage/ReviewsPage.test.tsx | 45 ------------------- 1 file changed, 45 deletions(-) diff --git a/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.test.tsx b/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.test.tsx index 0885f268c2..fdd0a796e0 100644 --- a/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.test.tsx +++ b/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.test.tsx @@ -747,18 +747,6 @@ describe('ReviewsPage', () => { }); }); - describe('Date Display', () => { - it('displays date uploaded correctly', async () => { - renderComponent(); - - await waitFor(() => { - expect(screen.getByText('2024-01-15')).toBeInTheDocument(); - }); - - expect(screen.getByText('2024-01-16')).toBeInTheDocument(); - }); - }); - describe('Report Download Link', () => { it('renders download report link with correct href', async () => { renderComponent(); @@ -772,37 +760,4 @@ describe('ReviewsPage', () => { expect(downloadLink).toHaveAttribute('href', '/create-report?reportType=REVIEW'); }); }); - - describe('Multiple Reviews', () => { - it('renders all review items correctly', async () => { - const multipleReviewsResponse: ReviewsResponse = { - documentReviewReferences: [ - ...mockReviewsResponse.documentReviewReferences, - { - id: '3', - nhsNumber: '9000000003', - document_snomed_code_type: '16521000000101' as DOCUMENT_TYPE, - odsCode: 'Y11111', - dateUploaded: '2024-01-17', - reviewReason: 'Another reason', - }, - ], - nextPageToken: '4', - count: 3, - }; - - mockGetReviews.mockResolvedValue(multipleReviewsResponse); - renderComponent(); - - await waitFor(() => { - expect(screen.getByText('900 000 0001')).toBeInTheDocument(); - }); - - expect(screen.getByText('900 000 0002')).toBeInTheDocument(); - expect(screen.getByText('900 000 0003')).toBeInTheDocument(); - expect(screen.getByTestId('view-record-link-1')).toBeInTheDocument(); - expect(screen.getByTestId('view-record-link-2')).toBeInTheDocument(); - expect(screen.getByTestId('view-record-link-3')).toBeInTheDocument(); - }); - }); }); From abf6663d9e6953cfde03ccec36ea9778ffdb1df4 Mon Sep 17 00:00:00 2001 From: NogaNHS <127490765+NogaNHS@users.noreply.github.com> Date: Tue, 13 Jan 2026 14:50:00 +0000 Subject: [PATCH 09/15] [PRMP-915] Update alignment class for document review section in ReviewsPage --- app/src/components/blocks/_admin/reviewsPage/ReviewsPage.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.tsx b/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.tsx index 441bec98f5..5b4350539c 100644 --- a/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.tsx +++ b/app/src/components/blocks/_admin/reviewsPage/ReviewsPage.tsx @@ -272,7 +272,7 @@ export const ReviewsPage = ({ setReviewData }: ReviewsPageProps): React.JSX.Elem

-
+
From 3d469345b4bac3d5c8afe1b3cc5a1a0bcd818c06 Mon Sep 17 00:00:00 2001 From: NogaNHS <127490765+NogaNHS@users.noreply.github.com> Date: Wed, 28 Jan 2026 11:04:21 +0000 Subject: [PATCH 10/15] [PRMP-915] Update report download link to use 'PATIENT' report type --- app/src/pages/adminPage/AdminPage.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/pages/adminPage/AdminPage.test.tsx b/app/src/pages/adminPage/AdminPage.test.tsx index d0654e26db..3074033dd4 100644 --- a/app/src/pages/adminPage/AdminPage.test.tsx +++ b/app/src/pages/adminPage/AdminPage.test.tsx @@ -55,7 +55,7 @@ describe('AdminPage', (): void => { it('renders the Download a report card with correct href', (): void => { render(); const reportLink = screen.getByTestId('download-report-btn'); - expect(reportLink).toHaveAttribute('href', '/create-report?reportType=0'); + expect(reportLink).toHaveAttribute('href', '/create-report?reportType=PATIENT'); }); it('renders the Download a report card description', (): void => { From e27b5afaacb9144a7a61ba13da736e6e84751a29 Mon Sep 17 00:00:00 2001 From: NogaNHS <127490765+NogaNHS@users.noreply.github.com> Date: Thu, 29 Jan 2026 10:30:43 +0000 Subject: [PATCH 11/15] [PRMP-915] Refactor navigation logic in DownloadReportSelectStage to simplify back navigation --- .../downloadReportSelectStage/DownloadReportSelectStage.tsx | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx index b29037eb7b..ba8e3a3236 100644 --- a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx +++ b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx @@ -138,9 +138,7 @@ const DownloadReportSelectStage = (props: Props): JSX.Element => { data-testid="return-to-home-button" asElement="a" href='#' - onClick={(): void => { - uploadV3Enabled ? navigate(routes.ADMIN_ROUTE) : navigate(routes.HOME); - }} + onClick={(): void => {navigate(-1)}} className="mb-5" > {uploadV3Enabled ? 'Go back' : 'Go to home'} From a922c2dcb8a7c893cf328285a0eee66e723dd6be Mon Sep 17 00:00:00 2001 From: NogaNHS <127490765+NogaNHS@users.noreply.github.com> Date: Thu, 29 Jan 2026 10:57:14 +0000 Subject: [PATCH 12/15] [PRMP-915] Replace 'Go to home' link with 'Go back' button in DownloadReportSelectStage --- .../DownloadReportSelectStage.test.tsx | 30 ++++--------------- .../DownloadReportSelectStage.tsx | 11 ++----- 2 files changed, 8 insertions(+), 33 deletions(-) diff --git a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.test.tsx b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.test.tsx index 3f7de871d1..d56d0d29f6 100644 --- a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.test.tsx +++ b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.test.tsx @@ -12,7 +12,6 @@ import { beforeEach, describe, expect, it, vi, MockedFunction, Mock } from 'vite const mockDownloadReport = downloadReport as MockedFunction; const mockUseConfig = vi.fn(); - const mockedUseNavigate = vi.fn(); vi.mock('react-router-dom', async () => { const actual = await vi.importActual('react-router-dom'); @@ -46,7 +45,7 @@ describe('DownloadReportSelectStage', () => { const report = getReportByType(REPORT_TYPE.ODS_PATIENT_SUMMARY); render(); - expect(screen.getByTestId('return-to-home-button')).toBeInTheDocument(); + expect(screen.getByTestId('go-back-button')).toBeInTheDocument(); const title = screen.getByTestId('title'); expect(title).toBeInTheDocument(); expect(title.innerHTML).toContain(report!.title); @@ -56,7 +55,7 @@ describe('DownloadReportSelectStage', () => { ).toBeInTheDocument(); }); expect(screen.queryByTestId('error-notification-banner')).not.toBeInTheDocument(); - expect(screen.getByText('Go to home')).toBeInTheDocument(); + expect(screen.getByText('Go back')).toBeInTheDocument(); }); it('should render error notification when download fails', async () => { @@ -107,33 +106,16 @@ describe('DownloadReportSelectStage', () => { }); }); - it('should navigate to home when clicking go to home link', async () => { + it('should navigate to back when clicking go back link', async () => { const report = getReportByType(REPORT_TYPE.ODS_PATIENT_SUMMARY); render(); - - await userEvent.click(screen.getByText('Go to home')); - await waitFor(() => { - expect(mockedUseNavigate).toHaveBeenCalledWith(routes.HOME); - }); - }); - - it ('should navigate to admin hub, upload version 3 enabled', async () => { - mockUseConfig.mockReturnValue({ - featureFlags: { uploadDocumentIteration3Enabled: true }, - }); - - const report = getReportByType(REPORT_TYPE.ODS_PATIENT_SUMMARY); - render(); - let backLink: Element; - backLink = screen.getByTestId('return-to-home-button'); - + backLink = screen.getByTestId('go-back-button'); expect(backLink).toHaveTextContent('Go back'); await userEvent.click(backLink); - await waitFor(() => { - expect(mockedUseNavigate).toHaveBeenCalledWith(routes.ADMIN_ROUTE); - }) + expect(mockedUseNavigate).toHaveBeenCalledWith(-1); + }); }); }); diff --git a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx index ba8e3a3236..81c94a4caa 100644 --- a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx +++ b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx @@ -12,6 +12,7 @@ import { JSX, ReactNode, useRef } from 'react'; import NotificationBanner from '../../../layout/notificationBanner/NotificationBanner'; import SpinnerButton from '../../../generic/spinnerButton/SpinnerButton'; import React from 'react'; +import BackButton from '../../../generic/backButton/BackButton'; type Props = { report: ReportData; @@ -134,15 +135,7 @@ const DownloadReportSelectStage = (props: Props): JSX.Element => { return ( <> - {navigate(-1)}} - className="mb-5" - > - {uploadV3Enabled ? 'Go back' : 'Go to home'} - + {downloadError && ( Date: Thu, 29 Jan 2026 11:12:09 +0000 Subject: [PATCH 13/15] Remove unused BackLink import in DownloadReportSelectStage --- .../downloadReportSelectStage/DownloadReportSelectStage.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx index 81c94a4caa..c2fcc12f0f 100644 --- a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx +++ b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx @@ -1,7 +1,7 @@ import { useNavigate } from 'react-router-dom'; import { FileTypeData, ReportData } from '../../../../types/generic/reports'; import { routeChildren, routes } from '../../../../types/generic/routes'; -import { BackLink, Button } from 'nhsuk-react-components'; +import { Button } from 'nhsuk-react-components'; import downloadReport from '../../../../helpers/requests/downloadReport'; import useBaseAPIUrl from '../../../../helpers/hooks/useBaseAPIUrl'; import useBaseAPIHeaders from '../../../../helpers/hooks/useBaseAPIHeaders'; @@ -31,7 +31,6 @@ const DownloadReportSelectStage = (props: Props): JSX.Element => { navigate(`${routeChildren.REPORT_DOWNLOAD_COMPLETE}?reportType=${props.report.reportType}`); }; - const uploadV3Enabled: boolean = !!config.featureFlags.uploadDocumentIteration3Enabled; const noDataContent = (): JSX.Element => { return ( <> From ac2714a9baad2b4d4f8026fac98de95a4e4458ad Mon Sep 17 00:00:00 2001 From: NogaNHS <127490765+NogaNHS@users.noreply.github.com> Date: Thu, 29 Jan 2026 11:25:10 +0000 Subject: [PATCH 14/15] Remove unused useConfig import in DownloadReportSelectStage --- .../downloadReportSelectStage/DownloadReportSelectStage.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx index c2fcc12f0f..8ea05a92f6 100644 --- a/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx +++ b/app/src/components/blocks/_downloadReport/downloadReportSelectStage/DownloadReportSelectStage.tsx @@ -5,7 +5,6 @@ import { Button } from 'nhsuk-react-components'; import downloadReport from '../../../../helpers/requests/downloadReport'; import useBaseAPIUrl from '../../../../helpers/hooks/useBaseAPIUrl'; import useBaseAPIHeaders from '../../../../helpers/hooks/useBaseAPIHeaders'; -import useConfig from '../../../../helpers/hooks/useConfig'; import { AxiosError } from 'axios'; import { isMock } from '../../../../helpers/utils/isLocal'; import { JSX, ReactNode, useRef } from 'react'; @@ -21,7 +20,6 @@ type Props = { const DownloadReportSelectStage = (props: Props): JSX.Element => { const baseUrl = useBaseAPIUrl(); const baseHeaders = useBaseAPIHeaders(); - const config = useConfig(); const navigate = useNavigate(); const [downloading, setDownloading] = React.useState(false); const [downloadError, setDownloadError] = React.useState(null); From 7a2f00297c0c0de2b8d6230450c4a94ac766dfa8 Mon Sep 17 00:00:00 2001 From: NogaNHS <127490765+NogaNHS@users.noreply.github.com> Date: Thu, 29 Jan 2026 16:56:25 +0000 Subject: [PATCH 15/15] Prevent default action on download report button click in HomePage --- app/src/pages/homePage/HomePage.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/pages/homePage/HomePage.tsx b/app/src/pages/homePage/HomePage.tsx index d24a8cb0cc..02252a3934 100644 --- a/app/src/pages/homePage/HomePage.tsx +++ b/app/src/pages/homePage/HomePage.tsx @@ -93,7 +93,8 @@ const HomePage = (): React.JSX.Element => { { + onClick={(e): void => { + e.preventDefault() navigate( `${routes.REPORT_DOWNLOAD}?reportType=${REPORT_TYPE.ODS_PATIENT_SUMMARY}`, );