From 51afdd47a0caf7799169ca7ef4288e9bab44095e Mon Sep 17 00:00:00 2001 From: baslani Date: Sun, 12 Jul 2026 11:11:08 +0330 Subject: [PATCH 1/2] added province and city filter to machine missions --- .../DriverDetailsDialog/DriverList/index.jsx | 106 ++++++++++++++---- .../MachineMissionsList/index.jsx | 106 ++++++++++++++---- 2 files changed, 170 insertions(+), 42 deletions(-) diff --git a/src/components/dashboard/roadMissions/reports/diverReports/RowActions/DriverDetails/Form/DriverDetailsDialog/DriverList/index.jsx b/src/components/dashboard/roadMissions/reports/diverReports/RowActions/DriverDetails/Form/DriverDetailsDialog/DriverList/index.jsx index 8237b24..3c12ce3 100644 --- a/src/components/dashboard/roadMissions/reports/diverReports/RowActions/DriverDetails/Form/DriverDetailsDialog/DriverList/index.jsx +++ b/src/components/dashboard/roadMissions/reports/diverReports/RowActions/DriverDetails/Form/DriverDetailsDialog/DriverList/index.jsx @@ -1,11 +1,51 @@ +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"; 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 ( + + ); + }, + Cell: ({ renderedCellValue, row }) => { + return <>{row.original.province_name}; + }, + }; + return [ { accessorKey: "id", header: "کد یکتا", @@ -17,27 +57,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 ( + + ); + }, + Cell: ({ row }) => <>{row.original.city_name}, }, { accessorKey: "station_name", @@ -83,9 +148,8 @@ const DriverList = ({ row, specialFilter }) => { grow: false, size: 100, }, - ], - [] - ); + ]; + }, []); return ( <> diff --git a/src/components/dashboard/roadMissions/reports/machinesReports/RowActions/MissionDitails/Form/MachineMissionsDetailsDialog/MachineMissionsList/index.jsx b/src/components/dashboard/roadMissions/reports/machinesReports/RowActions/MissionDitails/Form/MachineMissionsDetailsDialog/MachineMissionsList/index.jsx index d026fba..57a5ef9 100644 --- a/src/components/dashboard/roadMissions/reports/machinesReports/RowActions/MissionDitails/Form/MachineMissionsDetailsDialog/MachineMissionsList/index.jsx +++ b/src/components/dashboard/roadMissions/reports/machinesReports/RowActions/MissionDitails/Form/MachineMissionsDetailsDialog/MachineMissionsList/index.jsx @@ -1,11 +1,51 @@ +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"; 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 ( + + ); + }, + Cell: ({ renderedCellValue, row }) => { + return <>{row.original.province_name}; + }, + }; + return [ { accessorKey: "id", header: "کد یکتا", @@ -17,27 +57,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 ( + + ); + }, + Cell: ({ row }) => <>{row.original.city_name}, }, { accessorKey: "station_name", @@ -83,9 +148,8 @@ const MachineMissionsList = ({ row, specialFilter }) => { grow: false, size: 100, }, - ], - [] - ); + ]; + }, []); return ( <> From 1680cb44b74889750ba1ec51c2d30c3bc726b092 Mon Sep 17 00:00:00 2001 From: baslani Date: Sun, 12 Jul 2026 11:39:39 +0330 Subject: [PATCH 2/2] added enter/exit columns to operator violations --- .../operator/Actions/Violations/Dialog.jsx | 2 +- .../Actions/Violations/ViolationsList.jsx | 67 +++++++++++++++++++ 2 files changed, 68 insertions(+), 1 deletion(-) diff --git a/src/components/dashboard/roadMissions/operator/Actions/Violations/Dialog.jsx b/src/components/dashboard/roadMissions/operator/Actions/Violations/Dialog.jsx index 8cb7c67..36946ee 100644 --- a/src/components/dashboard/roadMissions/operator/Actions/Violations/Dialog.jsx +++ b/src/components/dashboard/roadMissions/operator/Actions/Violations/Dialog.jsx @@ -4,7 +4,7 @@ import ViolationsList from "./ViolationsList"; const ViolationsDialog = ({ open, setOpen, mutate }) => { return ( - + setOpen(false)} diff --git a/src/components/dashboard/roadMissions/operator/Actions/Violations/ViolationsList.jsx b/src/components/dashboard/roadMissions/operator/Actions/Violations/ViolationsList.jsx index 82a993d..e21681e 100644 --- a/src/components/dashboard/roadMissions/operator/Actions/Violations/ViolationsList.jsx +++ b/src/components/dashboard/roadMissions/operator/Actions/Violations/ViolationsList.jsx @@ -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 ( + <> + {value.date} + - + {value.time} + + ); + }, + }, + { + 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 ( +
+ {value.date} + - + {value.time} +
+ ); + }, + }, ]; }, []); @@ -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), + }; +};