From 790c0d1dac572682d27144be6fb1810099d6ab42 Mon Sep 17 00:00:00 2001 From: chaitanyakole Date: Tue, 14 Jan 2025 22:55:31 +0530 Subject: [PATCH 1/4] Bug #232354, Bug #233015, Bug #233020,Bug #233021,Bug #233023,Bug #233026,Bug #233029 --- public/locales/en/common.json | 4 +- src/components/CommonUserModal.tsx | 2 +- src/components/UserTable.tsx | 494 ++++---------------- src/components/UserUpdateSchema.json | 3 +- src/data/tableColumns.ts | 20 +- src/pages/cohortAdminSchema.json | 3 + src/pages/cohortUpdateSchema.json | 1 - src/pages/cohorts.tsx | 41 +- src/pages/login.tsx | 8 +- src/pages/tenant.tsx | 11 +- src/pages/tenantAdminSchema.json | 3 + src/pages/userSchema.json | 3 + src/services/CohortService/cohortService.ts | 65 ++- src/services/CreateUserService.ts | 22 +- src/utils/Helper.ts | 4 +- 15 files changed, 211 insertions(+), 473 deletions(-) diff --git a/public/locales/en/common.json b/public/locales/en/common.json index a99dedd..c27a57c 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -219,7 +219,9 @@ "DELETE_SUCCESSFULLY": "Cohort Deleted Successfully", "ALL_STATES": "All States", "COHORT_MEMBER": "Cohort", - "ADD_NEW_COHORT_ADMIN": "Add New Cohort Admin" + "ADD_NEW_COHORT_ADMIN": "Add New Cohort Admin", + "COHORT_UPDATED_SUCCESSFULLY": "Cohort Details Updated Successfully", + "COHORT_UPDATED_FAILED": "Cohort Details Updation Failed" }, "COURSE_PLANNER": { "GRADE": "Grade", diff --git a/src/components/CommonUserModal.tsx b/src/components/CommonUserModal.tsx index 3ca7707..60e4e5c 100644 --- a/src/components/CommonUserModal.tsx +++ b/src/components/CommonUserModal.tsx @@ -359,7 +359,7 @@ const CommonUserModal: React.FC = ({ userData: userData, customFields: customFields, }; - await updateUser(userId, object); + await updateUser(userId, object, ""); const messageKey = userType === FormContextType.STUDENT ? "LEARNERS.LEARNER_UPDATED_SUCCESSFULLY" diff --git a/src/components/UserTable.tsx b/src/components/UserTable.tsx index de8b478..9f4f589 100644 --- a/src/components/UserTable.tsx +++ b/src/components/UserTable.tsx @@ -735,6 +735,9 @@ const UserTable: React.FC = ({ const userId = rowData?.userId; setUserId(userId); + if (rowData) { + setSelectedRowData(rowData); + } const initialFormData = { userId: rowData.userId || "", name: rowData.name || "", @@ -771,6 +774,7 @@ const UserTable: React.FC = ({ ? filters?.tenantId : listOfTenants?.[0]?.tenantId; + const selectedTenantOrNot = selectedTenant?.[0] === "All"; const payload = { limit, filters: { @@ -778,7 +782,7 @@ const UserTable: React.FC = ({ status: filters.status, }, tenantCohortRoleMapping: { - tenantId: tenantId, + ...(selectedTenantOrNot ? {} : { tenantId: tenantId }), cohortId: filters?.cohortId ? [filters?.cohortId] : [], }, sort: sortBy, @@ -896,8 +900,41 @@ const UserTable: React.FC = ({ reassignButtonStatus, userType, editUserState, + selectedTenant, + selectedCohort, ]); + const handleTenantChange = ( + selectedNames: string[], + selectedCodes: string[] + ) => { + if (selectedNames && selectedCodes) { + const tenantId = selectedCodes.join(","); + setSelectedTenant(selectedNames); + if (selectedNames?.[0] == "All") { + setFilters( + (prevFilter) => ( + console.log({ prevFilter }), + { + ...prevFilter, + } + ) + ); + } else { + setFilters( + (prevFilter) => ( + console.log({ prevFilter }), + { + ...prevFilter, + tenantId: tenantId, + } + ) + ); + } + } else { + console.log("No valid tenants selected"); + } + }; const handleChange = (event: SelectChangeEvent) => { const newPageSize = Number(event.target.value); setPageSize(newPageSize); @@ -910,24 +947,34 @@ const UserTable: React.FC = ({ value: number ) => { if (value >= 1 && value <= pageCount) { - setPageOffset(value - 1); + setPageOffset(value - 1); // Ensure pageOffset is updated correctly } }; + + useEffect(() => { + const calculatePageSizes = (total: number) => { + if (total >= 15) return [5, 10, 15]; + if (total >= 10) return [5, 10]; + if (total > 5) return [5]; + return [total]; + }; + + setPageSizeArray(calculatePageSizes(totalCount)); + setPageCount(Math.ceil(totalCount / pageSize)); + }, [totalCount, pageSize]); + const PagesSelector = () => ( - <> - - - - + + + ); const PageSizeSelectorFunction = () => ( @@ -966,321 +1013,6 @@ const UserTable: React.FC = ({ } }; - // useEffect(() => { - // const fetchData = async () => { - // try { - // if (data.length === 0 || cohortsFetched) { - // return; - // } - // const newData = await Promise.all( - // data?.map(async (user) => { - // const response = await getCohortList(user.userId); - // // const cohortNames = response?.result?.cohortData?.map( - // // (cohort: Cohort) => cohort.name, - // // ); - // const cohortNames = response?.result?.cohortData - // ?.filter( - // (cohort: Cohort) => - // cohort.type !== "BLOCK" && - // cohort?.cohortMemberStatus !== "archived" - // ) - // .map((cohort: Cohort) => cohort.name); - // const cohortIds = response?.result?.cohortData - // ?.filter( - // (cohort: Cohort) => - // cohort.type !== "BLOCK" && - // cohort?.cohortMemberStatus !== "archived" - // ) - // .map((cohort: Cohort) => cohort.cohortId); - - // const centerMembershipIdList = response?.result?.cohortData - // ?.filter( - // (cohort: Cohort) => - // cohort.type !== "BLOCK" && - // cohort?.cohortMemberStatus !== "archived" - // ) - // .map((cohort: Cohort) => cohort.cohortMembershipId); - // const blockMembershipIdList = response?.result?.cohortData - // ?.filter( - // (cohort: Cohort) => - // cohort.type === "BLOCK" && - // cohort?.cohortMemberStatus !== "archived" - // ) - // .map((cohort: Cohort) => cohort.cohortMembershipId); - // // const cohortMembershipId=response?.result?.cohortData?.cohortMembershipId; - - // let finalArray; - // if (cohortNames?.length >= 1) { - // finalArray = capitalizeFirstLetterOfEachWordInArray(cohortNames); - // } - // // const finalArray=capitalizeFirstLetterOfEachWordInArray(cohortNames) - // return { - // ...user, - // centerMembershipIdList: centerMembershipIdList, - // blockMembershipIdList: blockMembershipIdList, - // cohortIds: cohortIds, - // centers: finalArray ? finalArray?.join(" , ") : "-", - // }; - // }) - // ); - // setData(newData); - // setCohortsFetched(true); - // } catch (error: any) { - // - // } - // }; - - // fetchData(); - // }, [data, cohortsFetched]); - - // useEffect(() => { - // const fetchLocationData = () => { - // try { - // const object = { - // // "limit": 20, - // // "offset": 0, - // fieldName: "states", - // }; - // // const response = await getStateBlockDistrictList(object); - // // const result = response?.result?.values; - // if (typeof window !== "undefined" && window.localStorage) { - // const admin = localStorage.getItem("adminInfo"); - // if (admin) { - // const stateField = JSON.parse(admin).customFields.find( - // (field: any) => field.label === "STATES" - // ); - // if (!stateField.value.includes(",")) { - // setSelectedState([stateField.value]); - // setSelectedStateCode(stateField.code); - - // // setFilters({ - // // states: stateField.code, - // // //districts:selectedDistrictCode, - // // // blocks:selectedBlockCode, - // // role: role, - // // status:[statusValue], - // // } - - // // ) - // // if( selectedDistrict.length===0 ||selectedDistrict[0]==="All Districts") - // // { - // // const newQuery = { ...router.query }; - - // // if (newQuery.district) { - // // delete newQuery.district; - // // } - // // if (newQuery.block) { - // // delete newQuery.block; - // // } - // // if(newQuery.center) - // // { - // // delete newQuery.center; - // // } - // // router.replace({ - // // pathname: router.pathname, - // // query: { - // // ...newQuery, - // // } - // // }); - - // // } - // // if( selectedBlock.length===0 ||selectedBlock[0]==="All Blocks") - // // { - // // const newQuery = { ...router.query }; - - // // // if (newQuery.district) { - // // // delete newQuery.district; - // // // } - - // // if (newQuery.block) { - // // delete newQuery.block; - // // } - // // if(newQuery.center) - // // { - // // delete newQuery.center; - // // } - // // router.replace({ - // // pathname: router.pathname, - // // query: { - // // ...newQuery, - // // } - // // }); - - // // } - - // if ( - // selectedDistrictCode && - // selectedDistrict.length !== 0 && - // selectedDistrict[0] !== t("COMMON.ALL_DISTRICTS") - // ) { - // setFilters({ - // states: stateField.code, - // districts: selectedDistrictCode, - // // blocks:selectedBlockCode, - // role: role, - // status: [statusValue], - // }); - // } - // if ( - // selectedBlockCode && - // selectedBlock.length !== 0 && - // selectedBlock[0] !== t("COMMON.ALL_BLOCKS") - // ) { - // setFilters({ - // states: stateField.code, - // districts: selectedDistrictCode, - // blocks: selectedBlockCode, - // role: role, - // status: [statusValue], - // }); - // } - // } - - // // setStates(object); - // } - // } - // // setStates(result); - // } catch (error) { - // - // } - // }; - - // fetchLocationData(); - // }, [selectedBlockCode, selectedDistrictCode]); - // useEffect(() => { - // const fetchCenterData = () => { - // if (userType === Role.TEAM_LEADERS) { - // setEnableCenterFilter(false); - // } else { - // if (selectedCenter.length !== 0) { - // if ( - // selectedCenter[0] === "" || - // selectedCenter[0] === t("COMMON.ALL_CENTERS") - // ) { - // setEnableCenterFilter(false); - // } else { - // setEnableCenterFilter(true); - // } - // //setEnableCenterFilter(true); - // if (selectedCenterCode.length !== 0) { - // setFilters({ - // // states: selectedStateCode, - // // districts: selectedDistrictCode, - // // blocks: blocks, - // cohortId: selectedCenterCode[0], - // role: role, - // status: [statusValue], - // }); - // } - // } else { - // setEnableCenterFilter(false); - // if (selectedCenterCode.length !== 0) setSelectedCenterCode([]); - // } - // } - // }; - - // fetchCenterData(); - // }, [selectedCenter, selectedCenterCode]); - // useEffect(() => { - // const { state, district, block, center } = router.query; - - // { - // if (state) { - // setSelectedStateCode(state.toString()); - // } - // if (district) { - // setSelectedDistrictCode(district.toString()); - // } - // if (block) { - // setSelectedBlockCode(block.toString()); - // } - // if ( center) { - // setSelectedCenter([center.toString()]); - // } - // setInitialized(true); - // } - // }, []); - - // useEffect(() => { - - // // Handle replacement when only state and district codes are available - // if (selectedStateCode!=="" && selectedDistrictCode==="" && selectedBlockCode==="") { - // const newQuery = { ...router.query }; - - // if (newQuery.center) { - // delete newQuery.center; - // } - // if (newQuery.district) { - // delete newQuery.district; - // } - // if (newQuery.block) { - // delete newQuery.block; - // } - // router.replace({ - // pathname: router.pathname, - // query: { - // ...newQuery, - // state: selectedStateCode, - // } - // }); - // } - // if (selectedStateCode!=="" && selectedDistrictCode!=="" && selectedBlockCode==="") { - // const newQuery = { ...router.query }; - - // if (newQuery.center) { - // delete newQuery.center; - // } - // if (newQuery.block) { - // delete newQuery.block; - // } - // router.replace({ - // pathname: router.pathname, - // query: { - // ...newQuery, - // state: selectedStateCode, - // district: selectedDistrictCode - // } - // }); - // } - - // // Handle replacement when state, district, and block codes are available - // if (selectedStateCode!=="" && selectedDistrictCode!=="" && selectedBlockCode!=="" && selectedCenter.length === 0) { - // const newQuery = { ...router.query }; - - // if (newQuery.center) { - // delete newQuery.center; - // } - // if (newQuery.block) { - // delete newQuery.block; - // } - // router.replace({ - // pathname: router.pathname, - // query: { - // ...newQuery, - // state: selectedStateCode, - // district: selectedDistrictCode, - // block: selectedBlockCode - // } - // }); - // } - - // // Handle replacement when state, district, block, and center are all selected - // if (selectedStateCode !==""&& selectedDistrictCode!=="" && selectedBlockCode!=="" && selectedCenter.length !== 0) { - // if (userType !== Role.TEAM_LEADERS) { - // router.replace({ - // pathname: router.pathname, - // query: { - // ...router.query, - // state: selectedStateCode, - // district: selectedDistrictCode, - // block: selectedBlockCode, - // center: selectedCenter - // } - // }); - // } - // } - // }, [selectedStateCode]); - const handleCloseReassignModal = () => { // setSelectedReason(""); // setOtherReason(""); @@ -1310,27 +1042,28 @@ const UserTable: React.FC = ({ // return; // } let cohortDetails = { - name: formData?.name, - role: formData?.role, - userId: formData?.userId, - username: formData?.username, - mobile: formData?.mobileNo, - email: formData?.email, - // status: "archived", - // customFields: customFields, + userData: { + name: formData?.name, + role: formData?.role, + userId: formData?.userId, + username: formData?.username, + mobile: formData?.mobileNo, + email: formData?.email, + // status: "archived", + // customFields: customFields, + }, }; - - const resp = await updateUser(formData?.userId, cohortDetails); - - if (resp?.data?.responseCode === 200 || resp?.responseCode === 201) { - showToastMessage(t("CENTERS.CENTER_UPDATE_SUCCESSFULLY"), "success"); + const tenantid = selectedRowData?.tenantId; + const resp = await updateUser(formData?.userId, cohortDetails, tenantid); + if (resp?.responseCode === 200 || resp?.responseCode === 201) { + showToastMessage(t("USER.UPDATE_SUCCESSFULLY"), "success"); setEditUserState((state) => !state); setLoading(false); } else { - showToastMessage(t("CENTERS.CENTER_UPDATE_FAILED"), "error"); + showToastMessage(t("USER.FAILED_TO_UPDATE"), "error"); } } catch (error) { - showToastMessage(t("CENTERS.CENTER_UPDATE_FAILED"), "error"); + showToastMessage(t("USER.FAILED_TO_UPDATE"), "error"); } finally { setLoading(false); setConfirmButtonDisable(false); @@ -1344,22 +1077,6 @@ const UserTable: React.FC = ({ }; const handleError = (error: any) => {}; - const handleTenantChange = ( - selectedNames: string[], - selectedCodes: string[] - ) => { - if (selectedNames && selectedCodes) { - const tenantId = selectedCodes.join(","); - setSelectedTenant(selectedNames); - setFilters((prevFilter) => ({ - ...prevFilter, - tenantId: tenantId, - })); - } else { - console.log("No valid tenants selected"); - } - }; - const handleCohortChange = ( selectedNames: string[], selectedCodes: string[] @@ -1435,7 +1152,7 @@ const UserTable: React.FC = ({ = ({ {t("COMMON.NO_USER_FOUND")} - - // ) )} - {/* */} = ({ cohortId={cohortId} centers={assignedCenters} /> */} - - {/* */} ); }; diff --git a/src/components/UserUpdateSchema.json b/src/components/UserUpdateSchema.json index 53b7eec..d581d53 100644 --- a/src/components/UserUpdateSchema.json +++ b/src/components/UserUpdateSchema.json @@ -8,7 +8,6 @@ "title": "Full Name", "fieldId": null, "type": "string", - "pattern": "^[a-zA-Z][a-zA-Z ]*[a-zA-Z]$", "validation": [] }, "mobileNo": { @@ -30,6 +29,8 @@ "title": "Username", "fieldId": null, "type": "string", + "minLength": 3, + "pattern": "^[a-zA-Z0-9!@#$%^&*()_+={}:;<>?,./~`|\\-]+$", "validation": [] } }, diff --git a/src/data/tableColumns.ts b/src/data/tableColumns.ts index b32a083..0e7077b 100644 --- a/src/data/tableColumns.ts +++ b/src/data/tableColumns.ts @@ -47,7 +47,7 @@ export const getUserTableColumns = (t: any, isMobile: boolean) => { return generateColumns(t, configs, isMobile); }; -export const getTLTableColumns = (t: any, isMobile: boolean) => { +export const getTLTableColumns = (t: any, isMobile: boolean, filter:any) => { const configs: ColumnConfig[] = [ { key: "name", titleKey: "TABLE_TITLE.NAME", width: 130 }, { key: "mobile", titleKey: "TABLE_TITLE.MOBILE", width: 130 }, @@ -59,12 +59,12 @@ export const getTLTableColumns = (t: any, isMobile: boolean) => { { key: "createdAt", titleKey: "TABLE_TITLE.CREATED_DATE", width: 130 }, { key: "updatedAt", titleKey: "TABLE_TITLE.UPDATED_DATE", width: 130 }, // { key: "roleDefine", titleKey: "TABLE_TITLE.ROLE", width: 130 }, - { + ...(filter?.status?.[0]!=="archived"?[{ key: "actions", titleKey: "TABLE_TITLE.ACTIONS", width: 170, isSortable: false, - }, + }]:[]), ]; return generateColumns(t, configs, isMobile); @@ -103,7 +103,7 @@ export const getTenantTableData = (t: any, isMobile: boolean,role:any) => { return generateColumns(t, configs, isMobile); }; -export const getCohortTableData = (t: any, isMobile: boolean,role:any) => { +export const getCohortTableData = (t: any, isMobile: boolean,role:any,filter:any) => { const configs: ColumnConfig[] = [ { key: "name", titleKey: "TABLE_TITLE.NAME", width: 130 }, { key: "type", titleKey: "TABLE_TITLE.TYPE", width: 90 }, @@ -123,8 +123,16 @@ export const getCohortTableData = (t: any, isMobile: boolean,role:any) => { // width: 130, // }, // { key: "roleDefine", titleKey: "TABLE_TITLE.ROLE", width: 130 }, - ...(role == true ? [{ key: "cohortAdmin", titleKey: "TABLE_TITLE.CREATE_COHORT_ADMIN", width: 130 }] : []), - { key: "actions", titleKey: "TABLE_TITLE.ACTIONS", width: 125 }, + + + ...( + role == true && !(filter?.status?.[0] === "inactive" || filter?.status?.[0] === "archived") + ? [{ key: "cohortAdmin", titleKey: "TABLE_TITLE.CREATE_COHORT_ADMIN", width: 130 }] + : [] + ) + +, + ...(filter?.status?.[0]!="archived"?[{ key: "actions", titleKey: "TABLE_TITLE.ACTIONS", width: 125 }]:[]), ]; return generateColumns(t, configs, isMobile); diff --git a/src/pages/cohortAdminSchema.json b/src/pages/cohortAdminSchema.json index bedebd4..6ba11b5 100644 --- a/src/pages/cohortAdminSchema.json +++ b/src/pages/cohortAdminSchema.json @@ -27,12 +27,15 @@ "title": "Username", "fieldId": null, "type": "string", + "minLength": 3, + "pattern": "^[a-zA-Z0-9!@#$%^&*()_+={}:;<>?,./~`|\\-]+$", "validation": [] }, "password": { "title": "Password", "fieldId": null, "type": "string", + "pattern": "^(?=.*[A-Z])(?=.*[a-z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$", "validation": [] }, diff --git a/src/pages/cohortUpdateSchema.json b/src/pages/cohortUpdateSchema.json index b67b506..6ccc383 100644 --- a/src/pages/cohortUpdateSchema.json +++ b/src/pages/cohortUpdateSchema.json @@ -26,7 +26,6 @@ { "const": "inactive", "title": "Inactive" }, { "const": "archived", "title": "Archived" } ], - "default": "active", "validation": [], "description": "The current status of the cohort, this field is read-only." } diff --git a/src/pages/cohorts.tsx b/src/pages/cohorts.tsx index f438d98..c1c01b8 100644 --- a/src/pages/cohorts.tsx +++ b/src/pages/cohorts.tsx @@ -230,7 +230,7 @@ const Center: React.FC = () => { "ui:widget": "password", "ui:placeholder": "Enter a secure password", "ui:help": - "Password must be at least 8 characters long, with at least one letter and one number.", + "Password must be at least 8 characters long and contain one uppercase letter, one lowercase letter, one number, and one special character.", }, role: { "ui:widget": "select", @@ -269,7 +269,7 @@ const Center: React.FC = () => { "ui:widget": "password", "ui:placeholder": "Enter a secure password", "ui:help": - "Password must be at least 8 characters long, with at least one letter and one number.", + "Password must be at least 8 characters long and contain one uppercase letter, one lowercase letter, one number, and one special character.", }, role: { "ui:widget": "select", @@ -785,7 +785,8 @@ const Center: React.FC = () => { let cohortDetails = { status: Status.ARCHIVED, }; - const resp = await deleteCohort(selectedCohortId); + const tenantid = selectedRowData?.tenantId; + const resp = await deleteCohort(selectedCohortId, tenantid); if (resp?.responseCode === 200) { showToastMessage(t("COHORTS.DELETE_SUCCESSFULLY"), "success"); const cohort = cohortData?.find( @@ -882,6 +883,7 @@ const Center: React.FC = () => { // Handle edit action here // setIsEditModalOpen(true); if (rowData) { + setSelectedRowData(rowData); const cohortId = rowData?.cohortId; setSelectedCohortId(cohortId); const cohortName = rowData?.name; @@ -896,7 +898,11 @@ const Center: React.FC = () => { offset: 0, }; const resp = await getCohortList(data); - setFormData(rowData); + + setFormData({ + ...rowData, + status: rowData?.status ? rowData?.status : "active", + }); setEditFormData(mapFields(schema, rowData)); setLoading(false); setIsEditForm(true); @@ -989,18 +995,24 @@ const Center: React.FC = () => { const changedFields = getChangedFields(formData, editFormData); if (Object.keys(changedFields).length === 0) { - showToastMessage(t("CENTERS.NO_CHANGES_TO_UPDATE"), "info"); + showToastMessage(t("USER.NO_CHANGES_TO_UPDATE"), "info"); setLoading(false); return; } - const resp = await updateCohortUpdate(selectedCohortId, changedFields); + + const tenantid = selectedRowData?.tenantId; + const resp = await updateCohortUpdate( + selectedCohortId, + changedFields, + tenantid + ); if (resp?.responseCode === 200 || resp?.responseCode === 201) { - showToastMessage(t("CENTERS.CENTER_UPDATE_SUCCESSFULLY"), "success"); + showToastMessage(t("COHORTS.COHORT_UPDATED_SUCCESSFULLY"), "success"); } else { - showToastMessage(t("CENTERS.CENTER_UPDATE_FAILED"), "error"); + showToastMessage(t("COHORTS.COHORT_UPDATED_FAILED"), "error"); } } catch (error) { - showToastMessage(t("CENTERS.CENTER_UPDATE_FAILED"), "error"); + showToastMessage(t("COHORTS.COHORT_UPDATED_FAILED"), "error"); } finally { setLoading(false); setConfirmButtonDisable(false); @@ -1282,9 +1294,10 @@ const Center: React.FC = () => { } else { showToastMessage(t("COHORTS.COHORT_ADMIN_CREATE_FAILED"), "error"); } - } catch (error) { - console.error("Error updating cohort:", error); - showToastMessage(t("COHORTS.CREATE_FAILED"), "error"); + } catch (error: any) { + const errorMessage = + error.message || t("TENANT.TENANT_ADMIN_FAILED_TO_CREATE"); + showToastMessage(errorMessage, "error"); } finally { setLoading(false); setConfirmButtonDisable(false); @@ -1370,8 +1383,8 @@ const Center: React.FC = () => { ) : cohortData?.length > 0 ? ( { > {t("LOGIN_PAGE.LOGIN")} */} - + {/* - + */} { }} /> - { > {t("LOGIN_PAGE.REMEMBER_ME")} - + */}