diff --git a/src/_digifi/layout/components/paginatedListing/TestList.tsx b/src/_digifi/layout/components/paginatedListing/TestList.tsx new file mode 100644 index 0000000..54d56f8 --- /dev/null +++ b/src/_digifi/layout/components/paginatedListing/TestList.tsx @@ -0,0 +1,142 @@ +import { ReactNode, useEffect, useState } from "react"; +import { UsersListHeader } from "../../../../app/modules/process/user-ready/components/header/UsersListHeader"; + + +type PaginatedListProps = { + data: any, + itemsPerPage?: number, + filterItem?: string[], + tableTitle?: string, + titleClass?:string, + children: (data:any) => ReactNode; +} + +export default function TestList({ + data, + itemsPerPage = 5, + filterItem, + tableTitle, + titleClass, + children, +}:PaginatedListProps) { + const [searchTerm, setSearchTerm] = useState(""); + const [filteredData, setFilteredData] = useState(data); + + const [currentPage, setCurrentPage] = useState(0); + const [newData, setNewData] = useState([]); + + const numberOfSelection = itemsPerPage; + + const handlePrev = () => { + if (currentPage != 0) { + setCurrentPage((prev) => prev - numberOfSelection); + } + }; + const handleNext = () => { + if (currentPage < data.length) { + setCurrentPage((prev) => prev + numberOfSelection); + } + }; + + const handleSearch = ({ target: { value } }:{target: {value:string}}, name:string) => { + setSearchTerm(value); + let newFilteredData:any = data.filter((item:any) => + item[name].toLowerCase().startsWith(value.toLowerCase()) + ); + setFilteredData(newFilteredData); + setCurrentPage(0); + }; + + useEffect(() => { + setNewData( + filteredData?.slice(currentPage, numberOfSelection + currentPage) + ); + }, [currentPage, filteredData]); + + useEffect(()=>{ + setCurrentPage(0) + },[itemsPerPage]) + + return ( +
+

{tableTitle}

+ + {data.length > 0 && filterItem && ( + //
+ // {filterItem.map((item, index) => ( + // + // ))} + //
+ + )} + + {children(newData)} + + {/* show prev and next button if data exist */} + {(data.length > 0 && data.length > itemsPerPage) && ( +
+ + + {/* {data.length && data.map((item, index)=>{ + item = item + if(index%itemsPerPage == 0 && index >= currentPage && index <= currentPage+itemsPerPage){ + return ( + + ) + } + })} */} + + +
+ )} +
+ ); +} diff --git a/src/app/modules/auth/core/AxiosCallHelper.ts b/src/app/modules/auth/core/AxiosCallHelper.ts index 2413696..19cb9c2 100644 --- a/src/app/modules/auth/core/AxiosCallHelper.ts +++ b/src/app/modules/auth/core/AxiosCallHelper.ts @@ -47,6 +47,53 @@ export function postAuxEnd(uri:string, reqData:any):Promise { }); } +export function patchAuxEnd(uri:string, reqData:any):Promise { + const endPoint = import.meta.env.VITE_APP_USER_ENDPOINT + uri; + const formData = new FormData(); + for (let value in reqData) { + formData.append(value, reqData[value]); + } + return axios.patch(endPoint, formData) + .then((response) => { + console.log(response); + // if (response.data.internal_return == "-9999") { + // localStorage.clear(); + // window.location.href = `/login?sessionExpired=true`; + // } + return response; + }) + .catch((error) => { + if (error.response) { + //response status is an error code + console.log( + "ERROR-------------------------------------------------------" + ); + console.log(error.response.status); + console.log( + "ERROR-------------------------------------------------------" + ); + } else if (error.request) { + //response not received though the request was sent + console.log( + "ERROR2-------------------------------------------------------" + ); + console.log(error?.request); + console.log( + "ERROR2-------------------------------------------------------" + ); + } else { + //an error occurred when setting up the request + console.log( + "ERROR3-------------------------------------------------------" + ); + console.log(error); + console.log( + "ERROR3-------------------------------------------------------" + ); + } + }); +} + export function getAuxEnd(uri: string, reqData?: any): Promise { const endPoint = import.meta.env.VITE_APP_USER_ENDPOINT + uri; diff --git a/src/app/modules/employers/employers-list/signatory-list/UsersList.tsx b/src/app/modules/employers/employers-list/signatory-list/UsersList.tsx index c62f97e..1cb09ef 100644 --- a/src/app/modules/employers/employers-list/signatory-list/UsersList.tsx +++ b/src/app/modules/employers/employers-list/signatory-list/UsersList.tsx @@ -7,11 +7,14 @@ import {UserEditModal} from './user-edit-modal/UserEditModal' import {KTCard} from '../../../../../_digifi/helpers' import { ToolbarWrapper } from '../../../../../_digifi/layout/components/toolbar' import { Content } from '../../../../../_digifi/layout/components/content' +import { useCustomModal } from '../../../../../context/CustomModal' +import { Modal } from './edit-signatory-modal/Modal' const UsersList = () => { const response = useAllResponse() // console.log('RESPONSE', response) const {itemIdForUpdate} = useListView() + const {MODALNAMES, showCustomModal} = useCustomModal() return ( <> @@ -19,6 +22,7 @@ const UsersList = () => { {itemIdForUpdate !== undefined && } + {(showCustomModal && showCustomModal.name == MODALNAMES.editSignatory) && } ) } diff --git a/src/app/modules/employers/employers-list/signatory-list/core/_models.ts b/src/app/modules/employers/employers-list/signatory-list/core/_models.ts index a7920e7..1a42832 100644 --- a/src/app/modules/employers/employers-list/signatory-list/core/_models.ts +++ b/src/app/modules/employers/employers-list/signatory-list/core/_models.ts @@ -21,6 +21,8 @@ export type User = { employer_name?: string title?: string phone?: string + employer_id?: string + signatory_uid?: string } export type UsersQueryResponse = Response> diff --git a/src/app/modules/employers/employers-list/signatory-list/core/_requests.ts b/src/app/modules/employers/employers-list/signatory-list/core/_requests.ts index ae3e56f..509e0a0 100644 --- a/src/app/modules/employers/employers-list/signatory-list/core/_requests.ts +++ b/src/app/modules/employers/employers-list/signatory-list/core/_requests.ts @@ -1,6 +1,7 @@ import axios, { AxiosResponse } from "axios"; import { ID, Response } from "../../../../../../_digifi/helpers"; import { User, UsersQueryResponse } from "./_models"; +import { patchAuxEnd } from "../../../../auth/core/AxiosCallHelper"; const API_URL = import.meta.env.VITE_APP_THEME_API_URL; const USER_URL = `${API_URL}/user`; @@ -13,12 +14,16 @@ const NEW_USER_ENDPOINT = import.meta.env.VITE_APP_USER_ENDPOINT // .get(`${GET_USERS_URL}?${query}`) // .then((d: AxiosResponse) => d.data); // }; -const getSignatoryList = (query: string): Promise => { // FUNCTION TO GET EMPLOYERS LIST +const getSignatoryList = (query: string): Promise => { // FUNCTION TO GET EMPLOYERS SIGNATORY LIST return axios .get(`${NEW_USER_ENDPOINT}/employers/signatory`) .then((d: AxiosResponse) => d.data); }; +const updateUser = (user: User): Promise => { // FUNCTION TO UPDATE EMPLOYERS SIGNATORY + return patchAuxEnd('/employers/signatory', user) +}; + const getUserById = (id: ID): Promise => { return axios .get(`${USER_URL}/${id}`) @@ -33,12 +38,6 @@ const createUser = (user: User): Promise => { .then((response: Response) => response.data); }; -const updateUser = (user: User): Promise => { - return axios - .post(`${USER_URL}/${user.id}`, user) - .then((response: AxiosResponse>) => response.data) - .then((response: Response) => response.data); -}; const deleteUser = (userId: ID): Promise => { return axios.delete(`${USER_URL}/${userId}`).then(() => {}); diff --git a/src/app/modules/employers/employers-list/users-list/user-edit-modal/UserEditModal.tsx b/src/app/modules/employers/employers-list/signatory-list/edit-signatory-modal/Modal.tsx similarity index 79% rename from src/app/modules/employers/employers-list/users-list/user-edit-modal/UserEditModal.tsx rename to src/app/modules/employers/employers-list/signatory-list/edit-signatory-modal/Modal.tsx index 00ccf09..b763c59 100644 --- a/src/app/modules/employers/employers-list/users-list/user-edit-modal/UserEditModal.tsx +++ b/src/app/modules/employers/employers-list/signatory-list/edit-signatory-modal/Modal.tsx @@ -1,9 +1,9 @@ import {useEffect} from 'react' -import {UserEditModalHeader} from './UserEditModalHeader' -import {UserEditModalFormWrapper} from './UserEditModalFormWrapper' +import { ModalHeader } from './ModalHeader' +import { ModalFormWrapper } from './ModalFormWrapper' -const UserEditModal = () => { +const Modal = () => { useEffect(() => { document.body.classList.add('modal-open') @@ -25,10 +25,10 @@ const UserEditModal = () => {
{/* begin::Modal content */}
- + {/* begin::Modal body */}
- +
{/* end::Modal body */}
@@ -43,4 +43,4 @@ const UserEditModal = () => { ) } -export {UserEditModal} +export {Modal} diff --git a/src/app/modules/employers/employers-list/signatory-list/edit-signatory-modal/ModalForm.tsx b/src/app/modules/employers/employers-list/signatory-list/edit-signatory-modal/ModalForm.tsx new file mode 100644 index 0000000..183198e --- /dev/null +++ b/src/app/modules/employers/employers-list/signatory-list/edit-signatory-modal/ModalForm.tsx @@ -0,0 +1,336 @@ +import { FC, useState } from "react"; +import * as Yup from "yup"; +import { useFormik } from "formik"; +import { isNotEmpty, toAbsoluteUrl } from "../../../../../../_digifi/helpers"; +// import { initialUser, User } from "../core/_models"; +import { initialUser, User } from "../../signatory-list/core/_models"; +import clsx from "clsx"; +import { useListView } from "../core/ListViewProvider"; +import { UsersListLoading } from "../components/loading/UsersListLoading"; +import { updateUser } from "../core/_requests"; +import { useQueryResponse } from "../core/QueryResponseProvider"; +import { useCustomModal } from "../../../../../../context/CustomModal"; + +type Props = { + isUserLoading: boolean; + user: User; +}; + +const editUserSchema = Yup.object().shape({ + email: Yup.string() + .email('Wrong email format') + .min(3, 'Minimum 3 symbols') + .max(50, 'Maximum 50 symbols') + .required('required'), + name: Yup.string() + .min(3, "Minimum 3 symbols") + .max(50, "Maximum 50 symbols") + .required("required"), + phone: Yup.string() + .min(11, "Minimum 11 symbols") + .max(11, "Maximum 11 symbols") + .required("required"), + title: Yup.string() + .min(2, "Minimum 2 symbols") + .max(20, "Maximum 20 symbols") + .required("required"), +}); + +const ModalForm: FC = ({ user, isUserLoading }) => { + + const {closeCustomModal, showCustomModal} = useCustomModal() + + const { setItemIdForUpdate } = useListView(); + const { refetch, isLoading } = useQueryResponse(); + + const [userForEdit] = useState({ + ...user, + avatar: user.avatar || initialUser.avatar, + // role: user.role || initialUser.role, + // position: user.position || initialUser.position, + name: user.name || initialUser.name, + // email: user.email || initialUser.email, + }); + + const cancel = (withRefresh?: boolean) => { + if (withRefresh) { + refetch(); + } + setItemIdForUpdate(undefined); + closeCustomModal() + }; + + const blankImg = toAbsoluteUrl("media/svg/avatars/blank.svg"); + const userAvatarImg = toAbsoluteUrl(`media/${userForEdit.avatar}`); + + const formik = useFormik({ + initialValues: userForEdit, + validationSchema: editUserSchema, + onSubmit: async (values, { setSubmitting }) => { + let reqData = { + employer_id: values.employer_id, + signatory_uid: values.uid, + name: values.name, + email: values.email, + title: values.title, + phone: values.phone + } + setSubmitting(true); + try { + await updateUser({...reqData}); + } catch (ex) { + console.error(ex); + } finally { + setSubmitting(true); + cancel(true); + } + }, + }); + + return ( + <> +
+ {/* begin::Scroll */} +
+ {/* begin::Input group */} + {/*
+ + + +
+
+ + + + + + + + + + +
+
Allowed file types: png, jpg, jpeg.
+
*/} + {/* end::Input group */} + + {/* begin::Input group */} +
+ {/* begin::Label */} + + {/* end::Label */} + + {/* begin::Input */} + + {formik.touched.name && formik.errors.name && ( +
+
+ {formik.errors.name} +
+
+ )} + {/* end::Input */} +
+ {/* end::Input group */} + + {/* begin::Input group */} +
+ {/* begin::Label */} + + {/* end::Label */} + + {/* begin::Input */} + + {/* end::Input */} + {formik.touched.title && formik.errors.title && ( + //
+ // {formik.errors.title} + //
+
+
+ {formik.errors.title} +
+
+ )} +
+ {/* end::Input group */} + + {/* begin::Input group */} +
+ {/* begin::Label */} + + {/* end::Label */} + + {/* begin::Input */} + + {/* end::Input */} + {formik.touched.phone && formik.errors.phone && ( +
+
+ {formik.errors.phone} +
+
+ )} +
+ {/* end::Input group */} + + {/* begin::Input group */} +
+ {/* begin::Label */} + + {/* end::Label */} + + {/* begin::Input */} + + {/* end::Input */} + {formik.touched.email && formik.errors.email && ( +
+
+ {formik.errors.email} +
+
+ )} +
+ {/* end::Input group */} + + +
+ {/* end::Scroll */} + + {/* begin::Actions */} +
+ + + +
+ {/* end::Actions */} +
+ {(formik.isSubmitting || isUserLoading) && } + + ); +}; + +export { ModalForm }; diff --git a/src/app/modules/employers/employers-list/signatory-list/edit-signatory-modal/ModalFormWrapper.tsx b/src/app/modules/employers/employers-list/signatory-list/edit-signatory-modal/ModalFormWrapper.tsx new file mode 100644 index 0000000..601383b --- /dev/null +++ b/src/app/modules/employers/employers-list/signatory-list/edit-signatory-modal/ModalFormWrapper.tsx @@ -0,0 +1,36 @@ +import {useQuery} from 'react-query' +import {ModalForm} from './ModalForm' +import {isNotEmpty, QUERIES} from '../../../../../../_digifi/helpers' +import {useListView} from '../core/ListViewProvider' +import {getUserById} from '../core/_requests' +import { useCustomModal } from '../../../../../../context/CustomModal' + +const ModalFormWrapper = () => { + const {itemIdForUpdate, setItemIdForUpdate} = useListView() + const enabledQuery: boolean = isNotEmpty(itemIdForUpdate) + + const {showCustomModal} = useCustomModal() + + const { + isLoading, + data: user, + error, + } = useQuery( + `${QUERIES.USERS_LIST}-user-${itemIdForUpdate}`, + () => { + return getUserById(itemIdForUpdate) + }, + { + cacheTime: 0, + enabled: enabledQuery, + onError: (err) => { + setItemIdForUpdate(undefined) + console.error(err) + }, + } + ) + + return +} + +export {ModalFormWrapper} diff --git a/src/app/modules/employers/employers-list/signatory-list/edit-signatory-modal/ModalHeader.tsx b/src/app/modules/employers/employers-list/signatory-list/edit-signatory-modal/ModalHeader.tsx new file mode 100644 index 0000000..cee600e --- /dev/null +++ b/src/app/modules/employers/employers-list/signatory-list/edit-signatory-modal/ModalHeader.tsx @@ -0,0 +1,34 @@ +import {KTIcon} from '../../../../../../_digifi/helpers' +import {useListView} from '../core/ListViewProvider' +import { useCustomModal } from '../../../../../../context/CustomModal' + +const ModalHeader = () => { + const {setItemIdForUpdate, itemIdForUpdate} = useListView() + const {closeCustomModal, showCustomModal} = useCustomModal() + + const onClose = () => { + setItemIdForUpdate(undefined) + closeCustomModal() + } + + return ( +
+ {/* begin::Modal title */} +

Add Signatory - {showCustomModal?.data?.employer_name}

+ {/* end::Modal title */} + + {/* begin::Close */} +
+ +
+ {/* end::Close */} +
+ ) +} + +export {ModalHeader} diff --git a/src/app/modules/employers/employers-list/signatory-list/table/columns/UserActionsCell.tsx b/src/app/modules/employers/employers-list/signatory-list/table/columns/UserActionsCell.tsx index 254a12f..bec9088 100644 --- a/src/app/modules/employers/employers-list/signatory-list/table/columns/UserActionsCell.tsx +++ b/src/app/modules/employers/employers-list/signatory-list/table/columns/UserActionsCell.tsx @@ -7,14 +7,22 @@ import {useListView} from '../../core/ListViewProvider' import {useQueryResponse} from '../../core/QueryResponseProvider' import {deleteUser} from '../../core/_requests' +import { useCustomModal } from '../../../../../../../context/CustomModal' +import { User } from '../../core/_models' + + type Props = { id: ID + data: Array | any } -const UserActionsCell: FC = ({id}) => { +const UserActionsCell: FC = ({id, data}) => { const {setItemIdForUpdate} = useListView() const {query} = useQueryResponse() const queryClient = useQueryClient() + const {MODALNAMES, openCustomModal} = useCustomModal() + + const selectedUser:User = data.filter((item:User) => item?.uid == id)[0] useEffect(() => { MenuComponent.reinitialization() @@ -50,7 +58,7 @@ const UserActionsCell: FC = ({id}) => { > {/* begin::Menu item */} diff --git a/src/app/modules/employers/employers-list/signatory-list/table/columns/_columns.tsx b/src/app/modules/employers/employers-list/signatory-list/table/columns/_columns.tsx index 67e7c31..522f22d 100644 --- a/src/app/modules/employers/employers-list/signatory-list/table/columns/_columns.tsx +++ b/src/app/modules/employers/employers-list/signatory-list/table/columns/_columns.tsx @@ -51,7 +51,7 @@ const usersColumns: ReadonlyArray> = [ ), id: 'actions', - Cell: ({...props}) => , + Cell: ({...props}) => , }, ] diff --git a/src/app/modules/employers/employers-list/users-list/UsersList.tsx b/src/app/modules/employers/employers-list/users-list/UsersList.tsx index 385d087..e00adf5 100644 --- a/src/app/modules/employers/employers-list/users-list/UsersList.tsx +++ b/src/app/modules/employers/employers-list/users-list/UsersList.tsx @@ -3,12 +3,13 @@ import {QueryRequestProvider} from './core/QueryRequestProvider' import {QueryResponseProvider} from './core/QueryResponseProvider' import {UsersListHeader} from './components/header/UsersListHeader' import {UsersTable} from './table/UsersTable' -import {UserEditModal} from './user-edit-modal/UserEditModal' +import {AddEmployerModal} from './add-employer-modal/AddEmployerModal' import {KTCard} from '../../../../../_digifi/helpers' import { ToolbarWrapper } from '../../../../../_digifi/layout/components/toolbar' import { Content } from '../../../../../_digifi/layout/components/content' import { AddSignatoryModal } from './add-signatory-modal/Modal' import { useCustomModal } from '../../../../../context/CustomModal' +import { EmployerEditModal } from './employer-edit-modal/EmployerEditModal' const UsersList = () => { const {itemIdForUpdate} = useListView() @@ -20,8 +21,9 @@ const UsersList = () => { - {itemIdForUpdate !== undefined && } + {itemIdForUpdate !== undefined && } {(showCustomModal && showCustomModal.name == MODALNAMES.addSignatory) && } + {(showCustomModal && showCustomModal.name == MODALNAMES.editEmployer) && } ) } diff --git a/src/app/modules/employers/employers-list/users-list/add-employer-modal/AddEmployerModal.tsx b/src/app/modules/employers/employers-list/users-list/add-employer-modal/AddEmployerModal.tsx new file mode 100644 index 0000000..45965ad --- /dev/null +++ b/src/app/modules/employers/employers-list/users-list/add-employer-modal/AddEmployerModal.tsx @@ -0,0 +1,46 @@ +import {useEffect} from 'react' +import {ModalHeader} from './ModalHeader' +import {ModalFormWrapper} from './ModalFormWrapper' + + +const AddEmployerModal = () => { + + useEffect(() => { + document.body.classList.add('modal-open') + return () => { + document.body.classList.remove('modal-open') + } + }, []) + + return ( + <> + + {/* begin::Modal Backdrop */} +
+ {/* end::Modal Backdrop */} + + ) +} + +export {AddEmployerModal} diff --git a/src/app/modules/employers/employers-list/users-list/user-edit-modal/UserEditModalForm.tsx b/src/app/modules/employers/employers-list/users-list/add-employer-modal/ModalForm.tsx similarity index 97% rename from src/app/modules/employers/employers-list/users-list/user-edit-modal/UserEditModalForm.tsx rename to src/app/modules/employers/employers-list/users-list/add-employer-modal/ModalForm.tsx index adf76f9..084ba8e 100644 --- a/src/app/modules/employers/employers-list/users-list/user-edit-modal/UserEditModalForm.tsx +++ b/src/app/modules/employers/employers-list/users-list/add-employer-modal/ModalForm.tsx @@ -14,6 +14,11 @@ type Props = { user: User; }; +type SelectProps = { + uid?: string + name?: string +}; + const editUserSchema = Yup.object().shape({ // email: Yup.string() // .email('Wrong email format') @@ -52,7 +57,7 @@ const editUserSchema = Yup.object().shape({ .required("required"), }); -const UserEditModalForm: FC = ({ user, isUserLoading }) => { +const ModalForm: FC = ({ user, isUserLoading }) => { const response:any = useAllResponse() const { setItemIdForUpdate } = useListView(); @@ -354,8 +359,8 @@ const UserEditModalForm: FC = ({ user, isUserLoading }) => { : <> - {response?.employer_sector?.map((item:any) => ( - + {response?.employer_sector?.map((item:SelectProps) => ( + )) } @@ -397,8 +402,8 @@ const UserEditModalForm: FC = ({ user, isUserLoading }) => { : <> - {response?.salary_sources?.map((item:any) => ( - + {response?.salary_sources?.map((item:SelectProps) => ( + )) } @@ -457,4 +462,4 @@ const UserEditModalForm: FC = ({ user, isUserLoading }) => { ); }; -export { UserEditModalForm }; +export { ModalForm }; diff --git a/src/app/modules/employers/employers-list/users-list/user-edit-modal/UserEditModalFormWrapper.tsx b/src/app/modules/employers/employers-list/users-list/add-employer-modal/ModalFormWrapper.tsx similarity index 73% rename from src/app/modules/employers/employers-list/users-list/user-edit-modal/UserEditModalFormWrapper.tsx rename to src/app/modules/employers/employers-list/users-list/add-employer-modal/ModalFormWrapper.tsx index d60d7e3..a694464 100644 --- a/src/app/modules/employers/employers-list/users-list/user-edit-modal/UserEditModalFormWrapper.tsx +++ b/src/app/modules/employers/employers-list/users-list/add-employer-modal/ModalFormWrapper.tsx @@ -1,10 +1,10 @@ import {useQuery} from 'react-query' -import {UserEditModalForm} from './UserEditModalForm' +import {ModalForm} from './ModalForm' import {isNotEmpty, QUERIES} from '../../../../../../_digifi/helpers' import {useListView} from '../core/ListViewProvider' import {getUserById} from '../core/_requests' -const UserEditModalFormWrapper = () => { +const ModalFormWrapper = () => { const {itemIdForUpdate, setItemIdForUpdate} = useListView() const enabledQuery: boolean = isNotEmpty(itemIdForUpdate) const { @@ -27,14 +27,14 @@ const UserEditModalFormWrapper = () => { ) if (!itemIdForUpdate) { - return + return } if (!isLoading && !error && user) { - return + return } return null } -export {UserEditModalFormWrapper} +export {ModalFormWrapper} diff --git a/src/app/modules/employers/employers-list/users-list/user-edit-modal/UserEditModalHeader.tsx b/src/app/modules/employers/employers-list/users-list/add-employer-modal/ModalHeader.tsx similarity index 91% rename from src/app/modules/employers/employers-list/users-list/user-edit-modal/UserEditModalHeader.tsx rename to src/app/modules/employers/employers-list/users-list/add-employer-modal/ModalHeader.tsx index 7d292dc..db4fd4e 100644 --- a/src/app/modules/employers/employers-list/users-list/user-edit-modal/UserEditModalHeader.tsx +++ b/src/app/modules/employers/employers-list/users-list/add-employer-modal/ModalHeader.tsx @@ -1,7 +1,7 @@ import {KTIcon} from '../../../../../../_digifi/helpers' import {useListView} from '../core/ListViewProvider' -const UserEditModalHeader = () => { +const ModalHeader = () => { const {setItemIdForUpdate, itemIdForUpdate} = useListView() return ( @@ -24,4 +24,4 @@ const UserEditModalHeader = () => { ) } -export {UserEditModalHeader} +export {ModalHeader} diff --git a/src/app/modules/employers/employers-list/users-list/user-edit-modal/UserEditModalForm copy.tsx b/src/app/modules/employers/employers-list/users-list/add-employer-modal/UserEditModalForm copy.tsx similarity index 100% rename from src/app/modules/employers/employers-list/users-list/user-edit-modal/UserEditModalForm copy.tsx rename to src/app/modules/employers/employers-list/users-list/add-employer-modal/UserEditModalForm copy.tsx diff --git a/src/app/modules/employers/employers-list/users-list/core/_models.ts b/src/app/modules/employers/employers-list/users-list/core/_models.ts index bbbd099..ca1e6ef 100644 --- a/src/app/modules/employers/employers-list/users-list/core/_models.ts +++ b/src/app/modules/employers/employers-list/users-list/core/_models.ts @@ -23,6 +23,7 @@ export type User = { sector?: string salary_source?: string added?: string + signatory_count?: string updated?: string email?: string } diff --git a/src/app/modules/employers/employers-list/users-list/employer-edit-modal/EditModalForm.tsx b/src/app/modules/employers/employers-list/users-list/employer-edit-modal/EditModalForm.tsx new file mode 100644 index 0000000..04784a6 --- /dev/null +++ b/src/app/modules/employers/employers-list/users-list/employer-edit-modal/EditModalForm.tsx @@ -0,0 +1,468 @@ +import { FC, useState } from "react"; +import * as Yup from "yup"; +import { useFormik } from "formik"; +import { isNotEmpty, toAbsoluteUrl } from "../../../../../../_digifi/helpers"; +import { initialUser, User } from "../core/_models"; +import clsx from "clsx"; +import { useListView } from "../core/ListViewProvider"; +import { UsersListLoading } from "../components/loading/UsersListLoading"; +import { createUser, updateUser } from "../core/_requests"; +import { useAllResponse, useQueryResponse } from "../core/QueryResponseProvider"; +import { useCustomModal } from "../../../../../../context/CustomModal"; + +type Props = { + isUserLoading: boolean; + user: User; +}; + +type SelectProps = { + uid?: string + name?: string +}; + +const editUserSchema = Yup.object().shape({ + // email: Yup.string() + // .email('Wrong email format') + // .min(3, 'Minimum 3 symbols') + // .max(50, 'Maximum 50 symbols') + // .required('required'), + name: Yup.string() + .min(3, "Minimum 3 symbols") + .max(50, "Maximum 50 symbols") + .required("required"), + percent_interest: Yup.number() + .typeError("Invalid number") + .min(1, "must be greater than 0") + // .test("no-e", "Invalid number", (value) => { + // if (value && /\d+e/.test(value)) { + // return false; + // } + // return true; + // }) + .required("required"), + max_loan: Yup.number() + .typeError("Invalid number") + .min(1, "must be greater than 0") + .required("required"), + tenor: Yup.number() + .typeError("Invalid number") + .min(1, "must be greater than 0") + .required("required"), + retirement_age: Yup.number() + .typeError("Invalid number") + .min(1, "must be greater than 0") + .required("is required"), + sector: Yup.string() + .required("required"), + salary_source: Yup.string() + .required("required"), +}); + +const EditModalForm: FC = ({ user, isUserLoading }) => { + const response:any = useAllResponse() + + const { setItemIdForUpdate } = useListView(); + const { refetch, isLoading } = useQueryResponse(); + + const {closeCustomModal, showCustomModal} = useCustomModal() + + const [userForEdit] = useState({ + ...user, + avatar: user.avatar || initialUser.avatar, + // role: user.role || initialUser.role, + // position: user.position || initialUser.position, + name: user.name || initialUser.name, + // email: user.email || initialUser.email, + }); + + const cancel = (withRefresh?: boolean) => { + if (withRefresh) { + refetch(); + } + setItemIdForUpdate(undefined); + closeCustomModal() + }; + + const blankImg = toAbsoluteUrl("media/svg/avatars/blank.svg"); + const userAvatarImg = toAbsoluteUrl(`media/${userForEdit.avatar}`); + + const formik = useFormik({ + initialValues: userForEdit, + validationSchema: editUserSchema, + onSubmit: async (values, { setSubmitting }) => { + // setSubmitting(true); + // try { + // if (isNotEmpty(values.id)) { + // await updateUser(values); + // } else { + // await createUser(values); + // } + // } catch (ex) { + // console.error(ex); + // } finally { + // setSubmitting(true); + // cancel(true); + // } + }, + }); + + return ( + <> +
+ {/* begin::Scroll */} +
+ {/* begin::Input group */} + {/*
+ + + +
+
+ + + + + + + + + + +
+
Allowed file types: png, jpg, jpeg.
+
*/} + {/* end::Input group */} + + {/* begin::Input group */} +
+ {/* begin::Label */} + + {/* end::Label */} + + {/* begin::Input */} + + {formik.touched.name && formik.errors.name && ( +
+
+ {formik.errors.name} +
+
+ )} + {/* end::Input */} +
+ {/* end::Input group */} + + {/* begin::Input group */} +
+ {/* begin::Label */} + + {/* end::Label */} + + {/* begin::Input */} + + {/* end::Input */} + {formik.touched.percent_interest && formik.errors.percent_interest && ( + //
+ // {formik.errors.percent_interest} + //
+
+
+ {formik.errors.percent_interest} +
+
+ )} +
+ {/* end::Input group */} + + {/* begin::Input group */} +
+ {/* begin::Label */} + + {/* end::Label */} + + {/* begin::Input */} + + {/* end::Input */} + {formik.touched.max_loan && formik.errors.max_loan && ( +
+
+ {formik.errors.max_loan} +
+
+ )} +
+ {/* end::Input group */} + + {/* begin::Input group */} +
+ {/* begin::Label */} + + {/* end::Label */} + + {/* begin::Input */} + + {/* end::Input */} + {formik.touched.tenor && formik.errors.tenor && ( +
+
+ {formik.errors.tenor} +
+
+ )} +
+ {/* end::Input group */} + + {/* begin::Input group */} +
+ {/* begin::Label */} + + {/* end::Label */} + + {/* begin::Input */} + + {/* end::Input */} + {formik.touched.retirement_age && formik.errors.retirement_age && ( +
+
+ {formik.errors.retirement_age} +
+
+ )} +
+ {/* end::Input group */} + + {/* begin::Input group */} +
+ + + {/* end::Input */} + {formik.touched.sector && formik.errors.sector && ( +
+
+ {formik.errors.sector} +
+
+ )} +
+ {/* end::Input group */} + + {/* begin::Input group */} +
+ {/* begin::Label */} + + {/* end::Label */} + + {/* begin::Input */} + + {/* end::Input */} + {formik.touched.salary_source && formik.errors.salary_source && ( +
+
+ {formik.errors.salary_source} +
+
+ )} +
+ {/* end::Input group */} + +
+ {/* end::Scroll */} + + {/* begin::Actions */} +
+ + + +
+ {/* end::Actions */} +
+ {(formik.isSubmitting || isUserLoading) && } + + ); +}; + +export { EditModalForm }; diff --git a/src/app/modules/employers/employers-list/users-list/employer-edit-modal/EditModalFormWrapper.tsx b/src/app/modules/employers/employers-list/users-list/employer-edit-modal/EditModalFormWrapper.tsx new file mode 100644 index 0000000..22521ea --- /dev/null +++ b/src/app/modules/employers/employers-list/users-list/employer-edit-modal/EditModalFormWrapper.tsx @@ -0,0 +1,36 @@ +import {useQuery} from 'react-query' +import {EditModalForm} from './EditModalForm' +import {isNotEmpty, QUERIES} from '../../../../../../_digifi/helpers' +import {useListView} from '../core/ListViewProvider' +import {getUserById} from '../core/_requests' +import { useCustomModal } from '../../../../../../context/CustomModal' + +const EditModalFormWrapper = () => { + const {itemIdForUpdate, setItemIdForUpdate} = useListView() + const enabledQuery: boolean = isNotEmpty(itemIdForUpdate) + + const {showCustomModal} = useCustomModal() + + const { + isLoading, + data: user, + error, + } = useQuery( + `${QUERIES.USERS_LIST}-user-${itemIdForUpdate}`, + () => { + return getUserById(itemIdForUpdate) + }, + { + cacheTime: 0, + enabled: enabledQuery, + onError: (err) => { + setItemIdForUpdate(undefined) + console.error(err) + }, + } + ) + + return +} + +export {EditModalFormWrapper} diff --git a/src/app/modules/employers/employers-list/users-list/employer-edit-modal/EditModalHeader.tsx b/src/app/modules/employers/employers-list/users-list/employer-edit-modal/EditModalHeader.tsx new file mode 100644 index 0000000..a5f5d93 --- /dev/null +++ b/src/app/modules/employers/employers-list/users-list/employer-edit-modal/EditModalHeader.tsx @@ -0,0 +1,35 @@ +import {KTIcon} from '../../../../../../_digifi/helpers' +import { useCustomModal } from '../../../../../../context/CustomModal' +import {useListView} from '../core/ListViewProvider' + +const EditModalHeader = () => { + const {setItemIdForUpdate, itemIdForUpdate} = useListView() + + const {closeCustomModal} = useCustomModal() + + const onClose = () => { + setItemIdForUpdate(undefined) + closeCustomModal() + } + + return ( +
+ {/* begin::Modal title */} +

Edit Employer

+ {/* end::Modal title */} + + {/* begin::Close */} +
+ +
+ {/* end::Close */} +
+ ) +} + +export {EditModalHeader} diff --git a/src/app/modules/employers/employers-list/users-list/employer-edit-modal/EmployerEditModal.tsx b/src/app/modules/employers/employers-list/users-list/employer-edit-modal/EmployerEditModal.tsx new file mode 100644 index 0000000..c8cbb5c --- /dev/null +++ b/src/app/modules/employers/employers-list/users-list/employer-edit-modal/EmployerEditModal.tsx @@ -0,0 +1,46 @@ +import {useEffect} from 'react' +import {EditModalHeader} from './EditModalHeader' +import {EditModalFormWrapper} from './EditModalFormWrapper' + + +const EmployerEditModal = () => { + + useEffect(() => { + document.body.classList.add('modal-open') + return () => { + document.body.classList.remove('modal-open') + } + }, []) + + return ( + <> + + {/* begin::Modal Backdrop */} +
+ {/* end::Modal Backdrop */} + + ) +} + +export {EmployerEditModal} diff --git a/src/app/modules/employers/employers-list/users-list/table/columns/SignatoryCount.tsx b/src/app/modules/employers/employers-list/users-list/table/columns/SignatoryCount.tsx new file mode 100644 index 0000000..805d5eb --- /dev/null +++ b/src/app/modules/employers/employers-list/users-list/table/columns/SignatoryCount.tsx @@ -0,0 +1,11 @@ +import {FC} from 'react' + +type Props = { + signatory_count?: string +} + +const SignatoryCount: FC = ({signatory_count}) => ( + <> {signatory_count &&
{signatory_count}
} +) + +export {SignatoryCount} diff --git a/src/app/modules/employers/employers-list/users-list/table/columns/UserActionsCell.tsx b/src/app/modules/employers/employers-list/users-list/table/columns/UserActionsCell.tsx index cfa2000..a0f261e 100644 --- a/src/app/modules/employers/employers-list/users-list/table/columns/UserActionsCell.tsx +++ b/src/app/modules/employers/employers-list/users-list/table/columns/UserActionsCell.tsx @@ -7,17 +7,21 @@ import {useListView} from '../../core/ListViewProvider' import {useQueryResponse} from '../../core/QueryResponseProvider' import {deleteUser} from '../../core/_requests' import { useCustomModal } from '../../../../../../../context/CustomModal' +import { User } from '../../core/_models' type Props = { id: ID + data: Array | any } -const UserActionsCell: FC = ({id}) => { +const UserActionsCell: FC = ({id, data}) => { const {setItemIdForUpdate} = useListView() const {query} = useQueryResponse() const queryClient = useQueryClient() const {MODALNAMES, openCustomModal} = useCustomModal() + + const selectedUser:User = data.filter((item:User) => item?.uid == id)[0] useEffect(() => { MenuComponent.reinitialization() @@ -53,7 +57,7 @@ const UserActionsCell: FC = ({id}) => { > {/* begin::Menu item */} diff --git a/src/app/modules/employers/employers-list/users-list/table/columns/_columns.tsx b/src/app/modules/employers/employers-list/users-list/table/columns/_columns.tsx index eba8873..cf920a0 100644 --- a/src/app/modules/employers/employers-list/users-list/table/columns/_columns.tsx +++ b/src/app/modules/employers/employers-list/users-list/table/columns/_columns.tsx @@ -9,6 +9,7 @@ import {UserSelectionHeader} from './UserSelectionHeader' import {User} from '../../core/_models' import { AddedCell } from './AddedCell' import { MaxLoan } from './MaxLoan' +import { SignatoryCount } from './SignatoryCount' const usersColumns: ReadonlyArray> = [ { @@ -34,14 +35,14 @@ const usersColumns: ReadonlyArray> = [ }, { Header: (props) => ( - + ), id: 'percent_interest', Cell: ({...props}) => , }, { Header: (props) => ( - + ), id: 'retirement_age', Cell: ({...props}) => , @@ -53,12 +54,19 @@ const usersColumns: ReadonlyArray> = [ id: 'added', Cell: ({...props}) => , }, + { + Header: (props) => ( + + ), + id: 'signatory_count', + Cell: ({...props}) => , + }, { Header: (props) => ( ), id: 'actions', - Cell: ({...props}) => , + Cell: ({...props}) => , }, ] diff --git a/src/context/CustomModal.tsx b/src/context/CustomModal.tsx index 02d5290..bdc64ca 100644 --- a/src/context/CustomModal.tsx +++ b/src/context/CustomModal.tsx @@ -24,7 +24,9 @@ type ModalNames = { } const MODALNAMES:ModalNames = { - addSignatory: 'add signatory' + addSignatory: 'add signatory', + editSignatory: 'edit signatory', + editEmployer: 'edit employer', } const CustomModalContext = createContext({