Commit f8202c1e by Arjun Jhukal

integrated the filter by date on transaction table

parent ba6db028
import { Button, IconButton, InputAdornment, OutlinedInput, useMediaQuery } from "@mui/material"; import { Button, Dialog, DialogContent, IconButton, InputAdornment, OutlinedInput, useMediaQuery } from "@mui/material";
import SelectField from "../atom/SelectField"; import SelectField from "../atom/SelectField";
import { DocumentDownload, SearchNormal } from "@wandersonalwes/iconsax-react"; import { ArrowDown, DocumentDownload, SearchNormal } from "@wandersonalwes/iconsax-react";
import React from "react"; import React from "react";
import Filter from "../organism/Filter"; import Filter from "../organism/Filter";
import dayjs, { Dayjs } from "dayjs";
import DateRangePicker from "./DateRangePicker";
interface FilterOption { interface FilterOption {
value: string; value: string;
...@@ -24,6 +27,14 @@ interface TableHeaderProps { ...@@ -24,6 +27,14 @@ interface TableHeaderProps {
onDownloadCSV?: () => void; onDownloadCSV?: () => void;
downloading?: boolean; downloading?: boolean;
debounceDelay?: number; debounceDelay?: number;
customRange?: {
startDate: string;
endDate: string;
};
setCustomRange?: React.Dispatch<
React.SetStateAction<{ startDate: string; endDate: string }>
>;
} }
export default function TableHeader({ export default function TableHeader({
...@@ -36,6 +47,8 @@ export default function TableHeader({ ...@@ -36,6 +47,8 @@ export default function TableHeader({
filterOptions, filterOptions,
downloading, downloading,
debounceDelay = 500, debounceDelay = 500,
customRange,
setCustomRange,
}: TableHeaderProps) { }: TableHeaderProps) {
const downMD = useMediaQuery((theme: any) => theme.breakpoints.down('md')); const downMD = useMediaQuery((theme: any) => theme.breakpoints.down('md'));
...@@ -57,6 +70,30 @@ export default function TableHeader({ ...@@ -57,6 +70,30 @@ export default function TableHeader({
setLocalSearch(search); setLocalSearch(search);
}, [search]); }, [search]);
const [startDate, setStartDate] = React.useState<Dayjs | null>(
customRange?.startDate ? dayjs(customRange.startDate) : null
);
const [endDate, setEndDate] = React.useState<Dayjs | null>(
customRange?.endDate ? dayjs(customRange.endDate) : null
);
const [showCustomRangeModal, setShowCustomRangeModal] = React.useState(false);
const handleApplyCustomRange = () => {
if (startDate && endDate) {
setCustomRange && setCustomRange({
startDate: startDate.format("YYYY-MM-DD"),
endDate: endDate.format("YYYY-MM-DD"),
});
setShowCustomRangeModal(false);
}
};
const handleResetCustomRange = () => {
setStartDate(null);
setEndDate(null);
setShowCustomRangeModal(false);
};
return ( return (
<div className="table__header p-4 mb-4 flex flex-wrap justify-between items-center gap-4"> <div className="table__header p-4 mb-4 flex flex-wrap justify-between items-center gap-4">
{/* Search Field */} {/* Search Field */}
...@@ -103,6 +140,45 @@ export default function TableHeader({ ...@@ -103,6 +140,45 @@ export default function TableHeader({
)} )}
{/* <Filter /> */} {/* <Filter /> */}
<Button
startIcon={!downMD && <ArrowDown size={16} />}
onClick={() => setShowCustomRangeModal(true)}
sx={{
borderRadius: "8px",
border: "1px solid var(--Gray, #E0E0E3)",
padding: "8px 16px",
color: "#0E0E11",
maxWidth: "fit-content",
}}
>
Filter By Date
</Button>
<Dialog
open={showCustomRangeModal}
onClose={() => setShowCustomRangeModal(false)}
maxWidth="xs"
fullWidth
PaperProps={{
sx: {
borderRadius: 3,
backgroundColor: "rgba(0,0,0,0.8)", // ✅ visible background
boxShadow: 3, // ✅ subtle shadow
padding: 2,
},
}}
>
<DialogContent sx={{ p: 0 }}>
<DateRangePicker
startDate={startDate}
endDate={endDate}
onStartDateChange={setStartDate}
onEndDateChange={setEndDate}
onApply={handleApplyCustomRange}
onReset={handleResetCustomRange}
/>
</DialogContent>
</Dialog>
{/* Download Button */} {/* Download Button */}
{onDownloadCSV && <Button {onDownloadCSV && <Button
......
...@@ -36,6 +36,11 @@ export default function TransactionTable({ user_id, game_id, search, setSearch } ...@@ -36,6 +36,11 @@ export default function TransactionTable({ user_id, game_id, search, setSearch }
const [status, setStatus] = React.useState<TransactionStatusProps | undefined>(); const [status, setStatus] = React.useState<TransactionStatusProps | undefined>();
const [selectedGame, setSelectedGame] = React.useState(""); const [selectedGame, setSelectedGame] = React.useState("");
const [selectedTransactionType, setSelectedTransationType] = React.useState<TransactionTypeProps | string>(""); const [selectedTransactionType, setSelectedTransationType] = React.useState<TransactionTypeProps | string>("");
const [customRange, setCustomRange] = React.useState({
startDate: "",
endDate: ""
})
const queryArgs = useMemo( const queryArgs = useMemo(
() => ({ () => ({
page, page,
...@@ -45,9 +50,11 @@ export default function TransactionTable({ user_id, game_id, search, setSearch } ...@@ -45,9 +50,11 @@ export default function TransactionTable({ user_id, game_id, search, setSearch }
user_id, user_id,
status, status,
selectedGame, selectedGame,
selectedTransactionType selectedTransactionType,
start_date: customRange.startDate,
end_date: customRange.endDate
}), }),
[page, pageSize, search, game_id, user_id, status, selectedGame, selectedTransactionType] [page, pageSize, search, game_id, user_id, status, selectedGame, selectedTransactionType, customRange]
); );
const { data, isLoading: loadingTransaction } = useGetAllTransactionQuery(queryArgs); const { data, isLoading: loadingTransaction } = useGetAllTransactionQuery(queryArgs);
...@@ -65,14 +72,14 @@ export default function TransactionTable({ user_id, game_id, search, setSearch } ...@@ -65,14 +72,14 @@ export default function TransactionTable({ user_id, game_id, search, setSearch }
header: ({ column }) => <SortableHeader column={column} label="Player Name" />, header: ({ column }) => <SortableHeader column={column} label="Player Name" />,
cell: ({ row }) => { cell: ({ row }) => {
const { first_name, last_name } = row.original; const { first_name, last_name } = row.original;
const initials = getInitials(first_name, last_name); const initials = getInitials(first_name, last_name) || getInitials(row.original.username);
return ( return (
<Box className="flex items-center gap-2"> <Box className="flex items-center gap-2">
<small className="text-[10px] w-[24px] h-[24px] flex items-center justify-center uppercase rounded-[4px] bg-[#1EB41B]/10 font-[500] text-[#1EB41B]"> <small className="text-[10px] w-[24px] h-[24px] flex items-center justify-center uppercase rounded-[4px] bg-[#1EB41B]/10 font-[500] text-[#1EB41B]">
{initials} {initials}
</small> </small>
<div> <div>
<strong className="text-primary text-[12px] font-[500] capitalize"> <strong className="text-primary text-[12px] font-[500] capitalize block">
{first_name} {last_name} {first_name} {last_name}
</strong> </strong>
<small className="text-[10px] text-para-light font-[500]"> <small className="text-[10px] text-para-light font-[500]">
...@@ -141,35 +148,10 @@ export default function TransactionTable({ user_id, game_id, search, setSearch } ...@@ -141,35 +148,10 @@ export default function TransactionTable({ user_id, game_id, search, setSearch }
const { data: games, isLoading } = useGetAllGamesQuery(); const { data: games, isLoading } = useGetAllGamesQuery();
return ( return (
<div className="border-gray border-solid border-[1px] rounded-[8px] lg:rounded-[16px]"> <div className="border-gray border-solid border-[1px] rounded-[8px] lg:rounded-[16px]">
{/* <TableHeader
search={search}
setSearch={setSearch && setSearch}
onDownloadCSV={async () => {
try {
const response = await downloadTransaction({ user: user_id, game: game_id?.toString(),search:search }).unwrap();
dispatch(
showToast({
variant: ToastVariant.SUCCESS,
message: response.message || "CSV Downloaded successfully."
})
)
}
catch (e: any) {
dispatch(
showToast({
variant: ToastVariant.ERROR,
message: e.message || "Unable to download CSV."
})
)
}
}}
downloading={downloading}
filters={[
{ value: status || "", setValue: (value) => setStatus(value as TransactionStatusProps), options: StatusOptions, placeholder: "Filter by status" }
]}
/> */}
<TableHeader <TableHeader
search={search} search={search}
setSearch={setSearch && setSearch} setSearch={setSearch && setSearch}
...@@ -228,12 +210,14 @@ export default function TransactionTable({ user_id, game_id, search, setSearch } ...@@ -228,12 +210,14 @@ export default function TransactionTable({ user_id, game_id, search, setSearch }
setValue: (value) => setSelectedTransationType(value as string), setValue: (value) => setSelectedTransationType(value as string),
options: [ options: [
{ label: "All", value: "" }, { label: "All", value: "" },
{ label: "Withdrawl", value: "withdrawl" }, { label: "Withdrawal", value: "withdrawal" },
{ label: "Deposit", value: "deposit" }, { label: "Deposit", value: "deposit" },
], ],
placeholder: "Filter by Transaction Type", placeholder: "Filter by Transaction Type",
}, },
]} ]}
customRange={customRange}
setCustomRange={setCustomRange}
/> />
......
...@@ -60,8 +60,8 @@ export const transactionApi = createApi({ ...@@ -60,8 +60,8 @@ export const transactionApi = createApi({
}, },
providesTags: ["Withdrawl"] providesTags: ["Withdrawl"]
}), }),
getAllTransaction: builder.query<DepositListProps, QueryParams & { status?: TransactionStatusProps; user_id?: string | number; game_id?: string | number, selectedGame?: string; selectedTransactionType?: string }>({ getAllTransaction: builder.query<DepositListProps, QueryParams & { status?: TransactionStatusProps; user_id?: string | number; game_id?: string | number, selectedGame?: string; selectedTransactionType?: string, start_date?: string; end_date?: string; }>({
query: ({ search, page, per_page, user_id, game_id, status, selectedGame, selectedTransactionType }) => { query: ({ search, page, per_page, user_id, game_id, status, selectedGame, selectedTransactionType, start_date, end_date }) => {
const params = new URLSearchParams(); const params = new URLSearchParams();
if (search) params.append('search', search); if (search) params.append('search', search);
if (page) params.append('page', page.toString()); if (page) params.append('page', page.toString());
...@@ -71,6 +71,8 @@ export const transactionApi = createApi({ ...@@ -71,6 +71,8 @@ export const transactionApi = createApi({
if (status) params.append('status', status.toString()); if (status) params.append('status', status.toString());
if (selectedGame) params.append('game', selectedGame.toString()); if (selectedGame) params.append('game', selectedGame.toString());
if (selectedTransactionType) params.append('type', selectedTransactionType.toString()); if (selectedTransactionType) params.append('type', selectedTransactionType.toString());
if (start_date) params.append('start_date', start_date.toString());
if (end_date) params.append('end_date', end_date.toString());
const queryString = params.toString(); const queryString = params.toString();
return { return {
url: `/api/admin/transactions${queryString ? `?${queryString}` : ''}`, url: `/api/admin/transactions${queryString ? `?${queryString}` : ''}`,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment