send filter data for reports

This commit is contained in:
2026-06-15 15:00:28 +03:30
parent 18674a5b75
commit f42a4ff63b
13 changed files with 105 additions and 95 deletions

View File

@@ -6,107 +6,107 @@ import { Controller, useWatch } from "react-hook-form";
const MissionDates = ({ control }) => { const MissionDates = ({ control }) => {
const type = useWatch({ control, name: "type" }); const type = useWatch({ control, name: "type" });
const start_date = useWatch({ control, name: "start_date" }); const start_date = useWatch({ control, name: "start_date" });
const end_date = useWatch({ control, name: "end_date" }); const end_date = useWatch({ control, name: "end_date" });
const start_time = useWatch({ control, name: "start_time" }); const start_time = useWatch({ control, name: "start_time" });
const end_time = useWatch({ control, name: "end_time" }); const end_time = useWatch({ control, name: "end_time" });
const startDateTime = makeDateTime(start_date, start_time);
const endDateTime = makeDateTime(end_date, end_time);
const now = new Date(); const now = new Date();
const startDateTime = start_date && start_time ? makeDateTime(start_date, start_time) : null;
const endDateTime = end_date && end_time ? makeDateTime(end_date, end_time) : null;
const isSameDay =
start_date && end_date && new Date(start_date).toDateString() === new Date(end_date).toDateString();
const isToday = start_date && new Date(start_date).toDateString() === now.toDateString();
return ( return (
type && ( type && (
<> <>
<Grid item xs={12} sm={6}> <Grid item xs={12} sm={6}>
<Controller <Controller
control={control} control={control}
name={"start_date"} name="start_date"
render={({ field, fieldState: { error } }) => { render={({ field, fieldState: { error } }) => (
return ( <MuiDatePicker
<MuiDatePicker name="start_date"
name="start_date" value={field.value}
error={error} error={error}
value={field.value} disableFuture={false}
disableFuture={false} minDate={now}
minDate={now} maxDate={end_date ?? null}
maxDate={end_date ?? null} label="تاریخ شروع ماموریت"
placeholder={"تاریخ شروع ماموریت را وارد کنید"} placeholder="تاریخ شروع ماموریت را وارد کنید"
label={"تاریخ شروع ماموریت"} setFieldValue={(name, value) => field.onChange(value || null)}
setFieldValue={(name, value) => field.onChange(value || [])} helperText={error?.message}
helperText={error ? error.message : null} />
/> )}
);
}}
/> />
</Grid> </Grid>
{type == 1 && ( {type == 1 && (
<Grid item xs={12} sm={6}> <Grid item xs={12} sm={6}>
<Controller <Controller
control={control} control={control}
name={"start_time"} name="start_time"
render={({ field, fieldState: { error } }) => { render={({ field, fieldState: { error } }) => (
return ( <MuiTimePicker
<MuiTimePicker name="start_time"
name="start_time" value={field.value}
error={error} error={error}
value={field.value} minTime={isToday ? now : null}
minTime={ maxTime={isSameDay && endDateTime ? endDateTime : null}
start_date && new Date(start_date).toDateString() === now.toDateString() label="زمان شروع ماموریت"
? now placeholder="زمان شروع ماموریت را وارد کنید"
: null setFieldValue={(name, value) => field.onChange(value || null)}
} helperText={error?.message}
maxTime={endDateTime ?? null} />
placeholder={"زمان شروع ماموریت را وارد کنید"} )}
label={"زمان شروع ماموریت"}
setFieldValue={(name, value) => field.onChange(value || null)}
helperText={error ? error.message : null}
/>
);
}}
/> />
</Grid> </Grid>
)} )}
<Grid item xs={12} sm={6}> <Grid item xs={12} sm={6}>
<Controller <Controller
control={control} control={control}
name={"end_date"} name="end_date"
render={({ field, fieldState: { error } }) => { render={({ field, fieldState: { error } }) => (
return ( <MuiDatePicker
<MuiDatePicker name="end_date"
name="end_date" value={field.value}
error={error} error={error}
value={field.value} disableFuture={false}
disableFuture={false} minDate={start_date || now}
minDate={start_date ? start_date : now} label="تاریخ پایان ماموریت"
placeholder={"تاریخ پایان ماموریت را وارد کنید"} placeholder="تاریخ پایان ماموریت را وارد کنید"
label={"تاریخ پایان ماموریت"} setFieldValue={(name, value) => field.onChange(value || null)}
setFieldValue={(name, value) => field.onChange(value || [])} helperText={error?.message}
helperText={error ? error.message : null} />
/> )}
);
}}
/> />
</Grid> </Grid>
{type == 1 && ( {type == 1 && (
<Grid item xs={12} sm={6}> <Grid item xs={12} sm={6}>
<Controller <Controller
control={control} control={control}
name={"end_time"} name="end_time"
render={({ field, fieldState: { error } }) => { render={({ field, fieldState: { error } }) => (
return ( <MuiTimePicker
<MuiTimePicker name="end_time"
name="end_time" value={field.value}
error={error} error={error}
value={field.value} minTime={isSameDay && startDateTime ? startDateTime : null}
minTime={startDateTime ?? null} label="زمان پایان ماموریت"
placeholder={"زمان پایان ماموریت را وارد کنید"} placeholder="زمان پایان ماموریت را وارد کنید"
label={"زمان پایان ماموریت"} setFieldValue={(name, value) => field.onChange(value || null)}
setFieldValue={(name, value) => field.onChange(value || null)} helperText={error?.message}
helperText={error ? error.message : null} />
/> )}
);
}}
/> />
</Grid> </Grid>
)} )}
@@ -114,4 +114,5 @@ const MissionDates = ({ control }) => {
) )
); );
}; };
export default MissionDates; export default MissionDates;

View File

@@ -50,7 +50,8 @@ const DriverReportsList = ({ data, specialFilter }) => {
}, },
]; ];
}, []); }, []);
const cleanedData = specialFilter.filter((item) => !(item.id === "province_id" && item.value === "-1"));
const RowActionsWithRowData = (props) => <RowActions specialFilter={cleanedData} {...props} />;
return ( return (
<Box sx={{ p: 1, border: 1, borderColor: "divider", borderRadius: 1 }}> <Box sx={{ p: 1, border: 1, borderColor: "divider", borderRadius: 1 }}>
<DataTableWithAuth <DataTableWithAuth
@@ -62,7 +63,7 @@ const DriverReportsList = ({ data, specialFilter }) => {
enablePagination={false} enablePagination={false}
specialFilter={specialFilter} specialFilter={specialFilter}
enableRowActions enableRowActions
RowActions={RowActions} RowActions={RowActionsWithRowData}
/> />
</Box> </Box>
); );

View File

@@ -3,7 +3,7 @@ import { GET_DRIVER_DETAILS } from "@/core/utils/routes";
import { Box } from "@mui/material"; import { Box } from "@mui/material";
import { useMemo } from "react"; import { useMemo } from "react";
const DriverList = ({ row }) => { const DriverList = ({ row, specialFilter }) => {
const columns = useMemo( const columns = useMemo(
() => [ () => [
{ {
@@ -93,6 +93,7 @@ const DriverList = ({ row }) => {
<DataTableWithAuth <DataTableWithAuth
need_filter={true} need_filter={true}
columns={columns} columns={columns}
specialFilter={specialFilter}
sorting={[{ id: "id", desc: true }]} sorting={[{ id: "id", desc: true }]}
table_url={`${GET_DRIVER_DETAILS}/${row.driver_id}`} table_url={`${GET_DRIVER_DETAILS}/${row.driver_id}`}
page_name={"driverListReport"} page_name={"driverListReport"}

View File

@@ -2,14 +2,14 @@ import { Box, Button, DialogActions, DialogContent } from "@mui/material";
import { Stack } from "@mui/system"; import { Stack } from "@mui/system";
import DriverList from "./DriverDetailsDialog/DriverList"; import DriverList from "./DriverDetailsDialog/DriverList";
const DriverDetailsTable = ({ row, setOpenDriverDetails }) => { const DriverDetailsTable = ({ row, setOpenDriverDetails, specialFilter }) => {
return ( return (
<> <>
<DialogContent dividers> <DialogContent dividers>
<Box sx={{ flex: 1 }}> <Box sx={{ flex: 1 }}>
<Stack spacing={3}> <Stack spacing={3}>
<Stack spacing={2}> <Stack spacing={2}>
<DriverList row={row} /> <DriverList specialFilter={specialFilter} row={row} />
</Stack> </Stack>
</Stack> </Stack>
</Box> </Box>

View File

@@ -3,7 +3,7 @@ import { Dialog, DialogTitle, IconButton, Tooltip } from "@mui/material";
import { useState } from "react"; import { useState } from "react";
import DriverDetailsTable from "./Form"; import DriverDetailsTable from "./Form";
const DriverDetails = ({ row }) => { const DriverDetails = ({ row, specialFilter }) => {
const [openDriverDetails, setOpenDriverDetails] = useState(false); const [openDriverDetails, setOpenDriverDetails] = useState(false);
return ( return (
@@ -35,7 +35,11 @@ const DriverDetails = ({ row }) => {
</IconButton> </IconButton>
<DialogTitle>ریز گزارشات راننده</DialogTitle> <DialogTitle>ریز گزارشات راننده</DialogTitle>
{openDriverDetails && ( {openDriverDetails && (
<DriverDetailsTable row={row.original} setOpenDriverDetails={setOpenDriverDetails} /> <DriverDetailsTable
specialFilter={specialFilter}
row={row.original}
setOpenDriverDetails={setOpenDriverDetails}
/>
)} )}
</Dialog> </Dialog>
</> </>

View File

@@ -1,6 +1,6 @@
import DriverDetails from "./DriverDetails"; import DriverDetails from "./DriverDetails";
const RowActions = ({ row }) => { const RowActions = ({ row, specialFilter }) => {
return <DriverDetails row={row} />; return <DriverDetails specialFilter={specialFilter} row={row} />;
}; };
export default RowActions; export default RowActions;

View File

@@ -27,8 +27,8 @@ const DriverReportsPage = () => {
}; };
const defaultFilter = [ const defaultFilter = [
{ value: `${defaultValues.province_id}`, datatype: "numeric", id: "province_id", fn: "equals" }, { value: `${defaultValues.province_id}`, datatype: "numeric", id: "province_id", fn: "equals" },
{ value: `${defaultValues.from_date}`, datatype: "date", id: "from_date", fn: "between" }, { value: `${defaultValues.from_date} 00:00:00`, datatype: "date", id: "start_time", fn: "greaterThan" },
{ value: `${defaultValues.date_to}`, datatype: "date", id: "date_to", fn: "between" }, { value: `${defaultValues.date_to} 23:59:59`, datatype: "date", id: "finish_time", fn: "lessThan" },
]; ];
const [specialFilter, setSpecialFilter] = useState(defaultFilter); const [specialFilter, setSpecialFilter] = useState(defaultFilter);
@@ -38,8 +38,8 @@ const DriverReportsPage = () => {
params.set("date_to", `${data.date_to} 23:59:59`); params.set("date_to", `${data.date_to} 23:59:59`);
setSpecialFilter([ setSpecialFilter([
{ value: `${data.province_id}`, datatype: "numeric", id: "province_id", fn: "equals" }, { value: `${data.province_id}`, datatype: "numeric", id: "province_id", fn: "equals" },
{ value: `${data.from_date}`, datatype: "date", id: "from_date", fn: "between" }, { value: `${data.from_date} 00:00:00`, datatype: "date", id: "start_time", fn: "greaterThan" },
{ value: `${data.date_to}`, datatype: "date", id: "date_to", fn: "between" }, { value: `${data.date_to} 23:59:59`, datatype: "date", id: "finish_time", fn: "lessThan" },
]); ]);
if (data.province_id === "-1") { if (data.province_id === "-1") {
try { try {

View File

@@ -60,7 +60,8 @@ const MachinesReportsList = ({ data, specialFilter }) => {
}, },
]; ];
}, []); }, []);
const cleanedData = specialFilter.filter((item) => !(item.id === "province_id" && item.value === "-1"));
const RowActionsWithRowData = (props) => <RowActions specialFilter={cleanedData} {...props} />;
return ( return (
<Box sx={{ p: 1, border: 1, borderColor: "divider", borderRadius: 1 }}> <Box sx={{ p: 1, border: 1, borderColor: "divider", borderRadius: 1 }}>
<DataTableWithAuth <DataTableWithAuth
@@ -72,7 +73,7 @@ const MachinesReportsList = ({ data, specialFilter }) => {
enablePagination={false} enablePagination={false}
specialFilter={specialFilter} specialFilter={specialFilter}
enableRowActions enableRowActions
RowActions={RowActions} RowActions={RowActionsWithRowData}
/> />
</Box> </Box>
); );

View File

@@ -3,7 +3,7 @@ import { GET_MACHINE_MISSIONS_DETAILS } from "@/core/utils/routes";
import { Box } from "@mui/material"; import { Box } from "@mui/material";
import { useMemo } from "react"; import { useMemo } from "react";
const MachineMissionsList = ({ row }) => { const MachineMissionsList = ({ row, specialFilter }) => {
const columns = useMemo( const columns = useMemo(
() => [ () => [
{ {
@@ -91,6 +91,7 @@ const MachineMissionsList = ({ row }) => {
<> <>
<Box sx={{ mt: 3 }}> <Box sx={{ mt: 3 }}>
<DataTableWithAuth <DataTableWithAuth
specialFilter={specialFilter}
need_filter={true} need_filter={true}
columns={columns} columns={columns}
sorting={[{ id: "id", desc: true }]} sorting={[{ id: "id", desc: true }]}

View File

@@ -2,14 +2,14 @@ import { Box, Button, DialogActions, DialogContent } from "@mui/material";
import { Stack } from "@mui/system"; import { Stack } from "@mui/system";
import MachineMissionsList from "./MachineMissionsDetailsDialog/MachineMissionsList"; import MachineMissionsList from "./MachineMissionsDetailsDialog/MachineMissionsList";
const MachineMissionsDetailsTable = ({ row, setOpenMachineMissionsDetails }) => { const MachineMissionsDetailsTable = ({ row, setOpenMachineMissionsDetails, specialFilter }) => {
return ( return (
<> <>
<DialogContent dividers> <DialogContent dividers>
<Box sx={{ flex: 1 }}> <Box sx={{ flex: 1 }}>
<Stack spacing={3}> <Stack spacing={3}>
<Stack spacing={2}> <Stack spacing={2}>
<MachineMissionsList row={row} /> <MachineMissionsList specialFilter={specialFilter} row={row} />
</Stack> </Stack>
</Stack> </Stack>
</Box> </Box>

View File

@@ -3,7 +3,7 @@ import { Dialog, DialogTitle, IconButton, Tooltip } from "@mui/material";
import { useState } from "react"; import { useState } from "react";
import MachineMissionsDetailsTable from "./Form"; import MachineMissionsDetailsTable from "./Form";
const MissionDetails = ({ row }) => { const MissionDetails = ({ row, specialFilter }) => {
const [openMachineMissionsDetails, setOpenMachineMissionsDetails] = useState(false); const [openMachineMissionsDetails, setOpenMachineMissionsDetails] = useState(false);
return ( return (
@@ -36,6 +36,7 @@ const MissionDetails = ({ row }) => {
<DialogTitle>ریز گزارشات خودرو</DialogTitle> <DialogTitle>ریز گزارشات خودرو</DialogTitle>
{openMachineMissionsDetails && ( {openMachineMissionsDetails && (
<MachineMissionsDetailsTable <MachineMissionsDetailsTable
specialFilter={specialFilter}
row={row.original} row={row.original}
setOpenMachineMissionsDetails={setOpenMachineMissionsDetails} setOpenMachineMissionsDetails={setOpenMachineMissionsDetails}
/> />

View File

@@ -1,6 +1,6 @@
import MissionDetails from "./MissionDitails"; import MissionDetails from "./MissionDitails";
const RowActions = ({ row }) => { const RowActions = ({ row, specialFilter }) => {
return <MissionDetails row={row} />; return <MissionDetails specialFilter={specialFilter} row={row} />;
}; };
export default RowActions; export default RowActions;

View File

@@ -27,8 +27,8 @@ const MachinesReportsPage = () => {
}; };
const defaultFilter = [ const defaultFilter = [
{ value: `${defaultValues.province_id}`, datatype: "numeric", id: "province_id", fn: "equals" }, { value: `${defaultValues.province_id}`, datatype: "numeric", id: "province_id", fn: "equals" },
{ value: `${defaultValues.from_date}`, datatype: "date", id: "from_date", fn: "between" }, { value: `${defaultValues.from_date} 00:00:00`, datatype: "date", id: "start_time", fn: "greaterThan" },
{ value: `${defaultValues.date_to}`, datatype: "date", id: "date_to", fn: "between" }, { value: `${defaultValues.date_to} 23:59:59`, datatype: "date", id: "finish_time", fn: "lessThan" },
]; ];
const [specialFilter, setSpecialFilter] = useState(defaultFilter); const [specialFilter, setSpecialFilter] = useState(defaultFilter);
@@ -38,8 +38,8 @@ const MachinesReportsPage = () => {
params.set("date_to", `${data.date_to} 23:59:59`); params.set("date_to", `${data.date_to} 23:59:59`);
setSpecialFilter([ setSpecialFilter([
{ value: `${data.province_id}`, datatype: "numeric", id: "province_id", fn: "equals" }, { value: `${data.province_id}`, datatype: "numeric", id: "province_id", fn: "equals" },
{ value: `${data.from_date}`, datatype: "date", id: "from_date", fn: "between" }, { value: `${data.from_date} 00:00:00`, datatype: "date", id: "start_time", fn: "greaterThan" },
{ value: `${data.date_to}`, datatype: "date", id: "date_to", fn: "between" }, { value: `${data.date_to} 23:59:59`, datatype: "date", id: "finish_time", fn: "lessThan" },
]); ]);
if (data.province_id === "-1") { if (data.province_id === "-1") {
try { try {