10 Commits

24 changed files with 564 additions and 109 deletions

View File

@@ -1,5 +1,5 @@
HOST="rms.witel.ir"
HOST_RMTO="rms.rmto.ir"
NEXT_PUBLIC_VERSION="1.9.1"
NEXT_PUBLIC_VERSION="1.9.2"
NEXT_PUBLIC_API_URL="https://rms.witel.ir"
NEXT_PUBLIC_MAPTILE_ENDPOINT="https://rmsmap.rmto.ir/141map"

View File

@@ -4,7 +4,7 @@ import ViolationsList from "./ViolationsList";
const ViolationsDialog = ({ open, setOpen, mutate }) => {
return (
<Dialog open={open} fullWidth maxWidth="xs">
<Dialog open={open} fullWidth maxWidth="sm">
<IconButton
aria-label="close"
onClick={() => setOpen(false)}

View File

@@ -116,6 +116,54 @@ const ViolationsList = ({ setOpen, mutate }) => {
},
Cell: ({ row }) => <>{row.original.city_name}</>,
},
{
accessorKey: "enter_time",
header: "تاریخ و ساعت ورود",
id: "enter_time",
enableColumnFilter: true,
datatype: "text",
filterMode: "equals",
columnFilterModeOptions: ["equals", "contains"],
grow: false,
size: 140,
Cell: ({ cell }) => {
const value = formatDateTime(cell.getValue());
if (!value) return "-";
return (
<>
<span className="font-medium">{value.date}</span>
<span> - </span>
<span className="text-xs text-muted-foreground">{value.time}</span>
</>
);
},
},
{
accessorKey: "exit_time",
header: "تاریخ و ساعت خروج",
id: "exit_time",
enableColumnFilter: true,
datatype: "text",
filterMode: "equals",
columnFilterModeOptions: ["equals", "contains"],
grow: false,
size: 140,
Cell: ({ cell }) => {
const value = formatDateTime(cell.getValue());
if (!value) return "-";
return (
<div className="flex flex-col leading-tight">
<span className="font-medium">{value.date}</span>
<span> - </span>
<span className="text-xs text-muted-foreground">{value.time}</span>
</div>
);
},
},
];
}, []);
@@ -139,3 +187,22 @@ const ViolationsList = ({ setOpen, mutate }) => {
);
};
export default ViolationsList;
const formatDateTime = (value) => {
if (!value) return null;
const date = new Date(value.replace(" ", "T"));
return {
date: new Intl.DateTimeFormat("fa-IR", {
year: "numeric",
month: "2-digit",
day: "2-digit",
}).format(date),
time: new Intl.DateTimeFormat("fa-IR", {
hour: "2-digit",
minute: "2-digit",
}).format(date),
};
};

View File

@@ -14,6 +14,7 @@ const DriverReportsList = ({ specialFilter }) => {
header: "کد یکتا",
id: "driver_id",
enableColumnFilter: true,
filterMode: "equals",
columnFilterModeOptions: ["equals", "contains"],
enableSorting: true,
datatype: "numeric",
@@ -25,6 +26,7 @@ const DriverReportsList = ({ specialFilter }) => {
header: "نام راننده",
id: "driver_name",
enableColumnFilter: true,
filterMode: "equals",
columnFilterModeOptions: ["equals", "contains"],
enableSorting: true,
datatype: "text",
@@ -36,7 +38,7 @@ const DriverReportsList = ({ specialFilter }) => {
header: "کارکرد",
id: "func",
enableColumnFilter: false,
enableSorting: true,
enableSorting: false,
datatype: "number",
grow: false,
size: 50,

View File

@@ -1,8 +1,5 @@
"use client";
import {
EXPORT_GET_DRIVER_COUNTRY_ACTIVITY_REPORT,
EXPORT_GET_DRIVER_PROVINCE_ACTIVITY_REPORT,
} from "@/core/utils/routes";
import { EXPORT_GET_DRIVER_ACTIVITY_REPORT } from "@/core/utils/routes";
import useRequest from "@/lib/hooks/useRequest";
import { useTheme } from "@emotion/react";
import DescriptionIcon from "@mui/icons-material/Description";
@@ -34,11 +31,7 @@ const PrintExcel = ({ table, filterData }) => {
const clickHandler = () => {
setLoading(true);
const CountryOrProvince = activeFilters.find((item) => item.id === "province_id");
const requestUrl =
CountryOrProvince.value === "-1"
? EXPORT_GET_DRIVER_COUNTRY_ACTIVITY_REPORT
: EXPORT_GET_DRIVER_PROVINCE_ACTIVITY_REPORT;
const requestUrl = EXPORT_GET_DRIVER_ACTIVITY_REPORT;
requestServer(`${requestUrl}?${filterParams}`, "get", {
requestOptions: { responseType: "blob" },
})
@@ -66,7 +59,7 @@ const PrintExcel = ({ table, filterData }) => {
disabled={loading}
sx={{ textTransform: "unset", alignSelf: "center" }}
startIcon={loading ? <CircularProgress size={18} color="inherit" /> : <DescriptionIcon />}
onClick={clickHandler}
// onClick={clickHandler}
>
خروجی اکسل
</Button>

View File

@@ -0,0 +1,79 @@
"use client";
import { EXPORT_GET_DRIVER_DETAILS_ACTIVITY_REPORT } from "@/core/utils/routes";
import useRequest from "@/lib/hooks/useRequest";
import { useTheme } from "@emotion/react";
import DescriptionIcon from "@mui/icons-material/Description";
import { Button, CircularProgress, IconButton, useMediaQuery } from "@mui/material";
import FileSaver from "file-saver";
import moment from "jalali-moment";
import { useMemo, useState } from "react";
const PrintExcel = ({ table, filterData, specialFilterData }) => {
const theme = useTheme();
const isMobile = useMediaQuery(theme.breakpoints.down("sm"));
const [loading, setLoading] = useState(false);
const requestServer = useRequest({ notificationSuccess: true });
const activeFilters = Object.entries(filterData).reduce((acc, [key, filter]) => {
if (filter.value) {
acc.push({ id: filter.id, value: filter.value });
}
return acc;
}, []);
const activeSpecialFilters = Object.entries(specialFilterData).reduce((acc, [key, filter]) => {
if (filter.value) {
acc.push({ id: filter.id, value: filter.value });
}
return acc;
}, []);
const filterParams = useMemo(() => {
const params = new URLSearchParams();
activeFilters.length > 0 &&
activeFilters.map((filter, index) => {
params.set(`${filter.id}`, filter.value);
});
activeSpecialFilters.length > 0 &&
activeSpecialFilters.map((filter, index) => {
params.set(`${filter.id}`, filter.value);
});
return params;
}, [activeFilters, activeSpecialFilters]);
const clickHandler = () => {
setLoading(true);
const requestUrl = EXPORT_GET_DRIVER_DETAILS_ACTIVITY_REPORT;
requestServer(`${requestUrl}?${filterParams}`, "get", {
requestOptions: { responseType: "blob" },
})
.then((response) => {
const filename = `خروجی کارتابل ریزگزارشات راننده تاریخ_${moment().format("jYYYY_jMM_jDD")}.xlsx`;
FileSaver.saveAs(response.data, filename);
})
.catch(() => {})
.finally(() => {
setLoading(false);
});
};
return (
<>
{isMobile ? (
<IconButton aria-label="خروجی اکسل" color="success" onClick={clickHandler}>
<DescriptionIcon sx={{ fontSize: "25px" }} />
</IconButton>
) : (
<Button
color="success"
variant="contained"
size="small"
disabled={loading}
sx={{ textTransform: "unset", alignSelf: "center" }}
startIcon={loading ? <CircularProgress size={18} color="inherit" /> : <DescriptionIcon />}
// onClick={clickHandler}
>
خروجی اکسل
</Button>
)}
</>
);
};
export default PrintExcel;

View File

@@ -0,0 +1,11 @@
import { Box } from "@mui/material";
import PrintExcel from "./ExcelPrint";
const Toolbar = ({ table, filterData, specialFilterData, mutate }) => {
return (
<Box sx={{ display: "flex", gap: 1 }}>
<PrintExcel table={table} filterData={filterData} specialFilterData={specialFilterData} />
</Box>
);
};
export default Toolbar;

View File

@@ -1,11 +1,52 @@
import CustomSelectByDependency from "@/core/components/DataTable/filter/fieldsType/CustomSelectByDependency";
import DataTableWithAuth from "@/core/components/DataTableWithAuth";
import { GET_DRIVER_DETAILS } from "@/core/utils/routes";
import useCities from "@/lib/hooks/useCities";
import useProvinces from "@/lib/hooks/useProvince";
import { Box } from "@mui/material";
import { useMemo } from "react";
import Toolbar from "./Toolbar";
const DriverList = ({ row, specialFilter }) => {
const columns = useMemo(
() => [
const columns = useMemo(() => {
const dynamicColumns = {
header: "استان",
id: "province_id",
enableColumnFilter: true,
datatype: "numeric",
filterMode: "equals",
grow: false,
size: 130,
ColumnSelectComponent: (props) => {
const { provinces, errorProvinces, loadingProvinces } = useProvinces();
const getColumnSelectOptions = useMemo(() => {
if (loadingProvinces) {
return [{ value: "loading", label: "در حال بارگذاری..." }];
}
if (errorProvinces) {
return [{ value: "error", label: "خطا در بارگذاری" }];
}
return [
{ value: "", label: "کل کشور" },
...provinces.map((province) => ({
value: province.id,
label: province.name_fa,
})),
];
}, [provinces, errorProvinces, loadingProvinces]);
return (
<CustomSelectByDependency
{...props}
value={loadingProvinces ? "loading" : props.filterParameters.value}
columnSelectOption={getColumnSelectOptions}
/>
);
},
Cell: ({ renderedCellValue, row }) => {
return <>{row.original.province_name}</>;
},
};
return [
{
accessorKey: "id",
header: "کد یکتا",
@@ -17,27 +58,52 @@ const DriverList = ({ row, specialFilter }) => {
grow: false,
size: 80,
},
...[dynamicColumns],
{
accessorKey: "province_name",
header: "استان",
id: "province_name",
enableColumnFilter: true,
datatype: "text",
filterMode: "equals",
columnFilterModeOptions: ["equals", "contains"],
grow: false,
size: 100,
},
{
accessorKey: "city_name",
header: "شهر",
id: "city_name",
id: "city_id",
enableColumnFilter: true,
datatype: "text",
datatype: "numeric",
filterMode: "equals",
columnFilterModeOptions: ["equals", "contains"],
dependencyId: "province_id",
grow: false,
size: 100,
size: 120,
ColumnSelectComponent: (props) => {
const { cityList, loadingCityList, errorCityList } = useCities(props.dependencyFieldValue.value);
const getColumnSelectOptions = useMemo(() => {
if (props.dependencyFieldValue.value === "") {
return [{ value: "empty", label: "ابتدا استان را انتخاب کنید" }];
}
if (loadingCityList) {
return [{ value: "loading", label: "در حال بارگذاری..." }];
}
if (errorCityList) {
return [{ value: "error", label: "خطا در بارگذاری" }];
}
return [
{ value: "", label: "کل ادارات" },
...cityList.map((edare) => ({
value: edare.id,
label: edare.name_fa,
})),
];
}, [cityList, loadingCityList, errorCityList]);
return (
<CustomSelectByDependency
{...props}
value={
props.dependencyFieldValue?.value === ""
? "empty"
: loadingCityList
? "loading"
: props.filterParameters.value
}
columnSelectOption={getColumnSelectOptions}
/>
);
},
Cell: ({ row }) => <>{row.original.city_name}</>,
},
{
accessorKey: "station_name",
@@ -83,19 +149,22 @@ const DriverList = ({ row, specialFilter }) => {
grow: false,
size: 100,
},
],
[]
);
];
}, []);
return (
<>
<Box sx={{ mt: 3 }}>
<DataTableWithAuth
TableToolbar={Toolbar}
need_filter={true}
columns={columns}
specialFilter={specialFilter}
specialQueries={{
driver_id: row.driver_id,
}}
sorting={[{ id: "id", desc: true }]}
table_url={`${GET_DRIVER_DETAILS}/${row.driver_id}`}
table_url={GET_DRIVER_DETAILS}
page_name={"driverListReport"}
table_name={"driverList"}
positionActionsColumn={"first"}

View File

@@ -1,8 +1,5 @@
"use client";
import {
EXPORT_GET_MACHINES_COUNTRY_ACTIVITY_REPORT,
EXPORT_GET_MACHINES_PROVINCE_ACTIVITY_REPORT,
} from "@/core/utils/routes";
import { EXPORT_GET_MACHINES_ACTIVITY_REPORT } from "@/core/utils/routes";
import useRequest from "@/lib/hooks/useRequest";
import { useTheme } from "@emotion/react";
import DescriptionIcon from "@mui/icons-material/Description";
@@ -34,16 +31,12 @@ const PrintExcel = ({ table, filterData }) => {
const clickHandler = () => {
setLoading(true);
const CountryOrProvince = activeFilters.find((item) => item.id === "province_id");
const requestUrl =
CountryOrProvince.value === "-1"
? EXPORT_GET_MACHINES_COUNTRY_ACTIVITY_REPORT
: EXPORT_GET_MACHINES_PROVINCE_ACTIVITY_REPORT;
const requestUrl = EXPORT_GET_MACHINES_ACTIVITY_REPORT;
requestServer(`${requestUrl}?${filterParams}`, "get", {
requestOptions: { responseType: "blob" },
})
.then((response) => {
const filename = `خروجی کارتابل گزارشات گشت راهداری تاریخ_${moment().format("jYYYY_jMM_jDD")}.xlsx`;
const filename = `خروجی کارتابل گزارشات ماشین ها تاریخ_${moment().format("jYYYY_jMM_jDD")}.xlsx`;
FileSaver.saveAs(response.data, filename);
})
.catch(() => {})
@@ -66,7 +59,7 @@ const PrintExcel = ({ table, filterData }) => {
disabled={loading}
sx={{ textTransform: "unset", alignSelf: "center" }}
startIcon={loading ? <CircularProgress size={18} color="inherit" /> : <DescriptionIcon />}
onClick={clickHandler}
// onClick={clickHandler}
>
خروجی اکسل
</Button>

View File

@@ -18,6 +18,7 @@ const MachinesReportsList = ({ specialFilter }) => {
header: "کد یکتا",
id: "machine_id",
enableColumnFilter: true,
filterMode: "equals",
columnFilterModeOptions: ["equals", "contains"],
enableSorting: true,
datatype: "text",
@@ -28,7 +29,8 @@ const MachinesReportsList = ({ specialFilter }) => {
accessorKey: "car_name",
header: "مدل ماشین",
id: "car_name",
enableColumnFilter: true,
enableColumnFilter: false,
filterMode: "equals",
columnFilterModeOptions: ["equals", "contains"],
enableSorting: true,
datatype: "text",
@@ -41,7 +43,7 @@ const MachinesReportsList = ({ specialFilter }) => {
id: "machine_code",
enableColumnFilter: true,
columnFilterModeOptions: ["equals", "contains"],
enableSorting: true,
enableSorting: false,
datatype: "text",
grow: false,
size: 50,
@@ -52,7 +54,7 @@ const MachinesReportsList = ({ specialFilter }) => {
id: "func",
enableColumnFilter: false,
columnFilterModeOptions: ["equals", "contains"],
enableSorting: false,
enableSorting: true,
datatype: "number",
grow: false,
size: 50,

View File

@@ -0,0 +1,70 @@
"use client";
import { EXPORT_GET_MACHINES_ACTIVITY_REPORT } from "@/core/utils/routes";
import useRequest from "@/lib/hooks/useRequest";
import { useTheme } from "@emotion/react";
import DescriptionIcon from "@mui/icons-material/Description";
import { Button, CircularProgress, IconButton, useMediaQuery } from "@mui/material";
import FileSaver from "file-saver";
import moment from "jalali-moment";
import { useMemo, useState } from "react";
const PrintExcel = ({ table, filterData }) => {
const theme = useTheme();
const isMobile = useMediaQuery(theme.breakpoints.down("sm"));
const [loading, setLoading] = useState(false);
const requestServer = useRequest({ notificationSuccess: true });
const activeFilters = Object.entries(filterData).reduce((acc, [key, filter]) => {
if (filter.value) {
acc.push({ id: filter.id, value: filter.value });
}
return acc;
}, []);
const filterParams = useMemo(() => {
const params = new URLSearchParams();
activeFilters.length > 0 &&
activeFilters.map((filter, index) => {
params.set(`${filter.id}`, filter.value);
});
return params;
}, [activeFilters]);
const clickHandler = () => {
setLoading(true);
const requestUrl = EXPORT_GET_MACHINES_ACTIVITY_REPORT;
requestServer(`${requestUrl}?${filterParams}`, "get", {
requestOptions: { responseType: "blob" },
})
.then((response) => {
const filename = `خروجی کارتابل گزارشات ماشین ها تاریخ_${moment().format("jYYYY_jMM_jDD")}.xlsx`;
FileSaver.saveAs(response.data, filename);
})
.catch(() => {})
.finally(() => {
setLoading(false);
});
};
return (
<>
{isMobile ? (
<IconButton aria-label="خروجی اکسل" color="success" onClick={clickHandler}>
<DescriptionIcon sx={{ fontSize: "25px" }} />
</IconButton>
) : (
<Button
color="success"
variant="contained"
size="small"
disabled={loading}
sx={{ textTransform: "unset", alignSelf: "center" }}
startIcon={loading ? <CircularProgress size={18} color="inherit" /> : <DescriptionIcon />}
// onClick={clickHandler}
>
خروجی اکسل
</Button>
)}
</>
);
};
export default PrintExcel;

View File

@@ -0,0 +1,11 @@
import { Box } from "@mui/material";
import PrintExcel from "./ExcelPrint";
const Toolbar = ({ table, filterData, mutate }) => {
return (
<Box sx={{ display: "flex", gap: 1 }}>
<PrintExcel table={table} filterData={filterData} />
</Box>
);
};
export default Toolbar;

View File

@@ -1,11 +1,52 @@
import CustomSelectByDependency from "@/core/components/DataTable/filter/fieldsType/CustomSelectByDependency";
import DataTableWithAuth from "@/core/components/DataTableWithAuth";
import { GET_MACHINE_MISSIONS_DETAILS } from "@/core/utils/routes";
import useCities from "@/lib/hooks/useCities";
import useProvinces from "@/lib/hooks/useProvince";
import { Box } from "@mui/material";
import { useMemo } from "react";
import Toolbar from "./Toolbar";
const MachineMissionsList = ({ row, specialFilter }) => {
const columns = useMemo(
() => [
const columns = useMemo(() => {
const dynamicColumns = {
header: "استان",
id: "province_id",
enableColumnFilter: true,
datatype: "numeric",
filterMode: "equals",
grow: false,
size: 130,
ColumnSelectComponent: (props) => {
const { provinces, errorProvinces, loadingProvinces } = useProvinces();
const getColumnSelectOptions = useMemo(() => {
if (loadingProvinces) {
return [{ value: "loading", label: "در حال بارگذاری..." }];
}
if (errorProvinces) {
return [{ value: "error", label: "خطا در بارگذاری" }];
}
return [
{ value: "", label: "کل کشور" },
...provinces.map((province) => ({
value: province.id,
label: province.name_fa,
})),
];
}, [provinces, errorProvinces, loadingProvinces]);
return (
<CustomSelectByDependency
{...props}
value={loadingProvinces ? "loading" : props.filterParameters.value}
columnSelectOption={getColumnSelectOptions}
/>
);
},
Cell: ({ renderedCellValue, row }) => {
return <>{row.original.province_name}</>;
},
};
return [
{
accessorKey: "id",
header: "کد یکتا",
@@ -17,27 +58,52 @@ const MachineMissionsList = ({ row, specialFilter }) => {
grow: false,
size: 80,
},
...[dynamicColumns],
{
accessorKey: "province_name",
header: "استان",
id: "province_name",
enableColumnFilter: true,
datatype: "text",
filterMode: "equals",
columnFilterModeOptions: ["equals", "contains"],
grow: false,
size: 100,
},
{
accessorKey: "city_name",
header: "شهر",
id: "city_name",
id: "city_id",
enableColumnFilter: true,
datatype: "text",
datatype: "numeric",
filterMode: "equals",
columnFilterModeOptions: ["equals", "contains"],
dependencyId: "province_id",
grow: false,
size: 100,
size: 120,
ColumnSelectComponent: (props) => {
const { cityList, loadingCityList, errorCityList } = useCities(props.dependencyFieldValue.value);
const getColumnSelectOptions = useMemo(() => {
if (props.dependencyFieldValue.value === "") {
return [{ value: "empty", label: "ابتدا استان را انتخاب کنید" }];
}
if (loadingCityList) {
return [{ value: "loading", label: "در حال بارگذاری..." }];
}
if (errorCityList) {
return [{ value: "error", label: "خطا در بارگذاری" }];
}
return [
{ value: "", label: "کل ادارات" },
...cityList.map((edare) => ({
value: edare.id,
label: edare.name_fa,
})),
];
}, [cityList, loadingCityList, errorCityList]);
return (
<CustomSelectByDependency
{...props}
value={
props.dependencyFieldValue?.value === ""
? "empty"
: loadingCityList
? "loading"
: props.filterParameters.value
}
columnSelectOption={getColumnSelectOptions}
/>
);
},
Cell: ({ row }) => <>{row.original.city_name}</>,
},
{
accessorKey: "station_name",
@@ -83,15 +149,15 @@ const MachineMissionsList = ({ row, specialFilter }) => {
grow: false,
size: 100,
},
],
[]
);
];
}, []);
return (
<>
<Box sx={{ mt: 3 }}>
<DataTableWithAuth
specialFilter={specialFilter}
TableToolbar={Toolbar}
need_filter={true}
columns={columns}
sorting={[{ id: "id", desc: true }]}

View File

@@ -1,10 +1,5 @@
"use client";
import {
EXPORT_GET_MACHINES_COUNTRY_ACTIVITY_REPORT,
EXPORT_GET_MACHINES_PROVINCE_ACTIVITY_REPORT,
EXPORT_GET_MACHINES_TYPE_COUNTRY_ACTIVITY_REPORT,
EXPORT_GET_MACHINES_TYPE_PROVINCE_ACTIVITY_REPORT,
} from "@/core/utils/routes";
import { EXPORT_GET_MACHINES_TYPE_ACTIVITY_REPORT } from "@/core/utils/routes";
import useRequest from "@/lib/hooks/useRequest";
import { useTheme } from "@emotion/react";
import DescriptionIcon from "@mui/icons-material/Description";
@@ -36,16 +31,12 @@ const PrintExcel = ({ table, filterData }) => {
const clickHandler = () => {
setLoading(true);
const CountryOrProvince = activeFilters.find((item) => item.id === "province_id");
const requestUrl =
CountryOrProvince.value === "-1"
? EXPORT_GET_MACHINES_TYPE_COUNTRY_ACTIVITY_REPORT
: EXPORT_GET_MACHINES_TYPE_PROVINCE_ACTIVITY_REPORT;
const requestUrl = EXPORT_GET_MACHINES_TYPE_ACTIVITY_REPORT;
requestServer(`${requestUrl}?${filterParams}`, "get", {
requestOptions: { responseType: "blob" },
})
.then((response) => {
const filename = `خروجی کارتابل گزارشات گشت راهداری تاریخ_${moment().format("jYYYY_jMM_jDD")}.xlsx`;
const filename = `خروجی کارتابل گزارشات نوع ماشین تاریخ_${moment().format("jYYYY_jMM_jDD")}.xlsx`;
FileSaver.saveAs(response.data, filename);
})
.catch(() => {})
@@ -68,7 +59,7 @@ const PrintExcel = ({ table, filterData }) => {
disabled={loading}
sx={{ textTransform: "unset", alignSelf: "center" }}
startIcon={loading ? <CircularProgress size={18} color="inherit" /> : <DescriptionIcon />}
onClick={clickHandler}
// onClick={clickHandler}
>
خروجی اکسل
</Button>

View File

@@ -3,11 +3,8 @@ import DataTableWithAuth from "@/core/components/DataTableWithAuth";
import { Box } from "@mui/material";
import { useMemo } from "react";
import Toolbar from "./Toolbar";
import {
GET_MACHINES_TYPE_COUNTRY_ACTIVITY_REPORT,
GET_MACHINES_TYPE_PROVINCE_ACTIVITY_REPORT,
} from "@/core/utils/routes";
// import RowActions from "./RowActions";
import { GET_MACHINES_TYPE_ACTIVITY_REPORT } from "@/core/utils/routes";
import RowActions from "./RowActions";
const MachinesReportsList = ({ specialFilter }) => {
const columns = useMemo(() => {
@@ -17,6 +14,7 @@ const MachinesReportsList = ({ specialFilter }) => {
header: "نوع ماشین",
id: "car_type",
enableColumnFilter: true,
filterMode: "equals",
columnFilterModeOptions: ["equals", "contains"],
enableSorting: true,
datatype: "text",
@@ -51,18 +49,14 @@ const MachinesReportsList = ({ specialFilter }) => {
<DataTableWithAuth
TableToolbar={Toolbar}
columns={columns}
table_url={
specialFilter.find((x) => x.id === "province_id")?.value === "-1"
? GET_MACHINES_TYPE_COUNTRY_ACTIVITY_REPORT
: GET_MACHINES_TYPE_PROVINCE_ACTIVITY_REPORT
}
table_url={GET_MACHINES_TYPE_ACTIVITY_REPORT}
page_name={"roadMissionReportMachineTypeReport"}
table_name={"roadMissionReportMachineTypeReportList"}
enablePagination={false}
specialFilter={specialFilter}
need_filter={true}
// enableRowActions
// RowActions={RowActions}
enableRowActions
RowActions={RowActions}
/>
</Box>
);

View File

@@ -0,0 +1,70 @@
"use client";
import { EXPORT_GET_MACHINES_TYPE_ACTIVITY_REPORT } from "@/core/utils/routes";
import useRequest from "@/lib/hooks/useRequest";
import { useTheme } from "@emotion/react";
import DescriptionIcon from "@mui/icons-material/Description";
import { Button, CircularProgress, IconButton, useMediaQuery } from "@mui/material";
import FileSaver from "file-saver";
import moment from "jalali-moment";
import { useMemo, useState } from "react";
const PrintExcel = ({ table, filterData }) => {
const theme = useTheme();
const isMobile = useMediaQuery(theme.breakpoints.down("sm"));
const [loading, setLoading] = useState(false);
const requestServer = useRequest({ notificationSuccess: true });
const activeFilters = Object.entries(filterData).reduce((acc, [key, filter]) => {
if (filter.value) {
acc.push({ id: filter.id, value: filter.value });
}
return acc;
}, []);
const filterParams = useMemo(() => {
const params = new URLSearchParams();
activeFilters.length > 0 &&
activeFilters.map((filter, index) => {
params.set(`${filter.id}`, filter.value);
});
return params;
}, [activeFilters]);
const clickHandler = () => {
setLoading(true);
const requestUrl = EXPORT_GET_MACHINES_TYPE_ACTIVITY_REPORT;
requestServer(`${requestUrl}?${filterParams}`, "get", {
requestOptions: { responseType: "blob" },
})
.then((response) => {
const filename = `خروجی کارتابل گزارشات نوع ماشین تاریخ_${moment().format("jYYYY_jMM_jDD")}.xlsx`;
FileSaver.saveAs(response.data, filename);
})
.catch(() => {})
.finally(() => {
setLoading(false);
});
};
return (
<>
{isMobile ? (
<IconButton aria-label="خروجی اکسل" color="success" onClick={clickHandler}>
<DescriptionIcon sx={{ fontSize: "25px" }} />
</IconButton>
) : (
<Button
color="success"
variant="contained"
size="small"
disabled={loading}
sx={{ textTransform: "unset", alignSelf: "center" }}
startIcon={loading ? <CircularProgress size={18} color="inherit" /> : <DescriptionIcon />}
// onClick={clickHandler}
>
خروجی اکسل
</Button>
)}
</>
);
};
export default PrintExcel;

View File

@@ -0,0 +1,11 @@
import { Box } from "@mui/material";
import PrintExcel from "./ExcelPrint";
const Toolbar = ({ table, filterData, mutate }) => {
return (
<Box sx={{ display: "flex", gap: 1 }}>
<PrintExcel table={table} filterData={filterData} />
</Box>
);
};
export default Toolbar;

View File

@@ -1,7 +1,8 @@
import DataTableWithAuth from "@/core/components/DataTableWithAuth";
import { GET_MACHINE_MISSIONS_DETAILS, GET_MACHINE_TYPE_MISSIONS_DETAILS } from "@/core/utils/routes";
import { GET_MACHINE_TYPE_MISSIONS_DETAILS } from "@/core/utils/routes";
import { Box } from "@mui/material";
import { useMemo } from "react";
import Toolbar from "./Toolbar";
const MachineMissionsList = ({ row }) => {
const columns = useMemo(
@@ -91,10 +92,14 @@ const MachineMissionsList = ({ row }) => {
<>
<Box sx={{ mt: 3 }}>
<DataTableWithAuth
TableToolbar={Toolbar}
need_filter={true}
columns={columns}
specialQueries={{
car_type: row.car_type,
}}
sorting={[{ id: "id", desc: true }]}
table_url={`${GET_MACHINE_TYPE_MISSIONS_DETAILS}?car_type=${row.car_type}`}
table_url={GET_MACHINE_TYPE_MISSIONS_DETAILS}
page_name={"roadMissionReportMachineType"}
table_name={"roadMissionReportMachineTypeList"}
positionActionsColumn={"first"}

View File

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

View File

@@ -8,7 +8,7 @@ const DeleteContent = ({ rowId, mutate, setOpenDeleteDialog }) => {
const requestServer = useRequest({ notificationSuccess: true });
const handleClick = () => {
setSubmitting(true);
requestServer(`${DELETE_VIOLATION}/${rowId}`, "post", {
requestServer(`${DELETE_VIOLATION}/${rowId}`, "delete", {
hasSidebarUpdate: true,
})
.then(() => {

View File

@@ -29,5 +29,5 @@ const DeleteViolation = ({ mutate, rowId }) => {
</Dialog>
</>
);
}
export default DeleteViolation
};
export default DeleteViolation;

View File

@@ -8,7 +8,7 @@ const RowActions = ({ row, mutate }) => {
<>
{!row.original.mileage && <EditViolation row={row} mutate={mutate} rowId={row.getValue("id")} />}
{/*{canEdit && <CreateWithoutProcess row={row} mutate={mutate} />}*/}
<DeleteViolation />
<DeleteViolation rowId={row.getValue("id")} mutate={mutate} />
</>
);
};

View File

@@ -38,6 +38,7 @@ const DataTable_Main = (props) => {
RowActions,
specific_data,
specialFilter,
specialQueries,
} = props;
const flatColumns = flattenArrayOfObjects(columns, "columns");
const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: 10 });
@@ -70,8 +71,15 @@ const DataTable_Main = (props) => {
}))
)
);
if (specialQueries) {
Object.entries(specialQueries).forEach(([key, value]) => {
if (value !== undefined && value !== null && value !== "") {
params.set(key, String(value));
}
});
}
return `${table_url}?${params}`;
}, [table_url, filterData, pagination, sortData, specialFilter]);
}, [table_url, filterData, pagination, sortData, specialFilter, specialQueries]);
const fetcher = async (url) => {
try {
@@ -152,7 +160,12 @@ const DataTable_Main = (props) => {
renderTopToolbarCustomActions: ({ table }) => (
<>
{TableToolbar && (
<TableToolbar table={table} mutate={mutate} filterData={specialFilter || filterData} />
<TableToolbar
table={table}
mutate={mutate}
filterData={specialFilter || filterData}
specialFilterData={filterData}
/>
)}
</>
),

View File

@@ -253,20 +253,24 @@ export const GET_MACHINES_ACTIVITY_REPORT = api + "/api/v3/missions/report_machi
export const GET_MACHINES_PROVINCE_ACTIVITY_REPORT = api + "/api/v3/missions/report_machine/province_machines_activity";
export const EXPORT_GET_MACHINES_COUNTRY_ACTIVITY_REPORT =
api + "/api/v3/missions/report_machine/country_machines_activity_excel";
export const EXPORT_GET_MACHINES_TYPE_ACTIVITY_REPORT = api + "/api/v3/missions/report_machine/machines_activity_excel";
export const EXPORT_GET_MACHINES_PROVINCE_ACTIVITY_REPORT =
api + "/api/v3/missions/report_machine/province_machines_activity_excel";
export const EXPORT_GET_MACHINES_ACTIVITY_REPORT = api + "/api/v3/missions/report_machine/machines_activity_excel";
export const GET_DRIVERS_ACTIVITY_REPORT =
api + "/api/v3/missions/report_machine/country_machine_drivers_activity";
export const GET_DRIVERS_ACTIVITY_REPORT = api + "/api/v3/missions/report_machine/machine_drivers_activity";
export const GET_DRIVER_PROVINCE_ACTIVITY_REPORT =
api + "/api/v3/missions/report_machine/province_machine_drivers_activity";
export const EXPORT_GET_DRIVER_COUNTRY_ACTIVITY_REPORT =
api + "/api/v3/missions/report_machine/country_machine_drivers_activity_excel";
export const EXPORT_GET_DRIVER_ACTIVITY_REPORT = api + "/api/v3/missions/report_machine/machine_drivers_activity_excel";
export const EXPORT_GET_DRIVER_DETAILS_ACTIVITY_REPORT =
api + "/api/v3/missions/report_machine/machine_driver_details_report_excel";
export const EXPORT_GET_DRIVER_PROVINCE_ACTIVITY_REPORT =
api + "/api/v3/missions/report_machine/province_machine_drivers_activity_excel";
export const GET_MACHINES_TYPE_COUNTRY_ACTIVITY_REPORT =
api + "/api/v3/missions/report_machine/country_machine_types_activity";
export const GET_MACHINES_TYPE_ACTIVITY_REPORT = api + "/api/v3/missions/report_machine/machine_types_activity";
export const GET_MACHINES_TYPE_PROVINCE_ACTIVITY_REPORT =
api + "/api/v3/missions/report_machine/province_machine_types_activity";
export const EXPORT_GET_MACHINES_TYPE_COUNTRY_ACTIVITY_REPORT =