feat: cr changes and improvements

This commit is contained in:
deepvasoya 2025-05-23 13:38:06 +05:30
parent 1f7c183e7e
commit 232f11d142
13 changed files with 341 additions and 169 deletions

View File

@ -1,94 +1,102 @@
// MUI Icons imports // MUI Icons imports
import HomeOutlinedIcon from '@mui/icons-material/HomeOutlined'; import HomeOutlinedIcon from "@mui/icons-material/HomeOutlined";
import HomeIcon from '@mui/icons-material/Home'; import HomeIcon from "@mui/icons-material/Home";
import LocalHospitalOutlinedIcon from '@mui/icons-material/LocalHospitalOutlined'; import LocalHospitalOutlinedIcon from "@mui/icons-material/LocalHospitalOutlined";
import LocalHospitalIcon from '@mui/icons-material/LocalHospital'; import LocalHospitalIcon from "@mui/icons-material/LocalHospital";
import PeopleOutlineIcon from '@mui/icons-material/PeopleOutline'; import PeopleOutlineIcon from "@mui/icons-material/PeopleOutline";
import PeopleIcon from '@mui/icons-material/People'; import PeopleIcon from "@mui/icons-material/People";
import SettingsOutlinedIcon from '@mui/icons-material/SettingsOutlined'; import SettingsOutlinedIcon from "@mui/icons-material/SettingsOutlined";
import SettingsIcon from '@mui/icons-material/Settings'; import SettingsIcon from "@mui/icons-material/Settings";
import ArticleIcon from '@mui/icons-material/Article'; import ArticleIcon from "@mui/icons-material/Article";
import ArticleOutlinedIcon from '@mui/icons-material/ArticleOutlined'; import ArticleOutlinedIcon from "@mui/icons-material/ArticleOutlined";
import PaymentIcon from '@mui/icons-material/Payment'; import PaymentIcon from "@mui/icons-material/Payment";
import PaymentOutlinedIcon from '@mui/icons-material/PaymentOutlined'; import PaymentOutlinedIcon from "@mui/icons-material/PaymentOutlined";
import { USER_ROLES } from '../../../constants'; import { USER_ROLES } from "../../../constants";
// Define the sidebar configuration with proper permission fields // Define the sidebar configuration with proper permission fields
export const SIDEBAR_CONFIG = [ export const SIDEBAR_CONFIG = [
{ {
text: 'Dashboard', text: "Dashboard",
path: '', path: "",
icon: HomeOutlinedIcon, icon: HomeOutlinedIcon,
activeIcon: HomeIcon, activeIcon: HomeIcon,
// Dashboard is accessible to all roles // Dashboard is accessible to all roles
roles: [USER_ROLES.SUPER_ADMIN, USER_ROLES.CLINIC_ADMIN] roles: [USER_ROLES.SUPER_ADMIN, USER_ROLES.CLINIC_ADMIN],
}, },
{ {
text: 'Clinics List', text: "Clinics",
path: 'clinics', path: "clinics",
icon: LocalHospitalOutlinedIcon, icon: LocalHospitalOutlinedIcon,
activeIcon: LocalHospitalIcon, activeIcon: LocalHospitalIcon,
// Only super admin can access clinics list // Only super admin can access clinics list
roles: [USER_ROLES.SUPER_ADMIN] roles: [USER_ROLES.SUPER_ADMIN],
}, },
{ {
text: 'Admin Staff Management', text: "Admin Staff Management",
path: 'admin', path: "admin",
icon: PeopleOutlineIcon, icon: PeopleOutlineIcon,
activeIcon: PeopleIcon, activeIcon: PeopleIcon,
// Only super admin can access admin staff management // Only super admin can access admin staff management
roles: [USER_ROLES.SUPER_ADMIN] roles: [USER_ROLES.SUPER_ADMIN],
}, },
{ {
text: 'Master Data Management', text: "Master Data Management",
path: 'masterData', path: "masterData",
icon: SettingsOutlinedIcon, icon: SettingsOutlinedIcon,
activeIcon: SettingsIcon, activeIcon: SettingsIcon,
// Only super admin can access admin staff management // Only super admin can access admin staff management
roles: [USER_ROLES.SUPER_ADMIN] roles: [USER_ROLES.SUPER_ADMIN],
}, },
{ {
text: 'Payment Management', text: "Payment Management",
path: 'payment-management', path: "payment-management",
icon: PaymentOutlinedIcon, icon: PaymentOutlinedIcon,
activeIcon: PaymentIcon, activeIcon: PaymentIcon,
// Only super admin can access payment management // Only super admin can access payment management
roles: [USER_ROLES.SUPER_ADMIN] roles: [USER_ROLES.SUPER_ADMIN],
}, },
{ {
text: 'Doctor/Nurse Management', text: "Signup Charges",
path: 'doctor', path: "signup-charges",
icon: PaymentOutlinedIcon,
activeIcon: PaymentIcon,
// Only super admin can access payment management
roles: [USER_ROLES.SUPER_ADMIN],
},
{
text: "Doctor/Nurse Management",
path: "doctor",
requireSaprateApp: false, requireSaprateApp: false,
icon: PeopleOutlineIcon, icon: PeopleOutlineIcon,
activeIcon: PeopleIcon, activeIcon: PeopleIcon,
// Clinic admin can access user management // Clinic admin can access user management
roles: [USER_ROLES.CLINIC_ADMIN] roles: [USER_ROLES.CLINIC_ADMIN],
}, },
{ {
text: 'Clinic Setup', text: "Clinic Setup",
path: 'clinicSetup', path: "clinicSetup",
requireSaprateApp: false, requireSaprateApp: false,
icon: SettingsOutlinedIcon, icon: SettingsOutlinedIcon,
activeIcon: SettingsIcon, activeIcon: SettingsIcon,
// Clinic admin can access clinic setup // Clinic admin can access clinic setup
roles: [USER_ROLES.CLINIC_ADMIN] roles: [USER_ROLES.CLINIC_ADMIN],
}, },
{ {
text: 'Call Transcripts', text: "Call Transcripts",
path: 'transcripts', path: "transcripts",
requireSaprateApp: false, requireSaprateApp: false,
icon: ArticleOutlinedIcon, icon: ArticleOutlinedIcon,
activeIcon: ArticleIcon, activeIcon: ArticleIcon,
// Clinic admin can access call transcripts // Clinic admin can access call transcripts
roles: [USER_ROLES.CLINIC_ADMIN] roles: [USER_ROLES.CLINIC_ADMIN],
}, },
{ {
text: 'Clinic Documents', text: "Clinic Documents",
path: 'docs', path: "docs",
requireSaprateApp: false, requireSaprateApp: false,
icon: ArticleOutlinedIcon, icon: ArticleOutlinedIcon,
activeIcon: ArticleIcon, activeIcon: ArticleIcon,
// Clinic admin can access call transcripts // Clinic admin can access call transcripts
roles: [USER_ROLES.CLINIC_ADMIN] roles: [USER_ROLES.CLINIC_ADMIN],
}, },
]; ];

View File

@ -141,7 +141,7 @@ function MainLayout() {
className={classes.functionalityNotAvailableText} className={classes.functionalityNotAvailableText}
variant="h4" variant="h4"
> >
This section will launch soon. This section will accessible after approval
</Typography> </Typography>
<LoadingButton <LoadingButton
variant="contained" variant="contained"

View File

@ -15,6 +15,7 @@ import PaymentManagement from "../views/PaymentManagement";
import ClinicDocUpdater from "../views/ClinicDocUpdate"; import ClinicDocUpdater from "../views/ClinicDocUpdate";
import ForgotPassword from "../views/ForgotPassword"; import ForgotPassword from "../views/ForgotPassword";
import ResetPassword from "../views/ResetPassword"; import ResetPassword from "../views/ResetPassword";
import SignupCharges from "../views/SignupCharges";
export const routesData = [ export const routesData = [
{ {
@ -31,6 +32,7 @@ export const routesData = [
{ path: "/masterData", component: MasterDataManagement }, { path: "/masterData", component: MasterDataManagement },
{ path: "/payment-management", component: PaymentManagement }, { path: "/payment-management", component: PaymentManagement },
{ path: "/docs", component: ClinicDocUpdater }, { path: "/docs", component: ClinicDocUpdater },
{ path: "/signup-charges", component: SignupCharges },
], ],
isProtected: true, isProtected: true,
}, },

View File

@ -32,8 +32,8 @@ const GeneralInformation = ({ clinicData, clinicAdminData }) => {
<Grid item xs={3}> <Grid item xs={3}>
<Typography className={classes.generalInfoUploaded}> <Typography className={classes.generalInfoUploaded}>
Uploaded:{' '} Uploaded:{' '}
{clinicData?.updatedAt {clinicData?.update_time
? format(new Date(clinicData?.createdAt), 'dd MMM yyyy') ? format(new Date(clinicData?.update_time), 'dd MMM yyyy')
: ''} : ''}
</Typography> </Typography>
</Grid> </Grid>
@ -92,7 +92,7 @@ const GeneralInformation = ({ clinicData, clinicAdminData }) => {
<Box> <Box>
<Typography className={classes.companyUserDetailsTitle}> <Typography className={classes.companyUserDetailsTitle}>
{clinicAdminData?.designation {clinicAdminData?.designation
? clinicAdminData?.designation ? clinicAdminData?.designation.toUpperCase()
: NOT_AVAILABLE_TEXT} : NOT_AVAILABLE_TEXT}
</Typography> </Typography>
<Typography className={classes.companyUserDetailsSubTitle}> <Typography className={classes.companyUserDetailsSubTitle}>

View File

@ -80,7 +80,7 @@ function ClinicDetails() {
path: "/", path: "/",
}, },
{ {
label: "Clinic List", label: "Clinics",
path: "/clinics", path: "/clinics",
query: { tab: queryParams.get("tab") || "UNREGISTERED" }, query: { tab: queryParams.get("tab") || "UNREGISTERED" },
}, },
@ -363,7 +363,7 @@ function ClinicDetails() {
</Box> </Box>
</Box> </Box>
{/* ..........on hold Button..... */} {/* ..........on hold Button..... */}
<Button {/* <Button
disableTouchRipple={isOnHoldButtonShow ? false : true} disableTouchRipple={isOnHoldButtonShow ? false : true}
className={ className={
isOnHoldButtonShow isOnHoldButtonShow
@ -382,7 +382,7 @@ function ClinicDetails() {
alt="On Hold Button Icon" alt="On Hold Button Icon"
/> />
On Hold On Hold
</Button> </Button> */}
{/* ......accept button...... */} {/* ......accept button...... */}
<Button <Button

View File

@ -2,7 +2,6 @@ import React, { useState, useMemo, useEffect, useRef } from "react";
import { useTheme } from "@emotion/react"; import { useTheme } from "@emotion/react";
import { useLocation, useNavigate, Link } from "react-router-dom"; import { useLocation, useNavigate, Link } from "react-router-dom";
import StoreIcon from "@mui/icons-material/Store"; import StoreIcon from "@mui/icons-material/Store";
import BlockIcon from "@mui/icons-material/Block";
import { import {
Box, Box,
Chip, Chip,
@ -65,16 +64,14 @@ const ClinicsList = () => {
[ [
// ..............sro number column...................... // ..............sro number column......................
{ {
size: 50, size: 100,
isBold: true,
header: "Sr. No.", header: "Sr. No.",
Cell: (props) => { Cell: (props) => {
const tableState = props?.table?.getState(); const tableState = props?.table?.getState();
const serialNumber = ( const serialNumber = (
props?.row?.index + props?.row?.index +
1 + 1 +
tableState?.pagination?.pageIndex * tableState?.pagination?.pageIndex * tableState?.pagination?.pageSize
tableState?.pagination?.pageSize
) )
?.toString() ?.toString()
?.padStart(2, "0"); ?.padStart(2, "0");
@ -86,7 +83,7 @@ const ClinicsList = () => {
{ {
enableColumnFilter: false, enableColumnFilter: false,
enableSorting: true, enableSorting: true,
size: "260px", size: "220px",
accessorKey: "name", accessorKey: "name",
header: "Clinic Name", header: "Clinic Name",
Cell: ({ row }) => ( Cell: ({ row }) => (
@ -195,10 +192,11 @@ const ClinicsList = () => {
}, },
// .................Company status column.................. // .................Company status column..................
{ {
enableSorting: true, enableSorting: false,
accessorKey: "status", accessorKey: "status",
header: "Status", header: "Status",
size: 100, size: 100,
enableColumnFilter: false,
Filter: ({ header }) => ( Filter: ({ header }) => (
<TableSelect <TableSelect
name="Status" name="Status"
@ -465,7 +463,7 @@ const ClinicsList = () => {
path: "/", path: "/",
}, },
{ {
label: "Clinic List", label: "Clinics",
path: "/clinics", path: "/clinics",
query: { tab: queryParams.get("tab") || "UNREGISTERED" }, query: { tab: queryParams.get("tab") || "UNREGISTERED" },
}, },
@ -480,7 +478,7 @@ const ClinicsList = () => {
<> <>
<Box> <Box>
<PageHeader <PageHeader
pageTitle="Clinic List" pageTitle="Clinics"
hideAddButton hideAddButton
addButtonIcon={<FileDownloadIcon />} addButtonIcon={<FileDownloadIcon />}
extraComponent={ extraComponent={
@ -505,7 +503,7 @@ const ClinicsList = () => {
variant="outlined" variant="outlined"
loading={isDownloading} loading={isDownloading}
startIcon={<FileDownloadIcon />} startIcon={<FileDownloadIcon />}
// onClick={handleExport} onClick={handleExport}
> >
Download Excel Download Excel
</LoadingButton> </LoadingButton>

View File

@ -19,44 +19,40 @@ const SuperAdminTotals = ({ isLoading, data }) => {
return ( return (
<ProtectedComponent> <ProtectedComponent>
<Grid container className={classes.numbers} spacing={2.3}> <Grid container className={classes.numbers} spacing={2}>
<Grid item> <Grid item>
<TotalNumber <TotalNumber
heading={"Total Accounts"} heading={`Pending Requests`}
isLoading={isLoading}
value={totalAccounts}
helperText={"Clinics"}
/>
</Grid>
<Grid item>
<TotalNumber
heading={`Registration Request`}
isLoading={isLoading} isLoading={isLoading}
viewAllClick={() => viewAllClick(true)} viewAllClick={() => viewAllClick(true)}
value={registrationRequest} value={registrationRequest}
helperText={"Clinics"}
/> />
</Grid> </Grid>
<Grid item> <Grid item>
<TotalNumber <TotalNumber
heading={`Approved`} heading={`Approved Requests`}
isLoading={isLoading} isLoading={isLoading}
viewAllClick={() => viewAllClick(false)} viewAllClick={() => viewAllClick(false)}
value={registered} value={registered}
helperText={"Clinics"}
color={theme.palette.grey[52]} color={theme.palette.grey[52]}
/> />
</Grid> </Grid>
<Grid item> <Grid item>
<TotalNumber <TotalNumber
heading={`Rejected`} heading={`Rejected Requests`}
isLoading={isLoading} isLoading={isLoading}
viewAllClick={() => viewAllClick(false)} viewAllClick={() => viewAllClick(false)}
value={rejected} value={rejected}
helperText={"Clinics"}
color={theme.palette.grey[57]} color={theme.palette.grey[57]}
/> />
</Grid> </Grid>
<Grid item>
<TotalNumber
heading={"Total Requests"}
isLoading={isLoading}
value={totalAccounts}
/>
</Grid>
</Grid> </Grid>
</ProtectedComponent> </ProtectedComponent>
); );

View File

@ -107,7 +107,7 @@ const PaymentConfig = () => {
<Paper elevation={3} sx={{ p: 3, mb: 4, borderRadius: 2 }}> <Paper elevation={3} sx={{ p: 3, mb: 4, borderRadius: 2 }}>
<Box mb={2}> <Box mb={2}>
<Typography variant="h6" fontWeight="bold"> <Typography variant="h6" fontWeight="bold">
Payment Configuration Signup Charges
</Typography> </Typography>
<Typography variant="body2" color="text.secondary"> <Typography variant="body2" color="text.secondary">
Configure payment details for new clinic registrations Configure payment details for new clinic registrations
@ -146,13 +146,13 @@ const PaymentConfig = () => {
<Grid item xs={12} md={4}> <Grid item xs={12} md={4}>
<TextField <TextField
fullWidth fullWidth
label="Per Call Charges" label="Per Minute Charges"
name="per_call_charges" name="per_call_charges"
value={paymentConfig.per_call_charges} value={paymentConfig.per_call_charges}
onChange={handleInputChange} onChange={handleInputChange}
InputProps={{ InputProps={{
startAdornment: <InputAdornment position="start">$</InputAdornment>, startAdornment: <InputAdornment position="start">$</InputAdornment>,
endAdornment: <InputAdornment position="end">/call</InputAdornment>, endAdornment: <InputAdornment position="end">/min</InputAdornment>,
}} }}
variant="outlined" variant="outlined"
/> />

View File

@ -49,9 +49,9 @@ const SuperAdmin = () => {
</Box> </Box>
{/* Payment Configuration Section */} {/* Payment Configuration Section */}
<Box mt={4}> {/* <Box mt={4}>
<PaymentConfig /> <PaymentConfig />
</Box> </Box> */}
</Box> </Box>
); );
}; };

View File

@ -108,7 +108,7 @@ function Dashboard() {
const clinicAdmin = ( const clinicAdmin = (
<Box> <Box>
{!isActive && ( {!isActive && (
<ThankYou canClose={false} /> <ThankYou />
)} )}
<Box> <Box>
<Box> <Box>

View File

@ -94,10 +94,9 @@ function YourDetailsForm() {
const selectedLocalityRef = useRef(); const selectedLocalityRef = useRef();
const [testConnection, setTestConnDone] = useState(false); const [testConnection, setTestConnDone] = useState(false);
const errorStatus = new URLSearchParams(window.location.search).get("status"); const errorStatus = new URLSearchParams(window.location.search).get("status");
console.log(errorStatus) console.log(errorStatus);
useEffect(() => { useEffect(() => {
setIsLoading(true); setIsLoading(true);
@ -154,10 +153,10 @@ function YourDetailsForm() {
// Clinic details // Clinic details
companyName: "", companyName: "",
designation: "", designation: "",
businessPhonePrefix: "", businessPhonePrefix: mobilePrefixOptions[0].name,
businessPhone: "", businessPhone: "",
emergencyBusinessPhone: "", emergencyBusinessPhone: "",
emergencyBusinessPhonePrefix: "", emergencyBusinessPhonePrefix: mobilePrefixOptions[0].name,
businessFax: "", businessFax: "",
clinicLogo: "", clinicLogo: "",
businessEmail: "", businessEmail: "",
@ -213,10 +212,11 @@ function YourDetailsForm() {
}; };
if (yourDetailsFormData) { if (yourDetailsFormData) {
defaultFormData.current = { ...yourDetailsFormData }; Object.keys(defaultFormData.current).forEach((field) => {
console.log(yourDetailsFormData) if (yourDetailsFormData[field]) {
// setLocalityOption([yourDetailsFormData?.locality]) defaultFormData.current[field] = yourDetailsFormData[field];
selectedLocalityRef.current = yourDetailsFormData?.locality; }
});
} }
const validationSchema = Yup.object().shape({ const validationSchema = Yup.object().shape({
@ -266,11 +266,6 @@ function YourDetailsForm() {
businessEmail: Yup.string() businessEmail: Yup.string()
.required("Business Email is required") .required("Business Email is required")
.email("Please enter valid Email Address"), .email("Please enter valid Email Address"),
businessFax: Yup.string()
.required("Business Fax is required")
.matches(/^[0-9]+$/, "Business Fax must be a valid number")
.min(10, "Business Fax number should have 10 digits only.")
.max(10, "Business Fax number should have 10 digits only."),
practiceManagementSystem: Yup.string() practiceManagementSystem: Yup.string()
.required("Practice Management System is required") .required("Practice Management System is required")
.typeError("Practice Management System must be string"), .typeError("Practice Management System must be string"),
@ -349,23 +344,23 @@ function YourDetailsForm() {
setOtpField(true); setOtpField(true);
const payload = { const payload = {
email: formik.values.email, email: formik.values.email,
} };
const response = await getEmailOtp(payload); const response = await getEmailOtp(payload);
if (response?.data?.error) { if (response?.data?.error) {
pushNotification(response?.data?.message, NOTIFICATION.ERROR); pushNotification(response?.data?.message, NOTIFICATION.ERROR);
return; return;
} }
pushNotification(response?.data?.message, NOTIFICATION.SUCCESS); pushNotification("OTP sent successfully to your email", NOTIFICATION.SUCCESS);
}; };
const verifyOTP = async (e) => { const verifyOTP = async (e) => {
e.preventDefault(); e.preventDefault();
console.log(otp) console.log(otp);
console.log("OTP verified"); console.log("OTP verified");
const payload = { const payload = {
email: formik.values.email, email: formik.values.email,
otp: otp, otp: otp,
} };
const response = await verifyOtp(payload); const response = await verifyOtp(payload);
if (response?.data?.error) { if (response?.data?.error) {
pushNotification(response?.data?.message, NOTIFICATION.ERROR); pushNotification(response?.data?.message, NOTIFICATION.ERROR);
@ -381,7 +376,12 @@ function YourDetailsForm() {
const handleFormSubmit = async () => { const handleFormSubmit = async () => {
dispatch(updateFormDetails(formik.values)); dispatch(updateFormDetails(formik.values));
if(!otpVerified){ if (!otpField) {
pushNotification("Please Request OTP first", NOTIFICATION.ERROR);
return;
}
if (!otpVerified) {
pushNotification("Please verify OTP first", NOTIFICATION.ERROR); pushNotification("Please verify OTP first", NOTIFICATION.ERROR);
return; return;
} }
@ -400,7 +400,7 @@ function YourDetailsForm() {
dispatch(resetFormData()); dispatch(resetFormData());
navigate("/auth/signup/payment"); navigate("/auth/signup/payment");
} catch (error) { } catch (error) {
console.error('Error signing up:', error); console.error("Error signing up:", error);
} finally { } finally {
formik.isSubmitting(false); formik.isSubmitting(false);
} }
@ -467,16 +467,17 @@ function YourDetailsForm() {
file_name: value.name, file_name: value.name,
}; };
const presignedUrlResponseClinicLogo = await getPresignedUrl( const presignedUrlResponseClinicLogo = await getPresignedUrl(filePayload);
filePayload,
);
await uploadToS3( await uploadToS3(
value, value,
presignedUrlResponseClinicLogo?.data?.data?.api_url presignedUrlResponseClinicLogo?.data?.data?.api_url
); );
formik.setFieldValue("clinicLogo", presignedUrlResponseClinicLogo?.data?.data?.key); formik.setFieldValue(
"clinicLogo",
presignedUrlResponseClinicLogo?.data?.data?.key
);
// Return a temporary local URL for preview purposes // Return a temporary local URL for preview purposes
return URL.createObjectURL(value); return URL.createObjectURL(value);
@ -574,15 +575,13 @@ function YourDetailsForm() {
// Set uploaded file URL // Set uploaded file URL
const setUploadedFileUrl = (documentName, fileUrl) => { const setUploadedFileUrl = (documentName, fileUrl) => {
console.log('Document Name:', documentName);
console.log('File URL:', fileUrl);
console.log('File URL Type:', typeof fileUrl);
if (documentName && fileUrl !== undefined) { if (documentName && fileUrl !== undefined) {
formik.setFieldValue(documentName, fileUrl); formik.setFieldValue(documentName, fileUrl);
console.log('After setting value:', formik.values[documentName]);
} else { } else {
console.error('Invalid parameters for setUploadedFileUrl:', { documentName, fileUrl }); console.error("Invalid parameters for setUploadedFileUrl:", {
documentName,
fileUrl,
});
} }
}; };
@ -629,6 +628,10 @@ function YourDetailsForm() {
} }
const handleSaveAndNext = async () => { const handleSaveAndNext = async () => {
if (!otpField) {
pushNotification("Please Request OTP first", NOTIFICATION.ERROR);
return;
}
if (!otpVerified) { if (!otpVerified) {
pushNotification("Please verify OTP first", NOTIFICATION.ERROR); pushNotification("Please verify OTP first", NOTIFICATION.ERROR);
otpButtonRef.current?.focus(); otpButtonRef.current?.focus();
@ -649,8 +652,6 @@ function YourDetailsForm() {
const errors = Object.keys(formikError); const errors = Object.keys(formikError);
console.log(errors)
if (errors.length) { if (errors.length) {
// Find the first invalid field and focus it // Find the first invalid field and focus it
const firstErrorField = errors[0]; const firstErrorField = errors[0];
@ -766,50 +767,6 @@ function YourDetailsForm() {
/> />
</Grid> </Grid>
{/* email id grid */}
<Grid item md={4} sm={6} xs={12}>
<InputLabel className={classes.inputLabel}>
Your Official Email ID*
</InputLabel>
<TextField
fullWidth
placeholder="Enter Your Email"
color="secondary"
variant="outlined"
name="email"
value={formik.values.email}
onChange={formik.handleChange}
onBlur={formik.handleBlur}
inputRef={fieldRefs.email}
error={Boolean(
formik.errors.email && formik.touched.email
)}
helperText={
formik.errors.email && formik.touched.email
? formik.errors.email
: ""
}
InputProps={{
endAdornment: (
<InputAdornment position="end">
<Button
variant="text"
color="info"
disabled={!formik.values.email}
onClick={handleOTPButton}
ref={otpButtonRef}
>
Request OTP
</Button>
</InputAdornment>
),
}}
/>
<Typography className={classes.emailNote}>
Note: This will be your login ID.
</Typography>
</Grid>
{/* mobile numer grid */} {/* mobile numer grid */}
<Grid item md={4} sm={6} xs={12}> <Grid item md={4} sm={6} xs={12}>
<InputLabel className={classes.inputLabel}> <InputLabel className={classes.inputLabel}>
@ -846,7 +803,6 @@ function YourDetailsForm() {
onChange={formik.handleChange} onChange={formik.handleChange}
onBlur={formik.handleBlur} onBlur={formik.handleBlur}
inputRef={fieldRefs.mobilePrefix} inputRef={fieldRefs.mobilePrefix}
defaultValue={"61"}
> >
{mobilePrefixOptions.map((option) => ( {mobilePrefixOptions.map((option) => (
<MenuItem <MenuItem
@ -855,7 +811,7 @@ function YourDetailsForm() {
border: "none", border: "none",
}} }}
key={option.id} key={option.id}
value={option.id} value={option.name}
> >
{option.name} {option.name}
</MenuItem> </MenuItem>
@ -879,6 +835,53 @@ function YourDetailsForm() {
/> />
</Grid> </Grid>
{/* email id grid */}
<Grid item md={4} sm={6} xs={12}>
<InputLabel className={classes.inputLabel}>
Your Official Email ID*
</InputLabel>
<TextField
fullWidth
placeholder="Enter Your Email"
color="secondary"
variant="outlined"
name="email"
value={formik.values.email}
onChange={formik.handleChange}
onBlur={formik.handleBlur}
disabled={otpVerified}
inputRef={fieldRefs.email}
error={Boolean(
formik.errors.email && formik.touched.email
)}
helperText={
formik.errors.email && formik.touched.email
? formik.errors.email
: ""
}
InputProps={{
endAdornment: (
<InputAdornment position="end">
<Button
variant="text"
color="info"
disabled={
!formik.values.email || otpVerified
}
onClick={handleOTPButton}
ref={otpButtonRef}
>
Request OTP
</Button>
</InputAdornment>
),
}}
/>
<Typography className={classes.emailNote}>
Note: This will be your login ID.
</Typography>
</Grid>
{/* otp verification grid */} {/* otp verification grid */}
{otpField && ( {otpField && (
<Grid item md={4} sm={6} xs={12}> <Grid item md={4} sm={6} xs={12}>
@ -894,10 +897,17 @@ function YourDetailsForm() {
value={otp} value={otp}
onChange={(e) => setOtp(e.target.value)} onChange={(e) => setOtp(e.target.value)}
onBlur={formik.handleBlur} onBlur={formik.handleBlur}
disabled={otpVerified}
InputProps={{ InputProps={{
type: "text", type: "text",
pattern: "[0-9]*", pattern: "[0-9]*",
endAdornment: ( endAdornment: otpVerified ? (
<InputAdornment position="end">
<VerifiedIcon
className={classes.verifyIcon}
/>
</InputAdornment>
) : (
<InputAdornment position="end"> <InputAdornment position="end">
<Button <Button
variant="text" variant="text"
@ -1143,12 +1153,12 @@ function YourDetailsForm() {
{/* Business Phone grid */} {/* Business Phone grid */}
<Grid item md={4} sm={6} xs={12}> <Grid item md={4} sm={6} xs={12}>
<InputLabel className={classes.inputLabel}> <InputLabel className={classes.inputLabel}>
Business PhoneNumber* Business Phone Number*
</InputLabel> </InputLabel>
<TextField <TextField
className={classes.mobileNumberInput} className={classes.mobileNumberInput}
fullWidth fullWidth
placeholder="Enter Mobile Number" placeholder="Enter Business Phone Number"
color="secondary" color="secondary"
variant="outlined" variant="outlined"
name="businessPhone" name="businessPhone"
@ -1178,7 +1188,6 @@ function YourDetailsForm() {
onChange={formik.handleChange} onChange={formik.handleChange}
onBlur={formik.handleBlur} onBlur={formik.handleBlur}
inputRef={fieldRefs.businessPhonePrefix} inputRef={fieldRefs.businessPhonePrefix}
defaultValue={"61"}
> >
{mobilePrefixOptions.map((option) => ( {mobilePrefixOptions.map((option) => (
<MenuItem <MenuItem
@ -1252,7 +1261,6 @@ function YourDetailsForm() {
inputRef={ inputRef={
fieldRefs.emergencyBusinessPhonePrefix fieldRefs.emergencyBusinessPhonePrefix
} }
defaultValue={"61"}
> >
{mobilePrefixOptions.map((option) => ( {mobilePrefixOptions.map((option) => (
<MenuItem <MenuItem
@ -1288,7 +1296,7 @@ function YourDetailsForm() {
{/* Business Fax grid */} {/* Business Fax grid */}
<Grid item md={4} sm={6} xs={12}> <Grid item md={4} sm={6} xs={12}>
<InputLabel className={classes.inputLabel}> <InputLabel className={classes.inputLabel}>
Business Fax Number* Business Fax Number
</InputLabel> </InputLabel>
<TextField <TextField
// className={classes.mobileNumberInput} // className={classes.mobileNumberInput}
@ -1399,7 +1407,6 @@ function YourDetailsForm() {
</InputLabel> </InputLabel>
<TextField <TextField
fullWidth fullWidth
label="PMS ID"
name="practiceId" name="practiceId"
value={formik.values.practiceId} value={formik.values.practiceId}
onChange={formik.handleChange} onChange={formik.handleChange}
@ -1425,7 +1432,6 @@ function YourDetailsForm() {
</InputLabel> </InputLabel>
<TextField <TextField
fullWidth fullWidth
label="Practice Name"
name="practiceName" name="practiceName"
value={formik.values.practiceName} value={formik.values.practiceName}
onChange={formik.handleChange} onChange={formik.handleChange}
@ -1458,7 +1464,14 @@ function YourDetailsForm() {
{/* Clinic logo grid */} {/* Clinic logo grid */}
<Grid item md={5} sm={12}> <Grid item md={5} sm={12}>
<InputLabel className={classes.inputLabel}> <InputLabel
sx={{
display: "flex",
alignItems: "center",
justifyContent: "space-between",
}}
className={classes.inputLabel}
>
Add Business Logo Add Business Logo
{(logoImage || formik.values.clinicLogo) && ( {(logoImage || formik.values.clinicLogo) && (
<div> <div>
@ -1886,7 +1899,7 @@ function YourDetailsForm() {
> >
<Box mr={2}> <Box mr={2}>
<Tooltip title="Download the contract template"> <Tooltip title="Download the contract template">
<Button>Download Template</Button> <Button>Download Contract Template</Button>
</Tooltip> </Tooltip>
</Box> </Box>
<CustomFileUpload <CustomFileUpload
@ -1925,7 +1938,10 @@ function YourDetailsForm() {
name="termsAccepted" name="termsAccepted"
/> />
</Box> </Box>
<Typography className={classes.checkBoxLabel}> <Typography
ref={fieldRefs.termsAccepted}
className={classes.checkBoxLabel}
>
I agree to{" "} I agree to{" "}
<span> <span>
{" "} {" "}

View File

@ -0,0 +1,33 @@
import { Box } from "@mui/system";
import React from "react";
import { useStyles } from "./signupChargesStyles";
import PageHeader from "../../components/PageHeader";
import PaymentConfig from "../Dashboard/components/PaymentConfig";
const SignupCharges = () => {
const classes = useStyles();
const breadcrumbs = [
{
label: "Dashboard",
path: "/",
},
{
label: "Signup Charges",
path: "/signup-charges",
},
];
return (
<Box>
<Box>
<PageHeader pageTitle="Signup Charges" hideAddButton />
<Box>
<PaymentConfig />
</Box>
</Box>
</Box>
);
};
export default SignupCharges;

View File

@ -0,0 +1,119 @@
import makeStyles from '@mui/styles/makeStyles';
import { pxToRem } from '../../theme/typography';
export const useStyles = makeStyles((theme) => ({
chipClass: {
height: 'fit-content',
minHeight: '30px',
padding: '2px',
alignItems: 'center',
},
statusColor: {
color: theme.palette.primary.main,
fontSize: pxToRem(10),
},
tabsBox: {
display: 'flex',
justifyContent: ' space-around',
// width: '55%',
marginTop: theme.spacing(0.5),
marginRight: theme.spacing(5.0),
alignItems: 'center',
},
secondaryButton: {
width: '200px',
height: '46px',
borderRadius: '8px',
justifyContent: 'space-evenly',
fontSize: pxToRem(16),
},
tableActionIcons: {
marginRight: theme.spacing(1.4),
width: '15px',
},
companyNameTableColumn: {
display: 'flex',
alignItems: 'center',
},
companyName: {
marginLeft: theme.spacing(1),
fontSize: pxToRem(14),
objectFit: 'contain',
width: '260px',
},
companyNameLink: {
textDecoration: 'none',
color: theme.palette.grey[10],
'&:hover': {
color: theme.palette.info.main,
textDecoration: 'underline',
},
},
companyWebsiteLabel: {
fontSize: pxToRem(12),
},
companyNameLogo: {
height: '40px',
width: '40px',
borderRadius: theme.shape.borderRadiusComponent,
objectFit: 'contain',
},
sendEmailStatus: {
fontSize: pxToRem(14),
color: theme.palette.primary.main,
},
sendEmailLastSentMailDate: {
fontSize: pxToRem(12),
},
addDiscountCodeLink: {
fontSize: pxToRem(12),
color: theme.palette.primary.main,
},
addDiscountCodeLabel: {
fontSize: pxToRem(14),
backgroundColor: theme.palette.common.white,
color: theme.palette.common.black,
},
customModel: {
display: 'flex',
flexDirection: 'column',
justifyContent: 'center',
alignItems: 'center',
height: '100%',
},
customModelBox: {
paddingLeft: theme.spacing(5),
paddingRight: theme.spacing(5),
textAlign: 'center',
display: 'flex',
flexDirection: 'column',
justifyContent: 'center',
alignItems: 'center',
// height: '100%',
border: 'none',
},
newPlanTitleText: {
fontSize: pxToRem(28),
fontFamily: theme.fontFamily.bold,
},
newPlanSubTitleText: {
fontSize: pxToRem(18),
padding: theme.spacing(1),
},
addPlanSuccessIcon: {
padding: theme.spacing(2),
paddingTop: theme.spacing(1),
},
planAddedText: {
fontSize: pxToRem(12),
color: theme.palette.grey[54],
display: 'flex',
alignItems: 'center',
alignSelf: 'center',
},
verifyIcon: {
marginLeft: theme.spacing(0.3),
fontSize: pxToRem(12),
color: theme.palette.grey[54],
},
}));