diff --git a/src/components/MultiSelect.jsx b/src/components/MultiSelect.jsx index c55256f..765b5b4 100644 --- a/src/components/MultiSelect.jsx +++ b/src/components/MultiSelect.jsx @@ -1,5 +1,5 @@ -import { Clear } from '@mui/icons-material'; -import ExpandMoreOutlinedIcon from '@mui/icons-material/ExpandMoreOutlined'; +import { Clear } from "@mui/icons-material"; +import ExpandMoreOutlinedIcon from "@mui/icons-material/ExpandMoreOutlined"; import { Autocomplete, Box, @@ -8,17 +8,16 @@ import { CircularProgress, ListItemText, Stack, - TextField -} from '@mui/material'; -import debounce from 'lodash/debounce'; -import React, { useEffect, useMemo, useState } from 'react'; -import { NOTIFICATION } from '../constants'; -import { pushNotification } from '../utils/notification'; -import { useStyles } from './styles/multiSelectStyles'; + TextField, +} from "@mui/material"; +import debounce from "lodash/debounce"; +import React, { useEffect, useMemo, useState } from "react"; +import { NOTIFICATION } from "../constants"; +import { pushNotification } from "../utils/notification"; +import { useStyles } from "./styles/multiSelectStyles"; +import { getMasterData } from "../services/masterData.services"; const MultiSelect = ({ - apiCall, - searchParams = {}, searchDebounceTime = 500, maxSelections = Infinity, formik, @@ -26,19 +25,16 @@ const MultiSelect = ({ fieldObjectValue, getOptionLabel, customErrorMessage = null, - hideEndAdornment = false, onError = (error) => console.error(error), - onOptionsChange = () => {}, - fieldName, styleForSelectorParent, styleForSelector, - placeholderText = '', + placeholderText = "", inputRef, }) => { const classes = useStyles(); const [data, setData] = useState([]); const [page, setPage] = useState(0); - const [searchQuery, setSearchQuery] = useState(''); + const [searchQuery, setSearchQuery] = useState(""); const [isLoading, setIsLoading] = useState(false); const [hasMore, setHasMore] = useState(true); const [dropdownOpen, setDropdownOpen] = useState(false); @@ -47,20 +43,8 @@ const MultiSelect = ({ const fetchData = async () => { try { setIsLoading(true); - const response = await apiCall({ - ...searchParams, - page, - size: 30, - search: searchQuery, - }); - const newData = response?.data || []; - if (page === 0) { - setData(newData); - } else { - setData((prevData) => [...prevData, ...newData]); - } - setHasMore(newData.length > 0); - onOptionsChange(newData); + const response = await getMasterData(); + setData(response?.data?.data?.data); } catch (error) { onError(error); } finally { @@ -182,13 +166,13 @@ const MultiSelect = ({ debouncedSearch(event.target.value.trim()); }} onKeyDown={(event) => { - if (event.key === 'Backspace') { + if (event.key === "Backspace") { event.stopPropagation(); } }} InputProps={{ ...params.InputProps, - type: 'search', + type: "search", endAdornment: ( <> {isLoading ? ( diff --git a/src/services/auth.services.js b/src/services/auth.services.js index 25e0388..d2b6d05 100644 --- a/src/services/auth.services.js +++ b/src/services/auth.services.js @@ -23,8 +23,8 @@ export const createAdmin = (data) => { export const getAdmins = (params) => { let searchParams = new URLSearchParams(); - searchParams.append("size", params?.pagination?.pageSize ?? 10); - searchParams.append("page", params?.pagination.pageIndex ?? 0); + searchParams.append("limit", params?.pagination?.pageSize ?? 10); + searchParams.append("page", params?.pagination.pageIndex+1 ?? 1); searchParams.append("search", params?.globalFilter ?? ""); const url = `/admin/?${searchParams.toString()}`; diff --git a/src/services/clinics.service.js b/src/services/clinics.service.js index 6ca1361..b240d5d 100644 --- a/src/services/clinics.service.js +++ b/src/services/clinics.service.js @@ -2,23 +2,10 @@ import { axiosInstance } from "../config/api"; import { CLINIC_TYPE } from "../constants"; import { clinicsData, registeredClinicsData } from "../mock/clinics"; -// export const getClinics = (params) => { -// switch (params.type) { -// case CLINIC_TYPE.UNREGISTERED: -// return { data: clinicsData }; -// case CLINIC_TYPE.REGISTERED: -// return { data: registeredClinicsData }; -// case CLINIC_TYPE.SUBSCRIBED: -// return { data: registeredClinicsData }; -// default: -// return { data: clinicsData }; -// } -// }; - export const getClinics = (params) => { let searchParams = new URLSearchParams(); - searchParams.append("size", params?.pagination?.pageSize ?? 10); - searchParams.append("page", params?.pagination.pageIndex ?? 0); + searchParams.append("limit", params?.pagination?.pageSize ?? 10); + searchParams.append("page", params?.pagination.pageIndex+1 ?? 1); searchParams.append("filter_type", params?.type ?? CLINIC_TYPE.REGISTERED); searchParams.append("search", params?.globalFilter ?? ""); @@ -30,7 +17,6 @@ export const getClinics = (params) => { .then((response) => resolve(response)) .catch((err) => reject(err)); }); - }; export const getLatestClinicId = () => { @@ -94,11 +80,10 @@ export const createClinicOffer = (data) => { }; export const getClinicOffer = (params) => { - - let searchParams = new URLSearchParams(); - searchParams.append("size", params?.pagination?.pageSize ?? 10); - searchParams.append("page", params?.pagination.pageIndex ?? 0); - searchParams.append("search", params?.globalFilter ?? ""); + let searchParams = new URLSearchParams(); + searchParams.append("limit", params?.pagination?.pageSize ?? 10); + searchParams.append("page", params?.pagination.pageIndex+1 ?? 1); + searchParams.append("search", params?.globalFilter ?? ""); const url = `/admin/clinic/offers?${searchParams.toString()}`; return new Promise((resolve, reject) => { @@ -128,3 +113,49 @@ export const deleteClinicOffer = (id) => { .catch((err) => reject(err)); }); }; + + +export const getClinicDoctors = (params) => { + let searchParams = new URLSearchParams(); + searchParams.append("limit", params?.pagination?.pageSize ?? 10); + searchParams.append("page", params?.pagination.pageIndex+1 ?? 1); + searchParams.append("search", params?.globalFilter ?? ""); + + const url = `/clinic-doctors?${searchParams.toString()}`; + return new Promise((resolve, reject) => { + axiosInstance + .get(url) + .then((response) => resolve(response)) + .catch((err) => reject(err)); + }); +} + +export const createDoctor = (data) => { + const url = `/clinic-doctors/`; + return new Promise((resolve, reject) => { + axiosInstance + .post(url, data) + .then((response) => resolve(response)) + .catch((err) => reject(err)); + }); +}; + +export const updateDoctor = (data, id) => { + const url = `/clinic-doctors/${id}`; + return new Promise((resolve, reject) => { + axiosInstance + .put(url, data) + .then((response) => resolve(response)) + .catch((err) => reject(err)); + }); +}; + +export const deleteDoctor = (id) => { + const url = `/clinic-doctors/${id}`; + return new Promise((resolve, reject) => { + axiosInstance + .delete(url) + .then((response) => resolve(response)) + .catch((err) => reject(err)); + }); +}; diff --git a/src/views/ClinicsList/index.jsx b/src/views/ClinicsList/index.jsx index 754272e..b9d93ed 100644 --- a/src/views/ClinicsList/index.jsx +++ b/src/views/ClinicsList/index.jsx @@ -74,7 +74,7 @@ const ClinicsList = () => { tableState?.pagination?.pageIndex * tableState?.pagination?.pageSize ) ?.toString() - ?.padStart(2, "0"); + ?.padStart(1, "0"); return {serialNumber}; }, enableSorting: false, @@ -273,7 +273,7 @@ const ClinicsList = () => { tableState?.pagination?.pageSize ) ?.toString() - ?.padStart(2, "0"); + ?.padStart(1, "0"); return {serialNumber}; }, enableSorting: false, @@ -519,7 +519,7 @@ const ClinicsList = () => { columns={columnsUnregistered} getData={getData} options={{ - enableRowSelection: true, + enableRowSelection: false, showTopBar: false, showFilters: true, }} diff --git a/src/views/MasterData/index.jsx b/src/views/MasterData/index.jsx index d02a51a..8ac8090 100644 --- a/src/views/MasterData/index.jsx +++ b/src/views/MasterData/index.jsx @@ -172,7 +172,7 @@ const MasterDataManagement = () => { tableState?.pagination?.pageIndex * tableState?.pagination?.pageSize ) ?.toString() - ?.padStart(2, "0"); + ?.padStart(1, "0"); return {serialNumber}; }, enableSorting: false, @@ -182,6 +182,13 @@ const MasterDataManagement = () => { size: 280, accessorKey: "type", header: "Type", + Cell: (props) => { + return ( + + {props.row.original.type.charAt(0).toUpperCase() + props.row.original.type.slice(1)} + + ); + }, enableColumnFilter: false, }, // Removed the empty object that was causing the error @@ -203,7 +210,7 @@ const MasterDataManagement = () => { columns={columns} getData={getData} options={{ - enableRowSelection: true, + enableRowSelection: false, showTopBar: false, showFilters: true, }} diff --git a/src/views/PaymentManagement/index.jsx b/src/views/PaymentManagement/index.jsx index 6f2e232..cd831cb 100644 --- a/src/views/PaymentManagement/index.jsx +++ b/src/views/PaymentManagement/index.jsx @@ -23,7 +23,6 @@ import CustomBreadcrumbs from "../../components/CustomBreadcrumbs"; import PageHeader from "../../components/PageHeader"; import { useStyles } from "./paymentStyles"; import Table from "../../components/Table"; -import { getAdmins } from "../../services/auth.services"; import { pushNotification } from "../../utils/notification"; import { NOTIFICATION } from "../../constants"; import { emailRegex } from "../../utils/regex"; @@ -66,7 +65,7 @@ const PaymentManagement = () => { tableState?.pagination?.pageIndex * tableState?.pagination?.pageSize ) ?.toString() - ?.padStart(2, "0"); + ?.padStart(1, "0"); return {serialNumber}; }, enableSorting: false, @@ -261,7 +260,7 @@ const PaymentManagement = () => { columns={columns} getData={getData} options={{ - enableRowSelection: true, + enableRowSelection: false, showTopBar: false, showFilters: true, }} diff --git a/src/views/StaffManagement/index.jsx b/src/views/StaffManagement/index.jsx index e99957e..2745e9c 100644 --- a/src/views/StaffManagement/index.jsx +++ b/src/views/StaffManagement/index.jsx @@ -208,7 +208,7 @@ const StaffManagement = () => { tableState?.pagination?.pageIndex * tableState?.pagination?.pageSize ) ?.toString() - ?.padStart(2, "0"); + ?.padStart(1, "0"); return {serialNumber}; }, enableSorting: false, @@ -243,7 +243,7 @@ const StaffManagement = () => { columns={columns} getData={getData} options={{ - enableRowSelection: true, + enableRowSelection: false, showTopBar: false, showFilters: true, }} diff --git a/src/views/User/index.jsx b/src/views/User/index.jsx index 0343b6d..7ef50eb 100644 --- a/src/views/User/index.jsx +++ b/src/views/User/index.jsx @@ -1,209 +1,179 @@ -import { LoadingButton } from "@mui/lab"; -import { Box, Button, Chip, Grid, MenuItem, Select, Switch, TextField } from "@mui/material"; +import { + Box, + Chip, + Dialog, + DialogContent, + DialogTitle, + IconButton, + MenuItem, + Select, + TextField, + Typography, + Button, + DialogActions, +} from "@mui/material"; import { useFormik } from "formik"; import React, { useMemo, useRef, useState } from "react"; -import { useSelector } from "react-redux"; import * as Yup from "yup"; -import EditIcon from '@mui/icons-material/Edit'; +import EditIcon from "@mui/icons-material/Edit"; +import CloseIcon from "@mui/icons-material/Close"; +import MultiSelect from "../../components/MultiSelect"; /* ----------------- Custom Imports ----------------- */ import PageHeader from "../../components/PageHeader"; import Table from "../../components/Table"; -import ConfirmationModal from "../Modal/ConfirmationModal"; -import CustomModal from "../Modal/Modal"; import { useStyles } from "./userStyles"; /* ----------------- Assets ----------------- */ import AddIcon from "@mui/icons-material/Add"; -import { - getUsers, - deleteUserById, - getRoles, - getUserById, - resendPasswordMailer, - revokeAdminTransferAccess, - transferMasterAdminAccess, -} from "../../services/users.service"; +import DeleteIcon from "@mui/icons-material/Delete"; /* ----------------- Utils ----------------- */ import { format } from "date-fns"; -import MultiSelect from "../../components/MultiSelect"; import { NOTIFICATION, NOT_AVAILABLE_TEXT } from "../../constants"; import { pushNotification } from "../../utils/notification"; +import { + createDoctor, + deleteDoctor, + getClinicDoctors, + updateDoctor, +} from "../../services/clinics.service"; +import { useSelector } from "react-redux"; /* ----------------- Validation Schema ----------------- */ const validationSchema = Yup.object().shape({ userName: Yup.string().required("User Name is required"), - email: Yup.string() - .email("Invalid Email Address") - .required("Email is required"), - mobile: Yup.string() - .matches(/^\d{10}$/, "Mobile Number must be exactly 10 digits") - .required("Mobile Number is required"), + userType: Yup.string().required("User Type is required"), + appointmentType: Yup.array().min( + 1, + "At least one appointment type is required" + ), }); function Users() { const ref = useRef(null); - const defaultFormData = useRef({ - userName: "", - email: "q@gmail.com", - mobile: "1234567890", - isEditUser: false, - lastName: "", - userType: "", - appointmentType: [], - appointmentTypeObject: "", - }); - - const fieldRefs = { - userName: useRef(null), - email: useRef(null), - mobile: useRef(null), - lastName: useRef(null), - userType: useRef(null), - appointmentType: useRef(null), - }; - const classes = useStyles(); - /* ----------------- State Variables ----------------- */ - const [showModal, setShowModal] = useState(false); - const [showUserAccessModal, setShowUserAccessModal] = useState(false); - const [isEditUser, setIsEditUser] = useState(false); - const [deleteModal, setDeleteModal] = useState(false); - const [masterAdminModal, setMasterAdminModal] = useState(false); - const [buttonLoading, setButtonLoading] = useState(false); - const [userId, setUserId] = useState(); - const [userTotalCount, setUserTotalCount] = useState(0); - const [selectedCheckboxes, setSelectedCheckboxes] = useState({}); - const [checkboxError, setCheckboxError] = useState(false); - const [roles, setRoles] = useState(); - const [isAdmin, setIsAdmin] = useState(); + const userTypes = [ + { id: "doctor", name: "Doctor" }, + { id: "nurse", name: "Nurse" }, + ]; - const isSuperAdmin = useSelector((state) => state?.login?.user?.isSuperAdmin); + /* ----------------- State Variables ----------------- */ + const [deleteModal, setDeleteModal] = useState(false); + const [userTotalCount, setUserTotalCount] = useState(0); + const [dialogOpen, setDialogOpen] = useState(false); + const [isEditUser, setIsEditUser] = useState(false); + const [deleteId, setDeleteId] = useState(null); + + // Fix: Use proper initial values for formik + const initialValues = { + userName: "", + userType: userTypes[0].id, + appointmentType: [], + appointmentTypeObject: {}, + }; /* ----------------- Get Users ----------------- */ const getData = async (filters) => { - const resp = await getUsers(filters); - console.log(resp); - console.log(resp?.data?.totalCount); - setUserTotalCount(resp?.data?.totalCount); + const resp = await getClinicDoctors(filters); + setUserTotalCount(resp?.data?.data?.total); - const role = await getRoles({ page: 0 }); - setRoles(role?.data); + return { data: resp?.data?.data?.data, rowCount: resp?.data?.data?.total }; + }; - return { data: resp?.data?.records, rowCount: resp?.data?.totalCount }; + const handleDialog = () => { + if (dialogOpen) { + // Reset form when closing dialog + formik.resetForm(); + setIsEditUser(false); + } + setDialogOpen(!dialogOpen); }; const editUser = async (row) => { - try { - const userData = await getUserById(row?.original?.id); - const formData = { - userName: userData?.name, - email: userData?.email, - mobile: userData?.mobile, - isEditUser: true, - }; - // const updatedCheckboxes = roles.reduce( - // (acc, role) => ({ - // ...acc, - // [role?.id]: userData?.roles.some( - // (roleData) => roleData?.id === role?.id - // ), - // }), - // {} - // ); - - // setSelectedCheckboxes(updatedCheckboxes); - // formik.setValues(formData); - // toggle(); - // setIsEditUser(true); - // setUserId(row?.original?.id); - } catch ({ resp }) { - // eslint-disable-next-line no-console - console.error(resp?.data?.message); - } + const { id, name, role, appointmentTypes } = row.original; + + // Set form values for editing + formik.setValues({ + id, + userName: name || '', + userType: role || userTypes[0]?.id || '', + appointmentType: Array.isArray(appointmentTypes) ? appointmentTypes : [], + appointmentTypeObject: {} + }); + + setIsEditUser(true); + setDialogOpen(true); }; - const handleToggleButton = async (row) => { - try { - // Replace this with your actual API call to update user status - // Example: await updateUserStatus(row.id, !row.isActive); - - // For now, just show a notification - pushNotification( - `${row.name}'s status has been ${row.isActive ? 'deactivated' : 'activated'}`, - NOTIFICATION.SUCCESS - ); - - // Refresh the table data - ref.current.reFetchData(); - } catch (error) { - console.error(error); - pushNotification('Failed to update status', NOTIFICATION.ERROR); - } + const deleteUserToggle = (id) => { + setDeleteId(id); + setDeleteModal(!deleteModal); }; /* ----------------- Handle Submit ----------------- */ - const handleSubmit = async (values, formik) => { + const handleSubmit = async (values, { resetForm, setSubmitting }) => { try { - // if (!showUserAccessModal) { - // setShowUserAccessModal(true); - // return; - // } + const payload = { + name: values.userName, + role: values.userType, + appointmentTypes: values.appointmentType.map((type) => type.id), + }; - // const hasSelectedCheckbox = - // Object.values(selectedCheckboxes).some(Boolean); - // if (!hasSelectedCheckbox) { - // setCheckboxError(true); - // return; - // } - // setCheckboxError(false); + let resp; - // const combinedValues = { - // ...values, - // name: values.userName, - // roles: Object.entries(selectedCheckboxes) - // .filter( - // ([id, isChecked]) => - // isChecked && id !== 'transferMasterAdminAccess' && id !== null - // ) - // .map(([id]) => parseInt(id)), - // transferMasterAdminAccess: - // selectedCheckboxes.transferMasterAdminAccess || false, - // }; - // delete combinedValues.userName; - // delete combinedValues.confirmPassword; + if (isEditUser) { + resp = await updateDoctor(payload, values.id); + } else { + resp = await createDoctor(payload); + } - // let response = isEditUser - // ? await updateUserById(userId, combinedValues) - // : await addUser(combinedValues); + if (resp?.data?.data?.error) { + pushNotification(resp?.data?.data?.error, NOTIFICATION.ERROR); + return; + } - // if (response.status === 200) { - // pushNotification(response?.data?.message, NOTIFICATION.SUCCESS); - pushNotification("Doctor added successfully", NOTIFICATION.SUCCESS); - // ref.current.reFetchData(); - toggle(); - formik.resetForm(); - setSelectedCheckboxes({}); - // } + pushNotification( + `${isEditUser ? "User updated" : "User added"} successfully`, + NOTIFICATION.SUCCESS + ); + + await ref.current?.reFetchData(); + handleDialog(); + resetForm(); + setSubmitting(false); } catch (error) { - // eslint-disable-next-line no-console console.log(error); + pushNotification("Failed to save user", NOTIFICATION.ERROR); } }; - /* ----------------- Toggle Modal ----------------- */ - const toggle = () => { - setIsEditUser(false); - setShowUserAccessModal(false); - setShowModal(!showModal); + const handleDeleteUser = async () => { + try { + const resp = await deleteDoctor(deleteId); + + if (resp?.data?.data?.error) { + pushNotification(resp?.data?.data?.error, NOTIFICATION.ERROR); + return; + } + + pushNotification("User deleted successfully", NOTIFICATION.SUCCESS); + + await ref.current?.reFetchData(); + setDeleteModal(false); + } catch (error) { + console.log(error); + pushNotification("Failed to delete user", NOTIFICATION.ERROR); + } }; - /* ----------------- Handle Checkbox Change ----------------- */ - const handleCheckboxChange = (id, isChecked) => { - setSelectedCheckboxes({ ...selectedCheckboxes, [id]: isChecked }); - }; + /* ----------------- Formik Setup ----------------- */ + const formik = useFormik({ + initialValues, + validationSchema, + onSubmit: handleSubmit, + }); /* ----------------- Table Columns ----------------- */ const columns = useMemo( @@ -220,53 +190,58 @@ function Users() { ) ?.toString() ?.padStart(1, "0"); - return {serialNumber}.; + return {serialNumber}; }, enableSorting: false, }, { + size: 100, accessorFn: ({ name }) => name || NOT_AVAILABLE_TEXT, accessorKey: "name", header: "Doctor/Nurse Name", isBold: true, }, { - accessorFn: ({ userType }) => userType || NOT_AVAILABLE_TEXT, - accessorKey: "userType", + size: 100, + accessorFn: ({ role }) => role || NOT_AVAILABLE_TEXT, + accessorKey: "role", header: "User Type", }, { + size: 200, accessorKey: "appointmentTypes", header: "Appointment Types", Cell: ({ row }) => { const appointmentTypes = row?.original?.appointmentTypes; - - // Convert to array if it's a string (comma-separated values) - const typesArray = Array.isArray(appointmentTypes) && appointmentTypes.length > 0 - ? appointmentTypes - : typeof appointmentTypes === 'string' && appointmentTypes.trim() !== '' - ? appointmentTypes.split(',').map(type => type.trim()) + + const typesArray = + Array.isArray(appointmentTypes) && appointmentTypes.length > 0 + ? appointmentTypes + : typeof appointmentTypes === "string" && + appointmentTypes.trim() !== "" + ? appointmentTypes.split(",").map((type) => type.trim()) : []; - + return ( - + {typesArray.length > 0 ? ( typesArray.map((type, index) => { - const label = typeof type === 'string' - ? type - : type?.name || type?.type || String(type); - + const label = + typeof type === "string" + ? type + : type?.name || type?.type || String(type); + return ( ); @@ -276,12 +251,12 @@ function Users() { label={NOT_AVAILABLE_TEXT} size="small" variant="outlined" - sx={{ - margin: '2px', - borderRadius: '16px', - backgroundColor: '#f0f0f0', - color: '#757575', - '& .MuiChip-label': { fontSize: '0.75rem' } + sx={{ + margin: "2px", + borderRadius: "16px", + backgroundColor: "#f0f0f0", + color: "#757575", + "& .MuiChip-label": { fontSize: "0.75rem" }, }} /> )} @@ -290,135 +265,31 @@ function Users() { }, }, { - accessorKey: "createdAt", + size: 150, + accessorKey: "create_time", Cell: ({ row }) => (
- {format(new Date(row?.original?.createdAt), "dd MMM, yyyy")} + {format(new Date(row?.original?.create_time), "dd MMM, yyyy")}
), header: "Added On", }, { - accessorFn: ({ email }) => email || NOT_AVAILABLE_TEXT, + size: 100, + accessorFn: ({ status }) => status || NOT_AVAILABLE_TEXT, accessorKey: "status", header: "Status", }, - { - size: 30, - accessorKey: "actions", - header: "Actions", - enableSorting: false, - Cell: ({ row }) => ( -
- handleToggleButton(row?.original)} - inputProps={{ "aria-label": "Status toggle" }} - color="primary" - /> -
- ), - } ], - [] + [classes.dateStyle] ); - const formik = useFormik({ - initialValues: defaultFormData.current, - validationSchema, - onSubmit: (values) => handleSubmit(values, formik), - }); - - /* ----------------- Handle Cancel ----------------- */ - const handleCancel = () => { - toggle(); - formik.resetForm(); - }; - - const deleteUserToggle = (row) => { - setDeleteModal(!deleteModal); - setSelectedUserData(row?.original); - }; - - const makeMasterAdminToggle = (row) => { - setMasterAdminModal((prev) => !prev); - setSelectedUserData(row?.original); - }; - - /* ----------------- Transfer Master Admin Access to User ----------------- */ - const handleTransferMasterAdminAccess = async () => { - setButtonLoading(true); - try { - const response = await transferMasterAdminAccess(seletedUserData?.id); - if (response.status === 200) { - pushNotification(response?.data?.message, NOTIFICATION.SUCCESS); - ref.current.resetPage(true); - makeMasterAdminToggle(); - } - } catch (error) { - // eslint-disable-next-line no-console - console.error(error?.response?.data?.message); - } finally { - ref.current.reFetchData(); - setButtonLoading(false); - } - }; - - /* ----------------- Delete User ----------------- */ - const deleteUser = async () => { - setButtonLoading(true); - try { - const response = await deleteUserById(seletedUserData?.id); - if (response.status === 200) { - pushNotification(response?.data?.message, NOTIFICATION.SUCCESS); - ref.current.resetPage(true); - deleteUserToggle(); - } - } catch (error) { - // eslint-disable-next-line no-console - console.error(error?.response?.data?.message); - } finally { - ref.current.reFetchData(); - setButtonLoading(false); - } - }; - - const handleuserAccessCancel = () => { - setCheckboxError(false); - setShowUserAccessModal(false); - }; - const getRowStyle = (row) => row?.original?.isAdmin ? { backgroundColor: "#E7F4EE !important" } : {}; - const handleSubmitClick = async () => { - const formikErrors = await formik.validateForm(); - const errors = Object.keys(formikErrors); - - if (errors.length) { - // Find the first invalid field and focus it - const firstErrorField = errors[0]; - const firstErrorRef = fieldRefs[firstErrorField]?.current; - - if (firstErrorRef) { - // Scroll to the first invalid field smoothly - if (typeof firstErrorRef?.scrollIntoView === "function") { - firstErrorRef?.scrollIntoView({ - behavior: "smooth", - block: "center", - }); - } - - // Focus the field after a slight delay (to ensure scrolling completes first) - setTimeout(() => firstErrorRef.focus(), 300); - } - - // Show error notification - if (formik?.touched[firstErrorField]) - pushNotification(formikErrors[firstErrorField], NOTIFICATION.ERROR); - } - - formik.handleSubmit(); + // Function to get option label for MultiSelect + const getAppointmentTypeLabel = (option) => { + return option?.name || option?.type || option?.label || String(option); }; return ( @@ -426,10 +297,8 @@ function Users() { } - addButtonDisabled={userTotalCount === 10} - // permissionName={'CREATE_USERS'} infiniteDropdown /> @@ -439,7 +308,7 @@ function Users() { getData={getData} options={{ enableRowSelection: false }} showAction={true} - hideShowPerPage={true} + hideShowPerPage={false} showSearchBox={true} ref={ref} searchText={"user"} @@ -447,285 +316,183 @@ function Users() { actions={[ { onClick: editUser, - text: 'Edit', - icon: ( - - ), - // permissionName: "CREATE_USERS", + text: "Edit", + icon: , + }, + { + onClick: (row) => deleteUserToggle(row.original.id), + text: "Delete", + icon: , }, ]} />
- {/* --------------- ADD User Modal --------------- */} - {showModal && !showUserAccessModal && ( - handleCancel()} - onFooterRightButtonClick={() => handleSubmit()} - title={isEditUser ? "Edit Doctor/Nurse" : "Add New Doctor/Nurse"} - isTitleLeft={true} - onClose={() => { - formik.resetForm(); - setShowModal(false); - setSelectedCheckboxes([]); - setIsAdmin(false); + + theme.palette.primary.main, + color: "white", + fontWeight: "bold", + position: "relative", }} - modalBodyFunction={() => ( - + {isEditUser ? "Edit User" : "Add New User"} + + + + + + + + + Doctor/Nurse Information + + + + + + User Type + + + - Doctor - Nurse - + {userTypes.map((type) => ( + + {type.name} + + ))} + - option.name} - searchDebounceTime={500} - fieldName="appointmentType" - placeholderText="Select Appointment Types" - styleForSelectorParent={classes.multiSelectParent} - styleForSelector={classes.multiSelectChild} - inputRef={fieldRefs.appointmentType} - /> - {/* - {formik.errors.email} - - ) : ( - '' - ) - } - /> - { - if (e.target.value.length <= 10) { - formik.handleChange(e); - } - }} - onBlur={formik.handleBlur} - inputRef={fieldRefs.mobile} - error={Boolean(formik.errors.mobile && formik.touched.mobile)} - helperText={ - formik.errors.mobile && formik.touched.mobile ? ( - - {formik.errors.mobile} - - ) : ( - '' - ) - } - inputProps={{ - type: 'string', - pattern: '[0-9]*', - autocomplete: 'password', - form: { - autocomplete: 'off', - }, - }} - /> */} - - - )} - /> - )} + + Appointment Types + - {/* ----------- Choose User Access Modal----------- */} - {showModal && showUserAccessModal && formik.isValid && ( - handleuserAccessCancel()} - onFooterRightButtonClick={() => formik.handleSubmit()} - footerLeftButtonTitle="Cancel" - footerRightButtonTitle="Add" - showFooter - onClose={() => { - formik.resetForm(); - setSelectedCheckboxes([]); - setShowModal(false); - setIsAdmin(false); + +
+ + + + + + + + + {/* Delete Confirmation Dialog */} + setDeleteModal(false)} + maxWidth="xs" + fullWidth + PaperProps={{ + sx: { + borderRadius: "12px", + overflow: "hidden", + }, + }} + > + theme.palette.error.main, + color: "white", + fontWeight: "bold", + position: "relative", }} - backFunctionCall={() => { - setShowUserAccessModal(false); - }} - modalBodyFunction={() => <>} - footerContent={ - - - - setCheckboxError(false)} // Clear error on cancel - > - Cancel - - - - - Add - - - - - } - /> - )} + > + Confirm Deletion + setDeleteModal(false) } + sx={{ + position: "absolute", + right: 8, + top: 8, + color: "white", + }} + > + + + - {/* ----------- Delete User Modal ----------- */} - {deleteModal && ( - - )} - - {/* ----------- Make User Master Admin Modal ----------- */} - {masterAdminModal && ( - - )} + + + Are you sure you want to delete this user? + + + + + + + ); }