From c9186a9b653cd19eb0b82651750ac9ce9d4816a4 Mon Sep 17 00:00:00 2001 From: Herrera Date: Thu, 5 Mar 2026 15:08:42 -0800 Subject: [PATCH 1/3] PSP-7782 : Document Manager: document selection and uploading -MP(UI ONLY) --- .../DocumentUploadContainer.test.tsx | 4 +- .../documentUpload/DocumentUploadForm.tsx | 4 +- .../documentUpload/SelectedDocumentHeader.tsx | 46 ++- .../documentUpload/SelectedDocumentRow.tsx | 12 +- .../DocumentUploadReplaceContainer.test.tsx | 66 ++++ .../DocumentUploadReplaceContainer.tsx | 38 ++ .../DocumentUploadReplaceView.test.tsx | 110 ++++++ .../DocumentUploadReplaceView.tsx | 69 ++++ .../DocumentUploadReplaceView.test.tsx.snap | 328 ++++++++++++++++++ .../frontend/src/features/documents/models.ts | 13 +- 10 files changed, 684 insertions(+), 6 deletions(-) create mode 100644 source/frontend/src/features/documents/documentUpload/documentUploadReplace/DocumentUploadReplaceContainer.test.tsx create mode 100644 source/frontend/src/features/documents/documentUpload/documentUploadReplace/DocumentUploadReplaceContainer.tsx create mode 100644 source/frontend/src/features/documents/documentUpload/documentUploadReplace/DocumentUploadReplaceView.test.tsx create mode 100644 source/frontend/src/features/documents/documentUpload/documentUploadReplace/DocumentUploadReplaceView.tsx create mode 100644 source/frontend/src/features/documents/documentUpload/documentUploadReplace/__snapshots__/DocumentUploadReplaceView.test.tsx.snap diff --git a/source/frontend/src/features/documents/documentUpload/DocumentUploadContainer.test.tsx b/source/frontend/src/features/documents/documentUpload/DocumentUploadContainer.test.tsx index 9e40bb1b07..3ea9132664 100644 --- a/source/frontend/src/features/documents/documentUpload/DocumentUploadContainer.test.tsx +++ b/source/frontend/src/features/documents/documentUpload/DocumentUploadContainer.test.tsx @@ -73,6 +73,8 @@ const mockDocumentRelationshipApi = { vi.mock('@/features/documents/hooks/useDocumentRelationshipProvider'); vi.mocked(useDocumentRelationshipProvider).mockReturnValue(mockDocumentRelationshipApi); +const mockFile = new File(['(⌐□_□)'], 'test.png', { type: 'image/png' }); + describe('DocumentUploadContainer component', () => { let viewProps: IDocumentUploadFormProps | undefined; const View: React.FC = props => { @@ -175,7 +177,7 @@ describe('DocumentUploadContainer component', () => { '', [], ); - formDocument.file = new File(['(⌐□_□)'], 'test.png', { type: 'image/png' }); + formDocument.setFile(mockFile); const batchRequest = new BatchUploadFormModel(); batchRequest.documents.push(formDocument); diff --git a/source/frontend/src/features/documents/documentUpload/DocumentUploadForm.tsx b/source/frontend/src/features/documents/documentUpload/DocumentUploadForm.tsx index 54672b18e8..1ab425a507 100644 --- a/source/frontend/src/features/documents/documentUpload/DocumentUploadForm.tsx +++ b/source/frontend/src/features/documents/documentUpload/DocumentUploadForm.tsx @@ -48,8 +48,9 @@ export const DocumentUploadForm: React.FunctionComponent + {formikProps.values.documents.map((formDocument, index) => ( void; + toggleReplacingFile: () => void; // event handlers onDocumentTypeChange: (changeEvent: React.ChangeEvent) => void; onRemove: (index: number) => void; @@ -40,6 +46,9 @@ export const SelectedDocumentHeader: React.FunctionComponent { @@ -98,15 +107,50 @@ export const SelectedDocumentHeader: React.FunctionComponentFile {index + 1}: {truncate(document.file.name, { length: 50 })} + {!replacingFile && ( + { + e.preventDefault(); + e.stopPropagation(); + toggleReplacingFile(); + }} + /> + )} + {replacingFile && ( + { + e.preventDefault(); + e.stopPropagation(); + toggleReplacingFile(); + }} + /> + )} + + {replacingFile && ( + toggleReplacingFile()} + View={DocumentUploadReplaceView} + > + )} + + + + + + + +
+
+

+ Replace with file? : + +

+
+
+ +
+
+ +
+
+ + +`; diff --git a/source/frontend/src/features/documents/models.ts b/source/frontend/src/features/documents/models.ts index cc2bcb3df3..8ae4654562 100644 --- a/source/frontend/src/features/documents/models.ts +++ b/source/frontend/src/features/documents/models.ts @@ -44,19 +44,28 @@ export class DocumentUploadFormData { public documentMetadata: Record; public isDocumentTypeChanged = false; public mayanMetadata: ApiGen_Mayan_DocumentTypeMetadataType[]; - public file: File | null; + private _file: File | null; public constructor( initialStatus: string, documentType: string, metadata: ApiGen_Mayan_DocumentTypeMetadataType[], + file: File = null, ) { this.documentStatusCode = initialStatus; this.documentTypeId = documentType; - this.file = null; + this.setFile(file); this.setMayanMetadata(metadata); } + get file(): File { + return this._file; + } + + setFile(file: File): void { + this._file = file; + } + public setMayanMetadata(metadata: ApiGen_Mayan_DocumentTypeMetadataType[]) { this.mayanMetadata = metadata; this.documentMetadata = {}; From c14494ae1819e16b45a1c960deab9d77d863f768 Mon Sep 17 00:00:00 2001 From: Herrera Date: Fri, 6 Mar 2026 10:29:05 -0800 Subject: [PATCH 2/3] - test updates --- .../DocumentUploadForm.test.tsx | 28 ++++++++++++++++++- .../documentUpload/SelectedDocumentHeader.tsx | 3 ++ .../DocumentUploadReplaceContainer.test.tsx | 1 + .../DocumentUploadReplaceContainer.tsx | 4 ++- .../DocumentUploadReplaceView.test.tsx | 1 + .../DocumentUploadReplaceView.tsx | 4 ++- .../DocumentUploadReplaceView.test.tsx.snap | 4 ++- 7 files changed, 41 insertions(+), 4 deletions(-) diff --git a/source/frontend/src/features/documents/documentUpload/DocumentUploadForm.test.tsx b/source/frontend/src/features/documents/documentUpload/DocumentUploadForm.test.tsx index 36b42f482f..ff395a6ccd 100644 --- a/source/frontend/src/features/documents/documentUpload/DocumentUploadForm.test.tsx +++ b/source/frontend/src/features/documents/documentUpload/DocumentUploadForm.test.tsx @@ -7,7 +7,7 @@ import { mockDocumentTypesResponse } from '@/mocks/documents.mock'; import { mockLookups } from '@/mocks/lookups.mock'; import { ApiGen_Mayan_DocumentTypeMetadataType } from '@/models/api/generated/ApiGen_Mayan_DocumentTypeMetadataType'; import { lookupCodesSlice } from '@/store/slices/lookupCodes'; -import { act, fireEvent, render, RenderOptions, screen } from '@/utils/test-utils'; +import { act, findByTestId, fireEvent, queryByTestId, render, RenderOptions, screen, userEvent, waitForEffects } from '@/utils/test-utils'; import { BatchUploadFormModel, DocumentUploadFormData } from '../models'; import DocumentUploadForm from './DocumentUploadForm'; @@ -140,6 +140,32 @@ describe('DocumentUploadView component', () => { expect(onUploadDocument).toHaveBeenCalled(); }); + it('should enable/disable document replace when replace button clicked', async () => { + const { getByTestId, queryByTestId, formikRef } = setup({ initialValues }); + + expect(formikRef.current).not.toBeNull(); + + // get the upload button + const uploader = getByTestId('upload-input'); + + // simulate upload event and wait until finish + await act(async () => { + fireEvent.change(uploader, { + target: { files: [file] }, + }); + }); + + const enableReplaceBtn = getByTestId('enable-replace-btn-0'); + await act(async () => userEvent.click(enableReplaceBtn)); + await waitForEffects(); + expect(getByTestId(`doc-replacement[0]`)).toBeInTheDocument(); + + const disableReplaceBtn = getByTestId('cancel-replace-btn-0'); + await act(async () => userEvent.click(disableReplaceBtn)); + await waitForEffects(); + expect(queryByTestId(`doc-replacement[0]`)).not.toBeInTheDocument(); + }); + it('should display the number of attached files', async () => { const { getByTestId, formikRef } = setup({ initialValues }); diff --git a/source/frontend/src/features/documents/documentUpload/SelectedDocumentHeader.tsx b/source/frontend/src/features/documents/documentUpload/SelectedDocumentHeader.tsx index 02439c67e6..d291f67823 100644 --- a/source/frontend/src/features/documents/documentUpload/SelectedDocumentHeader.tsx +++ b/source/frontend/src/features/documents/documentUpload/SelectedDocumentHeader.tsx @@ -113,6 +113,7 @@ export const SelectedDocumentHeader: React.FunctionComponent { e.preventDefault(); e.stopPropagation(); @@ -126,6 +127,7 @@ export const SelectedDocumentHeader: React.FunctionComponent { e.preventDefault(); e.stopPropagation(); @@ -138,6 +140,7 @@ export const SelectedDocumentHeader: React.FunctionComponent toggleReplacingFile()} View={DocumentUploadReplaceView} diff --git a/source/frontend/src/features/documents/documentUpload/documentUploadReplace/DocumentUploadReplaceContainer.test.tsx b/source/frontend/src/features/documents/documentUpload/documentUploadReplace/DocumentUploadReplaceContainer.test.tsx index 6ebc0ae50b..e66eb39ec7 100644 --- a/source/frontend/src/features/documents/documentUpload/documentUploadReplace/DocumentUploadReplaceContainer.test.tsx +++ b/source/frontend/src/features/documents/documentUpload/documentUploadReplace/DocumentUploadReplaceContainer.test.tsx @@ -22,6 +22,7 @@ describe('document upload replace container component', () => { ) => { const utils = render( void; onCancelReplaceFile: () => void; View: React.FunctionComponent; @@ -12,7 +13,7 @@ export interface IDocumentUploadReplaceContainerProps { const DocumentUploadReplaceContainer: React.FunctionComponent< IDocumentUploadReplaceContainerProps -> = ({ onReplaceDocumentFile, onCancelReplaceFile, View }) => { +> = ({ index, onReplaceDocumentFile, onCancelReplaceFile, View }) => { const [replacementFile, setReplacementFile] = useState(null); const handleOnSelectedFile = (files: File[]) => { @@ -25,6 +26,7 @@ const DocumentUploadReplaceContainer: React.FunctionComponent< return ( { setReplacementFile(null); onCancelReplaceFile && onCancelReplaceFile(); diff --git a/source/frontend/src/features/documents/documentUpload/documentUploadReplace/DocumentUploadReplaceView.test.tsx b/source/frontend/src/features/documents/documentUpload/documentUploadReplace/DocumentUploadReplaceView.test.tsx index 87df6d16a2..be157ab899 100644 --- a/source/frontend/src/features/documents/documentUpload/documentUploadReplace/DocumentUploadReplaceView.test.tsx +++ b/source/frontend/src/features/documents/documentUpload/documentUploadReplace/DocumentUploadReplaceView.test.tsx @@ -24,6 +24,7 @@ describe('Document upload replacement view', () => { ) => { const utils = render( void; onConfirmReplace: () => void; onCancelReplace: () => void; @@ -18,12 +19,13 @@ export interface IDocumentUploadReplaceViewProps { const DocumentUploadReplaceView: FunctionComponent = ({ file, className, + index, onConfirmReplace, onCancelReplace, onSelectedReplacementFile, }) => { return ( -
+
renders as expected 1`] = ` display: none; } -
+
From 03d206d7ef0e09fc790b839e7b052e6a770611e6 Mon Sep 17 00:00:00 2001 From: Herrera Date: Thu, 12 Mar 2026 11:24:47 -0700 Subject: [PATCH 3/3] - linting --- .../documents/documentUpload/DocumentUploadForm.test.tsx | 2 +- .../documentUploadReplace/DocumentUploadReplaceView.test.tsx | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/source/frontend/src/features/documents/documentUpload/DocumentUploadForm.test.tsx b/source/frontend/src/features/documents/documentUpload/DocumentUploadForm.test.tsx index ff395a6ccd..7214d9ce54 100644 --- a/source/frontend/src/features/documents/documentUpload/DocumentUploadForm.test.tsx +++ b/source/frontend/src/features/documents/documentUpload/DocumentUploadForm.test.tsx @@ -7,7 +7,7 @@ import { mockDocumentTypesResponse } from '@/mocks/documents.mock'; import { mockLookups } from '@/mocks/lookups.mock'; import { ApiGen_Mayan_DocumentTypeMetadataType } from '@/models/api/generated/ApiGen_Mayan_DocumentTypeMetadataType'; import { lookupCodesSlice } from '@/store/slices/lookupCodes'; -import { act, findByTestId, fireEvent, queryByTestId, render, RenderOptions, screen, userEvent, waitForEffects } from '@/utils/test-utils'; +import { act, fireEvent, render, RenderOptions, screen, userEvent, waitForEffects } from '@/utils/test-utils'; import { BatchUploadFormModel, DocumentUploadFormData } from '../models'; import DocumentUploadForm from './DocumentUploadForm'; diff --git a/source/frontend/src/features/documents/documentUpload/documentUploadReplace/DocumentUploadReplaceView.test.tsx b/source/frontend/src/features/documents/documentUpload/documentUploadReplace/DocumentUploadReplaceView.test.tsx index be157ab899..68f2f509c6 100644 --- a/source/frontend/src/features/documents/documentUpload/documentUploadReplace/DocumentUploadReplaceView.test.tsx +++ b/source/frontend/src/features/documents/documentUpload/documentUploadReplace/DocumentUploadReplaceView.test.tsx @@ -1,6 +1,5 @@ import { act, - findAllByTestId, fireEvent, render, RenderOptions,