From c6283ae1301b2fe5a2441baf6ed75d96eb11d1ef Mon Sep 17 00:00:00 2001 From: baslani Date: Sat, 13 Jun 2026 14:03:47 +0330 Subject: [PATCH 1/3] [wip] implementing machines reports --- jsconfig.json | 38 +++--- .../reports/machinesReports/page.js | 18 +++ .../machinesReports/ExcelPrint/index.jsx | 77 +++++++++++++ .../machinesReports/MachinesReportsList.jsx | 78 +++++++++++++ .../Search/FromDateController.jsx | 27 +++++ .../Search/SearchReportField.jsx | 44 +++++++ .../machinesReports/Search/SelectProvince.jsx | 45 ++++++++ .../Search/ToDateController.jsx | 30 +++++ .../reports/machinesReports/Search/index.jsx | 13 +++ .../reports/machinesReports/Toolbar.jsx | 11 ++ .../reports/machinesReports/index.jsx | 109 ++++++++++++++++++ src/core/utils/pageMenu.js | 9 ++ src/core/utils/pageMenuDev.js | 9 ++ src/core/utils/routes.js | 6 + 14 files changed, 495 insertions(+), 19 deletions(-) create mode 100644 src/app/(withAuth)/(dashboardLayout)/dashboard/road-missions/reports/machinesReports/page.js create mode 100644 src/components/dashboard/roadMissions/reports/machinesReports/ExcelPrint/index.jsx create mode 100644 src/components/dashboard/roadMissions/reports/machinesReports/MachinesReportsList.jsx create mode 100644 src/components/dashboard/roadMissions/reports/machinesReports/Search/FromDateController.jsx create mode 100644 src/components/dashboard/roadMissions/reports/machinesReports/Search/SearchReportField.jsx create mode 100644 src/components/dashboard/roadMissions/reports/machinesReports/Search/SelectProvince.jsx create mode 100644 src/components/dashboard/roadMissions/reports/machinesReports/Search/ToDateController.jsx create mode 100644 src/components/dashboard/roadMissions/reports/machinesReports/Search/index.jsx create mode 100644 src/components/dashboard/roadMissions/reports/machinesReports/Toolbar.jsx create mode 100644 src/components/dashboard/roadMissions/reports/machinesReports/index.jsx diff --git a/jsconfig.json b/jsconfig.json index b51472a..c136578 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -1,27 +1,27 @@ // javascript for production -{ - "compilerOptions": { - "paths": { - "@/*": ["./src/*"], - "^/*": ["./public/*"] - } - } -} - -// typescript for local development // { // "compilerOptions": { -// "jsx": "react-jsx", -// "noUnusedLocals": true, -// "noImplicitAny": false, -// "checkJs": true, -// "allowJs": true, -// "strict": true, -// "baseUrl": ".", // "paths": { // "@/*": ["./src/*"], // "^/*": ["./public/*"] // } -// }, -// "exclude": ["node_modules"] +// } // } + +// typescript for local development +{ + "compilerOptions": { + "jsx": "react-jsx", + "noUnusedLocals": true, + "noImplicitAny": false, + "checkJs": true, + "allowJs": true, + "strict": true, + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"], + "^/*": ["./public/*"] + } + }, + "exclude": ["node_modules"] +} diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/road-missions/reports/machinesReports/page.js b/src/app/(withAuth)/(dashboardLayout)/dashboard/road-missions/reports/machinesReports/page.js new file mode 100644 index 0000000..0656840 --- /dev/null +++ b/src/app/(withAuth)/(dashboardLayout)/dashboard/road-missions/reports/machinesReports/page.js @@ -0,0 +1,18 @@ +import MachinesReportsPage from "@/components/dashboard/roadMissions/reports/machinesReports"; +import WithPermission from "@/core/middlewares/withPermission"; + +export const metadata = { + title: "کارتابل گزارش ماشین‌ها", +}; + +export default function Page() { + return ( + + + + ); +} diff --git a/src/components/dashboard/roadMissions/reports/machinesReports/ExcelPrint/index.jsx b/src/components/dashboard/roadMissions/reports/machinesReports/ExcelPrint/index.jsx new file mode 100644 index 0000000..ef85a7f --- /dev/null +++ b/src/components/dashboard/roadMissions/reports/machinesReports/ExcelPrint/index.jsx @@ -0,0 +1,77 @@ +"use client"; +import { + EXPORT_GET_MACHINES_COUNTRY_ACTIVITY_REPORT, + EXPORT_GET_MACHINES_PROVINCE_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 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; + 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 ? ( + + + + ) : ( + + )} + + ); +}; +export default PrintExcel; diff --git a/src/components/dashboard/roadMissions/reports/machinesReports/MachinesReportsList.jsx b/src/components/dashboard/roadMissions/reports/machinesReports/MachinesReportsList.jsx new file mode 100644 index 0000000..4eaae92 --- /dev/null +++ b/src/components/dashboard/roadMissions/reports/machinesReports/MachinesReportsList.jsx @@ -0,0 +1,78 @@ +"use client"; +import DataTableWithAuth from "@/core/components/DataTableWithAuth"; +import { Box } from "@mui/material"; +import { useMemo } from "react"; +import Toolbar from "./Toolbar"; + +const MachinesReportsList = ({ data, specialFilter }) => { + const columns = useMemo(() => { + return [ + { + accessorKey: "machine_id", + header: "کد یکتا", + id: "machine_id", + enableColumnFilter: false, + enableSorting: false, + datatype: "numeric", + grow: false, + size: 50, + }, + { + accessorKey: "car_name", + header: "مدل ماشین", + id: "car_name", + enableColumnFilter: false, + enableSorting: false, + datatype: "text", + grow: false, + size: 50, + }, + { + accessorKey: "machine_code", + header: "کد ماشین", + id: "machine_code", + enableColumnFilter: false, + enableSorting: false, + datatype: "text", + grow: false, + size: 50, + }, + { + accessorKey: "func", + header: "کارکرد", + id: "func", + enableColumnFilter: false, + enableSorting: false, + datatype: "number", + grow: false, + size: 50, + }, + { + accessorKey: "missions", + header: "تعداد ماموریت", + id: "missions", + enableColumnFilter: false, + enableSorting: false, + datatype: "number", + grow: false, + size: 50, + }, + ]; + }, []); + + return ( + + + + ); +}; + +export default MachinesReportsList; diff --git a/src/components/dashboard/roadMissions/reports/machinesReports/Search/FromDateController.jsx b/src/components/dashboard/roadMissions/reports/machinesReports/Search/FromDateController.jsx new file mode 100644 index 0000000..490ee7b --- /dev/null +++ b/src/components/dashboard/roadMissions/reports/machinesReports/Search/FromDateController.jsx @@ -0,0 +1,27 @@ +import MuiDatePicker from "@/core/components/MuiDatePicker"; +import moment from "jalali-moment"; +import { Controller } from "react-hook-form"; + +const FromDateController = ({ control }) => { + return ( + ( + { + const formattedDate = moment(new Date(newValue)).locale("en").format("YYYY-MM-DD"); + onChange(formattedDate); // Update the field value in react-hook-form + }} + helperText={error ? error.message : null} + /> + )} + /> + ); +}; +export default FromDateController; diff --git a/src/components/dashboard/roadMissions/reports/machinesReports/Search/SearchReportField.jsx b/src/components/dashboard/roadMissions/reports/machinesReports/Search/SearchReportField.jsx new file mode 100644 index 0000000..bde2a4c --- /dev/null +++ b/src/components/dashboard/roadMissions/reports/machinesReports/Search/SearchReportField.jsx @@ -0,0 +1,44 @@ +import SearchIcon from "@mui/icons-material/Search"; +import { Button, Grid } from "@mui/material"; +import { Controller } from "react-hook-form"; +import FromDateController from "./FromDateController"; +import SelectProvince from "./SelectProvince"; +import ToDateController from "./ToDateController"; + +const SearchReportField = ({ control, hasProvincesPermission }) => { + return ( + + + + + + + + {hasProvincesPermission && ( + + + + )} + + ( + + )} + /> + + + ); +}; + +export default SearchReportField; diff --git a/src/components/dashboard/roadMissions/reports/machinesReports/Search/SelectProvince.jsx b/src/components/dashboard/roadMissions/reports/machinesReports/Search/SelectProvince.jsx new file mode 100644 index 0000000..2b24d67 --- /dev/null +++ b/src/components/dashboard/roadMissions/reports/machinesReports/Search/SelectProvince.jsx @@ -0,0 +1,45 @@ +import useProvinces from "@/lib/hooks/useProvince"; +import { FormControl, FormHelperText, InputLabel, MenuItem, Select } from "@mui/material"; +import { Controller } from "react-hook-form"; + +const SelectProvince = ({ control }) => { + const { provinces, loadingProvinces, errorProvinces } = useProvinces(); + return ( + ( + + استان + + {error && {error.message}} + + )} + /> + ); +}; +export default SelectProvince; diff --git a/src/components/dashboard/roadMissions/reports/machinesReports/Search/ToDateController.jsx b/src/components/dashboard/roadMissions/reports/machinesReports/Search/ToDateController.jsx new file mode 100644 index 0000000..fc4a776 --- /dev/null +++ b/src/components/dashboard/roadMissions/reports/machinesReports/Search/ToDateController.jsx @@ -0,0 +1,30 @@ +import MuiDatePicker from "@/core/components/MuiDatePicker"; +import moment from "jalali-moment"; +import { Controller, useWatch } from "react-hook-form"; + +const ToDateController = ({ control }) => { + const minDate = useWatch({ control, name: "from_date" }); + return ( + ( + { + const formattedDate = moment(new Date(newValue)).locale("en").format("YYYY-MM-DD"); + onChange(formattedDate); // Update the field value in react-hook-form + }} + helperText={error ? error.message : null} + /> + )} + /> + ); +}; +export default ToDateController; diff --git a/src/components/dashboard/roadMissions/reports/machinesReports/Search/index.jsx b/src/components/dashboard/roadMissions/reports/machinesReports/Search/index.jsx new file mode 100644 index 0000000..f29d302 --- /dev/null +++ b/src/components/dashboard/roadMissions/reports/machinesReports/Search/index.jsx @@ -0,0 +1,13 @@ +import StyledForm from "@/core/components/StyledForm"; +import SearchReportField from "./SearchReportField"; + +const SearchReportList = ({ handleSubmit, onSearchSubmit, control, hasProvincesPermission }) => { + return ( + <> + + + + + ); +}; +export default SearchReportList; diff --git a/src/components/dashboard/roadMissions/reports/machinesReports/Toolbar.jsx b/src/components/dashboard/roadMissions/reports/machinesReports/Toolbar.jsx new file mode 100644 index 0000000..0f726c7 --- /dev/null +++ b/src/components/dashboard/roadMissions/reports/machinesReports/Toolbar.jsx @@ -0,0 +1,11 @@ +import { Box } from "@mui/material"; +import PrintExcel from "./ExcelPrint"; + +const Toolbar = ({ table, filterData, mutate }) => { + return ( + + + + ); +}; +export default Toolbar; diff --git a/src/components/dashboard/roadMissions/reports/machinesReports/index.jsx b/src/components/dashboard/roadMissions/reports/machinesReports/index.jsx new file mode 100644 index 0000000..594fdb1 --- /dev/null +++ b/src/components/dashboard/roadMissions/reports/machinesReports/index.jsx @@ -0,0 +1,109 @@ +"use client"; +import PageTitle from "@/core/components/PageTitle"; +import { GET_MACHINES_COUNTRY_ACTIVITY_REPORT, GET_MACHINES_PROVINCE_ACTIVITY_REPORT } from "@/core/utils/routes"; +import { useAuth } from "@/lib/contexts/auth"; +import { usePermissions } from "@/lib/hooks/usePermissions"; +import useRequest from "@/lib/hooks/useRequest"; +import { yupResolver } from "@hookform/resolvers/yup"; +import { LinearProgress, Stack } from "@mui/material"; +import moment from "jalali-moment"; +import { useEffect, useState } from "react"; +import { useForm } from "react-hook-form"; +import * as yup from "yup"; +import MachinesReportsList from "./MachinesReportsList"; +import SearchReportList from "./Search"; + +const MachinesReportsPage = () => { + const [data, setData] = useState(null); + const { data: userPermissions } = usePermissions(); + const { user } = useAuth(); + const requestServer = useRequest(); + const hasProvincesPermission = userPermissions?.includes("mission-report-country"); + + const defaultValues = { + from_date: moment(new Date()).format("YYYY-MM-DD"), + date_to: moment(new Date()).format("YYYY-MM-DD"), + province_id: user.province_id || "-1", + }; + const defaultFilter = [ + { value: `${defaultValues.province_id}`, datatype: "numeric", id: "province_id", fn: "equals" }, + { value: `${defaultValues.from_date}`, datatype: "date", id: "from_date", fn: "between" }, + { value: `${defaultValues.date_to}`, datatype: "date", id: "date_to", fn: "between" }, + ]; + const [specialFilter, setSpecialFilter] = useState(defaultFilter); + + const onSearchSubmit = async (data) => { + const params = new URLSearchParams(); + params.set("from_date", `${data.from_date} 00:00:00`); + params.set("date_to", `${data.date_to} 23:59:59`); + setSpecialFilter([ + { value: `${data.province_id}`, datatype: "numeric", id: "province_id", fn: "equals" }, + { value: `${data.from_date}`, datatype: "date", id: "from_date", fn: "between" }, + { value: `${data.date_to}`, datatype: "date", id: "date_to", fn: "between" }, + ]); + if (data.province_id === "-1") { + try { + const response = await requestServer(`${GET_MACHINES_COUNTRY_ACTIVITY_REPORT}?${params}`); + const result = response.data.data; + + setData({ + data: result.activities, + filters: data, + }); + } catch (e) {} + } else { + try { + params.set("province_id", `${data.province_id}`); + const response = await requestServer(`${GET_MACHINES_PROVINCE_ACTIVITY_REPORT}?${params}`); + + const result = response.data.data; + + setData({ + data: result.activities, + filters: data, + }); + } catch (e) {} + } + }; + + useEffect(() => { + if (!userPermissions) return; + onSearchSubmit(defaultValues); + }, [userPermissions]); + + const validationSchema = yup.object().shape({ + from_date: yup + .string() + .required("تاریخ شروع الزامی است!") + .matches(/^\d{4}-\d{2}-\d{2}$/, "تاریخ شروع الزامی است!") + .test("is-valid-date", "تاریخ شروع معتبر نیست!", (value) => moment(value, "YYYY-MM-DD", true).isValid()), + date_to: yup + .string() + .required("تاریخ پایان الزامی است!") + .matches(/^\d{4}-\d{2}-\d{2}$/, "تاریخ پایان الزامی است!") + .test("is-valid-date", "تاریخ پایان معتبر نیست!", (value) => moment(value, "YYYY-MM-DD", true).isValid()), + province_id: yup.string().nullable(), + }); + + const { control, handleSubmit } = useForm({ + defaultValues, + resolver: yupResolver(validationSchema), + mode: "all", + }); + + console.log(data); + + return ( + + + + {!data ? : } + + ); +}; +export default MachinesReportsPage; diff --git a/src/core/utils/pageMenu.js b/src/core/utils/pageMenu.js index 99366c4..bd24701 100644 --- a/src/core/utils/pageMenu.js +++ b/src/core/utils/pageMenu.js @@ -192,6 +192,15 @@ export const pageMenu = [ badges: [{ key: "mission.request_portal" }], permissions: ["all"], }, + { + id: "machinesReports", + label: "ماشین‌ها", + icon: , + type: "page", + route: "/dashboard/road-missions/reports/machinesReports", + badges: [{ key: "mission.request_portal" }], + permissions: ["all"], + }, ], }, ], diff --git a/src/core/utils/pageMenuDev.js b/src/core/utils/pageMenuDev.js index 4bc0665..ab888c7 100644 --- a/src/core/utils/pageMenuDev.js +++ b/src/core/utils/pageMenuDev.js @@ -190,6 +190,15 @@ export const pageMenuDev = [ badges: [{ key: "mission.request_portal" }], permissions: ["all"], }, + { + id: "machinesReports", + label: "ماشین‌ها", + icon: , + type: "page", + route: "/dashboard/road-missions/reports/machinesReports", + badges: [{ key: "mission.request_portal" }], + permissions: ["all"], + }, ], }, ], diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js index c970699..2bac1c4 100644 --- a/src/core/utils/routes.js +++ b/src/core/utils/routes.js @@ -247,6 +247,12 @@ export const FINISH_MISSION = api + "/api/v3/missions/control_unit/finish"; export const GET_ROAD_MISSIONS_VIOLATIONS_LIST = api + "/api/v3/missions/violation_management"; export const GET_MISSION_PROVINCE_ACTIVITY_REPORT = api + "/api/v3/missions/report/country_activity"; export const GET_MISSION_CITY_ACTIVITY_REPORT = api + "/api/v3/missions/report/country_activity"; +export const GET_MACHINES_COUNTRY_ACTIVITY_REPORT = api + "/api/v3/missions/report_machine/country_machines_activity"; +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_PROVINCE_ACTIVITY_REPORT = + api + "/api/v3/missions/report_machine/province_machines_activity_excel"; export const CREATE_VIOLATION = api + "/api/v3/missions/violation_management"; export const EDIT_VIOLATION = api + "/api/v3/missions/violation_management"; export const EXPORT_COUNTRY_ROAD_MISSIONS_REPORTS = api + "/api/v3/missions/report/country_excel_activity"; -- 2.49.1 From a9a6d90281bc29a39028d8581e551824061035bd Mon Sep 17 00:00:00 2001 From: baslani Date: Sat, 13 Jun 2026 16:07:55 +0330 Subject: [PATCH 2/3] implemented machines reports --- jsconfig.json | 38 +++---- .../machinesReports/MachinesReportsList.jsx | 3 + .../MachineMissionsList/index.jsx | 106 ++++++++++++++++++ .../RowActions/MissionDitails/Form/index.jsx | 27 +++++ .../RowActions/MissionDitails/index.jsx | 47 ++++++++ .../RowActions/RouteDetail/ShowRoute.jsx | 46 ++++++++ .../RowActions/RouteDetail/index.jsx | 57 ++++++++++ .../machinesReports/RowActions/index.jsx | 6 + src/core/utils/routes.js | 1 + 9 files changed, 312 insertions(+), 19 deletions(-) create mode 100644 src/components/dashboard/roadMissions/reports/machinesReports/RowActions/MissionDitails/Form/MachineMissionsDetailsDialog/MachineMissionsList/index.jsx create mode 100644 src/components/dashboard/roadMissions/reports/machinesReports/RowActions/MissionDitails/Form/index.jsx create mode 100644 src/components/dashboard/roadMissions/reports/machinesReports/RowActions/MissionDitails/index.jsx create mode 100644 src/components/dashboard/roadMissions/reports/machinesReports/RowActions/RouteDetail/ShowRoute.jsx create mode 100644 src/components/dashboard/roadMissions/reports/machinesReports/RowActions/RouteDetail/index.jsx create mode 100644 src/components/dashboard/roadMissions/reports/machinesReports/RowActions/index.jsx diff --git a/jsconfig.json b/jsconfig.json index c136578..b51472a 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -1,27 +1,27 @@ // javascript for production -// { -// "compilerOptions": { -// "paths": { -// "@/*": ["./src/*"], -// "^/*": ["./public/*"] -// } -// } -// } - -// typescript for local development { "compilerOptions": { - "jsx": "react-jsx", - "noUnusedLocals": true, - "noImplicitAny": false, - "checkJs": true, - "allowJs": true, - "strict": true, - "baseUrl": ".", "paths": { "@/*": ["./src/*"], "^/*": ["./public/*"] } - }, - "exclude": ["node_modules"] + } } + +// typescript for local development +// { +// "compilerOptions": { +// "jsx": "react-jsx", +// "noUnusedLocals": true, +// "noImplicitAny": false, +// "checkJs": true, +// "allowJs": true, +// "strict": true, +// "baseUrl": ".", +// "paths": { +// "@/*": ["./src/*"], +// "^/*": ["./public/*"] +// } +// }, +// "exclude": ["node_modules"] +// } diff --git a/src/components/dashboard/roadMissions/reports/machinesReports/MachinesReportsList.jsx b/src/components/dashboard/roadMissions/reports/machinesReports/MachinesReportsList.jsx index 4eaae92..34badf1 100644 --- a/src/components/dashboard/roadMissions/reports/machinesReports/MachinesReportsList.jsx +++ b/src/components/dashboard/roadMissions/reports/machinesReports/MachinesReportsList.jsx @@ -3,6 +3,7 @@ import DataTableWithAuth from "@/core/components/DataTableWithAuth"; import { Box } from "@mui/material"; import { useMemo } from "react"; import Toolbar from "./Toolbar"; +import RowActions from "./RowActions"; const MachinesReportsList = ({ data, specialFilter }) => { const columns = useMemo(() => { @@ -70,6 +71,8 @@ const MachinesReportsList = ({ data, specialFilter }) => { table_name={"roadMissionReportList"} enablePagination={false} specialFilter={specialFilter} + enableRowActions + RowActions={RowActions} /> ); 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 new file mode 100644 index 0000000..037aec7 --- /dev/null +++ b/src/components/dashboard/roadMissions/reports/machinesReports/RowActions/MissionDitails/Form/MachineMissionsDetailsDialog/MachineMissionsList/index.jsx @@ -0,0 +1,106 @@ +import DataTableWithAuth from "@/core/components/DataTableWithAuth"; +import { GET_MACHINE_MISSIONS_DETAILS } from "@/core/utils/routes"; +import { Box } from "@mui/material"; +import { useMemo } from "react"; + +const MachineMissionsList = ({ row }) => { + const columns = useMemo( + () => [ + { + accessorKey: "id", + header: "کد یکتا", + id: "id", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 80, + }, + { + 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", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + }, + { + accessorKey: "station_name", + header: "راهدارخانه", + id: "station_name", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + }, + { + accessorKey: "driver_name", + header: "راننده", + id: "driver_name", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + }, + { + accessorKey: "km", + header: "کیلومتر شروع", + id: "km", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + }, + { + accessorKey: "end_km", + header: "کیلومتر پایان", + id: "end_km", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + }, + ], + [] + ); + + return ( + <> + + + + + ); +}; +export default MachineMissionsList; diff --git a/src/components/dashboard/roadMissions/reports/machinesReports/RowActions/MissionDitails/Form/index.jsx b/src/components/dashboard/roadMissions/reports/machinesReports/RowActions/MissionDitails/Form/index.jsx new file mode 100644 index 0000000..5e79bfa --- /dev/null +++ b/src/components/dashboard/roadMissions/reports/machinesReports/RowActions/MissionDitails/Form/index.jsx @@ -0,0 +1,27 @@ +import { Box, Button, DialogActions, DialogContent } from "@mui/material"; +import { Stack } from "@mui/system"; +import MachineMissionsList from "./MachineMissionsDetailsDialog/MachineMissionsList"; + +const MachineMissionsDetailsTable = ({ row, setOpenMachineMissionsDetails }) => { + return ( + <> + + + + + + + + + + + + + + + + ); +}; +export default MachineMissionsDetailsTable; diff --git a/src/components/dashboard/roadMissions/reports/machinesReports/RowActions/MissionDitails/index.jsx b/src/components/dashboard/roadMissions/reports/machinesReports/RowActions/MissionDitails/index.jsx new file mode 100644 index 0000000..3b65c8f --- /dev/null +++ b/src/components/dashboard/roadMissions/reports/machinesReports/RowActions/MissionDitails/index.jsx @@ -0,0 +1,47 @@ +import { Close, RemoveRedEye } from "@mui/icons-material"; +import { Dialog, DialogTitle, IconButton, Tooltip } from "@mui/material"; +import { useState } from "react"; +import MachineMissionsDetailsTable from "./Form"; + +const MissionDetails = ({ row }) => { + const [openMachineMissionsDetails, setOpenMachineMissionsDetails] = useState(false); + + return ( + <> + + { + setOpenMachineMissionsDetails(true); + }} + > + + + + + setOpenMachineMissionsDetails(false)} + sx={(theme) => ({ + position: "absolute", + right: 8, + top: 8, + zIndex: 50, + color: theme.palette.grey[500], + })} + > + + + ریز گزارشات خودرو + {openMachineMissionsDetails && ( + + )} + + + ); +}; +export default MissionDetails; diff --git a/src/components/dashboard/roadMissions/reports/machinesReports/RowActions/RouteDetail/ShowRoute.jsx b/src/components/dashboard/roadMissions/reports/machinesReports/RowActions/RouteDetail/ShowRoute.jsx new file mode 100644 index 0000000..5e1a4bd --- /dev/null +++ b/src/components/dashboard/roadMissions/reports/machinesReports/RowActions/RouteDetail/ShowRoute.jsx @@ -0,0 +1,46 @@ +import { useEffect, useRef } from "react"; +import { Marker, Polyline, useMap } from "react-leaflet"; +import L from "leaflet"; +import polyline from "@mapbox/polyline"; +import SourceIcon from "@/assets/images/source-icon.svg"; +import DestIcon from "@/assets/images/destination-icon.svg"; + +const ShowRoute = ({ area }) => { + const map = useMap(); + const defaultIconSize = [35, 35]; + + const createCustomIcon = (size, iconUrl) => { + return L.icon({ + iconUrl: iconUrl, + iconSize: size, + iconAnchor: [size[0] / 2, size[1]], + popupAnchor: [0, -size[1]], + }); + }; + + useEffect(() => { + if (coords.length > 0) { + map.flyToBounds(coords, { padding: [50, 50], duration: 1.5 }); + } + }, [area]); + const sourceIcon = createCustomIcon(defaultIconSize, SourceIcon.src); + const destIcon = createCustomIcon(defaultIconSize, DestIcon.src); + + if (!area) return null; + const coords = polyline.decode(area, 6); + + if (coords.length === 0) return null; + + const sourcePosition = coords[0]; + const destPosition = coords[coords.length - 1]; + + return ( + <> + + + + + ); +}; + +export default ShowRoute; diff --git a/src/components/dashboard/roadMissions/reports/machinesReports/RowActions/RouteDetail/index.jsx b/src/components/dashboard/roadMissions/reports/machinesReports/RowActions/RouteDetail/index.jsx new file mode 100644 index 0000000..4501d35 --- /dev/null +++ b/src/components/dashboard/roadMissions/reports/machinesReports/RowActions/RouteDetail/index.jsx @@ -0,0 +1,57 @@ +import { Box, Button, Dialog, DialogActions, DialogTitle, IconButton, Tooltip } from "@mui/material"; +import { useState } from "react"; +import MapIcon from "@mui/icons-material/Map"; +import MapLayer from "@/core/components/MapLayer"; +import ShowRoute from "./ShowRoute"; + +const RouteDetail = ({ encoded_route }) => { + const [openRouteDetailDialog, setOpenRouteDetailDialog] = useState(false); + return ( + <> + + setOpenRouteDetailDialog(true)}> + + + + setOpenRouteDetailDialog(false)} + PaperProps={{ + sx: { + boxShadow: "rgba(60, 64, 67, 0.3) 0px 1px 16px 0px, rgba(60, 64, 67, 0.15) 0px 1px 10px 0px", + }, + }} + dir="rtl" + maxWidth={"sm"} + > + مسیر انتخابی + + + + + + + + + + + + + ); +}; +export default RouteDetail; diff --git a/src/components/dashboard/roadMissions/reports/machinesReports/RowActions/index.jsx b/src/components/dashboard/roadMissions/reports/machinesReports/RowActions/index.jsx new file mode 100644 index 0000000..dbf9aa7 --- /dev/null +++ b/src/components/dashboard/roadMissions/reports/machinesReports/RowActions/index.jsx @@ -0,0 +1,6 @@ +import MissionDetails from "./MissionDitails"; + +const RowActions = ({ row }) => { + return ; +}; +export default RowActions; diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js index 2bac1c4..10a6117 100644 --- a/src/core/utils/routes.js +++ b/src/core/utils/routes.js @@ -291,3 +291,4 @@ export const GET_PROVINCES_LIST = api + "/api/v3/provinces/list"; export const GET_CITIES_LIST = api + "/api/v3/cities/list"; export const GET_STATIONS_LIST = api + "/api/v3/road_maintenance_station"; export const UPDATE_MACHINE_STATUS_AND_LOCATION = api + "/api/v3/cmms_machines"; +export const GET_MACHINE_MISSIONS_DETAILS = api + "/api/v3/missions/report_machine/machine_details_report"; -- 2.49.1 From 61ed1980f1347e30337279645a9bbbaf25d16c69 Mon Sep 17 00:00:00 2001 From: baslani Date: Sat, 13 Jun 2026 16:20:22 +0330 Subject: [PATCH 3/3] cleaned up logs --- .../control/RowActions/StartMission/StartMissionContent.jsx | 1 - .../dashboard/roadMissions/reports/machinesReports/index.jsx | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/components/dashboard/roadMissions/control/RowActions/StartMission/StartMissionContent.jsx b/src/components/dashboard/roadMissions/control/RowActions/StartMission/StartMissionContent.jsx index 56386db..8c2d3a1 100644 --- a/src/components/dashboard/roadMissions/control/RowActions/StartMission/StartMissionContent.jsx +++ b/src/components/dashboard/roadMissions/control/RowActions/StartMission/StartMissionContent.jsx @@ -38,7 +38,6 @@ const StartMissionContent = ({ rowId, mutate, setOpenStartMissionDialog }) => { const onSubmit = (values) => { const formattedDate = values.start_date; const formattedTime = format(values.start_time, "HH:mm"); - console.log(formattedDate, formattedTime); requestServer(`${START_MISSION}/${rowId}`, "post", { data: { diff --git a/src/components/dashboard/roadMissions/reports/machinesReports/index.jsx b/src/components/dashboard/roadMissions/reports/machinesReports/index.jsx index 594fdb1..e62f273 100644 --- a/src/components/dashboard/roadMissions/reports/machinesReports/index.jsx +++ b/src/components/dashboard/roadMissions/reports/machinesReports/index.jsx @@ -91,8 +91,6 @@ const MachinesReportsPage = () => { mode: "all", }); - console.log(data); - return ( -- 2.49.1