From 1cbcc4bb90ace5e1ed0fff8216ae0afab5c66fc0 Mon Sep 17 00:00:00 2001 From: baslani Date: Mon, 26 Jan 2026 15:51:17 +0330 Subject: [PATCH] implemented road missions taradod reports page --- .../reports/{ => missionsReports}/page.js | 36 +-- .../reports/violationsReports/page.js | 3 + .../roadMissions/reports/ReportLists.jsx | 84 ------ .../ExcelPrint/index.jsx | 151 +++++----- .../missionsReports/MissionsReportLists.jsx | 141 +++++++++ .../Search/FromDateController.jsx | 54 ++-- .../Search/SearchReportField.jsx | 88 +++--- .../Search/SelectProvince.jsx | 90 +++--- .../Search/ToDateController.jsx | 60 ++-- .../{ => missionsReports}/Search/index.jsx | 29 +- .../reports/{ => missionsReports}/Toolbar.jsx | 22 +- .../reports/{ => missionsReports}/index.jsx | 279 +++++++++--------- src/core/utils/pageMenu.js | 25 +- src/core/utils/pageMenuDev.js | 40 ++- src/core/utils/routes.js | 18 ++ 15 files changed, 624 insertions(+), 496 deletions(-) rename src/app/(withAuth)/(dashboardLayout)/dashboard/road-missions/reports/{ => missionsReports}/page.js (62%) create mode 100644 src/app/(withAuth)/(dashboardLayout)/dashboard/road-missions/reports/violationsReports/page.js delete mode 100644 src/components/dashboard/roadMissions/reports/ReportLists.jsx rename src/components/dashboard/roadMissions/reports/{ => missionsReports}/ExcelPrint/index.jsx (89%) create mode 100644 src/components/dashboard/roadMissions/reports/missionsReports/MissionsReportLists.jsx rename src/components/dashboard/roadMissions/reports/{ => missionsReports}/Search/FromDateController.jsx (97%) rename src/components/dashboard/roadMissions/reports/{ => missionsReports}/Search/SearchReportField.jsx (97%) rename src/components/dashboard/roadMissions/reports/{ => missionsReports}/Search/SelectProvince.jsx (97%) rename src/components/dashboard/roadMissions/reports/{ => missionsReports}/Search/ToDateController.jsx (97%) rename src/components/dashboard/roadMissions/reports/{ => missionsReports}/Search/index.jsx (69%) rename src/components/dashboard/roadMissions/reports/{ => missionsReports}/Toolbar.jsx (96%) rename src/components/dashboard/roadMissions/reports/{ => missionsReports}/index.jsx (84%) diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/road-missions/reports/page.js b/src/app/(withAuth)/(dashboardLayout)/dashboard/road-missions/reports/missionsReports/page.js similarity index 62% rename from src/app/(withAuth)/(dashboardLayout)/dashboard/road-missions/reports/page.js rename to src/app/(withAuth)/(dashboardLayout)/dashboard/road-missions/reports/missionsReports/page.js index 8b51a44..30c499c 100644 --- a/src/app/(withAuth)/(dashboardLayout)/dashboard/road-missions/reports/page.js +++ b/src/app/(withAuth)/(dashboardLayout)/dashboard/road-missions/reports/missionsReports/page.js @@ -1,18 +1,18 @@ -import WithPermission from "@/core/middlewares/withPermission"; -import ReportPage from "@/components/dashboard/roadMissions/reports"; -export const metadata = { - title: "کارتابل گزارش ماموریت", -}; -const Page = () => { - return ( - - - - ); -}; - -export default Page; +import WithPermission from "@/core/middlewares/withPermission"; +import MissionsReportPage from "@/components/dashboard/roadMissions/reports/missionsReports"; +export const metadata = { + title: "کارتابل گزارش ماموریت ها", +}; +const Page = () => { + return ( + + + + ); +}; + +export default Page; diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/road-missions/reports/violationsReports/page.js b/src/app/(withAuth)/(dashboardLayout)/dashboard/road-missions/reports/violationsReports/page.js new file mode 100644 index 0000000..6084a35 --- /dev/null +++ b/src/app/(withAuth)/(dashboardLayout)/dashboard/road-missions/reports/violationsReports/page.js @@ -0,0 +1,3 @@ +export default function ViolationReportsPage() { + return
ViolationReportsPage
; +} diff --git a/src/components/dashboard/roadMissions/reports/ReportLists.jsx b/src/components/dashboard/roadMissions/reports/ReportLists.jsx deleted file mode 100644 index 50e4c66..0000000 --- a/src/components/dashboard/roadMissions/reports/ReportLists.jsx +++ /dev/null @@ -1,84 +0,0 @@ -"use client"; -import DataTableWithAuth from "@/core/components/DataTableWithAuth"; -import { Box } from "@mui/material"; -import { useMemo } from "react"; -import Toolbar from "./Toolbar"; - -const ReportLists = ({ data, specialFilter }) => { - const columns = useMemo(() => { - return [ - { - accessorKey: "edare_name", - header: "اداره کل", - id: "edare_name", - enableColumnFilter: false, - enableSorting: false, - datatype: "text", - grow: false, - size: 50, - }, - { - accessorKey: "no_mission_count", - header: "تردد بدون ماموریت", - id: "no_mission_count", - enableColumnFilter: false, - enableSorting: false, - datatype: "text", - grow: false, - size: 50, - muiTableBodyCellProps: { - sx: { - textAlign: "center", - borderLeft: "1px solid #e1e1e1", - py: 0, - "&:first-of-type": { - borderLeft: "unset", - }, - }, - }, - Cell: ({ renderedCellValue }) => { - return renderedCellValue; - }, - }, - { - accessorKey: "out_of_area_count", - header: "تردد خارج محدوده", - id: "out_of_area_count", - enableColumnFilter: false, - enableSorting: false, - datatype: "text", - grow: false, - size: 50, - muiTableBodyCellProps: { - sx: { - textAlign: "center", - borderLeft: "1px solid #e1e1e1", - py: 0, - "&:first-of-type": { - borderLeft: "unset", - }, - }, - }, - Cell: ({ renderedCellValue }) => { - return renderedCellValue; - }, - }, - ]; - }, []); - - return ( - - - - ); -}; - -export default ReportLists; diff --git a/src/components/dashboard/roadMissions/reports/ExcelPrint/index.jsx b/src/components/dashboard/roadMissions/reports/missionsReports/ExcelPrint/index.jsx similarity index 89% rename from src/components/dashboard/roadMissions/reports/ExcelPrint/index.jsx rename to src/components/dashboard/roadMissions/reports/missionsReports/ExcelPrint/index.jsx index 296e30c..b398579 100644 --- a/src/components/dashboard/roadMissions/reports/ExcelPrint/index.jsx +++ b/src/components/dashboard/roadMissions/reports/missionsReports/ExcelPrint/index.jsx @@ -1,74 +1,77 @@ -"use client"; -import { EXPORT_COUNTRY_ROAD_MISSIONS_REPORTS, EXPORT_PROVINCE_ROAD_MISSIONS_REPORTS } 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_COUNTRY_ROAD_MISSIONS_REPORTS - : EXPORT_PROVINCE_ROAD_MISSIONS_REPORTS; - 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; +"use client"; +import { + EXPORT_MISSIONS_REPORT_TARADOD_COUNTRY_EXCEL_ACTIVITY, + EXPORT_MISSIONS_REPORT_TARADOD_PROVINCE_EXCEL_ACTIVITY, +} 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_MISSIONS_REPORT_TARADOD_COUNTRY_EXCEL_ACTIVITY + : EXPORT_MISSIONS_REPORT_TARADOD_PROVINCE_EXCEL_ACTIVITY; + 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/missionsReports/MissionsReportLists.jsx b/src/components/dashboard/roadMissions/reports/missionsReports/MissionsReportLists.jsx new file mode 100644 index 0000000..3aa0277 --- /dev/null +++ b/src/components/dashboard/roadMissions/reports/missionsReports/MissionsReportLists.jsx @@ -0,0 +1,141 @@ +"use client"; +import DataTableWithAuth from "@/core/components/DataTableWithAuth"; +import { Box } from "@mui/material"; +import { useEffect, useMemo } from "react"; +import Toolbar from "./Toolbar"; + +const MissionsReportLists = ({ data, specialFilter }) => { + useEffect(() => { + console.log(data); + }, [data]); + const columns = useMemo(() => { + return [ + { + accessorKey: "edare_name", + header: "اداره کل", + id: "edare_name", + enableColumnFilter: false, + enableSorting: false, + datatype: "text", + grow: false, + size: 50, + }, + { + accessorKey: "total", + header: "کل ماموریت ها", + id: "total", + enableColumnFilter: false, + enableSorting: false, + datatype: "numeric", + grow: false, + size: 50, + }, + { + accessorKey: "khareg_mahdode", + header: "تردد خارج از محدوده", + id: "khareg_mahdode", + enableColumnFilter: false, + enableSorting: false, + datatype: "numeric", + grow: false, + size: 50, + }, + { + accessorKey: "durations", + header: "جمع ساعات ماموریت", + id: "duration", + enableColumnFilter: false, + enableSorting: false, + datatype: "numeric", + grow: false, + size: 50, + }, + { + accessorKey: "gps", + header: "جمع ساعات gps", + id: "gps", + enableColumnFilter: false, + enableSorting: false, + datatype: "numeric", + grow: false, + size: 50, + }, + { + accessorKey: "far_h", + header: "با فرایند ساعتی", + id: "far_h", + enableColumnFilter: false, + enableSorting: false, + datatype: "numeric", + grow: false, + size: 50, + }, + { + accessorKey: "far_d", + header: "با فرایند روزانه", + id: "far_d", + enableColumnFilter: false, + enableSorting: false, + datatype: "numeric", + grow: false, + size: 50, + }, + { + accessorKey: "un_far_h", + header: "بدون فرایند ساعتی", + id: "un_far_h", + enableColumnFilter: false, + enableSorting: false, + datatype: "numeric", + grow: false, + size: 50, + }, + { + accessorKey: "un_far_d", + header: "بدون فرایند روزانه", + id: "un_far_d", + enableColumnFilter: false, + enableSorting: false, + datatype: "numeric", + grow: false, + size: 50, + }, + { + accessorKey: "item", + header: "فعالیت روزانه", + id: "item", + enableColumnFilter: false, + enableSorting: false, + datatype: "text", + grow: false, + size: 50, + }, + { + accessorKey: "patrol", + header: "گشت راهداری", + id: "patrol", + enableColumnFilter: false, + enableSorting: false, + datatype: "text", + grow: false, + size: 50, + }, + ]; + }, []); + + return ( + + + + ); +}; + +export default MissionsReportLists; diff --git a/src/components/dashboard/roadMissions/reports/Search/FromDateController.jsx b/src/components/dashboard/roadMissions/reports/missionsReports/Search/FromDateController.jsx similarity index 97% rename from src/components/dashboard/roadMissions/reports/Search/FromDateController.jsx rename to src/components/dashboard/roadMissions/reports/missionsReports/Search/FromDateController.jsx index 0a81488..490ee7b 100644 --- a/src/components/dashboard/roadMissions/reports/Search/FromDateController.jsx +++ b/src/components/dashboard/roadMissions/reports/missionsReports/Search/FromDateController.jsx @@ -1,27 +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; +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/Search/SearchReportField.jsx b/src/components/dashboard/roadMissions/reports/missionsReports/Search/SearchReportField.jsx similarity index 97% rename from src/components/dashboard/roadMissions/reports/Search/SearchReportField.jsx rename to src/components/dashboard/roadMissions/reports/missionsReports/Search/SearchReportField.jsx index e1b71cd..bde2a4c 100644 --- a/src/components/dashboard/roadMissions/reports/Search/SearchReportField.jsx +++ b/src/components/dashboard/roadMissions/reports/missionsReports/Search/SearchReportField.jsx @@ -1,44 +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; +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/Search/SelectProvince.jsx b/src/components/dashboard/roadMissions/reports/missionsReports/Search/SelectProvince.jsx similarity index 97% rename from src/components/dashboard/roadMissions/reports/Search/SelectProvince.jsx rename to src/components/dashboard/roadMissions/reports/missionsReports/Search/SelectProvince.jsx index 89395f0..2b24d67 100644 --- a/src/components/dashboard/roadMissions/reports/Search/SelectProvince.jsx +++ b/src/components/dashboard/roadMissions/reports/missionsReports/Search/SelectProvince.jsx @@ -1,45 +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; +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/Search/ToDateController.jsx b/src/components/dashboard/roadMissions/reports/missionsReports/Search/ToDateController.jsx similarity index 97% rename from src/components/dashboard/roadMissions/reports/Search/ToDateController.jsx rename to src/components/dashboard/roadMissions/reports/missionsReports/Search/ToDateController.jsx index 9b9ac81..2dd7263 100644 --- a/src/components/dashboard/roadMissions/reports/Search/ToDateController.jsx +++ b/src/components/dashboard/roadMissions/reports/missionsReports/Search/ToDateController.jsx @@ -1,30 +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; +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/Search/index.jsx b/src/components/dashboard/roadMissions/reports/missionsReports/Search/index.jsx similarity index 69% rename from src/components/dashboard/roadMissions/reports/Search/index.jsx rename to src/components/dashboard/roadMissions/reports/missionsReports/Search/index.jsx index 9d504f2..63d4a61 100644 --- a/src/components/dashboard/roadMissions/reports/Search/index.jsx +++ b/src/components/dashboard/roadMissions/reports/missionsReports/Search/index.jsx @@ -1,13 +1,16 @@ -import StyledForm from "@/core/components/StyledForm"; -import SearchReportField from "./SearchReportField"; - -const SearchReportList = ({ handleSubmit, onSearchSubmit, control, hasProvincesPermission }) => { - return ( - <> - - - - - ); -}; -export default SearchReportList; +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/Toolbar.jsx b/src/components/dashboard/roadMissions/reports/missionsReports/Toolbar.jsx similarity index 96% rename from src/components/dashboard/roadMissions/reports/Toolbar.jsx rename to src/components/dashboard/roadMissions/reports/missionsReports/Toolbar.jsx index afc132c..0f726c7 100644 --- a/src/components/dashboard/roadMissions/reports/Toolbar.jsx +++ b/src/components/dashboard/roadMissions/reports/missionsReports/Toolbar.jsx @@ -1,11 +1,11 @@ -import { Box } from "@mui/material"; -import PrintExcel from "./ExcelPrint"; - -const Toolbar = ({ table, filterData, mutate }) => { - return ( - - - - ); -}; -export default Toolbar; +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/index.jsx b/src/components/dashboard/roadMissions/reports/missionsReports/index.jsx similarity index 84% rename from src/components/dashboard/roadMissions/reports/index.jsx rename to src/components/dashboard/roadMissions/reports/missionsReports/index.jsx index 6ae4c0a..c92face 100644 --- a/src/components/dashboard/roadMissions/reports/index.jsx +++ b/src/components/dashboard/roadMissions/reports/missionsReports/index.jsx @@ -1,138 +1,141 @@ -"use client"; -import PageTitle from "@/core/components/PageTitle"; -import { GET_COUNTRY_ACTIVITY_REPORT, GET_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 ReportLists from "./ReportLists"; -import SearchReportList from "./Search"; - -const ReportPage = () => { - 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: hasProvincesPermission ? "-1" : user.province_id, - }; - 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}`); - params.set("date_to", `${data.date_to}`); - 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 { - params.set("province_id", `${data.province_id}`); - const response = await requestServer(`${GET_COUNTRY_ACTIVITY_REPORT}?${params}`); - const result = response.data.data; - const nationalReportForItem = result.activities.find((report) => report.province_id === "-1"); - const nationalReport = { - edare_name: "کل کشور", - ...nationalReportForItem, - }; - - setData({ - data: [ - nationalReport, - ...result.provinces.map((province) => { - const filteredReports = result.activities.find( - (report) => report.province_id == province.id - ); - return { - ...filteredReports, - edare_name: province.name_fa, - }; - }), - ], - filters: data, - }); - } catch (e) {} - } else { - try { - params.set("province_id", `${data.province_id}`); - const response = await requestServer(`${GET_PROVINCE_ACTIVITY_REPORT}?${params}`); - const result = response.data.data; - - const nationalReportForItem = result.activities.find((report) => report.city_id === "-1"); - - const nationalReport = { - ...nationalReportForItem, - edare_name: "کل استان", - }; - setData({ - data: [ - nationalReport, - ...result.city.map((city) => { - const filteredReports = result.activities.find((report) => report.city_id == city.id); - return { - edare_name: city.name_fa, - ...filteredReports, - }; - }), - ], - 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", - }); - - return ( - - - - {!data ? : } - - ); -}; -export default ReportPage; +"use client"; +import PageTitle from "@/core/components/PageTitle"; +import { + GET_MISSIONS_REPORT_TARADOD_COUNTRY_ACTIVITY, + GET_MISSIONS_REPORT_TARADOD_PROVINCE_ACTIVITY, +} 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 MissionsReportLists from "./MissionsReportLists"; +import SearchReportList from "./Search"; + +const MissionsReportPage = () => { + 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}`); + params.set("date_to", `${data.date_to}`); + 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 { + // params.set("province_id", `${data.province_id}`); + const response = await requestServer(`${GET_MISSIONS_REPORT_TARADOD_COUNTRY_ACTIVITY}?${params}`); + const result = response.data.data; + const nationalReportForItem = result.activities.find((report) => report.province_id === "-1"); + const nationalReport = { + edare_name: "کل کشور", + ...nationalReportForItem, + }; + + setData({ + data: [ + nationalReport, + ...result.provinces.map((province) => { + const filteredReports = result.activities.find( + (report) => report.province_id == province.id + ); + return { + ...filteredReports, + edare_name: province.name_fa, + }; + }), + ], + filters: data, + }); + } catch (e) {} + } else { + try { + params.set("province_id", `${data.province_id}`); + const response = await requestServer(`${GET_MISSIONS_REPORT_TARADOD_PROVINCE_ACTIVITY}?${params}`); + const result = response.data.data; + + const nationalReportForItem = result.activities.find((report) => report.city_id === "-1"); + + const nationalReport = { + ...nationalReportForItem, + edare_name: "کل استان", + }; + setData({ + data: [ + nationalReport, + ...result.city.map((city) => { + const filteredReports = result.activities.find((report) => report.city_id == city.id); + return { + edare_name: city.name_fa, + ...filteredReports, + }; + }), + ], + 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", + }); + + return ( + + + + {!data ? : } + + ); +}; +export default MissionsReportPage; diff --git a/src/core/utils/pageMenu.js b/src/core/utils/pageMenu.js index 802eac6..a770353 100644 --- a/src/core/utils/pageMenu.js +++ b/src/core/utils/pageMenu.js @@ -33,6 +33,7 @@ import ContactPageIcon from "@mui/icons-material/ContactPage"; import DirectionsBusIcon from "@mui/icons-material/DirectionsBus"; import SupervisedUserCircleIcon from "@mui/icons-material/SupervisedUserCircle"; import RemoveRoadIcon from "@mui/icons-material/RemoveRoad"; +import { ReportProblem, RvHookup } from "@mui/icons-material"; export const pageMenu = [ { @@ -167,11 +168,31 @@ export const pageMenu = [ { id: "roadMissionsReports", label: "گزارشات", - type: "page", - route: "/dashboard/road-missions/reports", + type: "menu", icon: , // badges: [{ key: "mission.control" }], // TODO: add badge and permission permissions: ["all"], + hasSubitems: true, + Subitems: [ + { + id: "missionsReports", + label: "ترددها", + icon: , + type: "page", + route: "/dashboard/road-missions/reports/missionsReports", + badges: [{ key: "mission.request_portal" }], + permissions: ["all"], + }, + { + id: "violationsReports", + label: "تخلفات", + icon: , + type: "page", + route: "/dashboard/road-missions/reports/violationsReports", + badges: [{ key: "mission.request_portal" }], + permissions: ["all"], + }, + ], }, ], }, diff --git a/src/core/utils/pageMenuDev.js b/src/core/utils/pageMenuDev.js index b42db83..e0f742d 100644 --- a/src/core/utils/pageMenuDev.js +++ b/src/core/utils/pageMenuDev.js @@ -1,4 +1,4 @@ -import { Mediation } from "@mui/icons-material"; +import { Mediation, ReportProblem, RvHookup } from "@mui/icons-material"; import AccountTreeIcon from "@mui/icons-material/AccountTree"; import AdminPanelSettingsIcon from "@mui/icons-material/AdminPanelSettings"; import AssessmentIcon from "@mui/icons-material/Assessment"; @@ -6,7 +6,9 @@ import AssignmentLateIcon from "@mui/icons-material/AssignmentLate"; import AssistantIcon from "@mui/icons-material/Assistant"; import BallotIcon from "@mui/icons-material/Ballot"; import BiotechIcon from "@mui/icons-material/Biotech"; +import ContactPageIcon from "@mui/icons-material/ContactPage"; import CottageIcon from "@mui/icons-material/Cottage"; +import DirectionsBusIcon from "@mui/icons-material/DirectionsBus"; import DoorbellIcon from "@mui/icons-material/Doorbell"; import DriveEtaIcon from "@mui/icons-material/DriveEta"; import ElectricBoltIcon from "@mui/icons-material/ElectricBolt"; @@ -19,19 +21,17 @@ import GroupsIcon from "@mui/icons-material/Groups"; import HandymanIcon from "@mui/icons-material/Handyman"; import LineAxisIcon from "@mui/icons-material/LineAxis"; import LockPersonIcon from "@mui/icons-material/LockPerson"; +import ManageAccountsIcon from "@mui/icons-material/ManageAccounts"; import MapIcon from "@mui/icons-material/Map"; +import MapsHomeWorkIcon from "@mui/icons-material/MapsHomeWork"; +import PsychologyAltIcon from "@mui/icons-material/PsychologyAlt"; +import RemoveRoadIcon from "@mui/icons-material/RemoveRoad"; import RouteIcon from "@mui/icons-material/Route"; import ScienceIcon from "@mui/icons-material/Science"; +import SecurityIcon from "@mui/icons-material/Security"; import SpaceDashboardIcon from "@mui/icons-material/SpaceDashboard"; import SpeedIcon from "@mui/icons-material/Speed"; -import PsychologyAltIcon from "@mui/icons-material/PsychologyAlt"; -import MapsHomeWorkIcon from "@mui/icons-material/MapsHomeWork"; -import SecurityIcon from "@mui/icons-material/Security"; -import ManageAccountsIcon from "@mui/icons-material/ManageAccounts"; -import DirectionsBusIcon from "@mui/icons-material/DirectionsBus"; -import ContactPageIcon from "@mui/icons-material/ContactPage"; import SupervisedUserCircleIcon from "@mui/icons-material/SupervisedUserCircle"; -import RemoveRoadIcon from "@mui/icons-material/RemoveRoad"; export const pageMenuDev = [ { @@ -166,11 +166,31 @@ export const pageMenuDev = [ { id: "roadMissionsReports", label: "گزارشات", - type: "page", - route: "/dashboard/road-missions/reports", + type: "menu", icon: , // badges: [{ key: "mission.control" }], // TODO: add badge and permission permissions: ["all"], + hasSubitems: true, + Subitems: [ + { + id: "missionsReports", + label: "ترددها", + icon: , + type: "page", + route: "/dashboard/road-missions/reports/missionsReports", + badges: [{ key: "mission.request_portal" }], + permissions: ["all"], + }, + { + id: "violationsReports", + label: "تخلفات", + icon: , + type: "page", + route: "/dashboard/road-missions/reports/violationsReports", + badges: [{ key: "mission.request_portal" }], + permissions: ["all"], + }, + ], }, ], }, diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js index 5dd9b6b..2c51a51 100644 --- a/src/core/utils/routes.js +++ b/src/core/utils/routes.js @@ -47,6 +47,24 @@ export const GET_COUNTRY_ACTIVITY_REPORT = api + "/api/v3/missions/report/countr export const EXPORT_COUNTRY_ROAD_PATROL_REPORTS = api + "/api/v3/road_patrols/report/country_activity_excel"; export const EXPORT_PROVINCE_ROAD_PATROL_REPORTS = api + "/api/v3/road_patrols/report/province_activity_excel"; +export const GET_MISSIONS_REPORT_VIOLATION_COUNTRY_ACTIVITY = + api + "/api/v3/missions/report_violation/country_activity"; +export const GET_MISSIONS_REPORT_VIOLATION_PROVINCE_ACTIVITY = + api + "/api/v3/missions/report_violation/province_activity"; +export const EXPORT_MISSIONS_REPORT_VIOLATION_COUNTRY_ACTIVITY = + api + "/api/v3/missions/report_violation/country_excel_activity"; +export const EXPORT_MISSIONS_REPORT_VIOLATION_PROVINCE_ACTIVITY = + api + "/api/v3/missions/report_violation/province_excel_activity"; + +export const GET_MISSIONS_REPORT_TARADOD_COUNTRY_ACTIVITY = + "http://192.168.1.132:8000" + "/api/v3/missions/report_taradod/country_activity"; +export const GET_MISSIONS_REPORT_TARADOD_PROVINCE_ACTIVITY = + "http://192.168.1.132:8000" + "/api/v3/missions/report_taradod/province_activity"; +export const EXPORT_MISSIONS_REPORT_TARADOD_COUNTRY_EXCEL_ACTIVITY = + api + "/api/v3/missions/report_taradod/country_excel_activity"; +export const EXPORT_MISSIONS_REPORT_TARADOD_PROVINCE_EXCEL_ACTIVITY = + api + "/api/v3/missions/report_taradod/province_excel_activity"; + // road items export const GET_ROAD_ITEMS_SUPERVISOR_LIST = api + "/api/v3/road_items/supervisor"; export const EXPORT_ROAD_ITEMS_SUPERVISOR_LIST = api + "/api/v3/road_items/supervisor/excel";