(
+
+
+
+ )}
+ />
+ );
+};
+export default FastReactCode;
diff --git a/src/components/dashboard/roadMissions/operator/RowActions/Add/AddController/Dialog/Form/GetItemInfo/index.jsx b/src/components/dashboard/roadMissions/operator/RowActions/Add/AddController/Dialog/Form/GetItemInfo/index.jsx
new file mode 100644
index 0000000..3b3b513
--- /dev/null
+++ b/src/components/dashboard/roadMissions/operator/RowActions/Add/AddController/Dialog/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/operator/RowActions/Add/AddController/Dialog/Form/Verify/index.jsx b/src/components/dashboard/roadMissions/operator/RowActions/Add/AddController/Dialog/Form/Verify/index.jsx
new file mode 100644
index 0000000..9e33b27
--- /dev/null
+++ b/src/components/dashboard/roadMissions/operator/RowActions/Add/AddController/Dialog/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 "../../../../../../Actions/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/operator/RowActions/Add/AddController/Dialog/Form/index.jsx b/src/components/dashboard/roadMissions/operator/RowActions/Add/AddController/Dialog/Form/index.jsx
new file mode 100644
index 0000000..42f2c36
--- /dev/null
+++ b/src/components/dashboard/roadMissions/operator/RowActions/Add/AddController/Dialog/Form/index.jsx
@@ -0,0 +1,102 @@
+import { AccessTime, InsertDriveFile, 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 Verify from "./Verify";
+
+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, oldBound }) => {
+ 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="بررسی نهایی" />
+
+
+ {
+ 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/operator/RowActions/Add/AddController/Dialog/index.jsx b/src/components/dashboard/roadMissions/operator/RowActions/Add/AddController/Dialog/index.jsx
new file mode 100644
index 0000000..440c4e9
--- /dev/null
+++ b/src/components/dashboard/roadMissions/operator/RowActions/Add/AddController/Dialog/index.jsx
@@ -0,0 +1,83 @@
+import { REQUEST_MISSION_CONTINUE_MISSION } from "@/core/utils/routes";
+import useRequest from "@/lib/hooks/useRequest";
+import moment from "jalali-moment";
+import { useState } from "react";
+import CreateForm from "./Form";
+
+const DialogAdd = ({ mutate, setOpen, oldBound, rahdaran, machine, row }) => {
+ const [submitting, setSubmitting] = useState(false);
+ const requestServer = useRequest({ notificationSuccess: 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_CONTINUE_MISSION}/${row.original.id}`, "post", {
+ data: {
+ ...(result.rahdaran.length != 0 ? { rahdaran: result.rahdaran.map((r) => r.id) } : {}),
+ machines: [result.machine.id],
+ driver: result.driver.id,
+ zone: result.region,
+ type: result.type,
+ ...(result.type == 1
+ ? {
+ end_date: `${result.end_date} ${moment(result.end_time).format("HH:mm")}`,
+ }
+ : {
+ end_date: result.end_date,
+ }),
+ end_point: result.end_point,
+ area: {
+ type: result.bound_type,
+ coordinates: area,
+ },
+ category_id: result.category_id,
+ explanation: result.explanation,
+ ...(result.category_id == 3
+ ? {
+ road_observed_id: result.road_observed_id,
+ }
+ : {}),
+ },
+ hasSidebarUpdate: true,
+ })
+ .then((response) => {
+ mutate();
+ setOpen(false);
+ })
+ .catch((error) => {})
+ .finally(() => {
+ setSubmitting(false);
+ });
+ };
+
+ return (
+ !r.is_driver),
+ bound_type: "polygon",
+ type: "",
+ end_date: "",
+ end_time: null,
+ end_point: "",
+ region: "",
+ machine: machine,
+ driver: rahdaran.find((r) => r.is_driver),
+ }}
+ oldBound={oldBound}
+ submitForm={submitForm}
+ submitting={submitting}
+ open={open}
+ setOpen={setOpen}
+ mutate={mutate}
+ />
+ );
+};
+export default DialogAdd;
diff --git a/src/components/dashboard/roadMissions/operator/RowActions/Add/AddController/index.jsx b/src/components/dashboard/roadMissions/operator/RowActions/Add/AddController/index.jsx
new file mode 100644
index 0000000..63caea6
--- /dev/null
+++ b/src/components/dashboard/roadMissions/operator/RowActions/Add/AddController/index.jsx
@@ -0,0 +1,52 @@
+import DialogLoading from "@/core/components/DialogLoading";
+import { GET_MACHINES_BY_ID, GET_RAHDARAN_BY_ID } from "@/core/utils/routes";
+import useRequest from "@/lib/hooks/useRequest";
+import L from "leaflet";
+import { useEffect, useMemo, useState } from "react";
+import DialogAdd from "./Dialog";
+
+const AddController = ({ row, mutate, setOpenAddDialog }) => {
+ const [rahdaran, setRahdaran] = useState(null);
+ const [rahdaranLoading, setRahdaranLoading] = useState(true);
+ const [machine, setMachine] = useState(null);
+ const [machineLoading, setMachineLoading] = useState(true);
+ const requestServer = useRequest();
+
+ useEffect(() => {
+ setRahdaranLoading(true);
+ requestServer(`${GET_RAHDARAN_BY_ID}/${row.original.id}`, "get")
+ .then((response) => {
+ setRahdaran(response.data.data);
+ setRahdaranLoading(false);
+ })
+ .catch((e) => {
+ setRahdaranLoading(false);
+ });
+ }, [row.original.id]);
+
+ useEffect(() => {
+ setMachineLoading(true);
+ requestServer(`${GET_MACHINES_BY_ID}/${row.original.id}`, "get")
+ .then((response) => {
+ setMachine(response.data.data[0]);
+ setMachineLoading(false);
+ })
+ .catch((e) => {
+ setMachineLoading(false);
+ });
+ }, [row.original.id]);
+
+ return rahdaranLoading || machineLoading ? (
+
+ ) : (
+
+ );
+};
+export default AddController;
diff --git a/src/components/dashboard/roadMissions/operator/RowActions/Add/index.jsx b/src/components/dashboard/roadMissions/operator/RowActions/Add/index.jsx
new file mode 100644
index 0000000..e743a0e
--- /dev/null
+++ b/src/components/dashboard/roadMissions/operator/RowActions/Add/index.jsx
@@ -0,0 +1,47 @@
+import { Add, Close } from "@mui/icons-material";
+import { Dialog, IconButton, Tooltip } from "@mui/material";
+import { useState } from "react";
+import AddController from "./AddController";
+
+const AddDialog = ({ row, mutate }) => {
+ const [openAddDialog, setOpenAddDialog] = useState(false);
+
+ return (
+ <>
+
+ {
+ setOpenAddDialog(true);
+ }}
+ >
+
+
+
+
+ >
+ );
+};
+export default AddDialog;
diff --git a/src/components/dashboard/roadMissions/operator/RowActions/Edit/EditController/index.jsx b/src/components/dashboard/roadMissions/operator/RowActions/Edit/EditController/index.jsx
index 1fdda15..bfc214a 100644
--- a/src/components/dashboard/roadMissions/operator/RowActions/Edit/EditController/index.jsx
+++ b/src/components/dashboard/roadMissions/operator/RowActions/Edit/EditController/index.jsx
@@ -16,7 +16,7 @@ const EditController = ({ row, mutate, openEditDialog, setOpenEditDialog }) => {
);
const [submitting, setSubmitting] = useState(false);
const [rahdaran, setRahdaran] = useState(null);
- const [rahdaranLoading, setRahdaranLoading] = useState(false);
+ const [rahdaranLoading, setRahdaranLoading] = useState(true);
const requestServer = useRequest();
useEffect(() => {
@@ -87,7 +87,7 @@ const EditController = ({ row, mutate, openEditDialog, setOpenEditDialog }) => {
explanation: row.original.explanation,
category_id: row.original.category_id,
road_observed_id: row.original.category_id == 3 ? row.original.road_observed[0].id : "",
- rahdaran: rahdaran,
+ rahdaran: rahdaran.filter((r) => !r.isDriver),
requested_machines: row.original.requested_machines,
bound: bound,
bound_type: row.original.area.type,
diff --git a/src/components/dashboard/roadMissions/operator/RowActions/index.jsx b/src/components/dashboard/roadMissions/operator/RowActions/index.jsx
index b5659da..38e6f9d 100644
--- a/src/components/dashboard/roadMissions/operator/RowActions/index.jsx
+++ b/src/components/dashboard/roadMissions/operator/RowActions/index.jsx
@@ -2,6 +2,7 @@ import { Box } from "@mui/material";
import Edit from "./Edit";
import Delete from "./Delete";
import { useAuth } from "@/lib/contexts/auth";
+import Add from "./Add";
const RowActions = ({ row, mutate }) => {
const { user } = useAuth();
@@ -14,6 +15,11 @@ const RowActions = ({ row, mutate }) => {
>
)}
+ {row.original.state_id == 3 && user.id == row.original.user_id && (
+ <>
+
+ >
+ )}
);
};
diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js
index bd25977..1ddf8dc 100644
--- a/src/core/utils/routes.js
+++ b/src/core/utils/routes.js
@@ -217,6 +217,7 @@ export const GET_ROAD_MISSIONS_TRANSPORTATION_LIST = api + "/api/v3/missions/tra
export const GET_ROAD_MISSIONS_CONTROL_LIST = api + "/api/v3/missions/control_unit";
export const REQUEST_MISSION = api + "/api/v3/missions/request_portal";
export const REQUEST_MISSION_WITHOUT_PROCESS = api + "/api/v3/missions/request_portal/no_process";
+export const REQUEST_MISSION_CONTINUE_MISSION = api + "/api/v3/missions/request_portal/continue";
export const UPDATE_REQUEST_MISSION = api + "/api/v3/missions/request_portal";
export const DELETE_REQUEST_MISSION = api + "/api/v3/missions/request_portal";
export const GET_RAHDARAN_BY_ID = api + "/api/v3/missions/details/rahdaran";