From fc02d979e1462367d987bc4904bf8b69b59ff008 Mon Sep 17 00:00:00 2001 From: AminGhasempoor Date: Tue, 15 Apr 2025 13:57:25 +0330 Subject: [PATCH 01/11] add title to images --- .../tollHouse/RowActions/ImageForm/ImagesContent.jsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/components/infrastructure/tollHouse/RowActions/ImageForm/ImagesContent.jsx b/src/components/infrastructure/tollHouse/RowActions/ImageForm/ImagesContent.jsx index 4b66734..c54c0d7 100644 --- a/src/components/infrastructure/tollHouse/RowActions/ImageForm/ImagesContent.jsx +++ b/src/components/infrastructure/tollHouse/RowActions/ImageForm/ImagesContent.jsx @@ -4,6 +4,13 @@ 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 +34,7 @@ const ImagesContent = ({ rowId }) => { ) : tollHouseImages ? ( tollHouseImages.map((image, index) => { - return ; + return ; }) ) : ( تصویری در سامانه یافت نشد From 26ab36ee6fed93ca579c774d439a808247cf3315 Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Sun, 27 Apr 2025 12:07:17 +0000 Subject: [PATCH 02/11] Feature/road safety cartable --- .../dashboard/azmayesh/loading.jsx | 7 - .../dashboard/azmayesh_type/loading.jsx | 7 - .../road-patrols/operator/loading.jsx | 7 - .../road-patrols/supervisor/loading.jsx | 7 - .../road-safety/operator/loading.jsx | 7 - .../dashboard/road-safety/operator/page.js | 8 +- .../dashboard/road-safety/supervisor/page.js | 21 + .../operator/Form/StepTwo/StepTwoContent.jsx | 210 ++++-- .../roadSafety/operator/OperatorList.jsx | 304 +++++---- .../RowActions/DescriptionForm/index.jsx | 51 ++ .../FinishDescriptionForm/index.jsx | 51 ++ .../RowActions/FinishForm/FinishContent.jsx | 80 +++ .../operator/RowActions/FinishForm/index.jsx | 29 + .../OperatorDescriptionForm/index.jsx | 51 ++ .../roadSafety/operator/RowActions/index.jsx | 7 +- .../supervisor/ExcelPrint/index.jsx | 74 +++ .../ActionPictureContent.jsx | 44 ++ .../RowActions/ActionPictureDialog/index.jsx | 40 ++ .../RowActions/ConfirmForm/ConfirmContent.jsx | 70 ++ .../RowActions/ConfirmForm/index.jsx | 29 + .../RowActions/DeleteDialog/DeleteContent.jsx | 42 ++ .../RowActions/DeleteDialog/index.jsx | 32 + .../RowActions/DescriptionForm/index.jsx | 51 ++ .../FinishDescriptionForm/index.jsx | 51 ++ .../JudiciaryDocumentContent.jsx | 43 ++ .../JudiciaryDocumentController.jsx | 35 + .../JudiciaryDocumentDialog/index.jsx | 40 ++ .../LocationForm/LocationFormContent.jsx | 35 + .../RowActions/LocationForm/index.jsx | 40 ++ .../OperatorDescriptionForm/index.jsx | 51 ++ .../RecognizePictureContent.jsx | 44 ++ .../RecognizePictureDialog/index.jsx | 40 ++ .../RowActions/RejectForm/RejectContent.jsx | 83 +++ .../RowActions/RejectForm/index.jsx | 29 + .../supervisor/RowActions/index.jsx | 22 + .../roadSafety/supervisor/SupervisorList.jsx | 606 ++++++++++++++++++ .../roadSafety/supervisor/Toolbar.jsx | 11 + .../dashboard/roadSafety/supervisor/index.jsx | 14 + src/core/utils/pageMenu.js | 27 +- src/core/utils/routes.js | 21 +- 40 files changed, 2164 insertions(+), 257 deletions(-) delete mode 100644 src/app/(withAuth)/(dashboardLayout)/dashboard/azmayesh/loading.jsx delete mode 100644 src/app/(withAuth)/(dashboardLayout)/dashboard/azmayesh_type/loading.jsx delete mode 100644 src/app/(withAuth)/(dashboardLayout)/dashboard/road-patrols/operator/loading.jsx delete mode 100644 src/app/(withAuth)/(dashboardLayout)/dashboard/road-patrols/supervisor/loading.jsx delete mode 100644 src/app/(withAuth)/(dashboardLayout)/dashboard/road-safety/operator/loading.jsx create mode 100644 src/app/(withAuth)/(dashboardLayout)/dashboard/road-safety/supervisor/page.js create mode 100644 src/components/dashboard/roadSafety/operator/RowActions/DescriptionForm/index.jsx create mode 100644 src/components/dashboard/roadSafety/operator/RowActions/FinishDescriptionForm/index.jsx create mode 100644 src/components/dashboard/roadSafety/operator/RowActions/FinishForm/FinishContent.jsx create mode 100644 src/components/dashboard/roadSafety/operator/RowActions/FinishForm/index.jsx create mode 100644 src/components/dashboard/roadSafety/operator/RowActions/OperatorDescriptionForm/index.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/ExcelPrint/index.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/RowActions/ActionPictureDialog/ActionPictureContent.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/RowActions/ActionPictureDialog/index.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/RowActions/ConfirmForm/ConfirmContent.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/RowActions/ConfirmForm/index.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/RowActions/DeleteDialog/DeleteContent.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/RowActions/DeleteDialog/index.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/RowActions/DescriptionForm/index.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/RowActions/FinishDescriptionForm/index.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/RowActions/JudiciaryDocumentDialog/JudiciaryDocumentContent.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/RowActions/JudiciaryDocumentDialog/JudiciaryDocumentController.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/RowActions/JudiciaryDocumentDialog/index.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/RowActions/LocationForm/LocationFormContent.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/RowActions/LocationForm/index.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/RowActions/OperatorDescriptionForm/index.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/RowActions/RecognizePictureDialog/RecognizePictureContent.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/RowActions/RecognizePictureDialog/index.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/RowActions/RejectForm/RejectContent.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/RowActions/RejectForm/index.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/RowActions/index.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/SupervisorList.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/Toolbar.jsx create mode 100644 src/components/dashboard/roadSafety/supervisor/index.jsx 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/components/dashboard/roadSafety/operator/Form/StepTwo/StepTwoContent.jsx b/src/components/dashboard/roadSafety/operator/Form/StepTwo/StepTwoContent.jsx index c9ab104..e9d5a6e 100644 --- a/src/components/dashboard/roadSafety/operator/Form/StepTwo/StepTwoContent.jsx +++ b/src/components/dashboard/roadSafety/operator/Form/StepTwo/StepTwoContent.jsx @@ -1,8 +1,23 @@ -import { Box, Button, Chip, DialogActions, DialogContent, Divider, Fade, Grid, Stack, Typography } from "@mui/material"; +import { + Box, + Button, + Chip, + DialogActions, + DialogContent, + Divider, + Fade, + FormControlLabel, + Grid, + Radio, + RadioGroup, + Stack, + TextField, + Typography, +} from "@mui/material"; import { useEffect, useState } from "react"; -import { Controller, useForm } from "react-hook-form"; +import { Controller, useForm, useWatch } from "react-hook-form"; import { yupResolver } from "@hookform/resolvers/yup"; -import { mixed, object } from "yup"; +import { mixed, object, string } from "yup"; import ShowDocuments from "./ShowDocuments"; import StyledForm from "@/core/components/StyledForm"; import { SECOND_STEP_STORE } from "@/core/utils/routes"; @@ -12,24 +27,35 @@ const StepTwoContent = ({ setOpenStepTwoDialog, mutate, rowId }) => { 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 FinishContent; diff --git a/src/components/dashboard/roadSafety/operator/RowActions/FinishForm/index.jsx b/src/components/dashboard/roadSafety/operator/RowActions/FinishForm/index.jsx new file mode 100644 index 0000000..a4340d7 --- /dev/null +++ b/src/components/dashboard/roadSafety/operator/RowActions/FinishForm/index.jsx @@ -0,0 +1,29 @@ +import DoneAllIcon from "@mui/icons-material/DoneAll"; +import { Dialog, DialogTitle, IconButton, Tooltip } from "@mui/material"; +import { useState } from "react"; +import FinishContent from "./FinishContent"; +const FinishForm = ({ rowId, mutate }) => { + const [openFinishDialog, setOpenFinishDialog] = useState(false); + return ( + <> + + setOpenFinishDialog(true)}> + + + + + خاتمه فرایند + + + + ); +}; +export default FinishForm; diff --git a/src/components/dashboard/roadSafety/operator/RowActions/OperatorDescriptionForm/index.jsx b/src/components/dashboard/roadSafety/operator/RowActions/OperatorDescriptionForm/index.jsx new file mode 100644 index 0000000..9a59745 --- /dev/null +++ b/src/components/dashboard/roadSafety/operator/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)}> + + + + setOpenOfficerDescriptionDialog(false)} + PaperProps={{ + sx: { + transition: "all .3s", + boxShadow: "rgba(60, 64, 67, 0.3) 0px 1px 16px 0px, rgba(60, 64, 67, 0.15) 0px 1px 10px 0px", + borderRadius: 2, + padding: 1, + }, + }} + maxWidth="sm" + fullWidth + dir="rtl" + > + + + توضیحات کارشناس + + setOpenOfficerDescriptionDialog(false)} size="small"> + + + + + + + {description || "هیچ توضیحی موجود نیست"} + + + + + + ); +}; + +export default OperatorDescriptionForm; diff --git a/src/components/dashboard/roadSafety/operator/RowActions/index.jsx b/src/components/dashboard/roadSafety/operator/RowActions/index.jsx index 85a7f23..8b3344b 100644 --- a/src/components/dashboard/roadSafety/operator/RowActions/index.jsx +++ b/src/components/dashboard/roadSafety/operator/RowActions/index.jsx @@ -4,21 +4,20 @@ import EditAxisType from "../Form/EditAxisType"; import StepThree from "../Form/StepThree"; import StepTwo from "../Form/StepTwo"; import DeleteForm from "./DeleteDialog"; +import FinishForm from "./FinishForm"; const RowActions = ({ row, mutate }) => { const { data: userPermissions } = usePermissions(); const hasDeletePermission = userPermissions?.includes("delete-safety-and-privacy"); const hasUpdatePermission = userPermissions?.includes("update-safety-and-privacy"); - const hasEdarateShahriPermission = userPermissions?.includes( - "show-safety-and-privacy-operator-cartable-edarate-shahri" - ); return ( {hasUpdatePermission && row.original?.axis_type_id == null && } - {hasEdarateShahriPermission && ( + {!row.original.is_finished && ( <> {row.original?.step === 1 && } {row.original?.step === 2 && } + )} {hasDeletePermission && } diff --git a/src/components/dashboard/roadSafety/supervisor/ExcelPrint/index.jsx b/src/components/dashboard/roadSafety/supervisor/ExcelPrint/index.jsx new file mode 100644 index 0000000..d66215e --- /dev/null +++ b/src/components/dashboard/roadSafety/supervisor/ExcelPrint/index.jsx @@ -0,0 +1,74 @@ +import DataTableFilterDataStructure from "@/core/utils/DataTableFilterDataStructure"; +import isArrayEmpty from "@/core/utils/isArrayEmpty"; +import { EXPORT_SUPERVISOR_ROAD_SAFETY } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; +import { useTheme } from "@emotion/react"; +import DescriptionIcon from "@mui/icons-material/Description"; +import { Button, CircularProgress, IconButton, useMediaQuery } from "@mui/material"; +import FileSaver from "file-saver"; +import moment from "jalali-moment"; +import { useMemo, useState } from "react"; + +const PrintExcel = ({ table, filterData }) => { + const [loading, setLoading] = useState(false); + const theme = useTheme(); + const isMobile = useMediaQuery(theme.breakpoints.down("sm")); + const requestServer = useRequest(); + const activeFilters = Object.entries(filterData).reduce((acc, [key, filter]) => { + if (filter.value && (!Array.isArray(filter.value) || filter.value.some((item) => item.trim() !== ""))) { + acc.push({ id: key, value: filter.value }); + } + return acc; + }, []); + + const filterParams = useMemo(() => { + const params = new URLSearchParams(); + if (activeFilters.length > 0) { + activeFilters.map((filter, index) => { + const filteredFilterData = DataTableFilterDataStructure(filterData, isArrayEmpty); + params.set("filters", JSON.stringify(filteredFilterData.length === 0 ? [] : filteredFilterData)); + }); + } else { + params.set("filters", JSON.stringify([])); + } + return params; + }, [activeFilters]); + + const clickHandler = () => { + setLoading(true); + requestServer(`${EXPORT_SUPERVISOR_ROAD_SAFETY}?${filterParams}`, "get", { + requestOptions: { responseType: "blob" }, + }) + .then((response) => { + const filename = `خروجی کارتابل ارزیابی نگهداری حریم تاریخ_${moment().format("jYYYY_jMM_jDD")}.xlsx`; + FileSaver.saveAs(response.data, filename); + }) + .catch(() => {}) + .finally(() => { + setLoading(false); + }); + }; + + return ( + <> + {isMobile ? ( + + + + ) : ( + + )} + + ); +}; +export default PrintExcel; diff --git a/src/components/dashboard/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} + + + Image + + + ); +}; +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)}> + + + + setOpenImageDialog(false)} + PaperProps={{ + sx: { + boxShadow: "rgba(60, 64, 67, 0.3) 0px 1px 16px 0px, rgba(60, 64, 67, 0.15) 0px 1px 10px 0px", + }, + }} + maxWidth={"sm"} + scroll="paper" + > + + + + + + + + + ); +}; +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 ( + <> + + + + + + + + + + + + + ); +}; + +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 ( + <> + + + آیا از حذف فعالیت اطمینان دارید؟ + + + + + + + + ); +}; + +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)}> + + + + setOpenDeleteDialog(false)} + PaperProps={{ + sx: { + boxShadow: "rgba(60, 64, 67, 0.3) 0px 1px 16px 0px, rgba(60, 64, 67, 0.15) 0px 1px 10px 0px", + }, + }} + dir="rtl" + maxWidth={"md"} + > + حذف فعالیت + + + + ); +}; +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)}> + + + + setOpenOfficerDescriptionDialog(false)} + PaperProps={{ + sx: { + transition: "all .3s", + boxShadow: "rgba(60, 64, 67, 0.3) 0px 1px 16px 0px, rgba(60, 64, 67, 0.15) 0px 1px 10px 0px", + borderRadius: 2, + padding: 1, + }, + }} + maxWidth="sm" + fullWidth + dir="rtl" + > + + + توضیحات ناظر + + setOpenOfficerDescriptionDialog(false)} size="small"> + + + + + + + {description || "هیچ توضیحی موجود نیست"} + + + + + + ); +}; + +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)}> + + + + setOpenOfficerDescriptionDialog(false)} + PaperProps={{ + sx: { + transition: "all .3s", + boxShadow: "rgba(60, 64, 67, 0.3) 0px 1px 16px 0px, rgba(60, 64, 67, 0.15) 0px 1px 10px 0px", + borderRadius: 2, + padding: 1, + }, + }} + maxWidth="sm" + fullWidth + dir="rtl" + > + + + علت خاتمه فرایند + + setOpenOfficerDescriptionDialog(false)} size="small"> + + + + + + + {description || "هیچ توضیحی موجود نیست"} + + + + + + ); +}; + +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} + + } + /> + + + + + ); + })} + + ); +}; +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)}> + + + + setOpenJudiciaryDocumentDialog(false)} + PaperProps={{ + sx: { + boxShadow: "rgba(60, 64, 67, 0.3) 0px 1px 16px 0px, rgba(60, 64, 67, 0.15) 0px 1px 10px 0px", + }, + }} + dir="rtl" + maxWidth={"sm"} + fullWidth + > + مشاهده مستندات قضایی + + + + + + + + + ); +}; +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 ( + <> + + + + + + + + + + + + ); +}; +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)}> + + + + setOpenLocationDialog(false)} + PaperProps={{ + sx: { + boxShadow: "rgba(60, 64, 67, 0.3) 0px 1px 16px 0px, rgba(60, 64, 67, 0.15) 0px 1px 10px 0px", + }, + }} + dir="rtl" + maxWidth={"md"} + > + موقعیت + {openLocationDialog && ( + + )} + + + ); +}; +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)}> + + + + setOpenOfficerDescriptionDialog(false)} + PaperProps={{ + sx: { + transition: "all .3s", + boxShadow: "rgba(60, 64, 67, 0.3) 0px 1px 16px 0px, rgba(60, 64, 67, 0.15) 0px 1px 10px 0px", + borderRadius: 2, + padding: 1, + }, + }} + maxWidth="sm" + fullWidth + dir="rtl" + > + + + توضیحات کارشناس + + setOpenOfficerDescriptionDialog(false)} size="small"> + + + + + + + {description || "هیچ توضیحی موجود نیست"} + + + + + + ); +}; + +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} + + + Image + + + ); +}; +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)}> + + + + setOpenImageDialog(false)} + PaperProps={{ + sx: { + boxShadow: "rgba(60, 64, 67, 0.3) 0px 1px 16px 0px, rgba(60, 64, 67, 0.15) 0px 1px 10px 0px", + }, + }} + maxWidth={"sm"} + scroll="paper" + > + + + + + + + + + ); +}; +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 ( + <> + + + + + + + + + + + + + ); +}; +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/core/utils/pageMenu.js b/src/core/utils/pageMenu.js index a4e1d31..c6bc66c 100644 --- a/src/core/utils/pageMenu.js +++ b/src/core/utils/pageMenu.js @@ -291,10 +291,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 +332,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"], }, ], }, 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"; From 17fa016bd96cb65bac0398a1c10de1ed16f5cb16 Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Tue, 13 May 2025 09:10:30 +0330 Subject: [PATCH 03/11] add arvancloud --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 684f35d6484d14022143a063224a883547566945 Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Tue, 13 May 2025 09:10:41 +0330 Subject: [PATCH 04/11] add SWRConfig --- src/app/(withAuth)/(dashboardLayout)/layout.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/app/(withAuth)/(dashboardLayout)/layout.js b/src/app/(withAuth)/(dashboardLayout)/layout.js index 219cee2..181673f 100644 --- a/src/app/(withAuth)/(dashboardLayout)/layout.js +++ b/src/app/(withAuth)/(dashboardLayout)/layout.js @@ -1,13 +1,16 @@ 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; From 1286987a5c9b486252df21ab96252cb9a0acac45 Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Tue, 13 May 2025 14:08:34 +0330 Subject: [PATCH 05/11] fixed bug --- src/app/(withAuth)/(dashboardLayout)/layout.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/(withAuth)/(dashboardLayout)/layout.js b/src/app/(withAuth)/(dashboardLayout)/layout.js index 181673f..f13663c 100644 --- a/src/app/(withAuth)/(dashboardLayout)/layout.js +++ b/src/app/(withAuth)/(dashboardLayout)/layout.js @@ -1,3 +1,4 @@ +"use client"; import HeaderWithLogo from "@/components/layouts/dashboard/headerWithLogo"; import HeaderWithSidebar from "@/components/layouts/dashboard/headerWithSidebar"; import { Stack } from "@mui/material"; From b089f2c7fa2454e085d14c42a047c505d1e9a341 Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Tue, 13 May 2025 14:10:58 +0330 Subject: [PATCH 06/11] add page menu dev --- .../headerWithSidebar/Sidebar/SidebarMenu.jsx | 3 +- src/core/utils/pageMenuDev.js | 548 ++++++++++++++++++ 2 files changed, 550 insertions(+), 1 deletion(-) create mode 100644 src/core/utils/pageMenuDev.js 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/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: [""], + }, + ], + }, +]; From 5f7f80839629208e5997936576460d3267eb6753 Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Tue, 13 May 2025 14:11:39 +0330 Subject: [PATCH 07/11] formatting --- .../tollHouse/RowActions/ImageForm/ImagesContent.jsx | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/components/infrastructure/tollHouse/RowActions/ImageForm/ImagesContent.jsx b/src/components/infrastructure/tollHouse/RowActions/ImageForm/ImagesContent.jsx index c54c0d7..6e22c9a 100644 --- a/src/components/infrastructure/tollHouse/RowActions/ImageForm/ImagesContent.jsx +++ b/src/components/infrastructure/tollHouse/RowActions/ImageForm/ImagesContent.jsx @@ -4,13 +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 titles = ["نمای کلی از راهداری", "آشیانه ماشین آلات", "انباری شن و ماسه", "محیط کاری", "سایر تصاویر"]; const ImagesContent = ({ rowId }) => { const requestServer = useRequest(); From 53bcc61b5956605271baa37d7993ffd5cf68fdd9 Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Tue, 13 May 2025 14:26:39 +0330 Subject: [PATCH 08/11] fixed bug --- src/core/utils/pageMenu.js | 134 ++++++++++++++++++------------------- 1 file changed, 65 insertions(+), 69 deletions(-) diff --git a/src/core/utils/pageMenu.js b/src/core/utils/pageMenu.js index c6bc66c..0b4f4f4 100644 --- a/src/core/utils/pageMenu.js +++ b/src/core/utils/pageMenu.js @@ -15,7 +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 AssessmentIcon from "@mui/icons-material/Assessment"; +import ReportIcon from "@mui/icons-material/Report"; import AssignmentLateIcon from "@mui/icons-material/AssignmentLate"; import LockPersonIcon from "@mui/icons-material/LockPerson"; import LineAxisIcon from "@mui/icons-material/LineAxis"; @@ -109,7 +109,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 +125,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 +145,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 +156,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 +185,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 +200,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 +232,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", @@ -296,26 +291,6 @@ export const pageMenu = [ { 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: "عملیات", @@ -327,12 +302,23 @@ export const pageMenu = [ { key: "safetyAndPrivacy.step_two", color: "error" }, ], Subitems: [ + { + id: "safetyAndPrivacyManagmentOparationCreate", + label: "ثبت فعالیت", + type: "page", + route: process.env.NEXT_PUBLIC_API_URL + "/v2/safety_and_privacy/operator/first_step", + permissions: ["add-safety-and-privacy"], + }, { id: "safetyAndPrivacyManagmentOparationCartable", label: "کارتابل", type: "page", - route: "/dashboard/road-safety/operator", - permissions: ["show-safety-and-privacy-operator-cartable-edarate-shahri"], + route: process.env.NEXT_PUBLIC_API_URL + "/v2/safety_and_privacy/operator/cartable", + permissions: [ + "show-safety-and-privacy-operator-cartable", + "show-safety-and-privacy-operator-cartable-province", + "show-safety-and-privacy-operator-cartable-edarate-shahri", + ], }, ], }, @@ -340,24 +326,26 @@ export const pageMenu = [ id: "safetyAndPrivacyManagmentMap", label: "پراکندگی بر روی نقشه", type: "page", - route: "/dashboard/road-safety/reports/map", + route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=safety_and_privacy", icon: , permissions: [ "show-safety-and-privacy-operator-cartable", "show-safety-and-privacy-operator-cartable-province", "show-safety-and-privacy-operator-cartable-edarate-shahri", + "add-safety-and-privacy", ], }, { id: "safetyAndPrivacyManagmentReport", label: "گزارش ها", type: "page", - route: "/dashboard/road-safety/reports", - icon: , + route: process.env.NEXT_PUBLIC_API_URL + "/v2/safety_and_privacy/report", + icon: , permissions: [ "show-safety-and-privacy-operator-cartable", "show-safety-and-privacy-operator-cartable-province", "show-safety-and-privacy-operator-cartable-edarate-shahri", + "add-safety-and-privacy", ], }, ], @@ -382,11 +370,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: "عملیات", @@ -399,8 +395,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"], }, ], }, @@ -417,7 +413,7 @@ export const pageMenu = [ label: "گزارش ها", type: "page", route: process.env.NEXT_PUBLIC_API_URL + "/v2/road_observations/report/index", - icon: , + icon: , permissions: ["all"], }, ], @@ -450,7 +446,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"], }, ], @@ -473,17 +469,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"], }, ], @@ -545,4 +541,4 @@ export const pageMenu = [ }, ], }, -]; +]; \ No newline at end of file From ceddbcb936f36e34ae7029d4d3059540cc6c8f8f Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Sun, 18 May 2025 10:33:07 +0330 Subject: [PATCH 09/11] formatting --- .../Form/StepOne/CreateFormContent.jsx | 2 +- .../operator/Form/StepOne/GetSubItemInfo.jsx | 21 ++--- .../Form/StepThree/StepThreeContent.jsx | 92 +++++++++---------- src/core/components/HourSelect.jsx | 26 ++++++ src/core/utils/pageMenu.js | 46 ++++++---- 5 files changed, 109 insertions(+), 78 deletions(-) create mode 100644 src/core/components/HourSelect.jsx 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"} + /> + + { + return ( + + {label} + + {error?.message} + + ); +}; +export default HourSelect; diff --git a/src/core/utils/pageMenu.js b/src/core/utils/pageMenu.js index 0b4f4f4..c314961 100644 --- a/src/core/utils/pageMenu.js +++ b/src/core/utils/pageMenu.js @@ -16,6 +16,7 @@ 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"; @@ -291,6 +292,26 @@ export const pageMenu = [ { 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: "عملیات", @@ -302,23 +323,12 @@ export const pageMenu = [ { key: "safetyAndPrivacy.step_two", color: "error" }, ], Subitems: [ - { - id: "safetyAndPrivacyManagmentOparationCreate", - label: "ثبت فعالیت", - type: "page", - route: process.env.NEXT_PUBLIC_API_URL + "/v2/safety_and_privacy/operator/first_step", - permissions: ["add-safety-and-privacy"], - }, { id: "safetyAndPrivacyManagmentOparationCartable", label: "کارتابل", type: "page", - route: process.env.NEXT_PUBLIC_API_URL + "/v2/safety_and_privacy/operator/cartable", - permissions: [ - "show-safety-and-privacy-operator-cartable", - "show-safety-and-privacy-operator-cartable-province", - "show-safety-and-privacy-operator-cartable-edarate-shahri", - ], + route: "/dashboard/road-safety/operator", + permissions: ["show-safety-and-privacy-operator-cartable-edarate-shahri"], }, ], }, @@ -326,26 +336,24 @@ export const pageMenu = [ id: "safetyAndPrivacyManagmentMap", label: "پراکندگی بر روی نقشه", type: "page", - route: process.env.NEXT_PUBLIC_API_URL + "/v2/map?type=safety_and_privacy", + 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", - "add-safety-and-privacy", ], }, { id: "safetyAndPrivacyManagmentReport", label: "گزارش ها", type: "page", - route: process.env.NEXT_PUBLIC_API_URL + "/v2/safety_and_privacy/report", - icon: , + 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", - "add-safety-and-privacy", ], }, ], @@ -541,4 +549,4 @@ export const pageMenu = [ }, ], }, -]; \ No newline at end of file +]; From 7c250071204ace80e7d58eeb63c84898a2895872 Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Sun, 18 May 2025 10:54:46 +0330 Subject: [PATCH 10/11] add day of week --- src/components/layouts/dashboard/headerWithSidebar/index.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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); From bfacddf14daac3d526c6a754919865ffd757d421 Mon Sep 17 00:00:00 2001 From: AmirHossein Mahmoodi Date: Sun, 18 May 2025 10:56:11 +0330 Subject: [PATCH 11/11] change version to 1.1.0 --- .env.local.example => .env.example | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename .env.local.example => .env.example (81%) 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