Merge branch 'release/v1.7.8'

This commit is contained in:
AmirHossein Mahmoodi
2025-09-20 11:30:34 +03:30
13 changed files with 235 additions and 289 deletions

View File

@@ -1,4 +1,4 @@
HOST="rms.witel.ir"
NEXT_PUBLIC_VERSION="1.7.5"
NEXT_PUBLIC_VERSION="1.7.8"
NEXT_PUBLIC_API_URL="https://rms.witel.ir"
NEXT_PUBLIC_MAPTILE_ENDPOINT="https://rmsmap.rmto.ir/141map"

View File

@@ -1,10 +1,11 @@
"use client";
import DataTableWithAuth from "@/core/components/DataTableWithAuth";
import { GET_RECEIPT_DAMAGE_ITEMS_LIST } from "@/core/utils/routes";
import { Box } from "@mui/material";
import { Box, Typography } from "@mui/material";
import { useMemo } from "react";
import Toolbar from "./Toolbar";
import RowActions from "./RowActions";
import moment from "jalali-moment";
const DamagesList = () => {
const columns = useMemo(
@@ -49,6 +50,19 @@ const DamagesList = () => {
size: 100,
Cell: ({ renderedCellValue }) => (renderedCellValue / 1).toLocaleString(),
},
{
accessorKey: "update_time",
header: "تاریخ بروزرسانی",
id: "update_time",
enableColumnFilter: false,
datatype: "date",
filterMode: "equals",
Cell: ({ renderedCellValue }) => (
<Typography variant="body2">
{renderedCellValue ? moment(renderedCellValue).locale("fa").format("YYYY/MM/DD") : "-"}
</Typography>
),
},
{
accessorKey: "status",
header: "وضعیت",

View File

@@ -19,6 +19,7 @@ import { number, object } from "yup";
import useDamageItemList from "@/lib/hooks/useDamageItemList";
import DamagePrice from "./DamagePrice";
import { yupResolver } from "@hookform/resolvers/yup";
import moment from "jalali-moment";
const schema = object({
id: number().required("لطفا نوع خسارت را وارد کنید!!!"),
@@ -86,7 +87,7 @@ const DamageItem = ({ baseOnChange, baseDamageItems }) => {
<Autocomplete
options={damageItemList || []}
size={"small"}
getOptionLabel={(option) => option.title}
getOptionLabel={(option) => `${option.title} - بروزرسانی: ${option.update_time ? moment(option.update_time).locale("fa").format("YYYY/MM/DD") : ""}` }
isOptionEqualToValue={(option, value) => option.id === value.id}
loading={loadingDamageItemList}
renderInput={(params) => (

View File

@@ -35,6 +35,59 @@ const OperatorList = () => {
size: 100,
Cell: ({ row }) => <BlinkingCell value={row.original.id} visible={row.original.status == 2} />,
},
{
accessorKey: "status",
header: "وضعیت نظارت",
id: "status",
enableColumnFilter: true,
datatype: "numeric",
filterMode: "equals",
sortDescFirst: true,
grow: false,
size: 100,
columnSelectOption: () => {
return statusOptions.map((status) => ({
value: status.value,
label: status.label,
}));
},
Cell: ({ row }) => <>{row.original.status_fa}</>,
},
{
accessorKey: "supervisor_description",
header: "توضیح ناظر",
id: "supervisor_description",
enableColumnFilter: false,
datatype: "text",
filterMode: "equals",
sortDescFirst: false,
columnFilterModeOptions: ["equals", "contains"],
grow: false,
size: 100,
muiTableBodyCellProps: {
sx: {
borderLeft: "1px solid #e1e1e1",
py: 0,
"&:first-of-type": {
borderLeft: "unset",
},
},
},
Cell: ({ renderedCellValue }) => {
if (renderedCellValue) {
return (
<Stack alignItems={"center"} justifyContent={"center"}>
<DescriptionForm
description={renderedCellValue}
title={"توضیحات ناظر"}
icon={ThreePIcon}
/>
</Stack>
);
}
return <Typography variant="body2">-</Typography>;
},
},
{
header: "اطلاعات ثبت‌ شده در سامانه سوانح",
id: "fkInfo",
@@ -288,59 +341,6 @@ const OperatorList = () => {
},
],
},
{
accessorKey: "status",
header: "وضعیت نظارت",
id: "status",
enableColumnFilter: true,
datatype: "numeric",
filterMode: "equals",
sortDescFirst: true,
grow: false,
size: 100,
columnSelectOption: () => {
return statusOptions.map((status) => ({
value: status.value,
label: status.label,
}));
},
Cell: ({ row }) => <>{row.original.status_fa}</>,
},
{
accessorKey: "supervisor_description",
header: "توضیح ناظر",
id: "supervisor_description",
enableColumnFilter: false,
datatype: "text",
filterMode: "equals",
sortDescFirst: false,
columnFilterModeOptions: ["equals", "contains"],
grow: false,
size: 100,
muiTableBodyCellProps: {
sx: {
borderLeft: "1px solid #e1e1e1",
py: 0,
"&:first-of-type": {
borderLeft: "unset",
},
},
},
Cell: ({ renderedCellValue }) => {
if (renderedCellValue) {
return (
<Stack alignItems={"center"} justifyContent={"center"}>
<DescriptionForm
description={renderedCellValue}
title={"توضیحات ناظر"}
icon={ThreePIcon}
/>
</Stack>
);
}
return <Typography variant="body2">-</Typography>;
},
},
],
[]
);

View File

@@ -136,6 +136,59 @@ const SupervisorList = () => {
},
Cell: ({ renderedCellValue, row }) => <>{row.original.name_fa}</>,
},
{
accessorKey: "status",
header: "وضعیت نظارت",
id: "status",
enableColumnFilter: true,
datatype: "numeric",
filterMode: "equals",
sortDescFirst: true,
grow: false,
size: 100,
columnSelectOption: () => {
return statusOptions.map((status) => ({
value: status.value,
label: status.label,
}));
},
Cell: ({ row }) => <>{row.original.status_fa}</>,
},
{
accessorKey: "supervisor_description",
header: "توضیح ناظر",
id: "supervisor_description",
enableColumnFilter: false,
datatype: "text",
filterMode: "equals",
sortDescFirst: false,
columnFilterModeOptions: ["equals", "contains"],
grow: false,
size: 100,
muiTableBodyCellProps: {
sx: {
borderLeft: "1px solid #e1e1e1",
py: 0,
"&:first-of-type": {
borderLeft: "unset",
},
},
},
Cell: ({ renderedCellValue }) => {
if (renderedCellValue) {
return (
<Stack alignItems={"center"} justifyContent={"center"}>
<DescriptionForm
description={renderedCellValue}
title={"توضیحات کارشناس"}
icon={ThreePIcon}
/>
</Stack>
);
}
return <Typography variant="body2">-</Typography>;
},
},
{
header: "اطلاعات ثبت‌ شده در سامانه سوانح",
id: "fkInfo",
@@ -389,59 +442,6 @@ const SupervisorList = () => {
},
],
},
{
accessorKey: "status",
header: "وضعیت نظارت",
id: "status",
enableColumnFilter: true,
datatype: "numeric",
filterMode: "equals",
sortDescFirst: true,
grow: false,
size: 100,
columnSelectOption: () => {
return statusOptions.map((status) => ({
value: status.value,
label: status.label,
}));
},
Cell: ({ row }) => <>{row.original.status_fa}</>,
},
{
accessorKey: "supervisor_description",
header: "توضیح ناظر",
id: "supervisor_description",
enableColumnFilter: false,
datatype: "text",
filterMode: "equals",
sortDescFirst: false,
columnFilterModeOptions: ["equals", "contains"],
grow: false,
size: 100,
muiTableBodyCellProps: {
sx: {
borderLeft: "1px solid #e1e1e1",
py: 0,
"&:first-of-type": {
borderLeft: "unset",
},
},
},
Cell: ({ renderedCellValue }) => {
if (renderedCellValue) {
return (
<Stack alignItems={"center"} justifyContent={"center"}>
<DescriptionForm
description={renderedCellValue}
title={"توضیحات کارشناس"}
icon={ThreePIcon}
/>
</Stack>
);
}
return <Typography variant="body2">-</Typography>;
},
},
];
}, []);

View File

@@ -48,12 +48,9 @@ const MissionList = ({ setMission, setOpenDialog }) => {
Cell: ({ row }) => row.original.zone_fa,
},
{
accessorFn: (row) =>
row.type == 1
? moment(row.start_date).locale("fa").format("HH:mm | yyyy/MM/DD")
: moment(row.start_date).locale("fa").format("yyyy/MM/DD"),
header: "تاریخ شروع",
id: "start_date",
accessorFn: (row) => moment(row.start_time).locale("fa").format("HH:mm | yyyy/MM/DD"),
header: "تاریخ خروج",
id: "start_time",
enableColumnFilter: true,
datatype: "date",
filterMode: "between",
@@ -61,12 +58,9 @@ const MissionList = ({ setMission, setOpenDialog }) => {
size: 100,
},
{
accessorFn: (row) =>
row.type == 1
? moment(row.end_date).locale("fa").format("HH:mm | yyyy/MM/DD")
: moment(row.end_date).locale("fa").format("yyyy/MM/DD"),
header: "تاریخ پایان",
id: "end_date",
accessorFn: (row) => moment(row.finish_time).locale("fa").format("HH:mm | yyyy/MM/DD"),
header: "تاریخ ورود",
id: "finish_time",
enableColumnFilter: true,
datatype: "date",
filterMode: "between",

View File

@@ -12,8 +12,6 @@ import RowActions from "./RowActions";
import DescriptionForm from "./RowActions/DescriptionForm";
import ImageDialog from "./RowActions/ImageForm";
import LocationForm from "./RowActions/LocationForm";
import MachinesCodeDialog from "./RowActions/MachinesCodeForm";
import RahdaranDialog from "./RowActions/RahdaranForm";
import Toolbar from "./Toolbar";
const OperatorList = () => {
@@ -36,6 +34,17 @@ const OperatorList = () => {
size: 100,
Cell: ({ row }) => <BlinkingCell value={row.original.id} visible={row.original.status == 2} />,
},
{
accessorKey: "mission_id",
header: "کد یکتا ماموریت",
id: "mission_id",
enableColumnFilter: true,
datatype: "text",
filterMode: "equals",
columnFilterModeOptions: ["equals", "contains"],
grow: false,
size: 100,
},
{
header: "اطلاعات فعالیت",
id: "info",
@@ -129,8 +138,8 @@ const OperatorList = () => {
props.dependencyFieldValue.value === ""
? "empty"
: loadingSubItemsList
? "loading"
: props.filterParameters.value
? "loading"
: props.filterParameters.value
}
columnSelectOption={getColumnSelectOptions}
/>
@@ -309,7 +318,7 @@ const OperatorList = () => {
table_name={"roadItemsOperatorList"}
TableToolbar={Toolbar}
enableRowActions
positionActionsColumn={"last"}
positionActionsColumn={"first"}
RowActions={RowActions}
/>
</Box>

View File

@@ -10,6 +10,11 @@ const ContentInfoItem = ({ data }) => {
<Divider sx={{ flex: 1, mx: 2 }} />
<Typography sx={{ fontSize: "13px", fontWeight: 400 }}>{data.id !== "" && data.id}</Typography>
</Stack>
<Stack direction={"row"} alignItems={"center"}>
<Chip size="small" label="کد یکتا ماموریت" />
<Divider sx={{ flex: 1, mx: 2 }} />
<Typography sx={{ fontSize: "13px", fontWeight: 400 }}>{data.mission_id && data.mission_id}</Typography>
</Stack>
<Stack direction={"row"} alignItems={"center"}>
<Chip size="small" label="استان" />
<Divider sx={{ flex: 1, mx: 2 }} />

View File

@@ -78,6 +78,17 @@ const SupervisorList = () => {
size: 100,
Cell: ({ row }) => <BlinkingCell value={row.original.id} visible={row.original.status == 0} />,
},
{
accessorKey: "mission_id",
header: "کد یکتا ماموریت",
id: "mission_id",
enableColumnFilter: true,
datatype: "text",
filterMode: "equals",
columnFilterModeOptions: ["equals", "contains"],
grow: false,
size: 100,
},
...(hasCountryPermission ? [dynamicColumns] : []),
{
header: "اداره",
@@ -127,8 +138,8 @@ const SupervisorList = () => {
props.dependencyFieldValue?.value === ""
? "empty"
: loadingEdaratList
? "loading"
: props.filterParameters.value
? "loading"
: props.filterParameters.value
}
columnSelectOption={getColumnSelectOptions}
/>
@@ -227,8 +238,8 @@ const SupervisorList = () => {
props.dependencyFieldValue.value === ""
? "empty"
: loadingSubItemsList
? "loading"
: props.filterParameters.value
? "loading"
: props.filterParameters.value
}
columnSelectOption={getColumnSelectOptions}
/>
@@ -325,7 +336,7 @@ const SupervisorList = () => {
filterMode: "between",
grow: false,
size: 100,
},
}
],
},
{
@@ -373,7 +384,7 @@ const SupervisorList = () => {
table_name={"roadItemsSupervisorList"}
TableToolbar={Toolbar}
enableRowActions
positionActionsColumn={"last"}
positionActionsColumn={"first"}
RowActions={RowActions}
/>
</Box>

View File

@@ -1,5 +1,5 @@
import { Done } from "@mui/icons-material";
import { IconButton, Tooltip } from "@mui/material";
import { Button, IconButton, Tooltip } from "@mui/material";
const Allocate = ({ row, setMachine, setOpenMachinesDialog }) => {
const handleClick = () => {
@@ -9,11 +9,9 @@ const Allocate = ({ row, setMachine, setOpenMachinesDialog }) => {
return (
<>
<Tooltip title="تخصیص" arrow placement="right">
<IconButton color="primary" sx={{ textTransform: "unset", alignSelf: "center" }} onClick={handleClick}>
<Done />
</IconButton>
</Tooltip>
<Button startIcon={<Done />} color="primary" sx={{ textTransform: "unset", alignSelf: "center" }} onClick={handleClick}>
تخصیص
</Button>
</>
);
};

View File

@@ -1,14 +1,12 @@
"use client";
import { useMemo } from "react";
import { Box, Stack, Typography } from "@mui/material";
import DataTableWithAuth from "@/core/components/DataTableWithAuth";
import Toolbar from "./Toolbar";
import { GET_ROAD_PATROL_OPERATOR_LIST } from "@/core/utils/routes";
import { Box, Stack } from "@mui/material";
import moment from "jalali-moment";
import { useMemo } from "react";
import RowActions from "./RowActions";
import ReportForm from "./RowActions/ReportForm";
import RahdaranDialog from "./RowActions/RahdaranForm";
import MachinePerformanceForm from "./RowActions/MachinePerformanceForm";
import Toolbar from "./Toolbar";
const OperatorList = () => {
const columns = useMemo(
@@ -25,59 +23,15 @@ const OperatorList = () => {
size: 100,
},
{
header: "عملکرد خودرو", // Car ID
accessorKey: "mission_id",
header: "کد یکتا ماموریت",
id: "mission_id",
enableColumnFilter: true,
id: "cmmsMachines__machine_code",
datatype: "text",
filterMode: "contains",
columnFilterModeOptions: ["equals", "contains"],
enableSorting: false,
grow: false,
size: 100,
muiTableBodyCellProps: {
sx: {
borderLeft: "1px solid #e1e1e1",
py: 0,
"&:first-of-type": {
borderLeft: "unset",
},
},
},
Cell: ({ renderedCellValue, row }) => {
return (
<Stack alignItems={"center"} justifyContent={"center"}>
<MachinePerformanceForm row={row} />
</Stack>
);
},
},
{
accessorKey: "rahdaran",
header: "راهداران",
id: "rahdaran__code",
enableColumnFilter: true,
enableSorting: false,
datatype: "text",
filterMode: "contains",
filterMode: "equals",
columnFilterModeOptions: ["equals", "contains"],
grow: false,
size: 100,
muiTableBodyCellProps: {
sx: {
borderLeft: "1px solid #e1e1e1",
py: 0,
"&:first-of-type": {
borderLeft: "unset",
},
},
},
Cell: ({ renderedCellValue, row }) => {
return (
<Stack alignItems={"center"} justifyContent={"center"}>
<RahdaranDialog rowId={row.original.id} />
</Stack>
);
},
},
{
accessorFn: (row) => moment(row.start_time).locale("fa").format("HH:mm | yyyy/MM/DD"),
@@ -148,7 +102,7 @@ const OperatorList = () => {
table_name={"roadPatrolOperatorList"}
TableToolbar={Toolbar}
enableRowActions
positionActionsColumn={"last"}
positionActionsColumn={"first"}
RowActions={RowActions}
/>
</Box>

View File

@@ -1,20 +1,18 @@
"use client";
import { useEffect, useMemo, useState } from "react";
import { Box, Stack, Typography } from "@mui/material";
import DataTableWithAuth from "@/core/components/DataTableWithAuth";
import Toolbar from "./Toolbar";
import { GET_ROAD_PATROL_SUPERVISOR_LIST } from "@/core/utils/routes";
import moment from "jalali-moment";
import RowActions from "./RowActions";
import useProvinces from "@/lib/hooks/useProvince";
import CustomSelectByDependency from "@/core/components/DataTable/filter/fieldsType/CustomSelectByDependency";
import DataTableWithAuth from "@/core/components/DataTableWithAuth";
import { GET_ROAD_PATROL_SUPERVISOR_LIST } from "@/core/utils/routes";
import { useAuth } from "@/lib/contexts/auth";
import useEdaratLists from "@/lib/hooks/useEdaratLists";
import { usePermissions } from "@/lib/hooks/usePermissions";
import useProvinces from "@/lib/hooks/useProvince";
import { Box, Stack } from "@mui/material";
import moment from "jalali-moment";
import { useEffect, useMemo, useState } from "react";
import RowActions from "./RowActions";
import OfficerDescriptionForm from "./RowActions/OfficerDescription";
import ReportForm from "./RowActions/ReportForm";
import RahdaranDialog from "./RowActions/RahdaranForm";
import { usePermissions } from "@/lib/hooks/usePermissions";
import { useAuth } from "@/lib/contexts/auth";
import MachinePerformanceForm from "./RowActions/MachinePerformanceForm";
import Toolbar from "./Toolbar";
const SupervisorList = () => {
const { data: userPermissions } = usePermissions();
@@ -69,6 +67,17 @@ const SupervisorList = () => {
grow: false,
size: 100,
},
{
accessorKey: "mission_id",
header: "کد یکتا ماموریت",
id: "mission_id",
enableColumnFilter: true,
datatype: "text",
filterMode: "equals",
columnFilterModeOptions: ["equals", "contains"],
grow: false,
size: 100,
},
...(hasCountryPermission ? [dynamicColumns] : []),
{
accessorKey: "edare_id",
@@ -119,8 +128,8 @@ const SupervisorList = () => {
props.dependencyFieldValue?.value === ""
? "empty"
: loadingEdaratList
? "loading"
: props.filterParameters.value
? "loading"
: props.filterParameters.value
}
columnSelectOption={getColumnSelectOptions}
/>
@@ -128,60 +137,6 @@ const SupervisorList = () => {
},
Cell: ({ renderedCellValue, row }) => <>{row.original.edare_name}</>,
},
{
header: "عملکرد خودرو",
enableColumnFilter: true,
id: "cmmsMachines__machine_code",
datatype: "text",
filterMode: "contains",
columnFilterModeOptions: ["equals", "contains"],
enableSorting: false,
grow: false,
size: 100,
muiTableBodyCellProps: {
sx: {
borderLeft: "1px solid #e1e1e1",
py: 0,
"&:first-of-type": {
borderLeft: "unset",
},
},
},
Cell: ({ row }) => (
<Stack alignItems={"center"} justifyContent={"center"}>
<MachinePerformanceForm row={row} />
</Stack>
),
},
{
accessorKey: "rahdaran",
header: "راهداران",
id: "rahdaran__code",
enableColumnFilter: true,
enableSorting: false,
datatype: "text",
filterMode: "contains",
columnFilterModeOptions: ["equals", "contains"],
grow: false,
size: 100,
muiTableBodyCellProps: {
sx: {
borderLeft: "1px solid #e1e1e1",
py: 0,
"&:first-of-type": {
borderLeft: "unset",
},
},
},
Cell: ({ renderedCellValue }) =>
renderedCellValue ? (
<Stack alignItems={"center"} justifyContent={"center"}>
<RahdaranDialog rahdarLists={renderedCellValue} />
</Stack>
) : (
<Typography variant="body2">-</Typography>
),
},
{
accessorFn: (row) => moment(row.start_time).locale("fa").format("HH:mm | yyyy/MM/DD"),
header: "تاریخ شروع",
@@ -271,7 +226,7 @@ const SupervisorList = () => {
table_name={"roadPatrolSupervisorList"}
TableToolbar={Toolbar}
enableRowActions
positionActionsColumn={"last"}
positionActionsColumn={"first"}
RowActions={RowActions}
/>
</Box>

View File

@@ -150,7 +150,7 @@ export const pageMenu = [
id: "roadItemManagmentSupervisorCartable",
label: "کارتابل",
type: "page",
route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_items/supervisor/cartable",
route: "/dashboard/road-items/supervisor",
permissions: [
"show-road-item-supervise-cartable",
"show-road-item-supervise-cartable-province",
@@ -166,18 +166,11 @@ export const pageMenu = [
hasSubitems: true,
badges: [{ key: "roadItem.operation_cnt" }],
Subitems: [
{
id: "roadItemManagmentOparationCreate",
label: "ثبت فعالیت",
type: "page",
route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_items/operator/create",
permissions: ["create-road-item"],
},
{
id: "roadItemManagmentOparationCartable",
label: "کارتابل",
type: "page",
route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_items/operator/cartable",
route: "/dashboard/road-items/operator",
permissions: ["create-road-item"],
},
],
@@ -186,7 +179,7 @@ export const pageMenu = [
id: "roadItemManagmentMap",
label: "پراکندگی بر روی نقشه",
type: "page",
route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=road_items",
route: "/dashboard/road-items/reports/map",
icon: <MapIcon sx={{ width: "inherit", height: "inherit" }} />,
permissions: [
"show-road-item-supervise-cartable",
@@ -197,13 +190,32 @@ export const pageMenu = [
{
id: "roadItemManagmentReport",
label: "گزارش ها",
type: "page",
route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_items/report",
icon: <ReportIcon sx={{ width: "inherit", height: "inherit" }} />,
permissions: [
"show-road-item-supervise-cartable",
"show-road-item-supervise-cartable-province",
"create-road-item",
type: "menu",
icon: <AssessmentIcon sx={{ width: "inherit", height: "inherit" }} />,
hasSubitems: true,
Subitems: [
{
id: "roadItemManagmentReportProvince",
label: "تعداد فعالیت ها به تفکیک آیتم",
type: "page",
route: "/dashboard/road-items/reports/items-report",
permissions: [
"show-road-item-supervise-cartable",
"show-road-item-supervise-cartable-province",
"create-road-item",
],
},
{
id: "roadItemManagmentReportItems",
label: "تعداد و حجم فعالیت ها به تفکیک موارد اقدام شده",
type: "page",
route: "/dashboard/road-items/reports/sub-items-report",
permissions: [
"show-road-item-supervise-cartable",
"show-road-item-supervise-cartable-province",
"create-road-item",
],
},
],
},
],
@@ -226,7 +238,7 @@ export const pageMenu = [
id: "roadPatrolManagmentSupervisorCartable",
label: "کارتابل",
type: "page",
route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_patrols/supervisor/cartable",
route: "/dashboard/road-patrols/supervisor",
permissions: [
"show-road-patrol-supervise-cartable",
"show-road-patrol-supervise-cartable-province",
@@ -241,18 +253,11 @@ export const pageMenu = [
icon: <EngineeringIcon sx={{ width: "inherit", height: "inherit" }} />,
hasSubitems: true,
Subitems: [
{
id: "roadPatrolManagmentOparationCreate",
label: "ثبت اقدام",
type: "page",
route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_patrols/operator/create",
permissions: ["add-road-patrol"],
},
{
id: "roadPatrolManagmentOparationCartable",
label: "کارتابل",
type: "page",
route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_patrols/operator/cartable",
route: "/dashboard/road-patrols/operator",
permissions: ["add-road-patrol"],
},
],
@@ -273,8 +278,8 @@ export const pageMenu = [
id: "roadPatrolManagmentReport",
label: "گزارش ها",
type: "page",
route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_patrols/report",
icon: <ReportIcon sx={{ width: "inherit", height: "inherit" }} />,
route: "/dashboard/road-patrols/reports",
icon: <AssessmentIcon sx={{ width: "inherit", height: "inherit" }} />,
permissions: [
"add-road-patrol",
"show-road-patrol-supervise-cartable",