diff --git a/src/pages/AllAgents/BulkUpload/bulkUploadDrawer.tsx b/src/pages/AllAgents/BulkUpload/bulkUploadDrawer.tsx index a3f72bed..24293d2b 100644 --- a/src/pages/AllAgents/BulkUpload/bulkUploadDrawer.tsx +++ b/src/pages/AllAgents/BulkUpload/bulkUploadDrawer.tsx @@ -3,6 +3,7 @@ import { TabItem, Tabs } from '@navi/web-ui/lib/components'; import { BULK_UPLOAD_DRAWER_TABS, CREATE_NEW, + NDRA, ROLE_OPTIONS, UPDATE_EXISTING, UPLOAD_NUMBERS, @@ -19,6 +20,7 @@ import { SelectPickerOptionProps } from '@cp/src/components/interfaces'; import { RootState } from '@cp/src/store'; import { Roles } from '../../auth/constants/AuthConstants'; import { TabsChild } from '@navi/web-ui/lib/components/Tabs/types'; +import CircularLoaderIcon from '../../Enach/Constants/CircularLoaderIconCopy'; type bulkUploaderDrawerProps = { showUploadDrawer: boolean; @@ -29,11 +31,14 @@ const BulkUploaderDrawer = ({ showUploadDrawer, setShowUploadDrawer }: bulkUploa const isCreateUserFeatureFlag = useSelector( (store: RootState) => store.common.featureFlags?.createUserFeatureFlag ); + const isNdraUploadFeatureFlag = useSelector( + (store: RootState) => store.common.featureFlags?.ndraUploadAccess + ); const user = useSelector((state: RootState) => state.common.userData); const isNumberManagementRole = user?.roles?.includes(Roles.ROLE_NUMBER_MANAGEMENT); - const [selectedTab, setSelectedTab] = useState(CREATE_NEW); + const [selectedTab, setSelectedTab] = useState(); const [createSelectedRole, setCreateSelectedRole] = useState< SelectPickerOptionProps | undefined >(); @@ -46,6 +51,7 @@ const BulkUploaderDrawer = ({ showUploadDrawer, setShowUploadDrawer }: bulkUploa const [createUploadFile, setCreateUploadFile] = useState(null); const [editUploadFile, setEditUploadFile] = useState(null); const [numberUploadFile, setNumberUploadFile] = useState(null); + const [ndraUploadFile, setNdraUploadFile] = useState(null); const handleCreateFileUpload = (file: File) => { setCreateUploadFile(file); @@ -62,18 +68,27 @@ const BulkUploaderDrawer = ({ showUploadDrawer, setShowUploadDrawer }: bulkUploa setUploadedFile(file); }; + const handleNdraFileUpload = (file: File) => { + setNdraUploadFile(file); + setUploadedFile(file); + }; + useEffect(() => { + if (selectedTab) return; if (isCreateUserFeatureFlag) { setSelectedTab(CREATE_NEW); setUploadedFile(createUploadFile); } else if (isNumberManagementRole) { setSelectedTab(UPLOAD_NUMBERS); setUploadedFile(numberUploadFile); + } else if (isNdraUploadFeatureFlag) { + setSelectedTab(NDRA); + setUploadedFile(ndraUploadFile); } else { setSelectedTab(UPDATE_EXISTING); setUploadedFile(editUploadFile); } - }, [isCreateUserFeatureFlag]); + }, [isCreateUserFeatureFlag, isNdraUploadFeatureFlag]); const handleTabChange = (newTab: string) => { setSelectedTab(newTab); @@ -81,6 +96,8 @@ const BulkUploaderDrawer = ({ showUploadDrawer, setShowUploadDrawer }: bulkUploa setUploadedFile(createUploadFile); } else if (newTab === UPDATE_EXISTING) { setUploadedFile(editUploadFile); + } else if (newTab === NDRA) { + setUploadedFile(ndraUploadFile); } else { setUploadedFile(numberUploadFile); } @@ -112,6 +129,37 @@ const BulkUploaderDrawer = ({ showUploadDrawer, setShowUploadDrawer }: bulkUploa setCreateUploadFile(null); setIsUploadDisabled(false); }); + } else if (selectedTab === NDRA && ndraUploadFile) { + const url = getApiUrl(ApiKeys.UPLOAD_NDRA); + const formData = new FormData(); + formData.append('file', ndraUploadFile); + axiosInstance + .post(url, formData, { + headers: { + 'Content-Type': 'multipart/form-data', + donotHandleError: true + } + }) + .then(response => { + toast.success('NDRA upload successful'); + setShowUploadDrawer(false); + }) + .catch(error => { + const errorMessage = error?.response?.data?.message; + toast.error( + errorMessage || ( +
+ Upload failed! Check upload history
+ for more info +
+ ) + ); + setShowUploadDrawer(false); + }) + .finally(() => { + setNdraUploadFile(null); + setIsUploadDisabled(false); + }); } else { if (editUploadFile) { const url = getApiUrl(ApiKeys.UPLOAD_EDIT_AGENTS); @@ -179,6 +227,10 @@ const BulkUploaderDrawer = ({ showUploadDrawer, setShowUploadDrawer }: bulkUploa return createActionType ? !validationOfFile(numberUploadFile) : true; } + if (selectedTab === NDRA) { + return !validationOfFile(ndraUploadFile); + } + if (selectedTab === CREATE_NEW) { return createSelectedRole ? !validationOfFile(createUploadFile) : true; } @@ -191,6 +243,8 @@ const BulkUploaderDrawer = ({ showUploadDrawer, setShowUploadDrawer }: bulkUploa return handleNumberFileUpload; } else if (selectedTab === CREATE_NEW) { return handleCreateFileUpload; + } else if (selectedTab === NDRA) { + return handleNdraFileUpload; } else { return handleEditFileUpload; } @@ -201,6 +255,8 @@ const BulkUploaderDrawer = ({ showUploadDrawer, setShowUploadDrawer }: bulkUploa return numberUploadFile; } else if (selectedTab === CREATE_NEW) { return createUploadFile; + } else if (selectedTab === NDRA) { + return ndraUploadFile; } else { return editUploadFile; } @@ -211,6 +267,8 @@ const BulkUploaderDrawer = ({ showUploadDrawer, setShowUploadDrawer }: bulkUploa return setNumberUploadFile; } else if (selectedTab === CREATE_NEW) { return setCreateUploadFile; + } else if (selectedTab === NDRA) { + return setNdraUploadFile; } else { return setEditUploadFile; } @@ -221,6 +279,8 @@ const BulkUploaderDrawer = ({ showUploadDrawer, setShowUploadDrawer }: bulkUploa return CREATE_NEW; } else if (isNumberManagementRole) { return UPLOAD_NUMBERS; + } else if (isNdraUploadFeatureFlag) { + return NDRA; } else { return UPDATE_EXISTING; } @@ -261,6 +321,9 @@ const BulkUploaderDrawer = ({ showUploadDrawer, setShowUploadDrawer }: bulkUploa if (item.key === UPLOAD_NUMBERS && !isNumberManagementRole) { return acc; } + if (item.key === NDRA && !isNdraUploadFeatureFlag) { + return acc; + } { acc.push( @@ -309,7 +372,10 @@ const BulkUploaderDrawer = ({ showUploadDrawer, setShowUploadDrawer }: bulkUploa ) : null} - Upload a CSV to update user details + Upload a CSV to{' '} + {selectedTab === NDRA + ? 'generate NDRA certificates' + : 'update user details'} + {isUploadDisabled ? ( +
+ + + Validating... + +
+ ) : null} ) : null}
diff --git a/src/pages/AllAgents/BulkUpload/fileUploader.tsx b/src/pages/AllAgents/BulkUpload/fileUploader.tsx index fa3f814d..7c47c1e1 100644 --- a/src/pages/AllAgents/BulkUpload/fileUploader.tsx +++ b/src/pages/AllAgents/BulkUpload/fileUploader.tsx @@ -9,6 +9,7 @@ import ErrorIcon from '@cp/src/assets/icons/ErrorIcon'; import { BULK_UPLOAD_FLOW, CREATE_NEW, + NDRA, ROLE_OPTIONS, UPLOAD_NUMBERS, validationOfFile @@ -31,13 +32,14 @@ const FileUploader = ({ const hiddenFileInput = useRef(null); const [isDragging, setIsDragging] = useState(false); const [hasError, setHasError] = useState(false); - const isSelectedTabCreateNew = selectedTab === CREATE_NEW; const handleDownloadClick = () => { if (selectedTab === CREATE_NEW) { dispatch(downloadSampleFile(BULK_UPLOAD_FLOW.CREATE)); } else if (selectedTab === UPLOAD_NUMBERS) { dispatch(downloadSampleFile(BULK_UPLOAD_FLOW.NUMBER)); + } else if (selectedTab === NDRA) { + dispatch(downloadSampleFile(BULK_UPLOAD_FLOW.NDRA)); } else { dispatch(downloadSampleFile(BULK_UPLOAD_FLOW.EDIT)); } diff --git a/src/pages/AllAgents/UploadHistory/ColumnDefs.tsx b/src/pages/AllAgents/UploadHistory/ColumnDefs.tsx index 1b8284b9..605cc73c 100644 --- a/src/pages/AllAgents/UploadHistory/ColumnDefs.tsx +++ b/src/pages/AllAgents/UploadHistory/ColumnDefs.tsx @@ -6,10 +6,16 @@ import LoaderIcon from '@cp/src/assets/icons/LoaderIcon'; import ErrorIconOutline from '@cp/src/assets/icons/ErrorIconOutline'; import { useMemo } from 'react'; import { FILE_STATUS } from '../../AmeyoUtility/types'; -import { fetchFailureReportFile, fetchFile } from './actions/uploadHistoryDrawerActions'; +import { + fetchFailureReportFile, + fetchFile, + fetchNdraFailureFile +} from './actions/uploadHistoryDrawerActions'; import dayjs from 'dayjs'; import { DateTimeFormat } from '@cp/src/components/DateTimePicker/constants'; -import { errorActionType, successActionType } from './types.ts/types'; +import { BulkUploadFileType, errorActionType, successActionType } from './types.ts/types'; +import { Tooltip, TooltipContent, TooltipTrigger } from '@cp/src/components/TooltipV2/TooltipV2'; +import cx from 'classnames'; export const useColumnDefs = (): { columnDefs: ColDef[]; @@ -20,6 +26,15 @@ export const useColumnDefs = (): { fetchFile(fileReferenceId); } }; + + const handleFailureReportButtonClick = (fileReferenceId: string, type: string) => { + if (type === BulkUploadFileType.UPLOAD_NDRA_CERTIFICATE) { + fetchNdraFailureFile(fileReferenceId); + return; + } + fetchFailureReportFile(fileReferenceId); + }; + const columnDefs: ColDef[] = useMemo( () => [ { @@ -150,11 +165,25 @@ export const useColumnDefs = (): { onClick={() => handleFileButtonClick(data?.referenceId, data?.status)} startAdornment={data?.status && icon} > - - {data?.status && (data?.status === 'COMPLETED' || data?.status === 'FAILED') - ? 'Download' - : 'In Progress'} - + + +
+ {data?.status && (data?.status === 'COMPLETED' || data?.status === 'FAILED') + ? `${data?.originalFileName || 'Download'}` + : `${data?.originalFileName || 'In Progress'}`} +
+
+ {data?.originalFileName && ( + + {data?.originalFileName} + + )} +
) : ( @@ -176,7 +205,7 @@ export const useColumnDefs = (): {