diff --git a/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ReviewDetailsAssessmentStage.test.tsx b/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ReviewDetailsAssessmentStage.test.tsx
index af9ed6b839..0c269d70ed 100644
--- a/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ReviewDetailsAssessmentStage.test.tsx
+++ b/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ReviewDetailsAssessmentStage.test.tsx
@@ -71,7 +71,7 @@ vi.mock('./ExistingRecordTable', () => ({
}));
vi.mock(
- '../../_documentUpload/documentUploadLloydGeorgePreview/DocumentUploadLloydGeorgePreview',
+ '../../_documentManagement/documentUploadLloydGeorgePreview/DocumentUploadLloydGeorgePreview',
() => ({
default: ({
documents,
diff --git a/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ReviewDetailsAssessmentStage.tsx b/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ReviewDetailsAssessmentStage.tsx
index 340e70abbb..8f06f06759 100644
--- a/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ReviewDetailsAssessmentStage.tsx
+++ b/app/src/components/blocks/_admin/reviewDetailsAssessmentStage/ReviewDetailsAssessmentStage.tsx
@@ -24,7 +24,7 @@ import {
ReviewUploadDocument,
UploadDocumentType,
} from '../../../../types/pages/UploadDocumentsPage/types';
-import DocumentUploadLloydGeorgePreview from '../../_documentUpload/documentUploadLloydGeorgePreview/DocumentUploadLloydGeorgePreview';
+import DocumentUploadLloydGeorgePreview from '../../_documentManagement/documentUploadLloydGeorgePreview/DocumentUploadLloydGeorgePreview';
import { AxiosError } from 'axios';
import { errorToParams } from '../../../../helpers/utils/errorToParams';
import PatientSummary, { PatientInfo } from '../../../generic/patientSummary/PatientSummary';
diff --git a/app/src/components/blocks/_admin/reviewDetailsDocumentRemoveAllStage/ReviewDetailsDocumentRemoveAllStage.tsx b/app/src/components/blocks/_admin/reviewDetailsDocumentRemoveAllStage/ReviewDetailsDocumentRemoveAllStage.tsx
index 2da1b7888b..3b9a91d648 100644
--- a/app/src/components/blocks/_admin/reviewDetailsDocumentRemoveAllStage/ReviewDetailsDocumentRemoveAllStage.tsx
+++ b/app/src/components/blocks/_admin/reviewDetailsDocumentRemoveAllStage/ReviewDetailsDocumentRemoveAllStage.tsx
@@ -7,7 +7,7 @@ import {
UploadDocumentType,
} from '../../../../types/pages/UploadDocumentsPage/types';
import Spinner from '../../../generic/spinner/Spinner';
-import DocumentUploadRemoveFilesStage from '../../_documentUpload/documentUploadRemoveFilesStage/DocumentUploadRemoveFilesStage';
+import DocumentUploadRemoveFilesStage from '../../_documentManagement/documentUploadRemoveFilesStage/DocumentUploadRemoveFilesStage';
import BackButton from '../../../generic/backButton/BackButton';
type ReviewDetailsDocumentRemoveAllStageProps = {
diff --git a/app/src/components/blocks/_admin/reviewDetailsDocumentSelectOrderStage/ReviewDetailsDocumentSelectOrderStage.test.tsx b/app/src/components/blocks/_admin/reviewDetailsDocumentSelectOrderStage/ReviewDetailsDocumentSelectOrderStage.test.tsx
index b3cdd7f462..b931ac7112 100644
--- a/app/src/components/blocks/_admin/reviewDetailsDocumentSelectOrderStage/ReviewDetailsDocumentSelectOrderStage.test.tsx
+++ b/app/src/components/blocks/_admin/reviewDetailsDocumentSelectOrderStage/ReviewDetailsDocumentSelectOrderStage.test.tsx
@@ -7,7 +7,7 @@ import { ReviewDetails } from '../../../../types/generic/reviews';
import { UploadDocument } from '../../../../types/pages/UploadDocumentsPage/types';
import userEvent from '@testing-library/user-event';
-vi.mock('../../_documentUpload/documentSelectOrderStage/DocumentSelectOrderStage', () => ({
+vi.mock('../../_documentManagement/documentSelectOrderStage/DocumentSelectOrderStage', () => ({
default: vi.fn(
({ documents, setDocuments, setMergedPdfBlob, existingDocuments, onSuccess }) => (
diff --git a/app/src/components/blocks/_admin/reviewDetailsDocumentSelectOrderStage/ReviewDetailsDocumentSelectOrderStage.tsx b/app/src/components/blocks/_admin/reviewDetailsDocumentSelectOrderStage/ReviewDetailsDocumentSelectOrderStage.tsx
index 2ca7a98cad..2352ca3028 100644
--- a/app/src/components/blocks/_admin/reviewDetailsDocumentSelectOrderStage/ReviewDetailsDocumentSelectOrderStage.tsx
+++ b/app/src/components/blocks/_admin/reviewDetailsDocumentSelectOrderStage/ReviewDetailsDocumentSelectOrderStage.tsx
@@ -7,7 +7,7 @@ import {
UploadDocument,
} from '../../../../types/pages/UploadDocumentsPage/types';
import Spinner from '../../../generic/spinner/Spinner';
-import DocumentSelectOrderStage from '../../_documentUpload/documentSelectOrderStage/DocumentSelectOrderStage';
+import DocumentSelectOrderStage from '../../_documentManagement/documentSelectOrderStage/DocumentSelectOrderStage';
import { getConfigForDocType } from '../../../../helpers/utils/documentType';
type Props = {
diff --git a/app/src/components/blocks/_admin/reviewDetailsDocumentSelectStage/ReviewDetailsDocumentSelectStage.tsx b/app/src/components/blocks/_admin/reviewDetailsDocumentSelectStage/ReviewDetailsDocumentSelectStage.tsx
index 045a38e4b9..3057a30426 100644
--- a/app/src/components/blocks/_admin/reviewDetailsDocumentSelectStage/ReviewDetailsDocumentSelectStage.tsx
+++ b/app/src/components/blocks/_admin/reviewDetailsDocumentSelectStage/ReviewDetailsDocumentSelectStage.tsx
@@ -1,5 +1,5 @@
import { JSX, useEffect, useRef, useState } from 'react';
-import DocumentSelectStage from '../../_documentUpload/documentSelectStage/DocumentSelectStage';
+import DocumentSelectStage from '../../_documentManagement/documentSelectStage/DocumentSelectStage';
import { getConfigForDocType } from '../../../../helpers/utils/documentType';
import { useNavigate } from 'react-router-dom';
import { ReviewDetails } from '../../../../types/generic/reviews';
diff --git a/app/src/components/blocks/_admin/reviewDetailsDocumentUploadingStage/ReviewDetailsDocumentUploadingStage.test.tsx b/app/src/components/blocks/_admin/reviewDetailsDocumentUploadingStage/ReviewDetailsDocumentUploadingStage.test.tsx
index 65719e502b..cab54026a9 100644
--- a/app/src/components/blocks/_admin/reviewDetailsDocumentUploadingStage/ReviewDetailsDocumentUploadingStage.test.tsx
+++ b/app/src/components/blocks/_admin/reviewDetailsDocumentUploadingStage/ReviewDetailsDocumentUploadingStage.test.tsx
@@ -50,7 +50,7 @@ vi.mock('../../../../helpers/utils/urlManipulations', () => ({
},
}));
-vi.mock('../../_documentUpload/documentUploadingStage/DocumentUploadingStage', () => ({
+vi.mock('../../_documentManagement/documentUploadingStage/DocumentUploadingStage', () => ({
default: ({ documents, startUpload }: any): JSX.Element => (
);
diff --git a/app/src/components/generic/recordCard/RecordCard.tsx b/app/src/components/generic/recordCard/RecordCard.tsx
index ec8ea9b271..eecc309787 100644
--- a/app/src/components/generic/recordCard/RecordCard.tsx
+++ b/app/src/components/generic/recordCard/RecordCard.tsx
@@ -16,6 +16,7 @@ export type RecordLayoutProps = {
detailsElement: ReactNode;
isFullScreen: boolean;
recordLinks?: Array;
+ linksElement?: ReactNode;
setStage?: Dispatch>;
showMenu?: boolean;
children?: ReactNode;
@@ -27,6 +28,7 @@ export const RecordLayout = ({
heading,
fullScreenHandler,
recordLinks = [],
+ linksElement,
setStage = (): void => {},
showMenu = false,
children,
@@ -64,11 +66,13 @@ export const RecordLayout = ({
{detailsElement}
-
+ {linksElement || (
+
+ )}
{children}
@@ -83,6 +87,7 @@ const RecordCard = ({
isFullScreen,
pdfObjectUrl,
recordLinks = [],
+ linksElement,
setStage = (): void => {},
showMenu = false,
}: RecordCardProps): React.JSX.Element => {
@@ -108,6 +113,7 @@ const RecordCard = ({
heading={heading}
fullScreenHandler={fullScreenHandler}
recordLinks={recordLinks}
+ linksElement={linksElement}
setStage={setStage}
showMenu={showMenu}
>
diff --git a/app/src/components/generic/recordMenuCard/RecordMenuCard.test.tsx b/app/src/components/generic/recordMenuCard/RecordMenuCard.test.tsx
index e09725e6fc..ffbfce6c63 100644
--- a/app/src/components/generic/recordMenuCard/RecordMenuCard.test.tsx
+++ b/app/src/components/generic/recordMenuCard/RecordMenuCard.test.tsx
@@ -5,7 +5,6 @@ import { LGRecordActionLink, RECORD_ACTION } from '../../../types/blocks/lloydGe
import { REPOSITORY_ROLE } from '../../../types/generic/authRole';
import { LinkProps } from 'react-router-dom';
import { LG_RECORD_STAGE } from '../../../types/blocks/lloydGeorgeStages';
-import { routes } from '../../../types/generic/routes';
import userEvent from '@testing-library/user-event';
import { afterEach, beforeEach, describe, expect, it, vi, Mock } from 'vitest';
@@ -13,18 +12,10 @@ vi.mock('../../../helpers/hooks/useRole');
const mockSetStage = vi.fn();
const mockedUseNavigate = vi.fn();
const mockedUseRole = useRole as Mock;
-const mockShowDownloadAndRemoveConfirmation = vi.fn();
const mockLinks: Array = [
{
- label: 'Upload files',
- key: 'upload-files-link',
- type: RECORD_ACTION.UPDATE,
- href: routes.HOME,
- unauthorised: [REPOSITORY_ROLE.GP_CLINICAL],
- showIfRecordInStorage: false,
- },
- {
+ index: 1,
label: 'Remove files',
key: 'delete-all-files-link',
type: RECORD_ACTION.UPDATE,
@@ -33,20 +24,13 @@ const mockLinks: Array = [
showIfRecordInStorage: true,
},
{
+ index: 0,
label: 'Download files',
key: 'download-all-files-link',
type: RECORD_ACTION.DOWNLOAD,
stage: LG_RECORD_STAGE.DOWNLOAD_ALL,
- unauthorised: [REPOSITORY_ROLE.GP_CLINICAL],
- showIfRecordInStorage: true,
- },
- {
- label: 'Download and remove files',
- key: 'download-and-remove-all-files-link',
- type: RECORD_ACTION.DOWNLOAD,
- unauthorised: [REPOSITORY_ROLE.GP_CLINICAL],
+ unauthorised: [],
showIfRecordInStorage: true,
- onClick: mockShowDownloadAndRemoveConfirmation,
},
];
@@ -71,7 +55,6 @@ describe('RecordMenuCard', () => {
,
);
expect(screen.getByRole('link', { name: 'Remove files' })).toBeInTheDocument();
- expect(screen.getByRole('link', { name: 'Upload files' })).toBeInTheDocument();
expect(screen.getByRole('link', { name: 'Download files' })).toBeInTheDocument();
});
@@ -87,7 +70,6 @@ describe('RecordMenuCard', () => {
showMenu={true}
/>,
);
- expect(screen.getByRole('link', { name: 'Upload files' })).toBeInTheDocument();
expect(screen.getByRole('link', { name: 'Remove files' })).toBeInTheDocument();
expect(screen.queryByRole('link', { name: 'Download files' })).not.toBeInTheDocument();
@@ -103,7 +85,6 @@ describe('RecordMenuCard', () => {
);
expect(screen.getByRole('link', { name: 'Download files' })).toBeInTheDocument();
- expect(screen.queryByRole('link', { name: 'Upload files' })).not.toBeInTheDocument();
expect(screen.queryByRole('link', { name: 'Remove files' })).not.toBeInTheDocument();
});
@@ -114,21 +95,6 @@ describe('RecordMenuCard', () => {
expect(container).toBeEmptyDOMElement();
});
- it('render menu item as a if link item does not have stage or href', async () => {
- render(
- ,
- );
- expect(
- screen.getByRole('button', { name: 'Download and remove files' }),
- ).toBeInTheDocument();
-
- await userEvent.click(
- screen.getByRole('button', { name: 'Download and remove files' }),
- );
-
- expect(mockShowDownloadAndRemoveConfirmation).toBeCalledTimes(1);
- });
-
it('Does not render the MenuCard if showMenu is false', () => {
const { container } = render(
,
@@ -138,15 +104,6 @@ describe('RecordMenuCard', () => {
});
describe('Navigation', () => {
- it('navigates to href when clicked', async () => {
- render(
- ,
- );
- expect(screen.getByRole('link', { name: 'Upload files' })).toBeInTheDocument();
- await userEvent.click(screen.getByRole('link', { name: 'Upload files' }));
- expect(mockedUseNavigate).toHaveBeenCalledWith(routes.HOME);
- });
-
it('change stage when clicked', async () => {
render(
,
diff --git a/app/src/config/electronicHealthRecordAttachmentsConfig.json b/app/src/config/electronicHealthRecordAttachmentsConfig.json
index 6f6529f12c..9d3e1d9ce3 100644
--- a/app/src/config/electronicHealthRecordAttachmentsConfig.json
+++ b/app/src/config/electronicHealthRecordAttachmentsConfig.json
@@ -33,6 +33,10 @@
"previewUploadTitle": "Preview electronic health record attachment",
"uploadFilesExtraParagraph": "",
"reviewDocumentTitle": "EHR Attachments",
- "skipDocumentLinkText": "Continue without uploading any EHR attachments"
+ "skipDocumentLinkText": "Continue without uploading any EHR attachments",
+ "choosePagesToRemoveTitle": "",
+ "choosePagesToRemoveWarning": "",
+ "addFilesLinkLabel": "",
+ "reassignPagesLinkLabel": ""
}
}
\ No newline at end of file
diff --git a/app/src/config/electronicHealthRecordConfig.json b/app/src/config/electronicHealthRecordConfig.json
index a251d0ffde..9f9fb2bbed 100644
--- a/app/src/config/electronicHealthRecordConfig.json
+++ b/app/src/config/electronicHealthRecordConfig.json
@@ -37,6 +37,10 @@
"previewUploadTitle": "Preview this electronic health record",
"uploadFilesExtraParagraph": "",
"reviewDocumentTitle": "Electronic health record",
- "skipDocumentLinkText": "Continue without uploading EHR notes"
+ "skipDocumentLinkText": "Continue without uploading EHR notes",
+ "choosePagesToRemoveTitle": "",
+ "choosePagesToRemoveWarning": "",
+ "addFilesLinkLabel": "",
+ "reassignPagesLinkLabel": ""
}
}
\ No newline at end of file
diff --git a/app/src/config/lettersAndDocumentsConfig.json b/app/src/config/lettersAndDocumentsConfig.json
index 0f00538476..0eac177546 100644
--- a/app/src/config/lettersAndDocumentsConfig.json
+++ b/app/src/config/lettersAndDocumentsConfig.json
@@ -31,6 +31,10 @@
"beforeYouUploadTitle": "Before you upload",
"previewUploadTitle": "Preview your PDF files",
"uploadFilesExtraParagraph": "",
- "reviewDocumentTitle": "Letters and documents"
+ "reviewDocumentTitle": "Letters and documents",
+ "choosePagesToRemoveTitle": "",
+ "choosePagesToRemoveWarning": "",
+ "addFilesLinkLabel": "",
+ "reassignPagesLinkLabel": ""
}
}
\ No newline at end of file
diff --git a/app/src/config/lloydGeorgeConfig.json b/app/src/config/lloydGeorgeConfig.json
index a35946e31b..5db32efa93 100644
--- a/app/src/config/lloydGeorgeConfig.json
+++ b/app/src/config/lloydGeorgeConfig.json
@@ -33,6 +33,10 @@
"beforeYouUploadTitle": "Before you upload",
"previewUploadTitle": "Preview these scanned paper notes",
"uploadFilesExtraParagraph": "You can add a note to the patient's electronic health record to say their Lloyd George record is stored in this service. Use SNOMED code 16521000000101.",
- "reviewDocumentTitle": "Scanned paper notes"
+ "reviewDocumentTitle": "Scanned paper notes",
+ "choosePagesToRemoveTitle": "Choose the pages you want to remove from these scanned paper notes",
+ "choosePagesToRemoveWarning": "These notes may contain pages for more than one other patient that you want to remove. Only remove pages for one patient at a time.",
+ "addFilesLinkLabel": "Add files to this patient's notes",
+ "reassignPagesLinkLabel": "Reassign pages in these notes to another patient"
}
}
\ No newline at end of file
diff --git a/app/src/helpers/utils/documentType.ts b/app/src/helpers/utils/documentType.ts
index d1e60497c0..8f0a40ee22 100644
--- a/app/src/helpers/utils/documentType.ts
+++ b/app/src/helpers/utils/documentType.ts
@@ -26,26 +26,30 @@ export type ContentKey =
| 'uploadFilesBulletPoints'
| 'skipDocumentLinkText'
| 'confirmFilesTableTitle'
- | 'confirmFilesTableParagraph';
+ | 'confirmFilesTableParagraph'
+ | 'choosePagesToRemoveTitle'
+ | 'choosePagesToRemoveWarning'
+ | 'addFilesLinkLabel'
+ | 'reassignPagesLinkLabel';
export interface IndividualDocumentTypeContent extends Record {}
// The individual config for each document type
export type DOCUMENT_TYPE_CONFIG = {
- snomedCode: DOCUMENT_TYPE;
+ acceptedFileTypes: string[];
+ associatedSnomed?: DOCUMENT_TYPE;
+ canBeDiscarded: boolean;
+ canBeUpdated: boolean;
+ content: IndividualDocumentTypeContent;
displayName: string;
filenameOverride?: string;
- canBeUpdated: boolean;
- associatedSnomed?: DOCUMENT_TYPE;
+ multifileReview: boolean;
multifileUpload: boolean;
multifileZipped: boolean;
- zippedFilename?: string;
- multifileReview: boolean;
- canBeDiscarded: boolean;
- stitched: boolean;
singleDocumentOnly: boolean;
+ snomedCode: DOCUMENT_TYPE;
+ stitched: boolean;
stitchedFilenamePrefix?: string;
- acceptedFileTypes: string[];
- content: IndividualDocumentTypeContent;
+ zippedFilename?: string;
};
export type DocumentTypeContentKey = 'uploadTitle' | 'uploadDescription';
diff --git a/app/src/pages/documentCorrectPage/DocumentCorrectPage.test.tsx b/app/src/pages/documentCorrectPage/DocumentCorrectPage.test.tsx
new file mode 100644
index 0000000000..dc31ee799d
--- /dev/null
+++ b/app/src/pages/documentCorrectPage/DocumentCorrectPage.test.tsx
@@ -0,0 +1,39 @@
+import { render, RenderResult, screen } from '@testing-library/react';
+import DocumentCorrectPage from './DocumentCorrectPage';
+import { Mock } from 'vitest';
+import { createMemoryHistory } from 'history';
+import * as ReactRouter from 'react-router-dom';
+
+vi.mock('react-router-dom', async () => {
+ const actual = await vi.importActual('react-router-dom');
+ return {
+ ...actual,
+ useNavigate: (): Mock => vi.fn(),
+ };
+});
+
+describe('DocumentCorrectPage', () => {
+ it('renders', () => {
+ renderPage();
+
+ expect(screen.getByText('Document select page')).toBeInTheDocument();
+ });
+});
+
+const renderPage = async (): Promise => {
+ const history = createMemoryHistory({
+ initialEntries: ['/patient/document-reassign/select-pages'],
+ initialIndex: 0,
+ });
+
+ return render(
+
+
+ }
+ />
+
+ ,
+ );
+};
diff --git a/app/src/pages/documentCorrectPage/DocumentCorrectPage.tsx b/app/src/pages/documentCorrectPage/DocumentCorrectPage.tsx
new file mode 100644
index 0000000000..4c0023bb7d
--- /dev/null
+++ b/app/src/pages/documentCorrectPage/DocumentCorrectPage.tsx
@@ -0,0 +1,21 @@
+import { Outlet, Route, Routes } from 'react-router-dom';
+import DocumentSelectPagesStage from '../../components/blocks/_documentManagement/documentSelectPagesStage/DocumentSelectPagesStage';
+import { routeChildren } from '../../types/generic/routes';
+import { getLastURLPath } from '../../helpers/utils/urlManipulations';
+
+const DocumentCorrectPage = (): React.JSX.Element => {
+ return (
+ <>
+
+ }
+ />
+
+
+
+ >
+ );
+};
+
+export default DocumentCorrectPage;
diff --git a/app/src/pages/documentSearchResultsPage/DocumentSearchResultsPage.tsx b/app/src/pages/documentSearchResultsPage/DocumentSearchResultsPage.tsx
index 147d3d76be..118aa964cc 100644
--- a/app/src/pages/documentSearchResultsPage/DocumentSearchResultsPage.tsx
+++ b/app/src/pages/documentSearchResultsPage/DocumentSearchResultsPage.tsx
@@ -142,12 +142,7 @@ const DocumentSearchResultsPage = (): React.JSX.Element => {
await handleViewDocSuccess(documentResponse);
} catch (e) {
const error = e as AxiosError;
- if (isMock(error)) {
- await handleViewDocSuccess({
- url: '/dev/testFile.pdf',
- contentType: activeSearchResult.current?.contentType || 'application/pdf',
- });
- } else if (error.response?.status === 403) {
+ if (error.response?.status === 403) {
navigate(routes.SESSION_EXPIRED);
} else if (error.response?.status === 404) {
await handleViewDocSuccess({
diff --git a/app/src/pages/documentUploadPage/DocumentUploadPage.tsx b/app/src/pages/documentUploadPage/DocumentUploadPage.tsx
index 6bee84c0c1..b92f027891 100644
--- a/app/src/pages/documentUploadPage/DocumentUploadPage.tsx
+++ b/app/src/pages/documentUploadPage/DocumentUploadPage.tsx
@@ -1,14 +1,14 @@
import { AxiosError } from 'axios';
import { useEffect, useRef, useState } from 'react';
import { Outlet, Route, Routes, useLocation } from 'react-router-dom';
-import DocumentSelectFileErrorsPage from '../../components/blocks/_documentUpload/documentSelectFileErrorsPage/DocumentSelectFileErrorsPage';
-import DocumentSelectOrderStage from '../../components/blocks/_documentUpload/documentSelectOrderStage/DocumentSelectOrderStage';
-import DocumentSelectStage from '../../components/blocks/_documentUpload/documentSelectStage/DocumentSelectStage';
-import DocumentUploadCompleteStage from '../../components/blocks/_documentUpload/documentUploadCompleteStage/DocumentUploadCompleteStage';
-import DocumentUploadConfirmStage from '../../components/blocks/_documentUpload/documentUploadConfirmStage/DocumentUploadConfirmStage';
-import DocumentUploadInfectedStage from '../../components/blocks/_documentUpload/documentUploadInfectedStage/DocumentUploadInfectedStage';
-import DocumentUploadingStage from '../../components/blocks/_documentUpload/documentUploadingStage/DocumentUploadingStage';
-import DocumentUploadRemoveFilesStage from '../../components/blocks/_documentUpload/documentUploadRemoveFilesStage/DocumentUploadRemoveFilesStage';
+import DocumentSelectFileErrorsPage from '../../components/blocks/_documentManagement/documentSelectFileErrorsPage/DocumentSelectFileErrorsPage';
+import DocumentSelectOrderStage from '../../components/blocks/_documentManagement/documentSelectOrderStage/DocumentSelectOrderStage';
+import DocumentSelectStage from '../../components/blocks/_documentManagement/documentSelectStage/DocumentSelectStage';
+import DocumentUploadCompleteStage from '../../components/blocks/_documentManagement/documentUploadCompleteStage/DocumentUploadCompleteStage';
+import DocumentUploadConfirmStage from '../../components/blocks/_documentManagement/documentUploadConfirmStage/DocumentUploadConfirmStage';
+import DocumentUploadInfectedStage from '../../components/blocks/_documentManagement/documentUploadInfectedStage/DocumentUploadInfectedStage';
+import DocumentUploadingStage from '../../components/blocks/_documentManagement/documentUploadingStage/DocumentUploadingStage';
+import DocumentUploadRemoveFilesStage from '../../components/blocks/_documentManagement/documentUploadRemoveFilesStage/DocumentUploadRemoveFilesStage';
import useBaseAPIHeaders from '../../helpers/hooks/useBaseAPIHeaders';
import useBaseAPIUrl from '../../helpers/hooks/useBaseAPIUrl';
import useConfig from '../../helpers/hooks/useConfig';
@@ -31,8 +31,7 @@ import { UploadSession } from '../../types/generic/uploadResult';
import {
DOCUMENT_UPLOAD_STATE,
ExistingDocument,
- LocationParams,
- LocationState,
+ DocumentUploadLocationState,
UploadDocument,
} from '../../types/pages/UploadDocumentsPage/types';
import {
@@ -47,13 +46,14 @@ import {
reduceDocumentsForUpload,
startIntervalTimer,
} from '../../helpers/utils/documentUpload';
-import DocumentUploadIndex from '../../components/blocks/_documentUpload/documentUploadIndex/DocumentUploadIndex';
+import DocumentUploadIndex from '../../components/blocks/_documentManagement/documentUploadIndex/DocumentUploadIndex';
+import { LocationParams } from '../../types/generic/location';
const DocumentUploadPage = (): React.JSX.Element => {
const patientDetails = usePatient();
const nhsNumber: string = patientDetails?.nhsNumber ?? '';
const baseUrl = useBaseAPIUrl();
- const location: LocationParams = useLocation();
+ const location: LocationParams = useLocation();
const baseHeaders = useBaseAPIHeaders();
const [documents, setDocuments] = useState>([]);
const [existingDocuments, setExistingDocuments] = useState>([]);
diff --git a/app/src/router/AppRouter.tsx b/app/src/router/AppRouter.tsx
index 5ea538f734..fea7c10a6b 100644
--- a/app/src/router/AppRouter.tsx
+++ b/app/src/router/AppRouter.tsx
@@ -30,6 +30,7 @@ import DocumentUploadPage from '../pages/documentUploadPage/DocumentUploadPage';
import AdminRoutesPage from '../pages/adminRoutesPage/AdminRoutesPage';
import DownloadCompletePage from '../pages/downloadCompletePage/DownloadCompletePage';
import CookiePolicyPage from '../pages/cookiePolicyPage/CookiePolicyPage';
+import DocumentCorrectPage from '../pages/documentCorrectPage/DocumentCorrectPage';
const {
START,
@@ -63,6 +64,8 @@ const {
DOWNLOAD_COMPLETE,
COOKIES_POLICY,
COOKIES_POLICY_WILDCARD,
+ DOCUMENT_REASSIGN_PAGES,
+ DOCUMENT_REASSIGN_PAGES_WILDCARD,
} = routes;
type Routes = {
@@ -166,6 +169,10 @@ export const childRoutes = [
route: routeChildren.COOKIES_POLICY_UPDATED,
parent: COOKIES_POLICY,
},
+ {
+ route: routeChildren.DOCUMENT_REASSIGN_SELECT_PAGES,
+ parent: DOCUMENT_REASSIGN_PAGES,
+ },
];
export const routeMap: Routes = {
@@ -307,6 +314,14 @@ export const routeMap: Routes = {
page: ,
type: ROUTE_TYPE.PUBLIC,
},
+ [DOCUMENT_REASSIGN_PAGES]: {
+ page: ,
+ type: ROUTE_TYPE.PATIENT,
+ },
+ [DOCUMENT_REASSIGN_PAGES_WILDCARD]: {
+ page: ,
+ type: ROUTE_TYPE.PATIENT,
+ },
};
const createRoutesFromType = (routeType: ROUTE_TYPE): Array =>
diff --git a/app/src/styles/App.scss b/app/src/styles/App.scss
index 51cdf9cb34..df80d5fe50 100644
--- a/app/src/styles/App.scss
+++ b/app/src/styles/App.scss
@@ -1304,11 +1304,16 @@ progress:not(.continuous-progress-bar) {
max-width: 960px !important;
}
+.placeholder-text {
+ color: #757575;
+}
+
@import '../components/blocks/_patientDocuments/documentSearchResults/DocumentSearchResults.scss';
-@import '../components/blocks/_documentUpload/documentUploadCompleteStage/DocumentUploadCompleteStage.scss';
+@import '../components/blocks/_documentManagement/documentUploadCompleteStage/DocumentUploadCompleteStage.scss';
@import '../components/blocks/_admin/reviewsPage/ReviewsPage.scss';
@import '../components/generic/paginationV2/Pagination.scss';
@import '../components/generic/spinnerV2/SpinnerV2.scss';
@import '../components/blocks/_admin/reviewDetailsNoFilesChoiceStage/ReviewDetailsNoFilesChoiceStage.scss';
@import '../components/blocks/_admin/reviewDetailsDownloadChoiceStage/ReviewDetailsDownloadChoiceStage.scss';
-@import '../components/blocks/_documentUpload/documentSelectStage/DocumentSelectStage.scss';
+@import '../components/blocks/_documentManagement/documentSelectStage/DocumentSelectStage.scss';
+@import '../components/blocks/_patientDocuments/documentView/DocumentView.scss';
\ No newline at end of file
diff --git a/app/src/types/blocks/lloydGeorgeActions.test.ts b/app/src/types/blocks/lloydGeorgeActions.test.ts
index 29c070d5b3..8406237332 100644
--- a/app/src/types/blocks/lloydGeorgeActions.test.ts
+++ b/app/src/types/blocks/lloydGeorgeActions.test.ts
@@ -9,12 +9,12 @@ describe('getUserRecordActionLinks', () => {
const hasRecordInRepo = true;
const expectedOutput = expect.arrayContaining([
expect.objectContaining({
- label: 'Remove record',
+ label: 'Remove this document',
key: 'delete-files-link',
type: RECORD_ACTION.UPDATE,
}),
expect.objectContaining({
- label: 'Download record',
+ label: 'Download this document',
key: 'download-files-link',
type: RECORD_ACTION.DOWNLOAD,
}),
@@ -41,11 +41,20 @@ describe('getUserRecordActionLinks', () => {
});
describe('When role = GP_CLINICAL', () => {
- it('returns an empty array in any case', () => {
+ it('returns no remove record button', () => {
const role = REPOSITORY_ROLE.GP_CLINICAL;
- expect(getUserRecordActionLinks({ role, hasRecordInStorage: true })).toEqual([]);
- expect(getUserRecordActionLinks({ role, hasRecordInStorage: false })).toEqual([]);
+ const expected = expect.arrayContaining([
+ expect.objectContaining({
+ label: 'Download this document',
+ key: 'download-files-link',
+ type: RECORD_ACTION.DOWNLOAD,
+ }),
+ ]);
+
+ const actual = getUserRecordActionLinks({ role, hasRecordInStorage: true });
+
+ expect(actual).toEqual(expected);
});
});
});
diff --git a/app/src/types/blocks/lloydGeorgeActions.ts b/app/src/types/blocks/lloydGeorgeActions.ts
index 94780e7730..696e69bc94 100644
--- a/app/src/types/blocks/lloydGeorgeActions.ts
+++ b/app/src/types/blocks/lloydGeorgeActions.ts
@@ -11,6 +11,7 @@ export enum RECORD_ACTION {
type ActionRoute = routeChildren | routes;
export type LGRecordActionLink = {
+ index: number;
label: string;
key: string;
stage?: LG_RECORD_STAGE;
@@ -19,22 +20,34 @@ export type LGRecordActionLink = {
type: RECORD_ACTION;
unauthorised?: Array;
showIfRecordInStorage: boolean;
+ description?: string;
};
+export enum ACTION_LINK_KEY {
+ DOWNLOAD = 'download-files-link',
+ DELETE = 'delete-files-link',
+ REASSIGN = 'reassign-pages-link',
+ ADD = 'add-files-link',
+}
+
export const lloydGeorgeRecordLinks: Array = [
{
- label: 'Remove record',
- key: 'delete-files-link',
+ index: 1,
+ label: 'Remove this document',
+ key: ACTION_LINK_KEY.DELETE,
type: RECORD_ACTION.UPDATE,
unauthorised: [REPOSITORY_ROLE.GP_CLINICAL],
href: routeChildren.LLOYD_GEORGE_DELETE,
showIfRecordInStorage: true,
+ description:
+ 'This action will remove all pages of this document from storage in this service.',
},
{
- label: 'Download record',
- key: 'download-files-link',
+ index: 0,
+ label: 'Download this document',
+ key: ACTION_LINK_KEY.DOWNLOAD,
type: RECORD_ACTION.DOWNLOAD,
- unauthorised: [REPOSITORY_ROLE.GP_CLINICAL],
+ unauthorised: [],
href: routeChildren.LLOYD_GEORGE_DOWNLOAD,
showIfRecordInStorage: true,
},
diff --git a/app/src/types/generic/featureFlags.ts b/app/src/types/generic/featureFlags.ts
index 6b6f372051..387f13d680 100644
--- a/app/src/types/generic/featureFlags.ts
+++ b/app/src/types/generic/featureFlags.ts
@@ -4,6 +4,7 @@ export type FeatureFlags = {
uploadArfWorkflowEnabled: boolean;
uploadDocumentIteration2Enabled?: boolean;
uploadDocumentIteration3Enabled?: boolean;
+ documentCorrectEnabled?: boolean;
};
export const defaultFeatureFlags: FeatureFlags = {
@@ -12,4 +13,5 @@ export const defaultFeatureFlags: FeatureFlags = {
uploadArfWorkflowEnabled: false,
uploadDocumentIteration2Enabled: false,
uploadDocumentIteration3Enabled: false,
+ documentCorrectEnabled: false,
};
diff --git a/app/src/types/generic/location.ts b/app/src/types/generic/location.ts
new file mode 100644
index 0000000000..e307f7c661
--- /dev/null
+++ b/app/src/types/generic/location.ts
@@ -0,0 +1,7 @@
+export type LocationParams = {
+ pathname: string;
+ state: T | undefined;
+ search: string;
+ hash: string;
+ key: string;
+};
diff --git a/app/src/types/generic/routes.ts b/app/src/types/generic/routes.ts
index aed587d44b..a5b75d5cda 100644
--- a/app/src/types/generic/routes.ts
+++ b/app/src/types/generic/routes.ts
@@ -27,6 +27,8 @@ export enum routes {
PATIENT_ACCESS_AUDIT_WILDCARD = '/patient/access-audit/*',
DOCUMENT_UPLOAD = '/patient/document-upload',
DOCUMENT_UPLOAD_WILDCARD = '/patient/document-upload/*',
+ DOCUMENT_REASSIGN_PAGES = '/patient/document-reassign-pages',
+ DOCUMENT_REASSIGN_PAGES_WILDCARD = '/patient/document-reassign-pages/*',
MOCK_LOGIN = 'Auth/MockLogin',
@@ -59,6 +61,8 @@ export enum routeChildren {
DOCUMENT_UPLOAD_INFECTED = '/patient/document-upload/infected',
DOCUMENT_UPLOAD_FILE_ERRORS = '/patient/document-upload/file-errors',
+ DOCUMENT_REASSIGN_SELECT_PAGES = '/patient/document-reassign-pages/select-pages',
+
DOCUMENT_VIEW = '/patient/documents/view',
DOCUMENT_DELETE = '/patient/documents/delete',
DOCUMENT_DELETE_CONFIRMATION = '/patient/documents/delete/confirmation',
diff --git a/app/src/types/pages/UploadDocumentsPage/types.ts b/app/src/types/pages/UploadDocumentsPage/types.ts
index 121c6a8b00..707963a205 100644
--- a/app/src/types/pages/UploadDocumentsPage/types.ts
+++ b/app/src/types/pages/UploadDocumentsPage/types.ts
@@ -68,14 +68,7 @@ export type ExistingDocument = {
documentId?: string | null;
versionId: string;
};
-export type LocationState = {
+export type DocumentUploadLocationState = {
journey?: JourneyType;
existingDocuments?: ExistingDocument[];
};
-export type LocationParams = {
- pathname: string;
- state: T | undefined;
- search: string;
- hash: string;
- key: string;
-};
diff --git a/app/src/types/pages/documentCorrect/types.ts b/app/src/types/pages/documentCorrect/types.ts
new file mode 100644
index 0000000000..7e9246296c
--- /dev/null
+++ b/app/src/types/pages/documentCorrect/types.ts
@@ -0,0 +1,5 @@
+import { DocumentReference } from '../documentSearchResultsPage/types';
+
+export type DocumentCorrectLocationState = {
+ documentReference?: DocumentReference;
+};