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.test.tsx b/source/frontend/src/features/documents/documentUpload/DocumentUploadForm.test.tsx index 36b42f482f..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, fireEvent, render, RenderOptions, screen } 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'; @@ -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/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,53 @@ 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 = {};