diff --git a/.env.local.example b/.env.example
similarity index 81%
rename from .env.local.example
rename to .env.example
index 8653b1b..02aac45 100644
--- a/.env.local.example
+++ b/.env.example
@@ -1,4 +1,4 @@
HOST="rms.witel.ir"
-NEXT_PUBLIC_VERSION="1.0.5"
+NEXT_PUBLIC_VERSION="1.1.0"
NEXT_PUBLIC_API_URL="https://rms.witel.ir"
NEXT_PUBLIC_MAPTILE_ENDPOINT="https://rmsmap.rmto.ir/141map"
\ No newline at end of file
diff --git a/Dockerfile b/Dockerfile
index 35a5be3..52d637b 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,4 +1,4 @@
-FROM node:22.11.0-alpine3.20
+FROM docker.arvancloud.ir/node:22.11.0-alpine3.20
WORKDIR /var/www/app
diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/azmayesh/loading.jsx b/src/app/(withAuth)/(dashboardLayout)/dashboard/azmayesh/loading.jsx
deleted file mode 100644
index 4535a8d..0000000
--- a/src/app/(withAuth)/(dashboardLayout)/dashboard/azmayesh/loading.jsx
+++ /dev/null
@@ -1,7 +0,0 @@
-"use client";
-import PageLoading from "@/core/components/PageLoading";
-
-const Loading = () => {
- return ;
-};
-export default Loading;
diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/azmayesh_type/loading.jsx b/src/app/(withAuth)/(dashboardLayout)/dashboard/azmayesh_type/loading.jsx
deleted file mode 100644
index 4535a8d..0000000
--- a/src/app/(withAuth)/(dashboardLayout)/dashboard/azmayesh_type/loading.jsx
+++ /dev/null
@@ -1,7 +0,0 @@
-"use client";
-import PageLoading from "@/core/components/PageLoading";
-
-const Loading = () => {
- return ;
-};
-export default Loading;
diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/road-patrols/operator/loading.jsx b/src/app/(withAuth)/(dashboardLayout)/dashboard/road-patrols/operator/loading.jsx
deleted file mode 100644
index 4535a8d..0000000
--- a/src/app/(withAuth)/(dashboardLayout)/dashboard/road-patrols/operator/loading.jsx
+++ /dev/null
@@ -1,7 +0,0 @@
-"use client";
-import PageLoading from "@/core/components/PageLoading";
-
-const Loading = () => {
- return ;
-};
-export default Loading;
diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/road-patrols/supervisor/loading.jsx b/src/app/(withAuth)/(dashboardLayout)/dashboard/road-patrols/supervisor/loading.jsx
deleted file mode 100644
index 4535a8d..0000000
--- a/src/app/(withAuth)/(dashboardLayout)/dashboard/road-patrols/supervisor/loading.jsx
+++ /dev/null
@@ -1,7 +0,0 @@
-"use client";
-import PageLoading from "@/core/components/PageLoading";
-
-const Loading = () => {
- return ;
-};
-export default Loading;
diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/road-safety/operator/loading.jsx b/src/app/(withAuth)/(dashboardLayout)/dashboard/road-safety/operator/loading.jsx
deleted file mode 100644
index 4535a8d..0000000
--- a/src/app/(withAuth)/(dashboardLayout)/dashboard/road-safety/operator/loading.jsx
+++ /dev/null
@@ -1,7 +0,0 @@
-"use client";
-import PageLoading from "@/core/components/PageLoading";
-
-const Loading = () => {
- return ;
-};
-export default Loading;
diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/road-safety/operator/page.js b/src/app/(withAuth)/(dashboardLayout)/dashboard/road-safety/operator/page.js
index 3ce87a7..ecf5a33 100644
--- a/src/app/(withAuth)/(dashboardLayout)/dashboard/road-safety/operator/page.js
+++ b/src/app/(withAuth)/(dashboardLayout)/dashboard/road-safety/operator/page.js
@@ -6,13 +6,7 @@ export const metadata = {
};
const Page = () => {
return (
-
+
{/**/}
diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/road-safety/supervisor/page.js b/src/app/(withAuth)/(dashboardLayout)/dashboard/road-safety/supervisor/page.js
new file mode 100644
index 0000000..6ef1822
--- /dev/null
+++ b/src/app/(withAuth)/(dashboardLayout)/dashboard/road-safety/supervisor/page.js
@@ -0,0 +1,21 @@
+import SupervisorPage from "@/components/dashboard/roadSafety/supervisor";
+import WithPermission from "@/core/middlewares/withPermission";
+// import ActivityCodeLog from "@/core/components/ActivityCodeLog";
+export const metadata = {
+ title: "کارتابل ارزیابی نگهداری حریم",
+};
+const Page = () => {
+ return (
+
+
+ {/**/}
+
+ );
+};
+
+export default Page;
diff --git a/src/app/(withAuth)/(dashboardLayout)/layout.js b/src/app/(withAuth)/(dashboardLayout)/layout.js
index 219cee2..f13663c 100644
--- a/src/app/(withAuth)/(dashboardLayout)/layout.js
+++ b/src/app/(withAuth)/(dashboardLayout)/layout.js
@@ -1,13 +1,17 @@
+"use client";
import HeaderWithLogo from "@/components/layouts/dashboard/headerWithLogo";
import HeaderWithSidebar from "@/components/layouts/dashboard/headerWithSidebar";
import { Stack } from "@mui/material";
+import { SWRConfig } from "swr";
const Layout = ({ children }) => {
return (
-
-
- {children}
-
+ new Map() }}>
+
+
+ {children}
+
+
);
};
export default Layout;
diff --git a/src/components/dashboard/roadSafety/operator/Form/StepOne/CreateFormContent.jsx b/src/components/dashboard/roadSafety/operator/Form/StepOne/CreateFormContent.jsx
index bcc6012..69fb689 100644
--- a/src/components/dashboard/roadSafety/operator/Form/StepOne/CreateFormContent.jsx
+++ b/src/components/dashboard/roadSafety/operator/Form/StepOne/CreateFormContent.jsx
@@ -83,7 +83,7 @@ const CreateFormContent = ({ setOpen, mutate }) => {
const startPoint = `${data.start_point.lat},${data.start_point.lng}`;
const formData = new FormData();
formData.append("activity_date", data.activity_date);
- formData.append("activity_time", format(new Date(data.activity_time), "HH:mm"));
+ formData.append("activity_time", `${data.activity_time.toString().padStart(2, "0")}:00`);
formData.append("info_id", data.info_id);
formData.append("axis_type_id", data.axis_type_id);
formData.append("recognize_picture", data.recognize_picture);
diff --git a/src/components/dashboard/roadSafety/operator/Form/StepOne/GetSubItemInfo.jsx b/src/components/dashboard/roadSafety/operator/Form/StepOne/GetSubItemInfo.jsx
index a6e3f5e..a54b027 100644
--- a/src/components/dashboard/roadSafety/operator/Form/StepOne/GetSubItemInfo.jsx
+++ b/src/components/dashboard/roadSafety/operator/Form/StepOne/GetSubItemInfo.jsx
@@ -1,11 +1,11 @@
-import { Box, Chip, Divider, Grid, Stack, Typography } from "@mui/material";
-import InsertDriveFileIcon from "@mui/icons-material/InsertDriveFile";
-import ImageUpload from "./ImageUpload";
-import { Controller, useWatch } from "react-hook-form";
+import HourSelect from "@/core/components/HourSelect";
import MapInfoOneMarker from "@/core/components/MapInfoOneMarker";
import MuiDatePicker from "@/core/components/MuiDatePicker";
-import MuiTimePicker from "@/core/components/MuiTimePicker";
import SelectBox from "@/core/components/SelectBox";
+import InsertDriveFileIcon from "@mui/icons-material/InsertDriveFile";
+import { Box, Chip, Divider, Grid, Stack, Typography } from "@mui/material";
+import { Controller, useWatch } from "react-hook-form";
+import ImageUpload from "./ImageUpload";
const GetSubItemInfo = ({ itemsList, control, setValue, errors }) => {
const StartPoint = useWatch({ control, name: "start_point" });
@@ -84,14 +84,11 @@ const GetSubItemInfo = ({ itemsList, control, setValue, errors }) => {
control={control}
render={({ field, fieldState: { error } }) => {
return (
- field.onChange(value || null)}
- helperText={error ? error.message : null}
+ label="ساعت فعالیت"
+ error={error}
+ onChange={field.onChange}
/>
);
}}
diff --git a/src/components/dashboard/roadSafety/operator/Form/StepThree/StepThreeContent.jsx b/src/components/dashboard/roadSafety/operator/Form/StepThree/StepThreeContent.jsx
index 0e9770c..278d8ca 100644
--- a/src/components/dashboard/roadSafety/operator/Form/StepThree/StepThreeContent.jsx
+++ b/src/components/dashboard/roadSafety/operator/Form/StepThree/StepThreeContent.jsx
@@ -1,14 +1,13 @@
-import { Button, DialogActions, DialogContent, Stack } from "@mui/material";
-import { Controller, useForm } from "react-hook-form";
-import { yupResolver } from "@hookform/resolvers/yup";
+import HourSelect from "@/core/components/HourSelect";
+import MuiDatePicker from "@/core/components/MuiDatePicker";
import StyledForm from "@/core/components/StyledForm";
+import { THIRD_STEP_STORE } from "@/core/utils/routes";
+import useRequest from "@/lib/hooks/useRequest";
+import { yupResolver } from "@hookform/resolvers/yup";
+import { Button, DialogActions, DialogContent, Grid, Stack } from "@mui/material";
+import { Controller, useForm } from "react-hook-form";
import { mixed, object, string } from "yup";
import ImageUpload from "./ImageUpload";
-import useRequest from "@/lib/hooks/useRequest";
-import { THIRD_STEP_STORE } from "@/core/utils/routes";
-import MuiDatePicker from "@/core/components/MuiDatePicker";
-import MuiTimePicker from "@/core/components/MuiTimePicker";
-import { format } from "date-fns";
const StepThreeContent = ({ setOpen, mutate, rowId }) => {
const requestServer = useRequest({ notificationSuccess: true });
@@ -33,7 +32,7 @@ const StepThreeContent = ({ setOpen, mutate, rowId }) => {
});
const onSubmit = async (data) => {
const formData = new FormData();
- formData.append("action_date", `${data.action_date} ${format(new Date(data.action_time), "HH:mm")}`);
+ formData.append("action_date", `${data.action_date} ${data.action_time.toString().padStart(2, "0")}:00`);
formData.append("action_picture", data.action_picture);
await requestServer(`${THIRD_STEP_STORE}/${rowId}`, "post", {
data: formData,
@@ -48,43 +47,44 @@ const StepThreeContent = ({ setOpen, mutate, rowId }) => {
return (
-
-
- {
- return (
- field.onChange(value || [])}
- helperText={error ? error.message : null}
- />
- );
- }}
- name={"action_date"}
- />
- {
- return (
- field.onChange(value || null)}
- helperText={error ? error.message : null}
- />
- );
- }}
- name={"action_time"}
- />
-
+
+
+
+ {
+ return (
+ field.onChange(value || [])}
+ helperText={error ? error.message : null}
+ />
+ );
+ }}
+ name={"action_date"}
+ />
+
+
+ {
+ return (
+
+ );
+ }}
+ name={"action_time"}
+ />
+
+
{
const requestServer = useRequest({ notificationSuccess: true });
const [selectedDamageItemList, setSelectedDamageItemList] = useState([]);
const defaultValues = {
+ need_judiciary: "0",
+ operator_description: "",
judiciary_document: null,
};
const validationSchema = object({
- judiciary_document: mixed().test("is-array", "لطفا حداقل یک فایل بارگذاری کنید!", (value) => {
- return Array.isArray(value) && value.length > 0;
+ judiciary_document: mixed().when("need_judiciary", {
+ is: "1",
+ then: (schema) =>
+ schema.test("is-array", "لطفا حداقل یک فایل بارگذاری کنید!", (value) => {
+ return Array.isArray(value) && value.length > 0;
+ }),
+ otherwise: (schema) => schema.notRequired(),
+ }),
+ operator_description: string().when("need_judiciary", {
+ is: "0",
+ then: (schema) => schema.required("لطفا توضیحات را وارد کنید!"),
+ otherwise: (schema) => schema.notRequired(),
}),
});
const {
control,
handleSubmit,
setValue,
- formState: { isSubmitting, errors },
+ formState: { isSubmitting },
} = useForm({
defaultValues,
resolver: yupResolver(validationSchema),
mode: "all",
});
-
const handleCreateDamage = (files) => {
setSelectedDamageItemList((prev) => {
const newFiles = files.filter((file) => !prev.some((item) => item.name === file.name));
@@ -40,12 +66,19 @@ const StepTwoContent = ({ setOpenStepTwoDialog, mutate, rowId }) => {
setValue("judiciary_document", selectedDamageItemList);
}, [selectedDamageItemList]);
+ const need_judiciary = useWatch({ control, name: "need_judiciary" });
+
const deleteDamageItem = (name) => {
setSelectedDamageItemList((prev) => prev.filter((documentItem) => documentItem.name !== name));
};
const onSubmit = async (data) => {
const formData = new FormData();
- data.judiciary_document.map((item, index) => formData.append(`judiciary_document[${index}]`, item));
+ formData.append(`need_judiciary`, data.need_judiciary);
+ if (data.need_judiciary == 1) {
+ data.judiciary_document.map((item, index) => formData.append(`judiciary_document[${index}]`, item));
+ } else {
+ formData.append(`operator_description`, data.operator_description);
+ }
await requestServer(`${SECOND_STEP_STORE}/${rowId}`, "post", {
data: formData,
hasSidebarUpdate: true,
@@ -58,69 +91,108 @@ const StepTwoContent = ({ setOpenStepTwoDialog, mutate, rowId }) => {
};
return (
-
-
- (
- <>
-
- {error && {error.message}}
- >
+
+ (
+ <>
+
+ } label="بدون مستندات قضایی" />
+ } label="دارای مستندات قضایی" />
+
+ >
+ )}
+ />
+ {need_judiciary == 1 ? (
+ <>
+
+ (
+ <>
+
+ {error && {error.message}}
+ >
+ )}
+ />
+
+
+
+
+ {selectedDamageItemList.length === 0 && (
+
+
+ فایل موردنظر را بارگذاری کنید.
+
+
)}
- />
-
-
-
-
- {selectedDamageItemList.length === 0 && (
-
-
- فایل موردنظر را بارگذاری کنید.
-
-
+
+
+ {selectedDamageItemList.length !== 0 &&
+ selectedDamageItemList.map((selectedDamageItem, index) => (
+
+
+
+ ))}
+
+
+ >
+ ) : (
+
+ (
+
+ )}
+ />
+
)}
-
-
- {selectedDamageItemList.length !== 0 &&
- selectedDamageItemList.map((selectedDamageItem, index) => (
-
-
-
- ))}
-
-
+ )}
+ >
+ );
+};
+export default PrintExcel;
diff --git a/src/components/dashboard/roadSafety/supervisor/RowActions/ActionPictureDialog/ActionPictureContent.jsx b/src/components/dashboard/roadSafety/supervisor/RowActions/ActionPictureDialog/ActionPictureContent.jsx
new file mode 100644
index 0000000..f27255b
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/RowActions/ActionPictureDialog/ActionPictureContent.jsx
@@ -0,0 +1,44 @@
+import { Box, Stack, Typography, useTheme } from "@mui/material";
+import Image from "next/image";
+
+const ActionPictureContent = ({ image, title }) => {
+ const theme = useTheme();
+ return (
+
+
+ {title}
+
+
+
+
+
+ );
+};
+export default ActionPictureContent;
diff --git a/src/components/dashboard/roadSafety/supervisor/RowActions/ActionPictureDialog/index.jsx b/src/components/dashboard/roadSafety/supervisor/RowActions/ActionPictureDialog/index.jsx
new file mode 100644
index 0000000..4c2911c
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/RowActions/ActionPictureDialog/index.jsx
@@ -0,0 +1,40 @@
+import PhotoLibraryIcon from "@mui/icons-material/PhotoLibrary";
+import { Button, Dialog, DialogActions, DialogContent, IconButton, Tooltip } from "@mui/material";
+import { useState } from "react";
+import ActionPictureContent from "./ActionPictureContent";
+
+const ActionPictureDialog = ({ image }) => {
+ const [openImageDialog, setOpenImageDialog] = useState(false);
+
+ return (
+ <>
+
+ setOpenImageDialog(true)}>
+
+
+
+
+ >
+ );
+};
+export default ActionPictureDialog;
diff --git a/src/components/dashboard/roadSafety/supervisor/RowActions/ConfirmForm/ConfirmContent.jsx b/src/components/dashboard/roadSafety/supervisor/RowActions/ConfirmForm/ConfirmContent.jsx
new file mode 100644
index 0000000..847e242
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/RowActions/ConfirmForm/ConfirmContent.jsx
@@ -0,0 +1,70 @@
+import { CONFIRM_ROAD_SAFETY_BY_SUPERVISOR } from "@/core/utils/routes";
+import useRequest from "@/lib/hooks/useRequest";
+import { Button, DialogActions, DialogContent, Stack, TextField } from "@mui/material";
+import { useForm } from "react-hook-form";
+
+const ConfirmContent = ({ rowId, mutate, setOpenConfirmDialog }) => {
+ const requestServer = useRequest({ notificationSuccess: true });
+
+ const {
+ register,
+ handleSubmit,
+ formState: { isSubmitting },
+ } = useForm({
+ defaultValues: {
+ supervisor_description: "",
+ },
+ });
+
+ const onSubmit = async (data) => {
+ const formData = new FormData();
+ data.supervisor_description !== "" && formData.append("supervisor_description", data.supervisor_description);
+ requestServer(`${CONFIRM_ROAD_SAFETY_BY_SUPERVISOR}/${rowId}`, "post", {
+ data: formData,
+ hasSidebarUpdate: true,
+ })
+ .then(() => {
+ mutate();
+ setOpenConfirmDialog(false);
+ })
+ .catch(() => {});
+ };
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+ setOpenConfirmDialog(false)}
+ variant="outlined"
+ color="secondary"
+ disabled={isSubmitting}
+ autoFocus
+ >
+ بستن
+
+
+ {isSubmitting ? "درحال ثبت تایید..." : "ثبت تایید"}
+
+
+ >
+ );
+};
+
+export default ConfirmContent;
diff --git a/src/components/dashboard/roadSafety/supervisor/RowActions/ConfirmForm/index.jsx b/src/components/dashboard/roadSafety/supervisor/RowActions/ConfirmForm/index.jsx
new file mode 100644
index 0000000..d9aafa0
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/RowActions/ConfirmForm/index.jsx
@@ -0,0 +1,29 @@
+import { Dialog, DialogTitle, IconButton, Tooltip } from "@mui/material";
+import { useState } from "react";
+import ConfirmContent from "./ConfirmContent";
+import DoneIcon from "@mui/icons-material/Done";
+const ConfirmForm = ({ rowId, mutate }) => {
+ const [openConfirmDialog, setOpenConfirmDialog] = useState(false);
+ return (
+ <>
+
+ setOpenConfirmDialog(true)}>
+
+
+
+
+ >
+ );
+};
+export default ConfirmForm;
diff --git a/src/components/dashboard/roadSafety/supervisor/RowActions/DeleteDialog/DeleteContent.jsx b/src/components/dashboard/roadSafety/supervisor/RowActions/DeleteDialog/DeleteContent.jsx
new file mode 100644
index 0000000..bb88f78
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/RowActions/DeleteDialog/DeleteContent.jsx
@@ -0,0 +1,42 @@
+import { Button, DialogActions, DialogContent, Stack, Typography } from "@mui/material";
+import React, { useState } from "react";
+import useRequest from "@/lib/hooks/useRequest";
+import { DELETE_SAFETY_AND_PRIVACY } from "@/core/utils/routes";
+
+const DeleteContent = ({ rowId, mutate, setOpenDeleteDialog }) => {
+ const [submitting, setSubmitting] = useState(false);
+ const requestServer = useRequest({ notificationSuccess: true });
+ const handleClick = () => {
+ setSubmitting(true);
+ requestServer(`${DELETE_SAFETY_AND_PRIVACY}/${rowId}`, "delete", {
+ hasSidebarUpdate: true,
+ })
+ .then(() => {
+ mutate();
+ setOpenDeleteDialog(false);
+ setSubmitting(false);
+ })
+ .catch(() => {
+ setSubmitting(false);
+ });
+ };
+ return (
+ <>
+
+
+ آیا از حذف فعالیت اطمینان دارید؟
+
+
+
+ setOpenDeleteDialog(false)} variant="outlined" color="secondary">
+ خیر !
+
+
+ {submitting ? "درحال حذف..." : "بله اطمینان دارم"}
+
+
+ >
+ );
+};
+
+export default DeleteContent;
diff --git a/src/components/dashboard/roadSafety/supervisor/RowActions/DeleteDialog/index.jsx b/src/components/dashboard/roadSafety/supervisor/RowActions/DeleteDialog/index.jsx
new file mode 100644
index 0000000..596cf9a
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/RowActions/DeleteDialog/index.jsx
@@ -0,0 +1,32 @@
+import DeleteIcon from "@mui/icons-material/Delete";
+import { Dialog, DialogTitle, IconButton, Tooltip } from "@mui/material";
+import { useState } from "react";
+import DeleteContent from "./DeleteContent";
+const DeleteForm = ({ rowId, mutate }) => {
+ const [openDeleteDialog, setOpenDeleteDialog] = useState(false);
+
+ return (
+ <>
+
+ setOpenDeleteDialog(true)}>
+
+
+
+
+ >
+ );
+};
+export default DeleteForm;
diff --git a/src/components/dashboard/roadSafety/supervisor/RowActions/DescriptionForm/index.jsx b/src/components/dashboard/roadSafety/supervisor/RowActions/DescriptionForm/index.jsx
new file mode 100644
index 0000000..91b135a
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/RowActions/DescriptionForm/index.jsx
@@ -0,0 +1,51 @@
+import { Dialog, DialogContent, DialogTitle, IconButton, Tooltip, Typography, Card, CardContent } from "@mui/material";
+import { useState } from "react";
+import RemoveRedEyeIcon from "@mui/icons-material/RemoveRedEye";
+import CloseIcon from "@mui/icons-material/Close";
+
+const DescriptionForm = ({ description }) => {
+ const [openOfficerDescriptionDialog, setOpenOfficerDescriptionDialog] = useState(false);
+
+ return (
+ <>
+
+ setOpenOfficerDescriptionDialog(true)}>
+
+
+
+
+ >
+ );
+};
+
+export default DescriptionForm;
diff --git a/src/components/dashboard/roadSafety/supervisor/RowActions/FinishDescriptionForm/index.jsx b/src/components/dashboard/roadSafety/supervisor/RowActions/FinishDescriptionForm/index.jsx
new file mode 100644
index 0000000..6178ae8
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/RowActions/FinishDescriptionForm/index.jsx
@@ -0,0 +1,51 @@
+import { Dialog, DialogContent, DialogTitle, IconButton, Tooltip, Typography, Card, CardContent } from "@mui/material";
+import { useState } from "react";
+import RemoveRedEyeIcon from "@mui/icons-material/RemoveRedEye";
+import CloseIcon from "@mui/icons-material/Close";
+
+const FinishDescriptionForm = ({ description }) => {
+ const [openOfficerDescriptionDialog, setOpenOfficerDescriptionDialog] = useState(false);
+
+ return (
+ <>
+
+ setOpenOfficerDescriptionDialog(true)}>
+
+
+
+
+ >
+ );
+};
+
+export default FinishDescriptionForm;
diff --git a/src/components/dashboard/roadSafety/supervisor/RowActions/JudiciaryDocumentDialog/JudiciaryDocumentContent.jsx b/src/components/dashboard/roadSafety/supervisor/RowActions/JudiciaryDocumentDialog/JudiciaryDocumentContent.jsx
new file mode 100644
index 0000000..95a3f1e
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/RowActions/JudiciaryDocumentDialog/JudiciaryDocumentContent.jsx
@@ -0,0 +1,43 @@
+import { Box, Button, Chip, Divider, Grid, Typography } from "@mui/material";
+import DownloadIcon from "@mui/icons-material/Download";
+import ArticleIcon from "@mui/icons-material/Article";
+
+const JudiciaryDocumentContent = ({ judiciaryDocumentDetails }) => {
+ return (
+
+ {judiciaryDocumentDetails.map((judiciaryDocument, index) => {
+ return (
+
+
+ }
+ label={
+
+ مستندات قضایی {index + 1}
+
+ }
+ />
+
+
+ }
+ onClick={() => {
+ if (judiciaryDocument) {
+ window.open(judiciaryDocument, "_blank");
+ } else {
+ alert("فایلی برای دانلود موجود نیست.");
+ }
+ }}
+ >
+ دانلود فایل
+
+
+ );
+ })}
+
+ );
+};
+export default JudiciaryDocumentContent;
diff --git a/src/components/dashboard/roadSafety/supervisor/RowActions/JudiciaryDocumentDialog/JudiciaryDocumentController.jsx b/src/components/dashboard/roadSafety/supervisor/RowActions/JudiciaryDocumentDialog/JudiciaryDocumentController.jsx
new file mode 100644
index 0000000..0773130
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/RowActions/JudiciaryDocumentDialog/JudiciaryDocumentController.jsx
@@ -0,0 +1,35 @@
+import { useEffect, useState } from "react";
+import useRequest from "@/lib/hooks/useRequest";
+import DialogLoading from "@/core/components/DialogLoading";
+import JudiciaryDocumentContent from "./JudiciaryDocumentContent";
+import { DESERIALIZE_JUDICIARY_DOCUMENT } from "@/core/utils/routes";
+import { Typography } from "@mui/material";
+
+const JudiciaryDocumentController = ({ rowId }) => {
+ const requestServer = useRequest();
+ const [judiciaryDocumentDetails, setJudiciaryDocumentDetails] = useState([]);
+ const [judiciaryDocumentDetailsLoading, setJudiciaryDocumentDetailsLoading] = useState(false);
+ useEffect(() => {
+ setJudiciaryDocumentDetailsLoading(true);
+ requestServer(`${DESERIALIZE_JUDICIARY_DOCUMENT}/${rowId}`, "get")
+ .then((response) => {
+ setJudiciaryDocumentDetails(response.data.data);
+ setJudiciaryDocumentDetailsLoading(false);
+ })
+ .catch((e) => {
+ setJudiciaryDocumentDetailsLoading(false);
+ });
+ }, [rowId]);
+ return (
+ <>
+ {judiciaryDocumentDetailsLoading ? (
+
+ ) : judiciaryDocumentDetails.length > 0 ? (
+
+ ) : (
+ بدون مستندات
+ )}
+ >
+ );
+};
+export default JudiciaryDocumentController;
diff --git a/src/components/dashboard/roadSafety/supervisor/RowActions/JudiciaryDocumentDialog/index.jsx b/src/components/dashboard/roadSafety/supervisor/RowActions/JudiciaryDocumentDialog/index.jsx
new file mode 100644
index 0000000..575d4c5
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/RowActions/JudiciaryDocumentDialog/index.jsx
@@ -0,0 +1,40 @@
+import { Button, Dialog, DialogActions, DialogContent, DialogTitle, IconButton, Tooltip } from "@mui/material";
+import ArticleIcon from "@mui/icons-material/Article";
+import React, { useState } from "react";
+import JudiciaryDocumentController from "./JudiciaryDocumentController";
+
+const JudiciaryDocumentDialog = ({ rowId }) => {
+ const [openJudiciaryDocumentDialog, setOpenJudiciaryDocumentDialog] = useState(false);
+ return (
+ <>
+
+ setOpenJudiciaryDocumentDialog(true)}>
+
+
+
+
+ >
+ );
+};
+export default JudiciaryDocumentDialog;
diff --git a/src/components/dashboard/roadSafety/supervisor/RowActions/LocationForm/LocationFormContent.jsx b/src/components/dashboard/roadSafety/supervisor/RowActions/LocationForm/LocationFormContent.jsx
new file mode 100644
index 0000000..14b3db3
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/RowActions/LocationForm/LocationFormContent.jsx
@@ -0,0 +1,35 @@
+"use client";
+import { Box, Button, DialogActions, DialogContent, Stack } from "@mui/material";
+import React from "react";
+import dynamic from "next/dynamic";
+import MapLoading from "@/core/components/MapLayer/Loading";
+import ShowLocationMarker from "@/core/components/ShowLocationMarker";
+const MapLayer = dynamic(() => import("@/core/components/MapLayer"), {
+ loading: () => ,
+ ssr: false,
+});
+
+const LocationFormContent = ({ setOpenLocationDialog, start_lat, start_lng, end_lat, end_lng }) => {
+ return (
+ <>
+
+
+
+
+
+
+
+
+ setOpenLocationDialog(false)} variant="outlined" color="secondary">
+ بستن
+
+
+ >
+ );
+};
+export default LocationFormContent;
diff --git a/src/components/dashboard/roadSafety/supervisor/RowActions/LocationForm/index.jsx b/src/components/dashboard/roadSafety/supervisor/RowActions/LocationForm/index.jsx
new file mode 100644
index 0000000..d614215
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/RowActions/LocationForm/index.jsx
@@ -0,0 +1,40 @@
+import React, { useState } from "react";
+import { Tooltip, IconButton, Dialog, DialogTitle } from "@mui/material";
+import ExploreIcon from "@mui/icons-material/Explore";
+import LocationFormContent from "./LocationFormContent";
+const LocationForm = ({ start_lat, start_lng, end_lat, end_lng }) => {
+ const [openLocationDialog, setOpenLocationDialog] = useState(false);
+
+ return (
+ <>
+
+ setOpenLocationDialog(true)}>
+
+
+
+
+ >
+ );
+};
+export default LocationForm;
diff --git a/src/components/dashboard/roadSafety/supervisor/RowActions/OperatorDescriptionForm/index.jsx b/src/components/dashboard/roadSafety/supervisor/RowActions/OperatorDescriptionForm/index.jsx
new file mode 100644
index 0000000..9a59745
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/RowActions/OperatorDescriptionForm/index.jsx
@@ -0,0 +1,51 @@
+import { Dialog, DialogContent, DialogTitle, IconButton, Tooltip, Typography, Card, CardContent } from "@mui/material";
+import { useState } from "react";
+import RemoveRedEyeIcon from "@mui/icons-material/RemoveRedEye";
+import CloseIcon from "@mui/icons-material/Close";
+
+const OperatorDescriptionForm = ({ description }) => {
+ const [openOfficerDescriptionDialog, setOpenOfficerDescriptionDialog] = useState(false);
+
+ return (
+ <>
+
+ setOpenOfficerDescriptionDialog(true)}>
+
+
+
+
+ >
+ );
+};
+
+export default OperatorDescriptionForm;
diff --git a/src/components/dashboard/roadSafety/supervisor/RowActions/RecognizePictureDialog/RecognizePictureContent.jsx b/src/components/dashboard/roadSafety/supervisor/RowActions/RecognizePictureDialog/RecognizePictureContent.jsx
new file mode 100644
index 0000000..39dbdcf
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/RowActions/RecognizePictureDialog/RecognizePictureContent.jsx
@@ -0,0 +1,44 @@
+import { Box, Stack, Typography, useTheme } from "@mui/material";
+import Image from "next/image";
+
+const RecognizePictureContent = ({ image, title }) => {
+ const theme = useTheme();
+ return (
+
+
+ {title}
+
+
+
+
+
+ );
+};
+export default RecognizePictureContent;
diff --git a/src/components/dashboard/roadSafety/supervisor/RowActions/RecognizePictureDialog/index.jsx b/src/components/dashboard/roadSafety/supervisor/RowActions/RecognizePictureDialog/index.jsx
new file mode 100644
index 0000000..72ef4ea
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/RowActions/RecognizePictureDialog/index.jsx
@@ -0,0 +1,40 @@
+import PhotoLibraryIcon from "@mui/icons-material/PhotoLibrary";
+import { Button, Dialog, DialogActions, DialogContent, IconButton, Tooltip } from "@mui/material";
+import { useState } from "react";
+import RecognizePictureContent from "./RecognizePictureContent";
+
+const RecognizePictureDialog = ({ image }) => {
+ const [openImageDialog, setOpenImageDialog] = useState(false);
+
+ return (
+ <>
+
+ setOpenImageDialog(true)}>
+
+
+
+
+ >
+ );
+};
+export default RecognizePictureDialog;
diff --git a/src/components/dashboard/roadSafety/supervisor/RowActions/RejectForm/RejectContent.jsx b/src/components/dashboard/roadSafety/supervisor/RowActions/RejectForm/RejectContent.jsx
new file mode 100644
index 0000000..bed259d
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/RowActions/RejectForm/RejectContent.jsx
@@ -0,0 +1,83 @@
+import { REJECT_ROAD_SAFETY_BY_SUPERVISOR } from "@/core/utils/routes";
+import useRequest from "@/lib/hooks/useRequest";
+import { yupResolver } from "@hookform/resolvers/yup";
+import { Button, DialogActions, DialogContent, Stack, TextField } from "@mui/material";
+import { useForm } from "react-hook-form";
+import * as Yup from "yup";
+
+const RejectContent = ({ rowId, mutate, setOpenRejectDialog }) => {
+ const requestServer = useRequest({ notificationSuccess: true });
+
+ const validationSchema = Yup.object().shape({
+ supervisor_description: Yup.string().required("لطفاً توضیحات را وارد کنید."),
+ });
+
+ const {
+ register,
+ handleSubmit,
+ formState: { errors, isSubmitting },
+ reset,
+ } = useForm({
+ defaultValues: {
+ supervisor_description: "",
+ },
+ resolver: yupResolver(validationSchema),
+ mode: "all",
+ });
+
+ const onSubmit = async (data) => {
+ const formData = new FormData();
+ formData.append("supervisor_description", data.supervisor_description);
+ await requestServer(`${REJECT_ROAD_SAFETY_BY_SUPERVISOR}/${rowId}`, "post", {
+ data: formData,
+ hasSidebarUpdate: true,
+ })
+ .then(() => {
+ mutate();
+ setOpenRejectDialog(false);
+ })
+ .catch(() => {})
+ .finally(() => {
+ reset();
+ });
+ };
+
+ return (
+ <>
+
+
+
+
+
+
+
+
+ setOpenRejectDialog(false)}
+ variant="outlined"
+ color="secondary"
+ disabled={isSubmitting}
+ autoFocus
+ >
+ بستن
+
+
+ {isSubmitting ? "درحال ثبت عدم تایید..." : "ثبت عدم تایید"}
+
+
+ >
+ );
+};
+export default RejectContent;
diff --git a/src/components/dashboard/roadSafety/supervisor/RowActions/RejectForm/index.jsx b/src/components/dashboard/roadSafety/supervisor/RowActions/RejectForm/index.jsx
new file mode 100644
index 0000000..2f08152
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/RowActions/RejectForm/index.jsx
@@ -0,0 +1,29 @@
+import { Dialog, DialogTitle, IconButton, Tooltip } from "@mui/material";
+import { useState } from "react";
+import RejectContent from "./RejectContent";
+import ClearIcon from "@mui/icons-material/Clear";
+const RejectForm = ({ rowId, mutate }) => {
+ const [openRejectDialog, setOpenRejectDialog] = useState(false);
+ return (
+ <>
+
+ setOpenRejectDialog(true)}>
+
+
+
+
+ >
+ );
+};
+export default RejectForm;
diff --git a/src/components/dashboard/roadSafety/supervisor/RowActions/index.jsx b/src/components/dashboard/roadSafety/supervisor/RowActions/index.jsx
new file mode 100644
index 0000000..1deca9d
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/RowActions/index.jsx
@@ -0,0 +1,22 @@
+import { usePermissions } from "@/lib/hooks/usePermissions";
+import { Box } from "@mui/material";
+import ConfirmForm from "./ConfirmForm";
+import DeleteForm from "./DeleteDialog";
+import RejectForm from "./RejectForm";
+
+const RowActions = ({ row, mutate }) => {
+ const { data: userPermissions } = usePermissions();
+ const hasDeletePermission = userPermissions?.includes("delete-safety-and-privacy");
+ return (
+
+ {row.original.is_finished == 1 && row.original.status === 0 && (
+ <>
+
+
+ >
+ )}
+ {hasDeletePermission && }
+
+ );
+};
+export default RowActions;
diff --git a/src/components/dashboard/roadSafety/supervisor/SupervisorList.jsx b/src/components/dashboard/roadSafety/supervisor/SupervisorList.jsx
new file mode 100644
index 0000000..c0acffd
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/SupervisorList.jsx
@@ -0,0 +1,606 @@
+"use client";
+import CustomSelectByDependency from "@/core/components/DataTable/filter/fieldsType/CustomSelectByDependency";
+import DataTableWithAuth from "@/core/components/DataTableWithAuth";
+import { GET_SAFETY_AND_PRIVACY_SUPERVISOR } from "@/core/utils/routes";
+import useSafetyAndPrivacyGetItems from "@/lib/hooks/useSafetyAndPrivacyGetItems";
+import { Box, Stack } from "@mui/material";
+import moment from "jalali-moment";
+import { useEffect, useMemo, useState } from "react";
+import RowActions from "./RowActions";
+import ActionPictureDialog from "./RowActions/ActionPictureDialog";
+import DescriptionForm from "./RowActions/DescriptionForm";
+import FinishDescriptionForm from "./RowActions/FinishDescriptionForm";
+import JudiciaryDocumentDialog from "./RowActions/JudiciaryDocumentDialog";
+import LocationForm from "./RowActions/LocationForm";
+import OperatorDescriptionForm from "./RowActions/OperatorDescriptionForm";
+import RecognizePictureDialog from "./RowActions/RecognizePictureDialog";
+import Toolbar from "./Toolbar";
+import { usePermissions } from "@/lib/hooks/usePermissions";
+import { useAuth } from "@/lib/contexts/auth";
+import useProvinces from "@/lib/hooks/useProvince";
+import useEdaratLists from "@/lib/hooks/useEdaratLists";
+import BlinkingCell from "@/core/components/BlinkingCell";
+
+const stepOptions = [
+ { value: "", label: "همه گام ها" },
+ { value: 1, label: "گام اول (شناسایی)" },
+ { value: 2, label: "گام دوم (مستندات قضایی)" },
+ { value: 3, label: "گام سوم (برخورد)" },
+];
+const statusOptions = [
+ { value: "", label: "همه وضعیت ها" },
+ { value: 0, label: "درحال بررسی" },
+ { value: 1, label: "تایید" },
+ { value: 2, label: "عدم تایید" },
+];
+const finishOptions = [
+ { value: "", label: "همه موارد" },
+ { value: 0, label: "در جریان" },
+ { value: 1, label: "خاتمه یافته" },
+];
+const axisOptions = [
+ { value: "", label: "همه محور ها" },
+ { value: 1, label: "آزادراه" },
+ { value: 2, label: "بزرگراه" },
+ { value: 3, label: "اصلی" },
+ { value: 4, label: "فرعی" },
+ { value: 5, label: "روستایی" },
+];
+const SupervisorList = () => {
+ const { data: userPermissions } = usePermissions();
+ const hasCountryPermission = userPermissions?.includes("show-safety-and-privacy-operator-cartable");
+ const { user } = useAuth();
+
+ const columns = useMemo(() => {
+ const provinceColumn = {
+ header: "استان",
+ id: "province_id",
+ enableColumnFilter: true,
+ datatype: "numeric",
+ filterMode: "equals",
+ grow: false,
+ size: 130,
+ ColumnSelectComponent: (props) => {
+ const { provinces, errorProvinces, loadingProvinces } = useProvinces();
+ const getColumnSelectOptions = useMemo(() => {
+ if (loadingProvinces) {
+ return [{ value: "loading", label: "در حال بارگذاری..." }];
+ }
+ if (errorProvinces) {
+ return [{ value: "error", label: "خطا در بارگذاری" }];
+ }
+ return [
+ { value: "", label: "کل کشور" },
+ ...provinces.map((province) => ({
+ value: province.id,
+ label: province.name_fa,
+ })),
+ ];
+ }, [provinces, errorProvinces, loadingProvinces]);
+ return (
+
+ );
+ },
+ Cell: ({ renderedCellValue, row }) => <>{row.original.province_fa}>,
+ };
+ return [
+ {
+ accessorKey: "id",
+ header: "کد یکتا",
+ id: "id",
+ enableColumnFilter: true,
+ datatype: "text",
+ filterMode: "equals",
+ sortDescFirst: false,
+ columnFilterModeOptions: ["equals", "contains"],
+ grow: false,
+ size: 100,
+ Cell: ({ row }) => (
+
+ ),
+ },
+ ...(hasCountryPermission ? [provinceColumn] : []),
+ {
+ header: "اداره",
+ id: "edare_shahri_id",
+ enableColumnFilter: true,
+ datatype: "numeric",
+ filterMode: "equals",
+ dependencyId: hasCountryPermission ? "province_id" : null,
+ grow: false,
+ size: 120,
+ ColumnSelectComponent: (props) => {
+ const { edaratList, loadingEdaratList, errorEdaratList } = useEdaratLists(
+ hasCountryPermission ? props.dependencyFieldValue.value : user.province_id
+ );
+ const [prevDependency, setPrevDependency] = useState(
+ hasCountryPermission ? props.dependencyFieldValue.value : user.province_id
+ );
+
+ const getColumnSelectOptions = useMemo(() => {
+ if (hasCountryPermission && props.dependencyFieldValue.value === "") {
+ return [{ value: "empty", label: "ابتدا استان را انتخاب کنید" }];
+ }
+ if (loadingEdaratList) {
+ return [{ value: "loading", label: "در حال بارگذاری..." }];
+ }
+ if (errorEdaratList) {
+ return [{ value: "error", label: "خطا در بارگذاری" }];
+ }
+ return [
+ { value: "", label: "کل ادارات" },
+ ...edaratList.map((edare) => ({
+ value: edare.id,
+ label: edare.name_fa,
+ })),
+ ];
+ }, [edaratList, loadingEdaratList, errorEdaratList]);
+ useEffect(() => {
+ if (hasCountryPermission) return;
+ if (prevDependency === props.dependencyFieldValue?.value) return;
+ props.handleChange({ ...props.filterParameters, value: "" });
+ setPrevDependency(props.dependencyFieldValue?.value);
+ }, [props.dependencyFieldValue?.value, hasCountryPermission]);
+ return (
+
+ );
+ },
+ Cell: ({ renderedCellValue, row }) => <>{row.original.edare_shahri_name}>,
+ },
+ {
+ header: "اطلاعات فعالیت",
+ id: "info",
+ enableColumnFilter: false,
+ enableSorting: false,
+ datatype: "text",
+ grow: false,
+ size: 50,
+ columns: [
+ {
+ accessorKey: "info_id",
+ header: "مورد مشاهده شده",
+ id: "info_id",
+ enableColumnFilter: true,
+ datatype: "numeric",
+ filterMode: "equals",
+ grow: false,
+ size: 100,
+ ColumnSelectComponent: (props) => {
+ const { itemsList, loadingItemsList, errorItemsList } = useSafetyAndPrivacyGetItems();
+
+ const getColumnSelectOptions = useMemo(() => {
+ if (loadingItemsList) {
+ return [{ value: "loading", label: "در حال بارگذاری..." }];
+ }
+ if (errorItemsList) {
+ return [{ value: "error", label: "خطا در بارگذاری" }];
+ }
+ return [
+ { value: "", label: "همه موارد" },
+ ...itemsList.map((item) => ({
+ value: item.id,
+ label: item.name,
+ })),
+ ];
+ }, [itemsList, loadingItemsList, errorItemsList]);
+
+ return (
+
+ );
+ },
+ Cell: ({ row }) => <>{row.original.info_fa}>,
+ },
+ {
+ accessorKey: "axis_type_id",
+ header: "نوع محور",
+ id: "axis_type_id",
+ enableColumnFilter: true,
+ datatype: "numeric",
+ filterMode: "equals",
+ sortDescFirst: true,
+ grow: false,
+ size: 100,
+ columnSelectOption: () => {
+ return axisOptions.map((status) => ({
+ value: status.value,
+ label: status.label,
+ }));
+ },
+ Cell: ({ row }) => (row.original?.axis_type_name ? <>{row.original.axis_type_name}> : <>->),
+ },
+ {
+ accessorKey: "location",
+ header: "موقعیت",
+ id: "location",
+ enableColumnFilter: false,
+ enableSorting: false,
+ datatype: "array",
+ grow: false,
+ size: 100,
+ muiTableBodyCellProps: {
+ sx: {
+ borderLeft: "1px solid #e1e1e1",
+ py: 0,
+ "&:first-of-type": {
+ borderLeft: "unset",
+ },
+ },
+ },
+ Cell: ({ row }) => {
+ return (
+
+
+
+ );
+ },
+ },
+ {
+ accessorFn: (row) => moment(row.created_at).locale("fa").format("HH:mm | yyyy/MM/DD"),
+ header: "تاریخ ثبت",
+ id: "created_at",
+ enableColumnFilter: true,
+ datatype: "date",
+ filterMode: "between",
+ grow: false,
+ size: 100,
+ },
+ ],
+ },
+ {
+ header: "وضعیت فعالیت",
+ id: "allstatus",
+ enableColumnFilter: false,
+ enableSorting: false,
+ datatype: "text",
+ grow: false,
+ size: 50,
+ columns: [
+ {
+ header: "وضعیت گام ها",
+ id: "step",
+ enableColumnFilter: true,
+ datatype: "numeric",
+ filterMode: "equals",
+ sortDescFirst: true,
+ grow: false,
+ size: 100,
+ columnSelectOption: () => {
+ return stepOptions.map((status) => ({
+ value: status.value,
+ label: status.label,
+ }));
+ },
+ Cell: ({ row }) => <>{row.original.step_fa}>,
+ },
+ {
+ header: "وضعیت فرایند",
+ id: "is_finished",
+ enableColumnFilter: true,
+ datatype: "numeric",
+ filterMode: "equals",
+ sortDescFirst: true,
+ grow: false,
+ size: 100,
+ columnSelectOption: () => {
+ return finishOptions.map((status) => ({
+ value: status.value,
+ label: status.label,
+ }));
+ },
+ Cell: ({ row }) => (
+ <>
+ {row.original.is_finished == 1
+ ? "خاتمه یافته"
+ : row.original.is_finished == 0
+ ? "در جریان"
+ : "-"}
+ >
+ ),
+ },
+ {
+ header: "علت خاتمه فرایند",
+ id: "finished_description",
+ enableColumnFilter: false,
+ datatype: "numeric",
+ filterMode: "equals",
+ grow: false,
+ size: 100,
+ muiTableBodyCellProps: {
+ sx: {
+ borderLeft: "1px solid #e1e1e1",
+ py: 0,
+ "&:first-of-type": {
+ borderLeft: "unset",
+ },
+ },
+ },
+ Cell: ({ row }) =>
+ row.original.final_description ? (
+
+
+
+ ) : (
+ "-"
+ ),
+ },
+ {
+ 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 || "-"}>,
+ },
+ {
+ header: "توضیحات ناظر",
+ id: "supervisor_description",
+ enableColumnFilter: false,
+ datatype: "numeric",
+ filterMode: "equals",
+ grow: false,
+ size: 100,
+ muiTableBodyCellProps: {
+ sx: {
+ borderLeft: "1px solid #e1e1e1",
+ py: 0,
+ "&:first-of-type": {
+ borderLeft: "unset",
+ },
+ },
+ },
+ Cell: ({ row }) =>
+ row.original.supervisor_description ? (
+
+
+
+ ) : (
+ "-"
+ ),
+ },
+ ],
+ },
+ {
+ header: "گام اول (شناسایی)",
+ id: "stepOne",
+ enableColumnFilter: false,
+ enableSorting: false,
+ datatype: "text",
+ grow: false,
+ size: 50,
+ columns: [
+ {
+ accessorKey: "recognize_picture",
+ header: "تصویر بازدید",
+ id: "recognize_picture",
+ enableColumnFilter: false,
+ enableSorting: false,
+ datatype: "text",
+ grow: false,
+ size: 100,
+ muiTableBodyCellProps: {
+ sx: {
+ borderLeft: "1px solid #e1e1e1",
+ py: 0,
+ "&:first-of-type": {
+ borderLeft: "unset",
+ },
+ },
+ },
+ Cell: ({ renderedCellValue }) => {
+ return renderedCellValue ? (
+
+
+
+ ) : (
+ <>->
+ );
+ },
+ },
+ {
+ accessorFn: (row) =>
+ row.activity_date_time ? (
+ moment(row.activity_date_time).locale("fa").format("HH:mm | yyyy/MM/DD")
+ ) : (
+ <>->
+ ),
+ header: "تاریخ بازدید",
+ id: "activity_date_time",
+ enableColumnFilter: true,
+ datatype: "date",
+ filterMode: "between",
+ grow: false,
+ size: 100,
+ },
+ ],
+ },
+ {
+ header: "گام دوم (مستندات قضایی)",
+ id: "stepTwo",
+ enableColumnFilter: false,
+ enableSorting: false,
+ datatype: "text",
+ grow: false,
+ size: 50,
+ columns: [
+ {
+ header: "مستندات قضایی",
+ id: "judiciary_document",
+ enableColumnFilter: false,
+ enableSorting: false,
+ datatype: "text",
+ grow: false,
+ size: 100,
+ muiTableBodyCellProps: {
+ sx: {
+ borderLeft: "1px solid #e1e1e1",
+ py: 0,
+ "&:first-of-type": {
+ borderLeft: "unset",
+ },
+ },
+ },
+ Cell: ({ row }) => {
+ return (
+
+ {row.original.judiciary_document_upload_date !== "0000-00-00 00:00:00" &&
+ row.original.judiciary_document_upload_date ? (
+
+ ) : (
+ <>->
+ )}
+
+ );
+ },
+ },
+ {
+ accessorFn: (row) => {
+ const date = row.judiciary_document_upload_date;
+ if (!date || date === "0000-00-00 00:00:00") {
+ return <>->;
+ }
+ return moment(date, "YYYY-MM-DD HH:mm:ss").locale("fa").format("HH:mm | yyyy/MM/DD");
+ },
+
+ header: "تاریخ بارگذاری مستندات",
+ id: "judiciary_document_upload_date",
+ enableColumnFilter: true,
+ datatype: "date",
+ filterMode: "between",
+ grow: false,
+ size: 100,
+ },
+ {
+ header: "توضیحات کارشناس",
+ id: "operator_description",
+ enableColumnFilter: false,
+ datatype: "numeric",
+ filterMode: "equals",
+ grow: false,
+ size: 100,
+ muiTableBodyCellProps: {
+ sx: {
+ borderLeft: "1px solid #e1e1e1",
+ py: 0,
+ "&:first-of-type": {
+ borderLeft: "unset",
+ },
+ },
+ },
+ Cell: ({ row }) =>
+ row.original.operator_description ? (
+
+
+
+ ) : (
+ "-"
+ ),
+ },
+ ],
+ },
+ {
+ header: "گام سوم (برخورد)",
+ id: "stepThree",
+ enableColumnFilter: false,
+ enableSorting: false,
+ datatype: "text",
+ grow: false,
+ size: 50,
+ columns: [
+ {
+ accessorKey: "action_picture",
+ header: "تصویر اقدام",
+ id: "action_picture",
+ enableColumnFilter: false,
+ enableSorting: false,
+ datatype: "text",
+ grow: false,
+ size: 100,
+ muiTableBodyCellProps: {
+ sx: {
+ borderLeft: "1px solid #e1e1e1",
+ py: 0,
+ "&:first-of-type": {
+ borderLeft: "unset",
+ },
+ },
+ },
+ Cell: ({ renderedCellValue }) => {
+ return renderedCellValue ? (
+
+
+
+ ) : (
+ <>->
+ );
+ },
+ },
+ {
+ accessorFn: (row) =>
+ row.action_date ? (
+ moment(row.action_date).locale("fa").format("HH:mm | yyyy/MM/DD")
+ ) : (
+ <>->
+ ),
+ header: "تاریخ اقدام",
+ id: "action_date",
+ enableColumnFilter: true,
+ datatype: "date",
+ filterMode: "between",
+ grow: false,
+ size: 100,
+ },
+ ],
+ },
+ ];
+ }, []);
+
+ return (
+ <>
+
+
+
+ >
+ );
+};
+export default SupervisorList;
diff --git a/src/components/dashboard/roadSafety/supervisor/Toolbar.jsx b/src/components/dashboard/roadSafety/supervisor/Toolbar.jsx
new file mode 100644
index 0000000..88f55fb
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/Toolbar.jsx
@@ -0,0 +1,11 @@
+import { Stack } from "@mui/material";
+import PrintExcel from "./ExcelPrint";
+
+const Toolbar = ({ table, filterData, mutate }) => {
+ return (
+
+
+
+ );
+};
+export default Toolbar;
diff --git a/src/components/dashboard/roadSafety/supervisor/index.jsx b/src/components/dashboard/roadSafety/supervisor/index.jsx
new file mode 100644
index 0000000..356487f
--- /dev/null
+++ b/src/components/dashboard/roadSafety/supervisor/index.jsx
@@ -0,0 +1,14 @@
+"use client";
+import PageTitle from "@/core/components/PageTitle";
+import { Stack } from "@mui/material";
+import SupervisorList from "./SupervisorList";
+
+const SupervisorPage = () => {
+ return (
+
+
+
+
+ );
+};
+export default SupervisorPage;
diff --git a/src/components/infrastructure/tollHouse/RowActions/ImageForm/ImagesContent.jsx b/src/components/infrastructure/tollHouse/RowActions/ImageForm/ImagesContent.jsx
index 4b66734..6e22c9a 100644
--- a/src/components/infrastructure/tollHouse/RowActions/ImageForm/ImagesContent.jsx
+++ b/src/components/infrastructure/tollHouse/RowActions/ImageForm/ImagesContent.jsx
@@ -4,6 +4,7 @@ import DialogLoading from "@/core/components/DialogLoading";
import useRequest from "@/lib/hooks/useRequest";
import { GET_TOLL_HOUSE_IMAGES } from "@/core/utils/routes";
import { Typography } from "@mui/material";
+const titles = ["نمای کلی از راهداری", "آشیانه ماشین آلات", "انباری شن و ماسه", "محیط کاری", "سایر تصاویر"];
const ImagesContent = ({ rowId }) => {
const requestServer = useRequest();
@@ -27,7 +28,7 @@ const ImagesContent = ({ rowId }) => {
) : tollHouseImages ? (
tollHouseImages.map((image, index) => {
- return ;
+ return ;
})
) : (
تصویری در سامانه یافت نشد
diff --git a/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarMenu.jsx b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarMenu.jsx
index 4142b7f..3be25b1 100644
--- a/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarMenu.jsx
+++ b/src/components/layouts/dashboard/headerWithSidebar/Sidebar/SidebarMenu.jsx
@@ -7,6 +7,7 @@ import Profile from "@/core/components/Profile";
import { filterMenuItems } from "@/core/utils/filterMenuItems";
import { pageMenu } from "@/core/utils/pageMenu";
import SidebarListItems from "./SidebarListItems";
+import { pageMenuDev } from "@/core/utils/pageMenuDev";
function selectPage(item, route) {
if (item.type === "page") {
@@ -76,7 +77,7 @@ function reducer(state, action) {
const SidebarMenu = () => {
const { data: userPermissions } = usePermissions();
- const [menuItems, dispatch] = useReducer(reducer, pageMenu);
+ const [menuItems, dispatch] = useReducer(reducer, process.env.NODE_ENV == "production" ? pageMenu : pageMenuDev);
const pathname = usePathname();
const [selectedKey, setSelectedKey] = useState(null);
diff --git a/src/components/layouts/dashboard/headerWithSidebar/index.jsx b/src/components/layouts/dashboard/headerWithSidebar/index.jsx
index ed1cca5..1a35210 100644
--- a/src/components/layouts/dashboard/headerWithSidebar/index.jsx
+++ b/src/components/layouts/dashboard/headerWithSidebar/index.jsx
@@ -64,7 +64,7 @@ const HeaderWithSidebar = ({ children }) => {
setOpen(!isMobile); // Toggle state when screen size changes
}, [isMobile]);
- const now = moment().locale("fa").format("YYYY/MM/DD");
+ const now = moment().locale("fa").format("dddd YYYY/MM/DD");
const handleDrawerOpen = () => {
setOpen(true);
diff --git a/src/core/components/HourSelect.jsx b/src/core/components/HourSelect.jsx
new file mode 100644
index 0000000..37f62cd
--- /dev/null
+++ b/src/core/components/HourSelect.jsx
@@ -0,0 +1,26 @@
+import { FormControl, FormHelperText, InputLabel, MenuItem, Select } from "@mui/material";
+
+const HourSelect = ({ label, error, name, value, onChange }) => {
+ return (
+
+ {label}
+
+ {error?.message}
+
+ );
+};
+export default HourSelect;
diff --git a/src/core/utils/pageMenu.js b/src/core/utils/pageMenu.js
index a4e1d31..c314961 100644
--- a/src/core/utils/pageMenu.js
+++ b/src/core/utils/pageMenu.js
@@ -15,6 +15,7 @@ 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";
@@ -109,7 +110,7 @@ export const pageMenu = [
id: "roadItemManagmentSupervisorCartable",
label: "کارتابل",
type: "page",
- route: "/dashboard/road-items/supervisor",
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_items/supervisor/cartable",
permissions: [
"show-road-item-supervise-cartable",
"show-road-item-supervise-cartable-province",
@@ -125,11 +126,18 @@ 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: "/dashboard/road-items/operator",
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_items/operator/cartable",
permissions: ["create-road-item"],
},
],
@@ -138,7 +146,7 @@ export const pageMenu = [
id: "roadItemManagmentMap",
label: "پراکندگی بر روی نقشه",
type: "page",
- route: "/dashboard/road-items/reports/map",
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=road_items",
icon: ,
permissions: [
"show-road-item-supervise-cartable",
@@ -149,32 +157,13 @@ export const pageMenu = [
{
id: "roadItemManagmentReport",
label: "گزارش ها",
- type: "menu",
- icon: ,
- 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",
- ],
- },
+ type: "page",
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_items/report",
+ icon: ,
+ permissions: [
+ "show-road-item-supervise-cartable",
+ "show-road-item-supervise-cartable-province",
+ "create-road-item",
],
},
],
@@ -197,7 +186,7 @@ export const pageMenu = [
id: "roadPatrolManagmentSupervisorCartable",
label: "کارتابل",
type: "page",
- route: "/dashboard/road-patrols/supervisor",
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_patrols/supervisor/cartable",
permissions: [
"show-road-patrol-supervise-cartable",
"show-road-patrol-supervise-cartable-province",
@@ -212,11 +201,18 @@ export const pageMenu = [
icon: ,
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: "/dashboard/road-patrols/operator",
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_patrols/operator/cartable",
permissions: ["add-road-patrol"],
},
],
@@ -237,8 +233,8 @@ export const pageMenu = [
id: "roadPatrolManagmentReport",
label: "گزارش ها",
type: "page",
- route: "/dashboard/road-patrols/reports",
- icon: ,
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_patrols/report",
+ icon: ,
permissions: [
"add-road-patrol",
"show-road-patrol-supervise-cartable",
@@ -291,10 +287,31 @@ export const pageMenu = [
icon: ,
hasSubitems: true,
badges: [
+ { key: "safetyAndPrivacy.supervise_cnt" },
{ key: "safetyAndPrivacy.step_one", color: "warning" },
{ key: "safetyAndPrivacy.step_two", color: "error" },
],
Subitems: [
+ {
+ id: "safetyAndPrivacyManagmentSupervisor",
+ label: "ارزیابی",
+ type: "menu",
+ icon: ,
+ hasSubitems: true,
+ badges: [{ key: "safetyAndPrivacy.supervise_cnt" }],
+ Subitems: [
+ {
+ id: "safetyAndPrivacyManagmentSupervisorCartable",
+ label: "کارتابل",
+ type: "page",
+ route: "/dashboard/road-safety/supervisor",
+ permissions: [
+ "show-safety-and-privacy-operator-cartable",
+ "show-safety-and-privacy-operator-cartable-province",
+ ],
+ },
+ ],
+ },
{
id: "safetyAndPrivacyManagmentOparation",
label: "عملیات",
@@ -311,11 +328,7 @@ export const pageMenu = [
label: "کارتابل",
type: "page",
route: "/dashboard/road-safety/operator",
- permissions: [
- "show-safety-and-privacy-operator-cartable",
- "show-safety-and-privacy-operator-cartable-province",
- "show-safety-and-privacy-operator-cartable-edarate-shahri",
- ],
+ permissions: ["show-safety-and-privacy-operator-cartable-edarate-shahri"],
},
],
},
@@ -365,11 +378,19 @@ export const pageMenu = [
id: "roadObservationsManagmentSupervisorCartable",
label: "کارتابل",
type: "page",
- route: "/dashboard/fast-react/supervisor",
- permissions: ["show-fast-react", "show-fast-react-province"],
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_observations/supervisor/cartable",
+ permissions: ["supervise-fast-react", "supervise-fast-react-province"],
},
],
},
+ {
+ id: "roadObservationsManagmentList",
+ label: "رسیدگی به شکایات",
+ type: "page",
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_observations",
+ icon: ,
+ permissions: ["show-fast-react", "show-fast-react-province", "show-fast-react-edarate-shahri"],
+ },
{
id: "roadObservationsManagmentOparation",
label: "عملیات",
@@ -382,8 +403,8 @@ export const pageMenu = [
id: "roadObservationsManagmentOparationCartable",
label: "کارتابل",
type: "page",
- route: "/dashboard/fast-react/operator",
- permissions: ["show-fast-react-edarate-shahri"],
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_observations/operator/cartable",
+ permissions: ["show-fast-react", "show-fast-react-province", "show-fast-react-edarate-shahri"],
},
],
},
@@ -400,7 +421,7 @@ export const pageMenu = [
label: "گزارش ها",
type: "page",
route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_observations/report/index",
- icon: ,
+ icon: ,
permissions: ["all"],
},
],
@@ -433,7 +454,7 @@ export const pageMenu = [
label: "گزارش ها",
type: "page",
route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=campNew",
- icon: ,
+ icon: ,
permissions: ["show-camp", "show-camp-province"],
},
],
@@ -456,17 +477,17 @@ export const pageMenu = [
id: "receiptManagmentOparationCartable",
label: "کارتابل",
type: "page",
- route: "/dashboard/damages/operator",
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/receipt",
permissions: ["all"],
},
],
},
{
- id: "damagesManagmentReport",
+ id: "receiptManagmentReport",
label: "گزارش ها",
type: "page",
route: "/dashboard/damages/report",
- icon: ,
+ icon: ,
permissions: ["show-receipt", "show-receipt-province"],
},
],
diff --git a/src/core/utils/pageMenuDev.js b/src/core/utils/pageMenuDev.js
new file mode 100644
index 0000000..f881e04
--- /dev/null
+++ b/src/core/utils/pageMenuDev.js
@@ -0,0 +1,548 @@
+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 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 DriveEtaIcon from "@mui/icons-material/DriveEta";
+import BiotechIcon from "@mui/icons-material/Biotech";
+
+export const pageMenuDev = [
+ {
+ id: "dashboard",
+ label: "پیشخوان",
+ type: "page",
+ route: "/dashboard",
+ icon: ,
+ permissions: ["all"],
+ },
+ {
+ id: "userManagement",
+ label: "مدیریت کاربران",
+ type: "page",
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/user_management",
+ icon: ,
+ permissions: ["full-user-management", "limited-user-management"],
+ },
+ {
+ id: "projectsManagment",
+ label: "پروژه های راهداری",
+ type: "menu",
+ icon: ,
+ hasSubitems: true,
+ Subitems: [
+ {
+ id: "projectsManagmentFinance",
+ label: "ثبت قرارداد و پروژه",
+ type: "page",
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/rahdari_projects/finance",
+ icon: ,
+ permissions: ["show-contract", "show-contract-province"],
+ },
+ {
+ id: "projectsManagmentList",
+ label: "لیست پروژه ها",
+ type: "page",
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/rahdari_projects/projects_list",
+ icon: ,
+ permissions: ["all"],
+ },
+ {
+ id: "projectsManagmentProposal",
+ label: "پروژه های پیشنهادی",
+ type: "page",
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/rahdari_projects/proposal",
+ icon: ,
+ permissions: ["show-proposal", "show-proposal-province"],
+ },
+ {
+ id: "projectsManagmentLawmaker",
+ label: "درخواست نمایندگان",
+ type: "page",
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/rahdari_projects/lawmakers",
+ icon: ,
+ permissions: ["show-lawmaker", "show-lawmaker-province"],
+ },
+ {
+ id: "projectsManagmentMap",
+ label: "پراکندگی بر روی نقشه",
+ type: "page",
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=rahdari_projects",
+ icon: ,
+ permissions: ["all"],
+ },
+ ],
+ },
+ {
+ id: "roadItemManagment",
+ label: "فعالیت های روزانه",
+ type: "menu",
+ icon: ,
+ hasSubitems: true,
+ badges: [{ key: "roadItem.total" }],
+ Subitems: [
+ {
+ id: "roadItemManagmentSupervisor",
+ label: "ارزیابی",
+ type: "menu",
+ icon: ,
+ hasSubitems: true,
+ badges: [{ key: "roadItem.supervise_cnt" }],
+ Subitems: [
+ {
+ id: "roadItemManagmentSupervisorCartable",
+ label: "کارتابل",
+ type: "page",
+ route: "/dashboard/road-items/supervisor",
+ permissions: [
+ "show-road-item-supervise-cartable",
+ "show-road-item-supervise-cartable-province",
+ ],
+ },
+ ],
+ },
+ {
+ id: "roadItemManagmentOparation",
+ label: "عملیات",
+ type: "menu",
+ icon: ,
+ hasSubitems: true,
+ badges: [{ key: "roadItem.operation_cnt" }],
+ Subitems: [
+ {
+ id: "roadItemManagmentOparationCartable",
+ label: "کارتابل",
+ type: "page",
+ route: "/dashboard/road-items/operator",
+ permissions: ["create-road-item"],
+ },
+ ],
+ },
+ {
+ id: "roadItemManagmentMap",
+ label: "پراکندگی بر روی نقشه",
+ type: "page",
+ route: "/dashboard/road-items/reports/map",
+ icon: ,
+ permissions: [
+ "show-road-item-supervise-cartable",
+ "show-road-item-supervise-cartable-province",
+ "create-road-item",
+ ],
+ },
+ {
+ id: "roadItemManagmentReport",
+ label: "گزارش ها",
+ type: "menu",
+ icon: ,
+ 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",
+ ],
+ },
+ ],
+ },
+ ],
+ },
+ {
+ id: "roadPatrolManagment",
+ label: "گشت راهداری و ترابری",
+ type: "menu",
+ icon: ,
+ hasSubitems: true,
+ Subitems: [
+ {
+ id: "roadPatrolManagmentSupervisor",
+ label: "ارزیابی",
+ type: "menu",
+ icon: ,
+ hasSubitems: true,
+ Subitems: [
+ {
+ id: "roadPatrolManagmentSupervisorCartable",
+ label: "کارتابل",
+ type: "page",
+ route: "/dashboard/road-patrols/supervisor",
+ permissions: [
+ "show-road-patrol-supervise-cartable",
+ "show-road-patrol-supervise-cartable-province",
+ ],
+ },
+ ],
+ },
+ {
+ id: "roadPatrolManagmentOparation",
+ label: "عملیات",
+ type: "menu",
+ icon: ,
+ hasSubitems: true,
+ Subitems: [
+ {
+ id: "roadPatrolManagmentOparationCartable",
+ label: "کارتابل",
+ type: "page",
+ route: "/dashboard/road-patrols/operator",
+ permissions: ["add-road-patrol"],
+ },
+ ],
+ },
+ {
+ id: "roadPatrolManagmentMap",
+ label: "پراکندگی بر روی نقشه",
+ type: "page",
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=road_patrols",
+ icon: ,
+ permissions: [
+ "add-road-patrol",
+ "show-road-patrol-supervise-cartable",
+ "show-road-patrol-supervise-cartable-province",
+ ],
+ },
+ {
+ id: "roadPatrolManagmentReport",
+ label: "گزارش ها",
+ type: "page",
+ route: "/dashboard/road-patrols/reports",
+ icon: ,
+ permissions: [
+ "add-road-patrol",
+ "show-road-patrol-supervise-cartable",
+ "show-road-patrol-supervise-cartable-province",
+ ],
+ },
+ ],
+ },
+ {
+ id: "inquiryPrivacyManagment",
+ label: "استعلام حریم راه",
+ type: "menu",
+ icon: ,
+ hasSubitems: true,
+ Subitems: [
+ {
+ id: "cityAdminZaminGov",
+ label: "استعلام حرائم پنجره واحد",
+ type: "page",
+ route: "/dashboard/inquiry-privacy/city-admin/zamin-gov",
+ permissions: [],
+ },
+ {
+ id: "provinceAdminZaminGov",
+ label: "استعلام حرائم پنجره واحد",
+ type: "page",
+ route: "/dashboard/inquiry-privacy/province-admin/zamin-gov",
+ permissions: [],
+ },
+ {
+ id: "assistantZaminGov",
+ label: "استعلام حرائم پنجره واحد",
+ type: "page",
+ route: "/dashboard/inquiry-privacy/assistant/zamin-gov",
+ permissions: [],
+ },
+ {
+ id: "generalManagerZaminGov",
+ label: "استعلام حرائم پنجره واحد",
+ type: "page",
+ route: "/dashboard/inquiry-privacy/general-manager/zamin-gov",
+ permissions: [],
+ },
+ ],
+ },
+ {
+ id: "safetyAndPrivacyManagment",
+ label: "نگهداری حریم راه",
+ type: "menu",
+ icon: ,
+ hasSubitems: true,
+ badges: [
+ { key: "safetyAndPrivacy.supervise_cnt" },
+ { key: "safetyAndPrivacy.step_one", color: "warning" },
+ { key: "safetyAndPrivacy.step_two", color: "error" },
+ ],
+ Subitems: [
+ {
+ id: "safetyAndPrivacyManagmentSupervisor",
+ label: "ارزیابی",
+ type: "menu",
+ icon: ,
+ hasSubitems: true,
+ badges: [{ key: "safetyAndPrivacy.supervise_cnt" }],
+ Subitems: [
+ {
+ id: "safetyAndPrivacyManagmentSupervisorCartable",
+ label: "کارتابل",
+ type: "page",
+ route: "/dashboard/road-safety/supervisor",
+ permissions: [
+ "show-safety-and-privacy-operator-cartable",
+ "show-safety-and-privacy-operator-cartable-province",
+ ],
+ },
+ ],
+ },
+ {
+ id: "safetyAndPrivacyManagmentOparation",
+ label: "عملیات",
+ type: "menu",
+ icon: ,
+ hasSubitems: true,
+ badges: [
+ { key: "safetyAndPrivacy.step_one", color: "warning" },
+ { key: "safetyAndPrivacy.step_two", color: "error" },
+ ],
+ Subitems: [
+ {
+ id: "safetyAndPrivacyManagmentOparationCartable",
+ label: "کارتابل",
+ type: "page",
+ route: "/dashboard/road-safety/operator",
+ permissions: ["show-safety-and-privacy-operator-cartable-edarate-shahri"],
+ },
+ ],
+ },
+ {
+ id: "safetyAndPrivacyManagmentMap",
+ label: "پراکندگی بر روی نقشه",
+ type: "page",
+ route: "/dashboard/road-safety/reports/map",
+ icon: ,
+ permissions: [
+ "show-safety-and-privacy-operator-cartable",
+ "show-safety-and-privacy-operator-cartable-province",
+ "show-safety-and-privacy-operator-cartable-edarate-shahri",
+ ],
+ },
+ {
+ id: "safetyAndPrivacyManagmentReport",
+ label: "گزارش ها",
+ type: "page",
+ route: "/dashboard/road-safety/reports",
+ icon: ,
+ permissions: [
+ "show-safety-and-privacy-operator-cartable",
+ "show-safety-and-privacy-operator-cartable-province",
+ "show-safety-and-privacy-operator-cartable-edarate-shahri",
+ ],
+ },
+ ],
+ },
+ {
+ id: "roadObservationsManagment",
+ label: "واکنش سریع",
+ type: "menu",
+ icon: ,
+ hasSubitems: true,
+ badges: [{ key: "roadObserved.total" }],
+ Subitems: [
+ {
+ id: "roadObservationsManagmentSupervisor",
+ label: "ارزیابی",
+ type: "menu",
+ icon: ,
+ hasSubitems: true,
+ badges: [{ key: "roadObserved.supervise_cnt" }, { key: "roadObserved.complaint_cnt", color: "info" }],
+ Subitems: [
+ {
+ id: "roadObservationsManagmentSupervisorCartable",
+ label: "کارتابل",
+ type: "page",
+ route: "/dashboard/fast-react/supervisor",
+ permissions: ["show-fast-react", "show-fast-react-province"],
+ },
+ ],
+ },
+ {
+ id: "roadObservationsManagmentOparation",
+ label: "عملیات",
+ type: "menu",
+ icon: ,
+ hasSubitems: true,
+ badges: [{ key: "roadObserved.operation_cnt" }, { key: "roadObserved.complaint_cnt", color: "info" }],
+ Subitems: [
+ {
+ id: "roadObservationsManagmentOparationCartable",
+ label: "کارتابل",
+ type: "page",
+ route: "/dashboard/fast-react/operator",
+ permissions: ["show-fast-react-edarate-shahri"],
+ },
+ ],
+ },
+ {
+ id: "roadObservationsManagmentMap",
+ label: "پراکندگی بر روی نقشه",
+ type: "page",
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=road_observations",
+ icon: ,
+ permissions: ["all"],
+ },
+ {
+ id: "roadObservationsManagmentReport",
+ label: "گزارش ها",
+ type: "page",
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_observations/report/index",
+ icon: ,
+ permissions: ["all"],
+ },
+ ],
+ },
+ {
+ id: "winterCampManagment",
+ label: "قرارگاه زمستانی",
+ type: "menu",
+ icon: ,
+ hasSubitems: true,
+ Subitems: [
+ {
+ id: "winterCampManagmentBlocking",
+ label: "محور های انسدادی",
+ type: "page",
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/winter_camp",
+ icon: ,
+ permissions: ["show-camp", "show-camp-province"],
+ },
+ {
+ id: "winterCampManagmentFirstRing",
+ label: "محور های حلقه اول",
+ type: "page",
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=camp",
+ icon: ,
+ permissions: ["show-camp", "show-camp-province"],
+ },
+ {
+ id: "winterCampManagmentReport",
+ label: "گزارش ها",
+ type: "page",
+ route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=campNew",
+ icon: ,
+ permissions: ["show-camp", "show-camp-province"],
+ },
+ ],
+ },
+ {
+ id: "receiptManagment",
+ label: "خسارات وارده بر ابنیه فنی و تاسیسات راه",
+ type: "menu",
+ icon: ,
+ hasSubitems: true,
+ Subitems: [
+ {
+ id: "receiptManagmentOparation",
+ label: "عملیات",
+ type: "menu",
+ icon: ,
+ hasSubitems: true,
+ Subitems: [
+ {
+ id: "receiptManagmentOparationCartable",
+ label: "کارتابل",
+ type: "page",
+ route: "/dashboard/damages/operator",
+ permissions: ["all"],
+ },
+ ],
+ },
+ {
+ id: "damagesManagmentReport",
+ label: "گزارش ها",
+ type: "page",
+ route: "/dashboard/damages/report",
+ icon: ,
+ permissions: ["show-receipt", "show-receipt-province"],
+ },
+ ],
+ },
+ {
+ id: "azmayesh",
+ label: "آزمایشات (OPTS)",
+ type: "page",
+ route: "/dashboard/azmayesh",
+ icon: ,
+ permissions: ["azmayesh-management"],
+ },
+ {
+ id: "azmayeshType",
+ label: "نوع آزمایشات",
+ type: "page",
+ route: "/dashboard/azmayesh_type",
+ icon: ,
+ permissions: ["azmayesh-type-management"],
+ },
+ {
+ id: "adminManagement",
+ label: "مدیریت سامانه",
+ type: "menu",
+ icon: ,
+ hasSubitems: true,
+ Subitems: [
+ {
+ id: "permissionItem",
+ label: "سطح دسترسی ها",
+ type: "page",
+ route: "/dashboard/permissions",
+ icon: ,
+ permissions: ["manage-permissions"],
+ },
+ {
+ id: "userActivities",
+ label: "انواع فعالیت کاربران",
+ type: "page",
+ route: "/dashboard/user-activities",
+ icon: ,
+ permissions: ["manage-log-list"],
+ },
+ {
+ id: "damageItems",
+ label: "آیتم خسارات وارده بر ابنیه فنی",
+ type: "page",
+ route: "/dashboard/damage-items",
+ icon: ,
+ permissions: ["manage-damage"],
+ },
+ {
+ id: "CarDetails",
+ label: "اطلاعات خودرو",
+ type: "page",
+ route: "/dashboard/car-details",
+ icon: ,
+ permissions: [""],
+ },
+ ],
+ },
+];
diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js
index 4fd9f13..ab33deb 100644
--- a/src/core/utils/routes.js
+++ b/src/core/utils/routes.js
@@ -130,15 +130,22 @@ export const EXPORT_FAST_REACT_OPERATOR_LIST = api + "/api/v3/road_observations/
export const EXPORT_FAST_REACT_COMPLAINT_LIST = api + "/api/v3/road_observations/complaints_report";
// road safety
-export const GET_SAFETY_AND_PRIVACY = api + "/api/v3/safety_and_privacy";
-export const DELETE_SAFETY_AND_PRIVACY = api + "/api/v3/safety_and_privacy";
+export const GET_SAFETY_AND_PRIVACY_OPERATOR = api + "/api/v3/safety_and_privacy/operator";
+export const DELETE_SAFETY_AND_PRIVACY = api + "/api/v3/safety_and_privacy/operator";
+export const FIRST_STEP_STORE = api + "/api/v3/safety_and_privacy/operator/first_step_store";
+export const SECOND_STEP_STORE = api + "/api/v3/safety_and_privacy/operator/second_step_store";
+export const THIRD_STEP_STORE = api + "/api/v3/safety_and_privacy/operator/third_step_store";
+export const UPDATE_SAFETY_AND_PRIVACY = api + "/api/v3/safety_and_privacy/operator";
+export const FINISH_ROAD_SAFETY_BY_SUPERVISOR = api + "/api/v3/safety_and_privacy/operator/finish";
+export const EXPORT_OPERATOR_ROAD_SAFETY = api + "/api/v3/safety_and_privacy/operator/excel_report";
+
+export const GET_SAFETY_AND_PRIVACY_SUPERVISOR = api + "/api/v3/safety_and_privacy/supervisor";
+export const EXPORT_SUPERVISOR_ROAD_SAFETY = api + "/api/v3/safety_and_privacy/supervisor/excel_report";
+export const CONFIRM_ROAD_SAFETY_BY_SUPERVISOR = api + "/api/v3/safety_and_privacy/supervisor/confirm";
+export const REJECT_ROAD_SAFETY_BY_SUPERVISOR = api + "/api/v3/safety_and_privacy/supervisor/reject";
+
export const DESERIALIZE_JUDICIARY_DOCUMENT = api + "/api/v3/safety_and_privacy/deserialize";
export const GET_SAFETY_AND_PRIVACY_ITEM = api + "/api/v3/safety_and_privacy/sub_items";
-export const FIRST_STEP_STORE = api + "/api/v3/safety_and_privacy/first_step_store";
-export const SECOND_STEP_STORE = api + "/api/v3/safety_and_privacy/second_step_store";
-export const THIRD_STEP_STORE = api + "/api/v3/safety_and_privacy/third_step_store";
-export const UPDATE_SAFETY_AND_PRIVACY = api + "/api/v3/safety_and_privacy";
-export const EXPORT_OPERATOR_ROAD_SAFETY = api + "/api/v3/safety_and_privacy/excel_report";
export const GET_ROAD_SAFETY_PROVINCE_ACTIVITY_REPORT = api + "/api/v3/safety_and_privacy_report/country_activity";
export const GET_ROAD_SAFETY_CITY_ACTIVITY_REPORT = api + "/api/v3/safety_and_privacy_report/province_activity";
export const GET_ROAD_SAFETY_REPORT_MAP = api + "/api/v3/safety_and_privacy/map";