const handleOnInputChange = (reason?: string, id?: string | null) => {
if (!id) {
setPreviewUrl(null);
setValue("type", 2);
reset({ type: 2 });
if (feeType === FeeType.sameFees) {
const editCourtValueReset: FormProps = {
...getAllValues,
name: "",
gameId: "",
courtId: "",
midNight: "",
morning: "",
evening: "",
night: "",
image: "",
};
// setValue("midNight", "");
// setValue("morning", "");
// setValue("evening", "");
// setValue("night", "");
// setValue("courtId", "");
reset(editCourtValueReset);
} else {
setValue("type", 2);
const dayWiseValues = {
...getAllValues,
name: "",
// gameId: "",
// courtId: "",
midNight: "",
morning: "",
evening: "",
night: "",
image: "",
// fees: DAYWISE_FEE,
type: 2,
};
setFeeType(2);
setDayWiseFeesData(DAYWISE_FEE);
reset(dayWiseValues);
}
}
};
/* eslint-disable max-lines */
import { useDashboardData } from "api/hooks/dashboard/useDashboardData";
import { useEffect, useState } from "react";
import { isAdminSite } from "utils/appUtils";
import { getColumnTotal } from "utils/helper";
import { rowsPerPageOptions } from "constants/data";
import { SubHeading } from "constants/enums";
import { images } from "constants/images";
import { paymentHistoryColumns } from "pages/bookings/paymentHistoryTable";
import { Box, Card, Loader, IconButton, Image } from "uiCore";
import { DetailsCard } from "uiCore/detailsCard/DetailsCard";
import { excelDownload } from "../downloadList";
import { BookingFilter } from "../Filter";
import { PaymentDetailsDialog } from "../PaymentDetailsModel";
import { BookingTable } from "../Table";
import { useStyle } from "./style";
export interface FilterProps {
gameId?: string;
courtId?: string;
startDate?: string;
endDate?: string;
createdEndDate?: string;
createdStartDate?: string;
}
export interface Props {
isUpcomingBooking?: boolean;
}
export const ManageBookings = ({ isUpcomingBooking = false }: Props) => {
const [upcomingLimit, setUpcomingLimit] = useState(10);
const [bookingHistoryLimit, setBookingHistoryLimit] = useState(10);
const initialFilterData = {
page: 1,
limit: upcomingLimit,
gameId: "",
courtId: "",
startDate: "",
endDate: "",
createdEndDate: "",
createdStartDate: "",
isClear: false,
isUpcoming: isUpcomingBooking,
};
const [filterData, setFilterData] = useState(initialFilterData);
const [totalAmount, setTotalAmount] = useState(0);
const [filterOpen, setFilterOpen] = useState(false);
const classes = useStyle({ filterOpen });
const [queryData, setQueryData] = useState(filterData);
const [openPaymentDetailModal, setOpenPaymentDetailModal] = useState(false);
const [isFilterApplied, setIsFilterApplied] = useState(false);
const [selectedOrderId, setSelectedOrderId] = useState("");
const [selectedGameId, setSelectedGameId] = useState("");
const [selectedCourtId, setSelectedCourtId] = useState("");
const [isExcelDataLoading, setIsExcelDataLoading] = useState(false);
const { dashboardData, isDashboardLoading, isDashboardSuccess } =
useDashboardData(queryData);
useEffect(() => {
if (dashboardData?.data?.paymentLogs?.length) {
const amount = getColumnTotal(dashboardData.data.paymentLogs, "amount");
setTotalAmount(amount);
}
}, [dashboardData]);
useEffect(() => {
if (filterData.isClear) {
isFilterApplied && setQueryData({ ...filterData });
setFilterData({ ...filterData, isClear: false });
setIsFilterApplied(false);
}
}, [filterData]);
useEffect(() => {
setQueryData({
...initialFilterData,
limit: isUpcomingBooking ? upcomingLimit : bookingHistoryLimit,
isUpcoming: isUpcomingBooking,
});
setFilterData(initialFilterData);
}, [isUpcomingBooking]);
const handleFilter = () => {
setFilterOpen(!filterOpen);
};
const handleSetFilterData = (filterProps: FilterProps) => {
setFilterData((prev) => ({
...prev,
...filterProps,
}));
};
const handleFilterSubmit = () => {
let dateData = {};
if (filterData.startDate && !filterData.endDate) {
dateData = { endDate: filterData.startDate };
}
if (filterData.createdStartDate && !filterData.createdEndDate) {
dateData = { createdEndDate: filterData.createdStartDate };
}
setQueryData((prev) => ({
...prev,
...filterData,
isUpcoming: isUpcomingBooking,
...dateData,
}));
setFilterOpen(false);
setIsFilterApplied(true);
};
const handleFilterClear = () => {
setFilterData({
...initialFilterData,
isClear: true,
isUpcoming: isUpcomingBooking,
});
};
const handlePageChange = (newPage: number) => {
setQueryData({ ...queryData, page: newPage + 1 });
};
const handlePageSizeChange = (limit: number) => {
if (queryData.isUpcoming) {
setUpcomingLimit(limit);
} else {
setBookingHistoryLimit(limit);
}
setQueryData({ ...queryData, page: 1, limit });
};
const closePaymentDetailsDialog = () => {
setOpenPaymentDetailModal(false);
};
const handleExport = async () => {
const totalCount = isUpcomingBooking
? dashboardData?.data?.totalUpcomingBookings
: dashboardData?.data?.totalBooking;
if (totalCount && dashboardData?.data?.paymentLogs?.length) {
try {
await excelDownload({
totalCount,
queryData,
setIsExcelDataLoading,
});
} finally {
setIsExcelDataLoading(false);
}
}
};
const {
courtId,
createdEndDate,
createdStartDate,
endDate,
gameId,
startDate,
} = filterData;
const buttonDisable =
!gameId &&
!courtId &&
!startDate &&
!endDate &&
!createdStartDate &&
!createdEndDate;
return (
<>
<Box className={classes.topCardsGroup}>
{!isUpcomingBooking && (
<>
<DetailsCard
label={isAdminSite ? "Total Earnings" : "Total Paid"}
isLoading={isDashboardLoading}
data={dashboardData?.data?.totalEarning}
rupeesIcon
decimal={2}
icon={images.totalAmount.default}
/>
<DetailsCard
label="Total Bookings"
isLoading={isDashboardLoading}
data={dashboardData?.data?.totalBooking}
icon={images.booking.default}
isTotalBooking
/>
</>
)}
<DetailsCard
label="Total Amount"
isLoading={isDashboardLoading}
rupeesIcon
data={
dashboardData?.data?.paymentLogs.length > 0
? Number(totalAmount)
: 0
}
icon={images.totalAmount.default}
decimal={2}
/>
</Box>
<Card
title={
isUpcomingBooking
? SubHeading.upcomingBookings
: SubHeading.bookingHistory
}
headerActionClassName={classes.DashboardHeaderAction}
sx={{ boxShadow: 5 }}
action={
<Box
sx={{
display: "flex",
justifyContent: "space-between",
alignItems: "center",
}}
>
<IconButton
onClick={handleExport}
id="export-image"
title="Export"
color="primary"
disabled={dashboardData?.data?.paymentLogs?.length === 0}
>
{isExcelDataLoading ? (
<Loader size={22} />
) : (
<Image src={images.download.default} />
)}
</IconButton>
{(dashboardData?.data?.paymentLogs?.length > 0 ||
!buttonDisable) && (
<IconButton onClick={handleFilter} color="primary" title="Filter">
<Image
src={images.filter.default}
className={classes.dashboardFilterIcon}
/>
</IconButton>
)}
</Box>
}
>
<Box className={classes.dashboardMain}>
<Box className={classes.dashboardCard}>
<Box className={classes.top}>
<Box className={classes.dashboardFilter}>
<Box className={classes.dashboardFilterIconMain}>
{filterOpen && (
<BookingFilter
selectedGameId={selectedGameId}
setSelectedGameId={setSelectedGameId}
selectedCourtId={selectedCourtId}
setSelectedCourtId={setSelectedCourtId}
gameId={filterData.gameId}
courtId={filterData.courtId}
endDate={filterData.endDate}
startDate={filterData.startDate}
createdEndDate={filterData.createdEndDate}
createdStartDate={filterData.createdStartDate}
handleFilterSubmit={handleFilterSubmit}
handleFilterClear={handleFilterClear}
handleSetFilterData={handleSetFilterData}
/>
)}
</Box>
</Box>
</Box>
<Box className={classes.bottom}>
<Box className={classes.tablesection}>
<BookingTable
rowData={dashboardData?.data?.paymentLogs}
columns={paymentHistoryColumns(
setOpenPaymentDetailModal,
setSelectedOrderId,
isUpcomingBooking
)}
page={queryData.page - 1}
rowCount={
queryData.isUpcoming
? dashboardData?.data?.totalUpcomingBookings
: dashboardData?.data?.totalBooking
}
pageSize={queryData.limit}
onPageSizeChange={handlePageSizeChange}
onPageChange={handlePageChange}
rowsPerPageOptions={rowsPerPageOptions}
loading={isDashboardLoading || !isDashboardSuccess}
/>
</Box>
</Box>
</Box>
</Box>
</Card>
<PaymentDetailsDialog
closePaymentDetailsDialog={closePaymentDetailsDialog}
openPaymentDetailModal={openPaymentDetailModal}
selectedOrderId={selectedOrderId}
/>
</>
);
};
import Box from "@mui/material/Box";
import { styled } from "@mui/material/styles";
import { images } from "constants/images";
import { Image } from "uiCore/image";
const StyledGridOverlay = styled("div")(({ theme }) => ({
display: "flex",
flexDirection: "column",
alignItems: "center",
justifyContent: "center",
height: "330px",
"& .ant-empty-img-1": {
fill: theme.palette.mode === "light" ? "#aeb8c2" : "#262626",
},
"& .ant-empty-img-2": {
fill: theme.palette.mode === "light" ? "#f5f5f7" : "#595959",
},
"& .ant-empty-img-3": {
fill: theme.palette.mode === "light" ? "#dce0e6" : "#434343",
},
"& .ant-empty-img-4": {
fill: theme.palette.mode === "light" ? "#fff" : "#1c1c1c",
},
"& .ant-empty-img-5": {
fillOpacity: theme.palette.mode === "light" ? "0.8" : "0.08",
fill: theme.palette.mode === "light" ? "#f5f5f5" : "#fff",
},
".noDataText": {
marginTop: "0.3rem",
paddingLeft: "0.1rem",
color: theme.palette.grey[400],
},
}));
export const NoData = () => {
return (
<StyledGridOverlay>
<Image src={images.noData} />
<Box className="noDataText">No Record Found</Box>
</StyledGridOverlay>
);
};
/* eslint-disable max-lines */
import { useDashboardData } from "api/hooks/dashboard/useDashboardData";
import { useEffect, useState } from "react";
import { isAdminSite } from "utils/appUtils";
import { getColumnTotal } from "utils/helper";
import { rowsPerPageOptions } from "constants/data";
import { SubHeading } from "constants/enums";
import { images } from "constants/images";
import { paymentHistoryColumns } from "pages/bookings/paymentHistoryTable";
import { Box, Card, Loader, IconButton, Image } from "uiCore";
import { DetailsCard } from "uiCore/detailsCard/DetailsCard";
import { excelDownload } from "../downloadList";
import { BookingFilter } from "../Filter";
import { PaymentDetailsDialog } from "../PaymentDetailsModel";
import { BookingTable } from "../Table";
import { useStyle } from "./style";
export interface FilterProps {
gameId?: string;
courtId?: string;
startDate?: string;
endDate?: string;
createdEndDate?: string;
createdStartDate?: string;
}
export interface Props {
isUpcomingBooking?: boolean;
}
export const ManageBookings = ({ isUpcomingBooking = false }: Props) => {
const [upcomingLimit, setUpcomingLimit] = useState(10);
const [bookingHistoryLimit, setBookingHistoryLimit] = useState(10);
const initialFilterData = {
page: 1,
limit: upcomingLimit,
gameId: "",
courtId: "",
startDate: "",
endDate: "",
createdEndDate: "",
createdStartDate: "",
isClear: false,
isUpcoming: isUpcomingBooking,
};
const [filterData, setFilterData] = useState(initialFilterData);
const [totalAmount, setTotalAmount] = useState(0);
const [filterOpen, setFilterOpen] = useState(false);
const classes = useStyle({ filterOpen });
const [queryData, setQueryData] = useState(filterData);
const [openPaymentDetailModal, setOpenPaymentDetailModal] = useState(false);
const [isFilterApplied, setIsFilterApplied] = useState(false);
const [selectedOrderId, setSelectedOrderId] = useState("");
const [isExcelDataLoading, setIsExcelDataLoading] = useState(false);
const { dashboardData, isDashboardLoading, isDashboardSuccess } =
useDashboardData(queryData);
useEffect(() => {
if (dashboardData?.data?.paymentLogs?.length) {
const amount = getColumnTotal(dashboardData.data.paymentLogs, "amount");
setTotalAmount(amount);
}
}, [dashboardData]);
useEffect(() => {
if (filterData.isClear) {
isFilterApplied && setQueryData({ ...filterData });
setFilterData({ ...filterData, isClear: false });
setIsFilterApplied(false);
}
}, [filterData]);
useEffect(() => {
setQueryData({
...initialFilterData,
limit: isUpcomingBooking ? upcomingLimit : bookingHistoryLimit,
isUpcoming: isUpcomingBooking,
});
setFilterData(initialFilterData);
}, [isUpcomingBooking]);
const handleFilter = () => {
setFilterOpen(!filterOpen);
};
const handleSetFilterData = (filterProps: FilterProps) => {
setFilterData((prev) => ({
...prev,
...filterProps,
}));
};
const handleFilterSubmit = () => {
let dateData = {};
if (filterData.startDate && !filterData.endDate) {
dateData = { endDate: filterData.startDate };
}
if (filterData.createdStartDate && !filterData.createdEndDate) {
dateData = { createdEndDate: filterData.createdStartDate };
}
setQueryData((prev) => ({
...prev,
...filterData,
isUpcoming: isUpcomingBooking,
...dateData,
}));
setFilterOpen(false);
setIsFilterApplied(true);
};
const handleFilterClear = () => {
setFilterData({
...initialFilterData,
isClear: true,
isUpcoming: isUpcomingBooking,
});
};
const handlePageChange = (newPage: number) => {
setQueryData({ ...queryData, page: newPage + 1 });
};
const handlePageSizeChange = (limit: number) => {
if (queryData.isUpcoming) {
setUpcomingLimit(limit);
} else {
setBookingHistoryLimit(limit);
}
setQueryData({ ...queryData, page: 1, limit });
};
const closePaymentDetailsDialog = () => {
setOpenPaymentDetailModal(false);
};
const handleExport = async () => {
const totalCount = isUpcomingBooking
? dashboardData?.data?.totalUpcomingBookings
: dashboardData?.data?.totalBooking;
if (totalCount && dashboardData?.data?.paymentLogs?.length) {
try {
await excelDownload({
totalCount,
queryData,
setIsExcelDataLoading,
});
} finally {
setIsExcelDataLoading(false);
}
}
};
const {
courtId,
createdEndDate,
createdStartDate,
endDate,
gameId,
startDate,
} = filterData;
const buttonDisable =
!gameId &&
!courtId &&
!startDate &&
!endDate &&
!createdStartDate &&
!createdEndDate;
return (
<>
<Box className={classes.topCardsGroup}>
{!isUpcomingBooking && (
<>
<DetailsCard
label={isAdminSite ? "Total Earnings" : "Total Paid"}
isLoading={isDashboardLoading}
data={dashboardData?.data?.totalEarning}
rupeesIcon
decimal={2}
icon={images.totalAmount.default}
/>
<DetailsCard
label="Total Bookings"
isLoading={isDashboardLoading}
data={dashboardData?.data?.totalBooking}
icon={images.booking.default}
isTotalBooking
/>
</>
)}
<DetailsCard
label="Total Amount"
isLoading={isDashboardLoading}
rupeesIcon
data={
dashboardData?.data?.paymentLogs.length > 0
? Number(totalAmount)
: 0
}
icon={images.totalAmount.default}
decimal={2}
/>
</Box>
<Card
title={
isUpcomingBooking
? SubHeading.upcomingBookings
: SubHeading.bookingHistory
}
headerActionClassName={classes.DashboardHeaderAction}
sx={{ boxShadow: 5 }}
action={
<Box
sx={{
display: "flex",
justifyContent: "space-between",
alignItems: "center",
}}
>
<IconButton
onClick={handleExport}
id="export-image"
title="Export"
color="primary"
disabled={dashboardData?.data?.paymentLogs?.length === 0}
>
{isExcelDataLoading ? (
<Loader size={22} />
) : (
<Image src={images.download.default} />
)}
</IconButton>
{(dashboardData?.data?.paymentLogs?.length > 0 ||
!buttonDisable) && (
<IconButton onClick={handleFilter} color="primary" title="Filter">
<Image
src={images.filter.default}
className={classes.dashboardFilterIcon}
/>
</IconButton>
)}
</Box>
}
>
<Box className={classes.dashboardMain}>
<Box className={classes.dashboardCard}>
<Box className={classes.top}>
<Box className={classes.dashboardFilter}>
<Box className={classes.dashboardFilterIconMain}>
{filterOpen && (
<BookingFilter
gameId={filterData.gameId}
courtId={filterData.courtId}
endDate={filterData.endDate}
startDate={filterData.startDate}
createdEndDate={filterData.createdEndDate}
createdStartDate={filterData.createdStartDate}
handleFilterSubmit={handleFilterSubmit}
handleFilterClear={handleFilterClear}
handleSetFilterData={handleSetFilterData}
/>
)}
</Box>
</Box>
</Box>
<Box className={classes.bottom}>
<Box className={classes.tablesection}>
<BookingTable
rowData={dashboardData?.data?.paymentLogs}
columns={paymentHistoryColumns(
setOpenPaymentDetailModal,
setSelectedOrderId,
isUpcomingBooking
)}
page={queryData.page - 1}
rowCount={
queryData.isUpcoming
? dashboardData?.data?.totalUpcomingBookings
: dashboardData?.data?.totalBooking
}
pageSize={queryData.limit}
onPageSizeChange={handlePageSizeChange}
onPageChange={handlePageChange}
rowsPerPageOptions={rowsPerPageOptions}
loading={isDashboardLoading || !isDashboardSuccess}
/>
</Box>
</Box>
</Box>
</Box>
</Card>
<PaymentDetailsDialog
closePaymentDetailsDialog={closePaymentDetailsDialog}
openPaymentDetailModal={openPaymentDetailModal}
selectedOrderId={selectedOrderId}
/>
</>
);
};
export const images = {
confirmationImage: require("assets/images/confirmation/confirmation.gif"),
excelIcon: require("assets/images/excel/excelIcon.png"),
error: require("assets/images/error/error.png"),
emptyImage: require("assets/images/emptyImage/emptyImage.png"),
success: require("assets/icons/success.png"),
inProgress: require("assets/icons/inProgress.gif"),
fail: require("assets/icons/fail.png"),
totalEarning: require("assets/icons/totalEarning.png"),
totalAmount: require("assets/icons/Paid.svg"),
wallet: require("assets/icons/Wallet.svg"),
booking: require("assets/icons/Bookings.svg"),
totalBooking: require("assets/icons/totalBooking.png"),
totalPaid: require("assets/icons/totalPaid.png"),
lastPayout: require("assets/icons/lastPayout.png"),
lastPayoutTime: require("assets/icons/lastPayoutTime.png"),
noImage: require("assets/images/emptyImage/initialImage.jpg"),
uploadImage: require("assets/icons/upload.png"),
download: require("assets/icons/download.svg"),
filter: require("assets/icons/Filter.svg"),
};


