(
+
+
+
+ )}
+ />
+ );
+};
+export default FastReactCode;
diff --git a/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/GetItemInfo/index.jsx b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/GetItemInfo/index.jsx
new file mode 100644
index 0000000..3b3b513
--- /dev/null
+++ b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/GetItemInfo/index.jsx
@@ -0,0 +1,153 @@
+import PersianTextField from "@/core/components/PersianTextField";
+import SelectBox from "@/core/components/SelectBox";
+import StyledForm from "@/core/components/StyledForm";
+import { missionCategoryTypes } from "@/core/utils/missionCategoryTypes";
+import { missionRegions } from "@/core/utils/missionRegions";
+import { yupResolver } from "@hookform/resolvers/yup";
+import { ExitToApp } from "@mui/icons-material";
+import { Box, Button, DialogActions, DialogContent, Grid, Stack } from "@mui/material";
+import { Controller, useForm } from "react-hook-form";
+import { object, string } from "yup";
+import FastReactCode from "./FastReactCode";
+
+const validationSchema = object({
+ explanation: string().required("موضوع را مشخص کنید!"),
+ end_point: string().required("مقصد را مشخص کنید!"),
+ region: string().required("محور ماموریت را مشخص کنید!"),
+ category_id: string().required("نوع ماموریت را مشخص کنید!"),
+ road_observed_id: string().when("category_id", {
+ is: "3",
+ then: (schema) => schema.required("کد یکتا شکایت را مشخص کنید!"),
+ otherwise: (schema) => schema.notRequired(),
+ }),
+});
+
+const GetItemInfo = ({ allData, setAllData, handlePrev, setTabState }) => {
+ const defaultValues = {
+ explanation: allData.explanation,
+ end_point: allData.end_point,
+ region: allData.region,
+ category_id: allData.category_id,
+ road_observed_id: allData.road_observed_id,
+ };
+
+ const { control, handleSubmit } = useForm({
+ defaultValues,
+ resolver: yupResolver(validationSchema),
+ mode: "all",
+ });
+
+ const handleNext = (data) => {
+ setAllData(data);
+ setTabState((s) => s + 1);
+ };
+
+ return (
+
+
+
+
+
+
+ (
+
+ )}
+ />
+
+
+ (
+
+ )}
+ />
+
+
+ (
+
+ )}
+ />
+
+
+
+
+
+ {
+ return (
+
+ );
+ }}
+ />
+
+
+
+
+
+
+ }
+ >
+ {"بستن"}
+
+
+
+
+ );
+};
+export default GetItemInfo;
diff --git a/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/DriversDialog/DriversSearch/Form/index.jsx b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/DriversDialog/DriversSearch/Form/index.jsx
new file mode 100644
index 0000000..93bb1d6
--- /dev/null
+++ b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/DriversDialog/DriversSearch/Form/index.jsx
@@ -0,0 +1,61 @@
+import RahdarNameOrCode from "@/core/components/RahdarNameOrCode";
+import StyledForm from "@/core/components/StyledForm";
+import { yupResolver } from "@hookform/resolvers/yup";
+import { Done } from "@mui/icons-material";
+import { Button, Stack } from "@mui/material";
+import { Controller, useForm } from "react-hook-form";
+import { object } from "yup";
+
+const schema = object().shape({
+ rahdar: object().required("همراه الزامی است."),
+});
+const DriverForm = ({ setDriver, setOpenDriversDialog }) => {
+ const defaultValues = {
+ rahdar: null,
+ };
+
+ const {
+ control,
+ handleSubmit,
+ formState: { isSubmitting, isValid },
+ } = useForm({ defaultValues, resolver: yupResolver(schema), mode: "all" });
+
+ const submit = (data) => {
+ setDriver(data.rahdar);
+ setOpenDriversDialog(false);
+ };
+
+ return (
+
+
+
+ {
+ return (
+ field.onChange(value)}
+ error={error}
+ multiple={false}
+ />
+ );
+ }}
+ name={"rahdar"}
+ />
+
+ }
+ >
+ انتخاب
+
+
+
+ );
+};
+export default DriverForm;
diff --git a/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/DriversDialog/DriversSearch/index.jsx b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/DriversDialog/DriversSearch/index.jsx
new file mode 100644
index 0000000..b7136c9
--- /dev/null
+++ b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/DriversDialog/DriversSearch/index.jsx
@@ -0,0 +1,11 @@
+import { DialogContent } from "@mui/material";
+import DriverForm from "./Form";
+
+const DriversSearch = ({ setDriver, setOpenDriversDialog }) => {
+ return (
+
+
+
+ );
+};
+export default DriversSearch;
diff --git a/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/DriversDialog/index.jsx b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/DriversDialog/index.jsx
new file mode 100644
index 0000000..3c1d406
--- /dev/null
+++ b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/DriversDialog/index.jsx
@@ -0,0 +1,41 @@
+import { Close, Edit } from "@mui/icons-material";
+import { Button, Dialog, DialogTitle, IconButton } from "@mui/material";
+import { useState } from "react";
+import DriversSearch from "./DriversSearch";
+
+const DriversDialog = ({ setDriver, mode }) => {
+ const [openDriversDialog, setOpenDriversDialog] = useState(false);
+ return (
+ <>
+ {mode == "edit" ? (
+ setOpenDriversDialog(true)} size="small">
+
+
+ ) : (
+
+ )}
+
+ >
+ );
+};
+export default DriversDialog;
diff --git a/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/MachinesDialog/MachineList/RowActions/Allocate/index.jsx b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/MachinesDialog/MachineList/RowActions/Allocate/index.jsx
new file mode 100644
index 0000000..f03579a
--- /dev/null
+++ b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/MachinesDialog/MachineList/RowActions/Allocate/index.jsx
@@ -0,0 +1,20 @@
+import { Done } from "@mui/icons-material";
+import { IconButton, Tooltip } from "@mui/material";
+
+const Allocate = ({ row, setMachine, setOpenMachinesDialog }) => {
+ const handleClick = () => {
+ setMachine(row.original);
+ setOpenMachinesDialog(false);
+ };
+
+ return (
+ <>
+
+
+
+
+
+ >
+ );
+};
+export default Allocate;
diff --git a/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/MachinesDialog/MachineList/RowActions/index.jsx b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/MachinesDialog/MachineList/RowActions/index.jsx
new file mode 100644
index 0000000..bcfcc03
--- /dev/null
+++ b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/MachinesDialog/MachineList/RowActions/index.jsx
@@ -0,0 +1,6 @@
+import Allocate from "./Allocate";
+
+const RowActions = ({ row, setMachine, setOpenMachinesDialog }) => {
+ return ;
+};
+export default RowActions;
diff --git a/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/MachinesDialog/MachineList/index.jsx b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/MachinesDialog/MachineList/index.jsx
new file mode 100644
index 0000000..e070b01
--- /dev/null
+++ b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/MachinesDialog/MachineList/index.jsx
@@ -0,0 +1,68 @@
+import DataTableWithAuth from "@/core/components/DataTableWithAuth";
+import { Box } from "@mui/material";
+import { useMemo } from "react";
+import RowActions from "./RowActions";
+import { GET_MACHINES_TABLE_LIST } from "@/core/utils/routes";
+
+const MachinesList = ({ machineType, setMachine, setOpenMachinesDialog }) => {
+ const columns = useMemo(
+ () => [
+ {
+ accessorKey: "machine_code",
+ header: "کد خودرو",
+ id: "machine_code",
+ enableColumnFilter: true,
+ datatype: "text",
+ filterMode: "equals",
+ columnFilterModeOptions: ["equals", "contains"],
+ grow: false,
+ size: 100,
+ },
+ {
+ accessorKey: "car_name",
+ header: "نام خودرو",
+ id: "car_name",
+ enableColumnFilter: true,
+ datatype: "text",
+ filterMode: "equals",
+ columnFilterModeOptions: ["equals", "contains"],
+ grow: false,
+ size: 100,
+ },
+ {
+ accessorKey: "car_type",
+ header: "نوع خودرو",
+ id: "car_type",
+ enableColumnFilter: false,
+ datatype: "text",
+ filterMode: "equals",
+ columnFilterModeOptions: ["equals", "contains"],
+ grow: false,
+ size: 100,
+ },
+ ],
+ []
+ );
+
+ return (
+ <>
+
+ (
+
+ )}
+ />
+
+ >
+ );
+};
+export default MachinesList;
diff --git a/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/MachinesDialog/index.jsx b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/MachinesDialog/index.jsx
new file mode 100644
index 0000000..8750142
--- /dev/null
+++ b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/MachinesDialog/index.jsx
@@ -0,0 +1,40 @@
+import { Close, Edit } from "@mui/icons-material";
+import { Button, Dialog, IconButton } from "@mui/material";
+import { useState } from "react";
+import MachinesList from "./MachineList";
+
+const MachinesDialog = ({ setMachine, mode }) => {
+ const [openMachinesDialog, setOpenMachinesDialog] = useState(false);
+ return (
+ <>
+ {mode == "edit" ? (
+ setOpenMachinesDialog(true)} size="small">
+
+
+ ) : (
+
+ )}
+
+ >
+ );
+};
+export default MachinesDialog;
diff --git a/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/index.jsx b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/index.jsx
new file mode 100644
index 0000000..24bfb15
--- /dev/null
+++ b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/MachineAndDriver/index.jsx
@@ -0,0 +1,77 @@
+import { Box, Button, Chip, DialogActions, DialogContent, Divider, Stack, Typography } from "@mui/material";
+import DriversDialog from "./DriversDialog";
+import { useState } from "react";
+import MachinesDialog from "./MachinesDialog";
+
+const MachineAndDriver = ({ setTabState, allData, setAllData, handlePrev }) => {
+ const [machine, setMachine] = useState(allData.machine);
+ const [driver, setDriver] = useState(allData.driver);
+
+ const handleNext = (data) => {
+ setAllData(data);
+ setTabState((s) => s + 1);
+ };
+
+ return (
+ <>
+
+
+
+
+ {machine ? (
+ <>
+ خودرو
+
+
+
+
+ >
+ ) : (
+
+ )}
+
+ {machine && (
+
+ {driver ? (
+ <>
+ راننده
+
+
+
+
+ >
+ ) : (
+
+ )}
+
+ )}
+
+
+
+
+
+
+
+ >
+ );
+};
+export default MachineAndDriver;
diff --git a/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/Rahdaran/Form/index.jsx b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/Rahdaran/Form/index.jsx
new file mode 100644
index 0000000..a4449fe
--- /dev/null
+++ b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/Rahdaran/Form/index.jsx
@@ -0,0 +1,66 @@
+import RahdarNameOrCode from "@/core/components/RahdarNameOrCode";
+import StyledForm from "@/core/components/StyledForm";
+import { yupResolver } from "@hookform/resolvers/yup";
+import { Add } from "@mui/icons-material";
+import { Button, Stack } from "@mui/material";
+import { Controller, useForm } from "react-hook-form";
+import { object } from "yup";
+
+const schema = object().shape({
+ rahdar: object().required("همراه الزامی است."),
+});
+const RahdaranForm = ({ setRahdaran }) => {
+ const defaultValues = {
+ rahdar: null,
+ };
+
+ const {
+ control,
+ handleSubmit,
+ reset,
+ formState: { isSubmitting, isValid },
+ } = useForm({ defaultValues, resolver: yupResolver(schema), mode: "all" });
+
+ const submit = (data) => {
+ setRahdaran((prev) => {
+ const alreadyExists = prev.some((r) => r.id === data.rahdar.id);
+ if (alreadyExists) return prev;
+ return [...prev, data.rahdar];
+ });
+ reset();
+ };
+
+ return (
+
+
+
+ {
+ return (
+ field.onChange(value)}
+ error={error}
+ multiple={false}
+ />
+ );
+ }}
+ name={"rahdar"}
+ />
+
+ }
+ >
+ افزودن همراه
+
+
+
+ );
+};
+export default RahdaranForm;
diff --git a/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/Rahdaran/List/index.jsx b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/Rahdaran/List/index.jsx
new file mode 100644
index 0000000..ebc4edc
--- /dev/null
+++ b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/Rahdaran/List/index.jsx
@@ -0,0 +1,56 @@
+import { AccountCircle, Delete } from "@mui/icons-material";
+import { Card, Collapse, IconButton, Stack, Typography } from "@mui/material";
+import { TransitionGroup } from "react-transition-group";
+
+const RahdaranList = ({ rahdaran, setRahdaran }) => {
+ const handleRemove = (index) => {
+ setRahdaran((prev) => prev.filter((_, i) => i !== index));
+ };
+
+ return (
+
+
+ {rahdaran.map((rahdar, index) => (
+
+
+
+
+
+
+ نام و نام خانوادگی:
+ {rahdar.name}
+
+
+ کدملی:
+ {rahdar.code}
+
+
+
+ handleRemove(index)}>
+
+
+
+
+ ))}
+ {rahdaran.length == 0 && (
+
+ همراهی ثبت نشده است
+
+ )}
+
+
+ );
+};
+export default RahdaranList;
diff --git a/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/Rahdaran/index.jsx b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/Rahdaran/index.jsx
new file mode 100644
index 0000000..af01fe6
--- /dev/null
+++ b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/Rahdaran/index.jsx
@@ -0,0 +1,36 @@
+import { Box, Button, Chip, DialogActions, DialogContent, Divider } from "@mui/material";
+import { useCallback, useState } from "react";
+import RahdaranForm from "./Form";
+import RahdaranList from "./List";
+
+const Rahdaran = ({ allData, setAllData, setTabState, handlePrev }) => {
+ const [rahdaran, setRahdaran] = useState(allData.rahdaran);
+
+ const handleNext = useCallback(() => {
+ setAllData({ rahdaran: rahdaran });
+ setTabState((s) => s + 1);
+ }, [rahdaran]);
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ >
+ );
+};
+export default Rahdaran;
diff --git a/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/Verify/index.jsx b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/Verify/index.jsx
new file mode 100644
index 0000000..0393018
--- /dev/null
+++ b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/Verify/index.jsx
@@ -0,0 +1,130 @@
+import MapLoading from "@/core/components/MapLayer/Loading";
+import { missionCategoryTypes } from "@/core/utils/missionCategoryTypes";
+import { missionRegions } from "@/core/utils/missionRegions";
+import { Box, Button, Chip, DialogActions, DialogContent, Divider, Stack, Typography } from "@mui/material";
+import moment from "jalali-moment";
+import dynamic from "next/dynamic";
+import { useCallback } from "react";
+import ShowBound from "../../../showBound";
+const MapLayer = dynamic(() => import("@/core/components/MapLayer"), {
+ loading: () => ,
+ ssr: false,
+});
+
+const Verify = ({ allData, handlePrev, submitForm, submitting }) => {
+ const handleNext = useCallback(() => {
+ submitForm(allData);
+ }, [allData]);
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ موضوع ماموریت
+
+
+
+
+ محدوده
+
+ r.id == allData.region).name_fa} />
+
+
+ نوع ماموریت
+
+ t.id == allData.category_id).name_fa}
+ />
+
+ {allData.category_id == 3 && (
+
+ کد شکایت
+
+
+
+ )}
+
+ مقصد
+
+
+
+
+ تاریخ شروع ماموریت
+
+
+
+
+ تاریخ پایان ماموریت
+
+
+
+
+
+
+
+
+
+ خودرو
+
+
+
+
+ راننده
+
+
+
+
+
+
+
+
+ {allData.rahdaran.length != 0 ? (
+ allData.rahdaran.map((rahdar) => (
+
+ {rahdar.name}
+
+
+
+ ))
+ ) : (
+
+ همراهی ثبت نشده است
+
+ )}
+
+
+
+
+
+
+
+
+ >
+ );
+};
+export default Verify;
diff --git a/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/index.jsx b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/index.jsx
new file mode 100644
index 0000000..00f9ef1
--- /dev/null
+++ b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/Form/index.jsx
@@ -0,0 +1,125 @@
+import { AccessTime, Engineering, InsertDriveFile, LocalShipping, Route, Verified } from "@mui/icons-material";
+import { Box, Tab, Tabs } from "@mui/material";
+import { useReducer, useState } from "react";
+import Area from "./Area";
+import GetDateTime from "./GetDateTime";
+import GetItemInfo from "./GetItemInfo";
+import Rahdaran from "./Rahdaran";
+import Verify from "./Verify";
+import MachineAndDriver from "./MachineAndDriver";
+
+function TabPanel(props) {
+ const { children, value, index } = props;
+ return (
+
+ {value === index && {children}}
+
+ );
+}
+
+const reducer = (state, action) => {
+ switch (action.type) {
+ case "changeData":
+ return { ...state, ...action.data };
+ default:
+ return state;
+ }
+};
+
+const CreateForm = ({ defaultValues, submitForm, setOpen, submitting }) => {
+ const [allData, dispatch] = useReducer(reducer, defaultValues);
+ const [tabState, setTabState] = useState(0);
+ const handleClose = () => {
+ setOpen(false);
+ };
+ const handleChangeTab = (event, newValue) => {
+ setTabState(newValue);
+ };
+
+ const handlePrev = () => {
+ if (tabState === 0) {
+ handleClose();
+ } else {
+ setTabState((t) => t - 1);
+ }
+ };
+
+ return (
+ <>
+
+ } label="مشخصات" />
+ } label="زمانبندی" />
+ } label="منطقه عملیاتی" />
+ } label="خودرو و راننده" />
+ } label="همراهان" />
+ } label="بررسی نهایی" />
+
+
+ {
+ dispatch({ type: "changeData", data });
+ }}
+ handlePrev={handlePrev}
+ setTabState={setTabState}
+ />
+
+
+ {
+ dispatch({ type: "changeData", data });
+ }}
+ handlePrev={handlePrev}
+ setTabState={setTabState}
+ />
+
+
+ {
+ dispatch({ type: "changeData", data });
+ }}
+ handlePrev={handlePrev}
+ setTabState={setTabState}
+ />
+
+
+ {
+ dispatch({ type: "changeData", data });
+ }}
+ handlePrev={handlePrev}
+ setTabState={setTabState}
+ />
+
+
+ {
+ dispatch({ type: "changeData", data });
+ }}
+ handlePrev={handlePrev}
+ setTabState={setTabState}
+ />
+
+
+
+
+ >
+ );
+};
+export default CreateForm;
diff --git a/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/index.jsx b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/index.jsx
new file mode 100644
index 0000000..2e3cb75
--- /dev/null
+++ b/src/components/dashboard/roadMissions/violations/Actions/CreateWithoutProcess/index.jsx
@@ -0,0 +1,119 @@
+import { REQUEST_MISSION_WITHOUT_PROCESS } from "@/core/utils/routes";
+import useRequest from "@/lib/hooks/useRequest";
+import { AddCircle, AddCircleOutline, Close } from "@mui/icons-material";
+import { Button, Dialog, IconButton, useMediaQuery, useTheme } from "@mui/material";
+import moment from "jalali-moment";
+import { useState } from "react";
+import CreateForm from "./Form";
+
+const CreateWithoutProcess = ({ mutate }) => {
+ const [submitting, setSubmitting] = useState(false);
+ const requestServer = useRequest({ notificationSuccess: true });
+ const theme = useTheme();
+ const isMobile = useMediaQuery(theme.breakpoints.down("sm"));
+ const [open, setOpen] = useState(false);
+
+ const handleOpen = () => {
+ setOpen(true);
+ };
+
+ const submitForm = async (result) => {
+ setSubmitting(true);
+ const bound = result.bound.getLatLngs();
+ let area =
+ result.bound_type == "polygon"
+ ? bound.map((ring) => ring.map((latlng) => [latlng.lat, latlng.lng]))[0]
+ : bound.map((latlng) => [latlng.lat, latlng.lng]);
+
+ await requestServer(REQUEST_MISSION_WITHOUT_PROCESS, "post", {
+ data: {
+ explanation: result.explanation,
+ category_id: result.category_id,
+ ...(result.category_id == 3
+ ? {
+ road_observed_id: result.road_observed_id,
+ }
+ : {}),
+ area: {
+ type: result.bound_type,
+ coordinates: area,
+ },
+ ...(result.rahdaran.length != 0 ? { rahdaran: result.rahdaran.map((r) => r.id) } : {}),
+ zone: result.region,
+ end_point: result.end_point,
+ start_date: `${result.start_date} ${moment(result.start_time).format("HH:mm")}`,
+ end_date: `${result.end_date} ${moment(result.end_time).format("HH:mm")}`,
+ machines: [result.machine.id],
+ driver: result.driver.id,
+ },
+ hasSidebarUpdate: true,
+ })
+ .then((response) => {
+ mutate();
+ setOpen(false);
+ })
+ .catch((error) => {})
+ .finally(() => {
+ setSubmitting(false);
+ });
+ };
+
+ return (
+ <>
+ {isMobile ? (
+
+
+
+ ) : (
+ }
+ onClick={handleOpen}
+ >
+ تصحیح ماموریت
+
+ )}
+
+ >
+ );
+};
+export default CreateWithoutProcess;
diff --git a/src/components/dashboard/roadMissions/violations/RowActions/index.jsx b/src/components/dashboard/roadMissions/violations/RowActions/index.jsx
new file mode 100644
index 0000000..192bfe1
--- /dev/null
+++ b/src/components/dashboard/roadMissions/violations/RowActions/index.jsx
@@ -0,0 +1,4 @@
+const RowActions = ({ row, mutate }) => {
+ return <>>;
+};
+export default RowActions;
diff --git a/src/components/dashboard/roadMissions/violations/ViolationsList.jsx b/src/components/dashboard/roadMissions/violations/ViolationsList.jsx
new file mode 100644
index 0000000..49223c2
--- /dev/null
+++ b/src/components/dashboard/roadMissions/violations/ViolationsList.jsx
@@ -0,0 +1,83 @@
+"use client";
+import DataTableWithAuth from "@/core/components/DataTableWithAuth";
+import { GET_ROAD_MISSIONS_VIOLATIONS_LIST } from "@/core/utils/routes";
+import { Box } from "@mui/material";
+import moment from "jalali-moment";
+import { useMemo } from "react";
+import RowActions from "./RowActions";
+
+const ViolationsList = () => {
+ const columns = useMemo(
+ () => [
+ {
+ accessorKey: "id",
+ header: "کد یکتا",
+ id: "id",
+ enableColumnFilter: true,
+ datatype: "text",
+ filterMode: "equals",
+ columnFilterModeOptions: ["equals", "contains"],
+ grow: false,
+ },
+ {
+ accessorKey: "type",
+ header: "نوع تخلف",
+ id: "type",
+ enableColumnFilter: true,
+ datatype: "numeric",
+ filterMode: "equals",
+ sortDescFirst: true,
+ grow: false,
+ Cell: ({ row }) => (row.original.type === 1 ? "خروج بدون مجوز" : "عدم تحرک"),
+ },
+ {
+ accessorKey: "machine_code",
+ header: "خودرو",
+ id: "machine_code",
+ datatype: "text",
+ columnFilterModeOptions: ["equals", "contains"],
+ grow: false,
+ },
+ {
+ accessorKey: "mission_id",
+ header: "کد ماموریت",
+ id: "mission_id",
+ enableColumnFilter: false,
+ datatype: "numeric",
+ filterMode: "equals",
+ grow: false,
+ Cell: ({ row }) => row.original.mission_id || "-",
+ },
+ {
+ accessorKey: "request_date",
+ header: "تاریخ تخلف",
+ id: "request_date",
+ enableColumnFilter: true,
+ datatype: "date",
+ filterMode: "between",
+ grow: false,
+ Cell: ({ row }) => moment(row.original.request_date).locale("fa").format("YYYY/MM/DD"),
+ },
+ ],
+ []
+ );
+
+ return (
+ <>
+
+
+
+ >
+ );
+};
+export default ViolationsList;
diff --git a/src/components/dashboard/roadMissions/violations/index.jsx b/src/components/dashboard/roadMissions/violations/index.jsx
new file mode 100644
index 0000000..ace0981
--- /dev/null
+++ b/src/components/dashboard/roadMissions/violations/index.jsx
@@ -0,0 +1,14 @@
+"use client";
+import PageTitle from "@/core/components/PageTitle";
+import { Stack } from "@mui/material";
+import ViolationsList from "./ViolationsList";
+
+const ViolationsPage = () => {
+ return (
+
+
+
+
+ );
+};
+export default ViolationsPage;
diff --git a/src/core/utils/pageMenu.js b/src/core/utils/pageMenu.js
index 0c9bfd3..f812b52 100644
--- a/src/core/utils/pageMenu.js
+++ b/src/core/utils/pageMenu.js
@@ -1,30 +1,34 @@
-import SpaceDashboardIcon from "@mui/icons-material/SpaceDashboard";
-import GroupsIcon from "@mui/icons-material/Groups";
import AccountTreeIcon from "@mui/icons-material/AccountTree";
-import FactCheckIcon from "@mui/icons-material/FactCheck";
-import FireTruckIcon from "@mui/icons-material/FireTruck";
-import RouteIcon from "@mui/icons-material/Route";
-import DoorbellIcon from "@mui/icons-material/Doorbell";
-import ElectricBoltIcon from "@mui/icons-material/ElectricBolt";
-import CottageIcon from "@mui/icons-material/Cottage";
-import GppMaybeIcon from "@mui/icons-material/GppMaybe";
-import GavelIcon from "@mui/icons-material/Gavel";
-import BallotIcon from "@mui/icons-material/Ballot";
-import AssistantIcon from "@mui/icons-material/Assistant";
import AdminPanelSettingsIcon from "@mui/icons-material/AdminPanelSettings";
-import MapIcon from "@mui/icons-material/Map";
-import SpeedIcon from "@mui/icons-material/Speed";
-import EngineeringIcon from "@mui/icons-material/Engineering";
-import ReportIcon from "@mui/icons-material/Report";
import AssessmentIcon from "@mui/icons-material/Assessment";
import AssignmentLateIcon from "@mui/icons-material/AssignmentLate";
-import LockPersonIcon from "@mui/icons-material/LockPerson";
-import LineAxisIcon from "@mui/icons-material/LineAxis";
-import ScienceIcon from "@mui/icons-material/Science";
-import HandymanIcon from "@mui/icons-material/Handyman";
-import DriveEtaIcon from "@mui/icons-material/DriveEta";
+import AssistantIcon from "@mui/icons-material/Assistant";
+import BallotIcon from "@mui/icons-material/Ballot";
import BiotechIcon from "@mui/icons-material/Biotech";
+import CottageIcon from "@mui/icons-material/Cottage";
+import DoorbellIcon from "@mui/icons-material/Doorbell";
+import DriveEtaIcon from "@mui/icons-material/DriveEta";
+import ElectricBoltIcon from "@mui/icons-material/ElectricBolt";
+import EngineeringIcon from "@mui/icons-material/Engineering";
+import FactCheckIcon from "@mui/icons-material/FactCheck";
+import FireTruckIcon from "@mui/icons-material/FireTruck";
+import GavelIcon from "@mui/icons-material/Gavel";
+import GppMaybeIcon from "@mui/icons-material/GppMaybe";
+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 Mediation from "@mui/icons-material/Mediation";
+import PsychologyAltIcon from "@mui/icons-material/PsychologyAlt";
+import ReportIcon from "@mui/icons-material/Report";
+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";
export const pageMenu = [
{
@@ -128,6 +132,14 @@ export const pageMenu = [
badges: [{ key: "mission.control" }],
permissions: ["manage-control-unit"],
},
+ {
+ id: "roadMissionsViolations",
+ label: "تخلفات",
+ type: "page",
+ route: "/dashboard/road-missions/violation",
+ // badges: [{ key: "mission.control" }], // TODO: add badge and permission
+ permissions: ["all"],
+ },
],
},
{
@@ -296,32 +308,36 @@ export const pageMenu = [
hasSubitems: true,
Subitems: [
{
- id: "cityAdminZaminGov",
- label: "استعلام حرائم پنجره واحد",
+ id: "cityAdmin",
+ label: "کارتابل شهرستان",
type: "page",
- route: "/dashboard/inquiry-privacy/city-admin/zamin-gov",
- permissions: [],
+ route: "/dashboard/inquiry-privacy/city-admin",
+ icon: ,
+ permissions: ["all"],
},
{
- id: "provinceAdminZaminGov",
- label: "استعلام حرائم پنجره واحد",
+ id: "privacyOffice",
+ label: "کارتابل اداره حریم",
type: "page",
- route: "/dashboard/inquiry-privacy/province-admin/zamin-gov",
- permissions: [],
+ route: "/dashboard/inquiry-privacy/privacy-office",
+ icon: ,
+ permissions: ["all"],
},
{
- id: "assistantZaminGov",
- label: "استعلام حرائم پنجره واحد",
+ id: "assistant",
+ label: "کارتابل معاون",
type: "page",
- route: "/dashboard/inquiry-privacy/assistant/zamin-gov",
- permissions: [],
+ route: "/dashboard/inquiry-privacy/technical-deputy",
+ icon: ,
+ permissions: ["all"],
},
{
- id: "generalManagerZaminGov",
- label: "استعلام حرائم پنجره واحد",
+ id: "generalManager",
+ label: "کارتابل مدیر",
type: "page",
- route: "/dashboard/inquiry-privacy/general-manager/zamin-gov",
- permissions: [],
+ route: "/dashboard/inquiry-privacy/general-manager",
+ icon: ,
+ permissions: ["all"],
},
],
},
diff --git a/src/core/utils/pageMenuDev.js b/src/core/utils/pageMenuDev.js
index 7a68cb6..41e811d 100644
--- a/src/core/utils/pageMenuDev.js
+++ b/src/core/utils/pageMenuDev.js
@@ -131,6 +131,14 @@ export const pageMenuDev = [
badges: [{ key: "mission.control" }],
permissions: ["manage-control-unit"],
},
+ {
+ id: "roadMissionsViolations",
+ label: "تخلفات",
+ type: "page",
+ route: "/dashboard/road-missions/violation",
+ // badges: [{ key: "mission.control" }], // TODO: add badge and permission
+ permissions: ["all"],
+ },
],
},
{
diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js
index 11cf9b4..6bf7001 100644
--- a/src/core/utils/routes.js
+++ b/src/core/utils/routes.js
@@ -227,6 +227,7 @@ export const ALLOCATE_REQUEST_MISSION = api + "/api/v3/missions/transportation_u
export const DEALLOCATE_REQUEST_MISSION = api + "/api/v3/missions/transportation_unit/deallocate";
export const START_MISSION = api + "/api/v3/missions/control_unit/start";
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_MACHINES_TABLE_LIST = api + "/api/v3/cmms_machines";