diff --git a/package.json b/package.json index a4532cb..8a2e759 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@mui/material-nextjs": "^5.16.6", "@mui/x-date-pickers": "^6.19.5", "@mui/x-tree-view": "^7.11.0", + "@turf/turf": "^7.2.0", "axios": "^1.7.2", "date-fns": "^3.3.1", "date-fns-jalali": "^2.13.0-0", diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/assistant/page.js b/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/assistant/page.js new file mode 100644 index 0000000..c13a78d --- /dev/null +++ b/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/assistant/page.js @@ -0,0 +1,13 @@ +import WithPermission from "@/core/middlewares/withPermission"; +export const metadata = { + title: "کارتابل معاون", +}; +const Page = () => { + return ( + +

کارتابل معاون

+
+ ); +}; + +export default Page; diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/assistant/zamin-gov/page.js b/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/assistant/zamin-gov/page.js deleted file mode 100644 index d82631a..0000000 --- a/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/assistant/zamin-gov/page.js +++ /dev/null @@ -1,12 +0,0 @@ -import AssistantZaminGovComponent from "@/components/dashboard/inquiryPrivacy/assistant/zaminGov"; -import WithPermission from "@/core/middlewares/withPermission"; - -const Page = () => { - return ( - - - - ); -}; - -export default Page; diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/city-admin/page.js b/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/city-admin/page.js new file mode 100644 index 0000000..3fd1888 --- /dev/null +++ b/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/city-admin/page.js @@ -0,0 +1,14 @@ +import CityAdminPage from "@/components/dashboard/inquiryPrivacy/city-admin"; +import WithPermission from "@/core/middlewares/withPermission"; +export const metadata = { + title: "کارتابل شهرستان", +}; +const Page = () => { + return ( + + + + ); +}; + +export default Page; diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/city-admin/zamin-gov/page.js b/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/city-admin/zamin-gov/page.js deleted file mode 100644 index d7631c9..0000000 --- a/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/city-admin/zamin-gov/page.js +++ /dev/null @@ -1,12 +0,0 @@ -import CityAdminZaminGovComponent from "@/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov"; -import WithPermission from "@/core/middlewares/withPermission"; - -const Page = () => { - return ( - - - - ); -}; - -export default Page; diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/general-manager/page.js b/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/general-manager/page.js new file mode 100644 index 0000000..e24a103 --- /dev/null +++ b/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/general-manager/page.js @@ -0,0 +1,13 @@ +import WithPermission from "@/core/middlewares/withPermission"; +export const metadata = { + title: "کارتابل مدیر", +}; +const Page = () => { + return ( + +

کارتابل مدیر

+
+ ); +}; + +export default Page; diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/general-manager/zamin-gov/page.js b/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/general-manager/zamin-gov/page.js deleted file mode 100644 index 9b9d446..0000000 --- a/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/general-manager/zamin-gov/page.js +++ /dev/null @@ -1,12 +0,0 @@ -import GeneralManagerZaminGovComponent from "@/components/dashboard/inquiryPrivacy/generalManager/zaminGov"; -import WithPermission from "@/core/middlewares/withPermission"; - -const Page = () => { - return ( - - - - ); -}; - -export default Page; diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/privacy-office/page.js b/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/privacy-office/page.js new file mode 100644 index 0000000..c0de9c5 --- /dev/null +++ b/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/privacy-office/page.js @@ -0,0 +1,14 @@ +import PrivacyOfficePage from "@/components/dashboard/inquiryPrivacy/privacy-office"; +import WithPermission from "@/core/middlewares/withPermission"; +export const metadata = { + title: "کارتابل اداره حریم", +}; +const Page = () => { + return ( + + + + ); +}; + +export default Page; diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/province-admin/zamin-gov/page.js b/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/province-admin/zamin-gov/page.js deleted file mode 100644 index 0c51a47..0000000 --- a/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/province-admin/zamin-gov/page.js +++ /dev/null @@ -1,12 +0,0 @@ -import ProvinceAdminZaminGovComponent from "@/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov"; -import WithPermission from "@/core/middlewares/withPermission"; - -const Page = () => { - return ( - - - - ); -}; - -export default Page; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/DescriptionForm.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/DescriptionForm.jsx deleted file mode 100644 index ba2cdeb..0000000 --- a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/DescriptionForm.jsx +++ /dev/null @@ -1,29 +0,0 @@ -import { FormControl, FormHelperText, InputLabel, OutlinedInput, Stack } from "@mui/material"; - -const DescriptionForm = ({ errors, register }) => { - return ( - - - - توضیحات - - - - {errors.description ? errors.description.message : null} - - - - ); -}; -export default DescriptionForm; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/ManagerOrAssistantSubmit.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/ManagerOrAssistantSubmit.jsx deleted file mode 100644 index d755b7c..0000000 --- a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/ManagerOrAssistantSubmit.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import { Button } from "@mui/material"; - -const ManagerOrAssistantSubmit = ({ isSubmitting }) => { - return ( - <> - - - - ); -}; -export default ManagerOrAssistantSubmit; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/PrevCartableOpinion.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/PrevCartableOpinion.jsx deleted file mode 100644 index d6df4b1..0000000 --- a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/PrevCartableOpinion.jsx +++ /dev/null @@ -1,25 +0,0 @@ -import { Card, CardContent, CardHeader, CircularProgress, Divider, Stack, Typography } from "@mui/material"; - -const PrevCartableOpinion = ({ message, loadingMessage, errorMessage }) => { - return ( - - - - - {errorMessage ? ( - خطا در دریافت اطلاعات !!! - ) : loadingMessage ? ( - - - درحال دریافت اطلاعات - - ) : ( - {message} - )} - - - - - ); -}; -export default PrevCartableOpinion; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx deleted file mode 100644 index 5410d66..0000000 --- a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx +++ /dev/null @@ -1,33 +0,0 @@ -import { Card, CardContent, FormControl, FormLabel, Stack, Typography } from "@mui/material"; - -const QuestionSafetyForm = () => { - return ( - - - - - - - آیا ایمنی راه این طرح مورد تایید است ؟ - - - - دفتر حریم راه : - - بله - - - - - - - ); -}; -export default QuestionSafetyForm; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx deleted file mode 100644 index 75a279c..0000000 --- a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx +++ /dev/null @@ -1,82 +0,0 @@ -import { DialogActions, DialogContent, Stack } from "@mui/material"; -import StyledForm from "@/core/components/StyledForm"; -import useRequest from "@/lib/hooks/useRequest"; -import { useForm } from "react-hook-form"; -import { yupResolver } from "@hookform/resolvers/yup"; -import { object, string } from "yup"; -import { SUBMIT_ROAD_SAFETY_FORM } from "@/core/utils/routes"; -import usePrevStateOpinion from "@/lib/hooks/usePrevStateopinion"; -import QuestionSafetyForm from "./QuestionSafetyForm"; -import PrevCartableOpinion from "./PrevCartableOpinion"; -import DescriptionForm from "./DescriptionForm"; -import ManagerOrAssistantSubmit from "./ManagerOrAssistantSubmit"; -import ApplicantRequestDetail from "@/core/components/ApplicantRequestDetail"; -const fakeData = { - id: 1, - shomareh_darkhast: "2124", - ostan: "ostan", - shahr: "shahr", - shahrestan: "shahrestan", - bakhsh: "bakhsh", - roosta: "roosta", - tarikh_darkhast: "tarikh_darkhast", - sazman: "sazman", - masahat_zamin: "masahat_zamin", - masahat_tarh: "masahat_tarh", - gorooh_tarh: "gorooh_tarh", - onvane_tarh: "onvane_tarh", - address: "کرج - فلان جا - جنب پاساژ - نزدیک اونجا - اونور خیابون - زیر رو گذر - روی زیر گذر", - file_mosavab: "file", - polygon: [ - [51.515, -0.09], - [51.52, -0.1], - [51.52, -0.12], - ], -}; -const validationSchema = object({ - description: string().required("وارد کردن توضیحات الزامیست!"), -}); -const RoadSafetyFormContext = ({ rowId, mutate, setOpenRoadSafetyForm }) => { - const defaultValues = { - description: "", - }; - const requestServer = useRequest({ notificationSuccess: true }); - const { message, loadingMessage, errorMessage } = usePrevStateOpinion(); - const { - register, - handleSubmit, - formState: { isSubmitting, errors }, - } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "all" }); - const onSubmit = async (data) => { - const formData = new FormData(); - formData.append("description", data.description); - requestServer(`${SUBMIT_ROAD_SAFETY_FORM}/${rowId}`, "post", { - data: formData, - }) - .then(() => { - setOpenRoadSafetyForm(false); - mutate(); - }) - .catch(() => {}); - }; - return ( - - - - - - - - - - - - - - ); -}; -export default RoadSafetyFormContext; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/index.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/index.jsx deleted file mode 100644 index a4de0d7..0000000 --- a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/index.jsx +++ /dev/null @@ -1,52 +0,0 @@ -import { Dialog, IconButton, Stack, Tooltip } from "@mui/material"; -import EngineeringIcon from "@mui/icons-material/Engineering"; -import DialogTransition from "@/core/components/DialogTransition"; -import { useState } from "react"; -import { Close } from "@mui/icons-material"; -import RoadSafetyFormContext from "./RoadSafetyFormContext"; - -const RoadSafetyForm = ({ rowId, mutate }) => { - const [openRoadSafetyForm, setOpenRoadSafetyForm] = useState(false); - return ( - - - { - setOpenRoadSafetyForm(true); - }} - > - - - - - setOpenRoadSafetyForm(false)} - sx={{ - position: "absolute", - right: 8, - top: 8, - zIndex: 10, - color: (theme) => theme.palette.grey[500], - }} - > - - - - - - ); -}; -export default RoadSafetyForm; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/TaskDetail/DetailDialog.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/TaskDetail/DetailDialog.jsx deleted file mode 100644 index 777eecf..0000000 --- a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/TaskDetail/DetailDialog.jsx +++ /dev/null @@ -1,75 +0,0 @@ -"use client"; - -import { Dialog, DialogContent } from "@mui/material"; -import { object, string } from "yup"; -import useRequest from "@/lib/hooks/useRequest"; -import { useForm } from "react-hook-form"; -import { yupResolver } from "@hookform/resolvers/yup"; -import StyledForm from "@/core/components/StyledForm"; -import ApplicantRequestDetail from "@/core/components/ApplicantRequestDetail"; - -const fakeData = { - id: 1, - shomareh_darkhast: "2124", - ostan: "ostan", - shahr: "shahr", - shahrestan: "shahrestan", - bakhsh: "bakhsh", - roosta: "roosta", - tarikh_darkhast: "tarikh_darkhast", - sazman: "sazman", - masahat_zamin: "masahat_zamin", - masahat_tarh: "masahat_tarh", - gorooh_tarh: "gorooh_tarh", - onvane_tarh: "onvane_tarh", - address: "کرج - فلان جا - جنب پاساژ - نزدیک اونجا - اونور خیابون - زیر رو گذر - روی زیر گذر", - file_mosavab: "file", - polygon: [ - [51.515, -0.09], - [51.52, -0.1], - [51.52, -0.12], - ], -}; - -const validationSchema = object({ - description: string().required("وارد کردن توضیحات الزامیست!"), -}); - -const DetailDialog = ({ taskModal, setTaskModal, rowId, mutate }) => { - const requestServer = useRequest({ auth: true }); - const defaultValues = { - description: "", - }; - const handleClose = () => { - setTaskModal(false); - }; - - const { - register, - handleSubmit, - formState: { isSubmitting, errors, touchedFields }, - } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "all" }); - - const onSubmit = async (data) => { - const formData = new FormData(); - formData.append("description", data.description); - requestServer(`api-for-send-to-harim/${rowId}`, "post", { - data: formData, - }) - .then(() => { - handleClose(); - mutate(); - }) - .catch(() => {}); - }; - return ( - - - - - - - - ); -}; -export default DetailDialog; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/TaskDetail/index.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/TaskDetail/index.jsx deleted file mode 100644 index 1641840..0000000 --- a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/TaskDetail/index.jsx +++ /dev/null @@ -1,26 +0,0 @@ -"use client"; - -import { IconButton, Tooltip } from "@mui/material"; -import AssignmentIcon from "@mui/icons-material/Assignment"; -import DetailDialog from "./DetailDialog"; -import { useState } from "react"; - -const TaskDetail = ({ rowId, mutate }) => { - const [taskModal, setTaskModal] = useState(false); - - const openDetailDialog = () => { - setTaskModal(true); - }; - - return ( - <> - - - - - - - - ); -}; -export default TaskDetail; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/index.jsx deleted file mode 100644 index ae4213c..0000000 --- a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/index.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import TaskDetail from "./TaskDetail"; -import { Box } from "@mui/material"; -import RoadSafetyForm from "./RoadSafetyForm"; - -const RowActions = ({ row, mutate }) => { - return ( - - - - - ); -}; -export default RowActions; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/TaskList.jsx deleted file mode 100644 index 31452f6..0000000 --- a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/TaskList.jsx +++ /dev/null @@ -1,145 +0,0 @@ -"use client"; - -import { useMemo } from "react"; -import { Box } from "@mui/material"; -import DataTableWithAuth from "@/core/components/DataTableWithAuth"; -import RowActions from "./RowActions"; - -const TaskList = () => { - const columns = useMemo( - () => [ - { - accessorKey: "id", - header: "کد یکتا", - id: "id", - enableColumnFilter: false, - datatype: "text", - filterMode: "notEquals", - }, - { - accessorKey: "aplication_number", - header: "شماره درخواست", - id: "aplication_number", - enableColumnFilter: false, - datatype: "text", - filterMode: "notEquals", - }, - { - accessorKey: "application_date", - header: "تاریخ درخواست", - id: "application_date", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "province", - header: "استان", - id: "province", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "township", - header: "شهرستان", - id: "township", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "city", - header: "شهر", - id: "city", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "county", - header: "بخش", - id: "county", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "village", - header: "روستا", - id: "village", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "land_area", - header: "مساحت زمین", - id: "land_area", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "design_area", - header: "مساحت طرح", - id: "design_area", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "organization", - header: "سازمان", - id: "organization", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "design_group", - header: "گروه طرح", - id: "design_group", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "design_title", - header: "عنوان طرح", - id: "design_title", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "state", - header: "وضعیت درخواست", - id: "state", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - ], - [] - ); - - return ( - <> - - - - - ); -}; -export default TaskList; diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/index.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/index.jsx deleted file mode 100644 index a6a53cf..0000000 --- a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/index.jsx +++ /dev/null @@ -1,15 +0,0 @@ -"use client"; - -import PageTitle from "@/core/components/PageTitle"; -import { Stack } from "@mui/material"; -import TaskList from "./TaskList"; - -const AssistantZaminGovComponent = () => { - return ( - - - - - ); -}; -export default AssistantZaminGovComponent; diff --git a/src/components/dashboard/inquiryPrivacy/city-admin/CityAdminList.jsx b/src/components/dashboard/inquiryPrivacy/city-admin/CityAdminList.jsx new file mode 100644 index 0000000..b732d9b --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/city-admin/CityAdminList.jsx @@ -0,0 +1,243 @@ +import CustomSelectByDependency from "@/core/components/DataTable/filter/fieldsType/CustomSelectByDependency"; +import DataTableWithAuth from "@/core/components/DataTableWithAuth"; +import { GET_CITY_ADMIN_LIST } from "@/core/utils/routes"; +import useInquiryPrivacyState from "@/lib/hooks/useInquiryPrivacyState"; +import { Box, Stack } from "@mui/material"; +import moment from "jalali-moment"; +import { useMemo } from "react"; +import MapsHomeWorkIcon from "@mui/icons-material/MapsHomeWork"; +import SecurityIcon from "@mui/icons-material/Security"; +import ManageAccountsIcon from "@mui/icons-material/ManageAccounts"; +import PsychologyAltIcon from "@mui/icons-material/PsychologyAlt"; +import ReceiptLongIcon from "@mui/icons-material/ReceiptLong"; +import WindowIcon from "@mui/icons-material/Window"; +import DangerousIcon from "@mui/icons-material/Dangerous"; +import AutorenewIcon from "@mui/icons-material/Autorenew"; +import RowActions from "./RowActions"; +import ShowPrimaryArea from "./ShowPrimaryArea"; + +const CityAdminList = () => { + const stateIcon = (state_id) => { + if (state_id === 1) return ; + if (state_id === 2 || state_id === 5 || state_id === 13) return ; + if (state_id === 3 || state_id === 6 || state_id === 14) + return ; + if (state_id === 4 || state_id === 7 || state_id === 15) return ; + if (state_id === 8) return ; + if (state_id === 9 || state_id === 11) return ; + if (state_id === 10) return ; + if (state_id === 12) return ; + }; + const columns = useMemo(() => { + return [ + { + accessorKey: "panjare_vahed_id", + header: "کدرهگیری درخواست", + id: "panjare_vahed_id", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => <>{row.original.panjare_vahed_id}, + }, + { + accessorKey: "national_id", + header: "کد ملی", + id: "national_id", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => <>{row.original.national_id}, + }, + { + accessorKey: "state_id", + header: "وضعیت", + id: "state_id", + enableColumnFilter: true, + datatype: "numeric", + filterMode: "equals", + sortDescFirst: false, + grow: false, + size: 100, + ColumnSelectComponent: (props) => { + const { itemsList, loadingItemsList, errorItemsList } = useInquiryPrivacyState(); + + 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 }) => ( + + {stateIcon(row.original.state_id)} + + {row.original.state_name} + + + ), + }, + { + accessorKey: "plan_title", + header: "عنوان طرح", + id: "plan_title", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => <>{row.original.plan_title}, + }, + { + accessorKey: "plan_group", + header: "گروه طرح", + id: "plan_group", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => <>{row.original.plan_group}, + }, + { + accessorKey: "requested_organization", + header: "دستگاه صادر کننده", + id: "requested_organization", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => <>{row.original.requested_organization}, + }, + { + accessorKey: "worksheet_id", + header: "شناسه کاربرگ", + id: "worksheet_id", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => <>{row.original.worksheet_id}, + }, + { + accessorKey: "primary_area", + header: "نمایش محدوده طرح", + id: "primary_area", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => + row.original.primary_area ? ( + + + + ) : ( + "-" + ), + }, + { + accessorKey: "province_id", + header: "استان", + id: "province_id", + enableColumnFilter: false, + datatype: "numeric", + sortDescFirst: false, + grow: false, + size: 100, + Cell: ({ row }) => <>{row.original.province_name}, + }, + { + accessorKey: "city_id", + header: "شهر", + id: "city_id", + enableColumnFilter: false, + datatype: "numeric", + sortDescFirst: false, + grow: false, + size: 100, + Cell: ({ row }) => <>{row.original.city_name}, + }, + { + accessorKey: "isic", + header: "کد آیسیک", + id: "isic", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => <>{row.original.isic}, + }, + { + accessorFn: (row) => moment(row.request_date).locale("fa").format("YYYY/MM/DD"), + header: "تاریخ درخواست", + id: "request_date", + enableColumnFilter: true, + datatype: "date", + filterMode: "between", + grow: false, + size: 100, + }, + ]; + }, []); + + return ( + <> + + + + + ); +}; + +export default CityAdminList; diff --git a/src/components/dashboard/inquiryPrivacy/city-admin/RowActions/FeedbackAction/MapDrawPolygon/DrawBound.jsx b/src/components/dashboard/inquiryPrivacy/city-admin/RowActions/FeedbackAction/MapDrawPolygon/DrawBound.jsx new file mode 100644 index 0000000..02b567f --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/city-admin/RowActions/FeedbackAction/MapDrawPolygon/DrawBound.jsx @@ -0,0 +1,149 @@ +import React, { useCallback, useEffect, useRef, useState } from "react"; +import L from "leaflet"; +import { FeatureGroup, useMap } from "react-leaflet"; +import "leaflet-draw"; +import { calculatePolygonMetrics } from "@/core/utils/geoCalculations"; + +const DrawPolygon = ({ control, controlDispach, drawBound, setDrawBound }) => { + const map = useMap(); + const featureRef = useRef(null); + const drawControlRef = useRef(null); + + const [area, setArea] = useState(0); + const [sideLengths, setSideLengths] = useState([]); + + const calculatePolygonMetricsForLayer = useCallback( + (layer) => { + if (!layer) return; + + const latlngs = layer.getLatLngs()[0]; + if (!latlngs || latlngs.length < 3) return; + + const coordinates = latlngs.map((p) => [p.lat, p.lng]); + + const metrics = calculatePolygonMetrics(coordinates, true); + + setArea(metrics.area); + setSideLengths(metrics.sides); + + setDrawBound({ + layer, + metrics, + }); + }, + [setDrawBound] + ); + + const safeFitBounds = (layer) => { + if (!layer || !map) return; + try { + const latLngs = layer.getLatLngs(); + map.fitBounds(latLngs, { + paddingTopLeft: [20, 35], + paddingBottomRight: [20, 55], + }); + } catch (e) { + console.warn("fitBounds failed:", e); + } + }; + + const bindEditEvent = useCallback( + (layer) => { + if (!layer) return; + layer.on("edit", function (e) { + const editedLayer = e.target; + calculatePolygonMetricsForLayer(editedLayer); + }); + }, + [calculatePolygonMetricsForLayer] + ); + + const handlerCreatedBound = useCallback( + (event) => { + const { layer } = event; + layer.editing.enable(); + featureRef.current.addLayer(layer); + + calculatePolygonMetricsForLayer(layer); + bindEditEvent(layer); + + controlDispach({ type: "SET_STATUS", status: 2 }); + }, + [calculatePolygonMetricsForLayer, bindEditEvent, controlDispach] + ); + + useEffect(() => { + if ( + control.status === 1 && + drawControlRef.current && + drawControlRef.current._toolbars?.draw?._modes?.polygon?.handler + ) { + drawControlRef.current._toolbars.draw._modes.polygon.handler.enable(); + } + }, [control.status]); + + useEffect(() => { + if (control.status === 0 && featureRef.current) { + featureRef.current.clearLayers(); + setArea(0); + setSideLengths([]); + setDrawBound(null); + } + }, [control.status, setDrawBound]); + + useEffect(() => { + if (control.status === 2 && drawBound && featureRef.current) { + const { layer, metrics } = drawBound; + featureRef.current.addLayer(layer); + layer.editing.enable(); + safeFitBounds(layer); + bindEditEvent(layer); + + setArea(metrics?.area || 0); + setSideLengths(metrics?.sides || []); + } + }, [control.status, drawBound, bindEditEvent]); + + useEffect(() => { + if (!featureRef.current) return; + + L.drawLocal.draw.handlers.polygon.tooltip.start = "برای شروع ترسیم محدوده، روی نقشه کلیک کنید"; + L.drawLocal.draw.handlers.polygon.tooltip.cont = "برای ادامه ترسیم، نقاط بعدی را کلیک کنید"; + L.drawLocal.draw.handlers.polygon.tooltip.end = "برای بستن محدوده، روی نقطه‌ی شروع کلیک کنید"; + + const drawControl = new L.Control.Draw({ + draw: { + polygon: { + shapeOptions: { + color: "red", + weight: 3, + clickable: true, + }, + }, + polyline: false, + rectangle: false, + circle: false, + marker: false, + circlemarker: false, + }, + edit: { + featureGroup: featureRef.current, + edit: true, + remove: true, + }, + }); + + drawControlRef.current = drawControl; + map.addControl(drawControl); + map.on(L.Draw.Event.CREATED, handlerCreatedBound); + + return () => { + map.off(L.Draw.Event.CREATED, handlerCreatedBound); + map.removeControl(drawControl); + }; + }, [map, handlerCreatedBound]); + + return ; +}; + +export default DrawPolygon; diff --git a/src/components/dashboard/inquiryPrivacy/city-admin/RowActions/FeedbackAction/MapDrawPolygon/index.jsx b/src/components/dashboard/inquiryPrivacy/city-admin/RowActions/FeedbackAction/MapDrawPolygon/index.jsx new file mode 100644 index 0000000..ab4c1f4 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/city-admin/RowActions/FeedbackAction/MapDrawPolygon/index.jsx @@ -0,0 +1,121 @@ +import { Delete, Route } from "@mui/icons-material"; +import { Box, Button, Stack, Typography } from "@mui/material"; +import { useReducer } from "react"; +import DrawPolygon from "./DrawBound"; + +const statusType = [ + { + id: 0, + message: "برای آغاز ترسیم محدوده، کلیک کنید!", + buttons: [ + { + label: "شروع ترسیم محدوده", + key: "start", + color: "warning", + icon: , + onclick: (controlDispach) => { + controlDispach({ type: "SET_STATUS", status: 1 }); + }, + }, + ], + }, + { + id: 1, + message: "محدوده‌ی موردنظر را با کلیک روی نقشه مشخص کنید. برای اتمام، روی نقطه‌ی ابتدایی کلیک کنید!", + buttons: [], + }, + { + id: 2, + message: "برای اصلاح محدوده، گوشه‌ها را بکشید. برای ترسیم دوباره، آن را حذف کنید", + buttons: [ + { + label: "حذف", + key: "end", + color: "error", + icon: , + onclick: (controlDispach) => { + controlDispach({ type: "SET_STATUS", status: 0 }); + }, + }, + ], + }, +]; + +const createInitialState = (drawBound) => { + if (drawBound) { + return { status: 2 }; + } + return { status: 0 }; +}; + +const reducer = (state, action) => { + switch (action.type) { + case "SET_STATUS": + return { ...state, status: action.status }; + default: + return state; + } +}; + +const MapDrawPolygon = ({ drawBound, setDrawBound }) => { + const [control, controlDispach] = useReducer(reducer, drawBound, createInitialState); + + return ( + <> + + + theme.palette.secondary.main, + borderBottomLeftRadius: 8, + borderBottomRightRadius: 8, + py: 0.5, + px: 2, + }} + > + + {statusType.find((st) => st.id == control.status).message} + + + + + + {statusType + .find((st) => st.id == control.status) + .buttons.map((button) => ( + + ))} + + + + ); +}; +export default MapDrawPolygon; diff --git a/src/components/dashboard/inquiryPrivacy/city-admin/RowActions/FeedbackAction/index.jsx b/src/components/dashboard/inquiryPrivacy/city-admin/RowActions/FeedbackAction/index.jsx new file mode 100644 index 0000000..0f64405 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/city-admin/RowActions/FeedbackAction/index.jsx @@ -0,0 +1,156 @@ +import MapLayer from "@/core/components/MapLayer"; +import { CITY_ADMIN_FEEDBACK } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; +import { yupResolver } from "@hookform/resolvers/yup"; +import CloseIcon from "@mui/icons-material/Close"; +import ForumIcon from "@mui/icons-material/Forum"; +import { + Box, + Button, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + IconButton, + TextField, + Tooltip, + Typography, +} from "@mui/material"; +import { useMemo, useState } from "react"; +import { useForm } from "react-hook-form"; +import { object, string } from "yup"; +import ShowBound from "../../ShowPrimaryArea/ShowBound"; +import MapDrawPolygon from "./MapDrawPolygon"; + +const validationSchema = object({ + expert_description: string().required("توضیحات ناظر اجباری است!"), +}); + +const FeedbackAction = ({ rowId, mutate, rowPrimaryArea }) => { + const requestServer = useRequest({ notificationSuccess: true }); + const [openFeedbackDialog, setOpenFeedbackDialog] = useState(false); + const [drawBound, setDrawBound] = useState(null); + const bound = useMemo(() => { + const latLngCoords = rowPrimaryArea.coordinates.map((coord) => [coord[1], coord[0]]); + return rowPrimaryArea.type === "polygon" ? L.polygon(latLngCoords) : L.polyline(latLngCoords); + }, [rowPrimaryArea]); + + const { + register, + handleSubmit, + formState: { isSubmitting, errors }, + } = useForm({ + defaultValues: { expert_description: "", forbidden_area: "", forbidden_area_space: "" }, + resolver: yupResolver(validationSchema), + mode: "all", + }); + + const onSubmit = async (data) => { + try { + const payload = { + expert_description: data.expert_description, + }; + + if (drawBound && drawBound.metrics) { + const { metrics } = drawBound; + payload.forbidden_area = { + type: "polygon", + coordinates: metrics.coordinates, + }; + payload.forbidden_area_space = metrics.area.toFixed(2); + } + await requestServer(`${CITY_ADMIN_FEEDBACK}/${rowId}`, "post", { + data: payload, + }); + + mutate(); + setOpenFeedbackDialog(false); + } catch (error) { + console.error("❌ Error submitting feedback:", error); + } + }; + + return ( + <> + + + setOpenFeedbackDialog(true)}> + + + + setOpenFeedbackDialog(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, + }, + }} + maxWidth="sm" + fullWidth + dir="rtl" + > + + + توضیحات ناظر + + setOpenFeedbackDialog(false)} size="small"> + + + + + + منطقه ممنوعه{" "} + + (در صورت وجود انتخاب کنید) + + + + + + + + + + + + + + + + + + ); +}; + +export default FeedbackAction; diff --git a/src/components/dashboard/inquiryPrivacy/city-admin/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/city-admin/RowActions/index.jsx new file mode 100644 index 0000000..cb1517b --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/city-admin/RowActions/index.jsx @@ -0,0 +1,15 @@ +import { Box } from "@mui/material"; +import FeedbackAction from "./FeedbackAction"; + +const RowActions = ({ row, mutate }) => { + return ( + + {row.original.state_id === 1 ? ( + + ) : ( + "-" + )} + + ); +}; +export default RowActions; diff --git a/src/components/dashboard/inquiryPrivacy/city-admin/ShowPrimaryArea/ShowBound.jsx b/src/components/dashboard/inquiryPrivacy/city-admin/ShowPrimaryArea/ShowBound.jsx new file mode 100644 index 0000000..24db476 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/city-admin/ShowPrimaryArea/ShowBound.jsx @@ -0,0 +1,29 @@ +import { useEffect, useRef } from "react"; +import { FeatureGroup, useMap } from "react-leaflet"; + +const ShowBound = ({ bound }) => { + const map = useMap(); + const featureRef = useRef(null); + + const safeFitBounds = (layer) => { + if (!layer || !map) return; + try { + const latLngs = layer.getLatLngs(); + map.fitBounds(latLngs, { + paddingTopLeft: [20, 20], + paddingBottomRight: [20, 20], + }); + } catch (e) { + console.warn("fitBounds failed:", e); + } + }; + + useEffect(() => { + bound?.editing?.disable(); + featureRef.current.addLayer(bound); + safeFitBounds(bound); + }, []); + + return ; +}; +export default ShowBound; diff --git a/src/components/dashboard/inquiryPrivacy/city-admin/ShowPrimaryArea/index.jsx b/src/components/dashboard/inquiryPrivacy/city-admin/ShowPrimaryArea/index.jsx new file mode 100644 index 0000000..98e24d0 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/city-admin/ShowPrimaryArea/index.jsx @@ -0,0 +1,69 @@ +const { + Button, + IconButton, + Tooltip, + Box, + Dialog, + DialogTitle, + Typography, + DialogContent, + DialogActions, +} = require("@mui/material"); +import LayersIcon from "@mui/icons-material/Layers"; +import CloseIcon from "@mui/icons-material/Close"; +import { useMemo, useState } from "react"; +import MapLayer from "@/core/components/MapLayer"; +import ShowBound from "./ShowBound"; + +const ShowPrimaryArea = ({ primaryArea }) => { + const [openShowAreaDialog, setOpenShowAreaDialog] = useState(false); + const bound = useMemo(() => { + const latLngCoords = primaryArea.coordinates.map((coord) => [coord[1], coord[0]]); + return primaryArea.type === "polygon" ? L.polygon(latLngCoords) : L.polyline(latLngCoords); + }, [primaryArea]); + + return ( + + + setOpenShowAreaDialog(true)}> + + + + setOpenShowAreaDialog(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" + > + + + محدوده طرح + + setOpenShowAreaDialog(false)} size="small"> + + + + + + + + + + + + + + + ); +}; + +export default ShowPrimaryArea; diff --git a/src/components/dashboard/inquiryPrivacy/city-admin/index.jsx b/src/components/dashboard/inquiryPrivacy/city-admin/index.jsx new file mode 100644 index 0000000..b8d7433 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/city-admin/index.jsx @@ -0,0 +1,14 @@ +"use client"; +import PageTitle from "@/core/components/PageTitle"; +import { Stack } from "@mui/material"; +import CityAdminList from "./CityAdminList"; + +const CityAdminPage = () => { + return ( + + + + + ); +}; +export default CityAdminPage; diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx deleted file mode 100644 index 604e141..0000000 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx +++ /dev/null @@ -1,138 +0,0 @@ -import { - Autocomplete, - Button, - CircularProgress, - DialogActions, - DialogContent, - FormControl, - FormHelperText, - InputLabel, - OutlinedInput, - Stack, - TextField, - Typography, -} from "@mui/material"; -import { Controller, useForm } from "react-hook-form"; -import { yupResolver } from "@hookform/resolvers/yup"; -import { object, string } from "yup"; -import StyledForm from "@/core/components/StyledForm"; -import useCities from "@/lib/hooks/useCities"; -import useRequest from "@/lib/hooks/useRequest"; -import { REFER_ADMIN_CITY } from "@/core/utils/routes"; - -const validationSchema = object({ - description: string().required("وارد کردن توضیحات الزامیست!"), - city: string().required("وارد کردن شهرستان الزامیست!"), -}); - -const ReferFormContext = ({ setOpenReferDialog, rowId, mutate }) => { - const defaultValues = { - description: "", - city: "", - }; - const { cities, loadingCities, errorCities } = useCities(); - const requestServer = useRequest({ notificationSuccess: true }); - const { - control, - register, - handleSubmit, - formState: { isSubmitting, errors, touchedFields }, - } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "all" }); - - const onSubmit = async (data) => { - const formData = new FormData(); - formData.append("description", data.description); - formData.append("cityId", data.city); - requestServer(`${REFER_ADMIN_CITY}/${rowId}`, "post", { - data: formData, - }) - .then(() => { - setOpenReferDialog(false); - mutate(); - }) - .catch(() => {}); - }; - return ( - - - - - - - توضیحات - - - - {errors.description ? errors.description.message : null} - - - - - ( - - - {errorCities ? ( - خطایی در دریافت شهرستان ها رخ داده است! - ) : loadingCities ? ( - - - درحال دریافت لیست شهرستان ها - - ) : ( - city.id === value) || null} - disablePortal - options={cities} - getOptionLabel={(city) => city.name} - isOptionEqualToValue={(option, value) => option.id === value.id} - onChange={(event, newValue) => { - onChange(newValue ? newValue.id : ""); - }} - renderInput={(params) => ( - - )} - /> - )} - - {errors.city ? errors.city.message : null} - - - )} - /> - - - - - - - - - ); -}; -export default ReferFormContext; diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/index.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/index.jsx deleted file mode 100644 index a8ebdc2..0000000 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/index.jsx +++ /dev/null @@ -1,41 +0,0 @@ -import { Dialog, DialogTitle, IconButton, Stack, Tooltip } from "@mui/material"; -import ReplyIcon from "@mui/icons-material/Reply"; -import DialogTransition from "@/core/components/DialogTransition"; -import ReferFormContext from "./ReferFormContext"; -import { useState } from "react"; - -const ReferForm = ({ rowId, mutate }) => { - const [openReferDialog, setOpenReferDialog] = useState(false); - return ( - - - { - setOpenReferDialog(true); - }} - > - - - - - - ارجاع به شهرستان دیگر - - - - - ); -}; -export default ReferForm; diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/TaskDetail/DetailDialog.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/TaskDetail/DetailDialog.jsx deleted file mode 100644 index 3c25592..0000000 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/TaskDetail/DetailDialog.jsx +++ /dev/null @@ -1,109 +0,0 @@ -"use client"; - -import { - Button, - Dialog, - DialogActions, - DialogContent, - FormControl, - FormHelperText, - InputLabel, - OutlinedInput, -} from "@mui/material"; -import { object, string } from "yup"; -import useRequest from "@/lib/hooks/useRequest"; -import { useForm } from "react-hook-form"; -import { yupResolver } from "@hookform/resolvers/yup"; -import StyledForm from "@/core/components/StyledForm"; -import ApplicantRequestDetail from "@/core/components/ApplicantRequestDetail"; - -const fakeData = { - id: 1, - shomareh_darkhast: "2124", - ostan: "ostan", - shahr: "shahr", - shahrestan: "shahrestan", - bakhsh: "bakhsh", - roosta: "roosta", - tarikh_darkhast: "tarikh_darkhast", - sazman: "sazman", - masahat_zamin: "masahat_zamin", - masahat_tarh: "masahat_tarh", - gorooh_tarh: "gorooh_tarh", - onvane_tarh: "onvane_tarh", - address: "کرج - فلان جا - جنب پاساژ - نزدیک اونجا - اونور خیابون - زیر رو گذر - روی زیر گذر", - file_mosavab: "file", - polygon: [ - [51.515, -0.09], - [51.52, -0.1], - [51.52, -0.12], - ], -}; - -const validationSchema = object({ - description: string().required("وارد کردن توضیحات الزامیست!"), -}); - -const DetailDialog = ({ taskModal, setTaskModal, rowId, mutate }) => { - const requestServer = useRequest({ auth: true }); - const defaultValues = { - description: "", - }; - const handleClose = () => { - setTaskModal(false); - }; - - const { - register, - handleSubmit, - formState: { isSubmitting, errors, touchedFields }, - } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "all" }); - - const onSubmit = async (data) => { - const formData = new FormData(); - formData.append("description", data.description); - requestServer(`api-for-send-to-harim/${rowId}`, "post", { - data: formData, - }) - .then(() => { - handleClose(); - mutate(); - }) - .catch(() => {}); - }; - return ( - - - - - - - توضیحات - - - - {errors.description ? errors.description.message : null} - - - - - - - - - ); -}; -export default DetailDialog; diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/TaskDetail/index.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/TaskDetail/index.jsx deleted file mode 100644 index 1641840..0000000 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/TaskDetail/index.jsx +++ /dev/null @@ -1,26 +0,0 @@ -"use client"; - -import { IconButton, Tooltip } from "@mui/material"; -import AssignmentIcon from "@mui/icons-material/Assignment"; -import DetailDialog from "./DetailDialog"; -import { useState } from "react"; - -const TaskDetail = ({ rowId, mutate }) => { - const [taskModal, setTaskModal] = useState(false); - - const openDetailDialog = () => { - setTaskModal(true); - }; - - return ( - <> - - - - - - - - ); -}; -export default TaskDetail; diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/index.jsx deleted file mode 100644 index 2ed70e0..0000000 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/index.jsx +++ /dev/null @@ -1,15 +0,0 @@ -"use client"; - -import ReferForm from "./Refer"; -import TaskDetail from "./TaskDetail"; -import { Box } from "@mui/material"; - -const RowActions = ({ row, mutate }) => { - return ( - - - - - ); -}; -export default RowActions; diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx deleted file mode 100644 index 14a0e35..0000000 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx +++ /dev/null @@ -1,145 +0,0 @@ -"use client"; - -import { useMemo } from "react"; -import { Box } from "@mui/material"; -import DataTableWithAuth from "@/core/components/DataTableWithAuth"; -import RowActions from "./RowActions"; - -const TaskList = () => { - const columns = useMemo( - () => [ - { - accessorKey: "id", - header: "کد یکتا", - id: "id", - enableColumnFilter: false, - datatype: "text", - filterMode: "notEquals", - }, - { - accessorKey: "aplication_number", - header: "شماره درخواست", - id: "aplication_number", - enableColumnFilter: false, - datatype: "text", - filterMode: "notEquals", - }, - { - accessorKey: "application_date", - header: "تاریخ درخواست", - id: "application_date", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "province", - header: "استان", - id: "province", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "township", - header: "شهرستان", - id: "township", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "city", - header: "شهر", - id: "city", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "county", - header: "بخش", - id: "county", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "village", - header: "روستا", - id: "village", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "land_area", - header: "مساحت زمین", - id: "land_area", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "design_area", - header: "مساحت طرح", - id: "design_area", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "organization", - header: "سازمان", - id: "organization", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "design_group", - header: "گروه طرح", - id: "design_group", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "design_title", - header: "عنوان طرح", - id: "design_title", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "state", - header: "وضعیت درخواست", - id: "state", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - ], - [] - ); - - return ( - <> - - - - - ); -}; -export default TaskList; diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx deleted file mode 100644 index 4af891c..0000000 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx +++ /dev/null @@ -1,14 +0,0 @@ -"use client"; -import PageTitle from "@/core/components/PageTitle"; -import { Stack } from "@mui/material"; -import TaskList from "./TaskList"; - -const CityAdminZaminGovComponent = () => { - return ( - - - - - ); -}; -export default CityAdminZaminGovComponent; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/DescriptionForm.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/DescriptionForm.jsx deleted file mode 100644 index ba2cdeb..0000000 --- a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/DescriptionForm.jsx +++ /dev/null @@ -1,29 +0,0 @@ -import { FormControl, FormHelperText, InputLabel, OutlinedInput, Stack } from "@mui/material"; - -const DescriptionForm = ({ errors, register }) => { - return ( - - - - توضیحات - - - - {errors.description ? errors.description.message : null} - - - - ); -}; -export default DescriptionForm; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/ManagerOrAssistantSubmit.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/ManagerOrAssistantSubmit.jsx deleted file mode 100644 index d755b7c..0000000 --- a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/ManagerOrAssistantSubmit.jsx +++ /dev/null @@ -1,15 +0,0 @@ -import { Button } from "@mui/material"; - -const ManagerOrAssistantSubmit = ({ isSubmitting }) => { - return ( - <> - - - - ); -}; -export default ManagerOrAssistantSubmit; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/PrevCartableOpinion.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/PrevCartableOpinion.jsx deleted file mode 100644 index 365c1b4..0000000 --- a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/PrevCartableOpinion.jsx +++ /dev/null @@ -1,26 +0,0 @@ -import { Card, CardContent, CardHeader, CircularProgress, Divider, Stack, Typography } from "@mui/material"; -import usePrevStateOpinion from "@/lib/hooks/usePrevStateopinion"; - -const PrevCartableOpinion = ({ message, loadingMessage, errorMessage }) => { - return ( - - - - - {errorMessage ? ( - خطا در دریافت اطلاعات !!! - ) : loadingMessage ? ( - - - درحال دریافت اطلاعات - - ) : ( - {message} - )} - - - - - ); -}; -export default PrevCartableOpinion; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx deleted file mode 100644 index 5410d66..0000000 --- a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx +++ /dev/null @@ -1,33 +0,0 @@ -import { Card, CardContent, FormControl, FormLabel, Stack, Typography } from "@mui/material"; - -const QuestionSafetyForm = () => { - return ( - - - - - - - آیا ایمنی راه این طرح مورد تایید است ؟ - - - - دفتر حریم راه : - - بله - - - - - - - ); -}; -export default QuestionSafetyForm; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx deleted file mode 100644 index 68ffecf..0000000 --- a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx +++ /dev/null @@ -1,82 +0,0 @@ -import { DialogActions, DialogContent, Stack } from "@mui/material"; -import StyledForm from "@/core/components/StyledForm"; -import useRequest from "@/lib/hooks/useRequest"; -import { useForm } from "react-hook-form"; -import { yupResolver } from "@hookform/resolvers/yup"; -import { object, string } from "yup"; -import { SUBMIT_ROAD_SAFETY_FORM } from "@/core/utils/routes"; -import QuestionSafetyForm from "./QuestionSafetyForm"; -import PrevCartableOpinion from "./PrevCartableOpinion"; -import DescriptionForm from "./DescriptionForm"; -import ManagerOrAssistantSubmit from "./ManagerOrAssistantSubmit"; -import usePrevStateOpinion from "@/lib/hooks/usePrevStateopinion"; -import ApplicantRequestDetail from "@/core/components/ApplicantRequestDetail"; -const fakeData = { - id: 1, - shomareh_darkhast: "2124", - ostan: "ostan", - shahr: "shahr", - shahrestan: "shahrestan", - bakhsh: "bakhsh", - roosta: "roosta", - tarikh_darkhast: "tarikh_darkhast", - sazman: "sazman", - masahat_zamin: "masahat_zamin", - masahat_tarh: "masahat_tarh", - gorooh_tarh: "gorooh_tarh", - onvane_tarh: "onvane_tarh", - address: "کرج - فلان جا - جنب پاساژ - نزدیک اونجا - اونور خیابون - زیر رو گذر - روی زیر گذر", - file_mosavab: "file", - polygon: [ - [51.515, -0.09], - [51.52, -0.1], - [51.52, -0.12], - ], -}; -const validationSchema = object({ - description: string().required("وارد کردن توضیحات الزامیست!"), -}); -const RoadSafetyFormContext = ({ rowId, mutate, setOpenRoadSafetyForm }) => { - const defaultValues = { - description: "", - }; - const requestServer = useRequest({ notificationSuccess: true }); - const { message, loadingMessage, errorMessage } = usePrevStateOpinion(); - const { - register, - handleSubmit, - formState: { isSubmitting, errors }, - } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "all" }); - const onSubmit = async (data) => { - const formData = new FormData(); - formData.append("description", data.description); - requestServer(`${SUBMIT_ROAD_SAFETY_FORM}/${rowId}`, "post", { - data: formData, - }) - .then(() => { - setOpenRoadSafetyForm(false); - mutate(); - }) - .catch(() => {}); - }; - return ( - - - - - - - - - - - - - - ); -}; -export default RoadSafetyFormContext; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/index.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/index.jsx deleted file mode 100644 index a4de0d7..0000000 --- a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/index.jsx +++ /dev/null @@ -1,52 +0,0 @@ -import { Dialog, IconButton, Stack, Tooltip } from "@mui/material"; -import EngineeringIcon from "@mui/icons-material/Engineering"; -import DialogTransition from "@/core/components/DialogTransition"; -import { useState } from "react"; -import { Close } from "@mui/icons-material"; -import RoadSafetyFormContext from "./RoadSafetyFormContext"; - -const RoadSafetyForm = ({ rowId, mutate }) => { - const [openRoadSafetyForm, setOpenRoadSafetyForm] = useState(false); - return ( - - - { - setOpenRoadSafetyForm(true); - }} - > - - - - - setOpenRoadSafetyForm(false)} - sx={{ - position: "absolute", - right: 8, - top: 8, - zIndex: 10, - color: (theme) => theme.palette.grey[500], - }} - > - - - - - - ); -}; -export default RoadSafetyForm; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/TaskDetail/DetailDialog.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/TaskDetail/DetailDialog.jsx deleted file mode 100644 index 777eecf..0000000 --- a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/TaskDetail/DetailDialog.jsx +++ /dev/null @@ -1,75 +0,0 @@ -"use client"; - -import { Dialog, DialogContent } from "@mui/material"; -import { object, string } from "yup"; -import useRequest from "@/lib/hooks/useRequest"; -import { useForm } from "react-hook-form"; -import { yupResolver } from "@hookform/resolvers/yup"; -import StyledForm from "@/core/components/StyledForm"; -import ApplicantRequestDetail from "@/core/components/ApplicantRequestDetail"; - -const fakeData = { - id: 1, - shomareh_darkhast: "2124", - ostan: "ostan", - shahr: "shahr", - shahrestan: "shahrestan", - bakhsh: "bakhsh", - roosta: "roosta", - tarikh_darkhast: "tarikh_darkhast", - sazman: "sazman", - masahat_zamin: "masahat_zamin", - masahat_tarh: "masahat_tarh", - gorooh_tarh: "gorooh_tarh", - onvane_tarh: "onvane_tarh", - address: "کرج - فلان جا - جنب پاساژ - نزدیک اونجا - اونور خیابون - زیر رو گذر - روی زیر گذر", - file_mosavab: "file", - polygon: [ - [51.515, -0.09], - [51.52, -0.1], - [51.52, -0.12], - ], -}; - -const validationSchema = object({ - description: string().required("وارد کردن توضیحات الزامیست!"), -}); - -const DetailDialog = ({ taskModal, setTaskModal, rowId, mutate }) => { - const requestServer = useRequest({ auth: true }); - const defaultValues = { - description: "", - }; - const handleClose = () => { - setTaskModal(false); - }; - - const { - register, - handleSubmit, - formState: { isSubmitting, errors, touchedFields }, - } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "all" }); - - const onSubmit = async (data) => { - const formData = new FormData(); - formData.append("description", data.description); - requestServer(`api-for-send-to-harim/${rowId}`, "post", { - data: formData, - }) - .then(() => { - handleClose(); - mutate(); - }) - .catch(() => {}); - }; - return ( - - - - - - - - ); -}; -export default DetailDialog; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/TaskDetail/index.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/TaskDetail/index.jsx deleted file mode 100644 index 1641840..0000000 --- a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/TaskDetail/index.jsx +++ /dev/null @@ -1,26 +0,0 @@ -"use client"; - -import { IconButton, Tooltip } from "@mui/material"; -import AssignmentIcon from "@mui/icons-material/Assignment"; -import DetailDialog from "./DetailDialog"; -import { useState } from "react"; - -const TaskDetail = ({ rowId, mutate }) => { - const [taskModal, setTaskModal] = useState(false); - - const openDetailDialog = () => { - setTaskModal(true); - }; - - return ( - <> - - - - - - - - ); -}; -export default TaskDetail; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/index.jsx deleted file mode 100644 index ae4213c..0000000 --- a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/index.jsx +++ /dev/null @@ -1,13 +0,0 @@ -import TaskDetail from "./TaskDetail"; -import { Box } from "@mui/material"; -import RoadSafetyForm from "./RoadSafetyForm"; - -const RowActions = ({ row, mutate }) => { - return ( - - - - - ); -}; -export default RowActions; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/TaskList.jsx deleted file mode 100644 index cb0bd3d..0000000 --- a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/TaskList.jsx +++ /dev/null @@ -1,145 +0,0 @@ -"use client"; - -import { useMemo } from "react"; -import { Box } from "@mui/material"; -import DataTableWithAuth from "@/core/components/DataTableWithAuth"; -import RowActions from "./RowActions"; - -const TaskList = () => { - const columns = useMemo( - () => [ - { - accessorKey: "id", - header: "کد یکتا", - id: "id", - enableColumnFilter: false, - datatype: "text", - filterMode: "notEquals", - }, - { - accessorKey: "aplication_number", - header: "شماره درخواست", - id: "aplication_number", - enableColumnFilter: false, - datatype: "text", - filterMode: "notEquals", - }, - { - accessorKey: "application_date", - header: "تاریخ درخواست", - id: "application_date", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "province", - header: "استان", - id: "province", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "township", - header: "شهرستان", - id: "township", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "city", - header: "شهر", - id: "city", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "county", - header: "بخش", - id: "county", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "village", - header: "روستا", - id: "village", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "land_area", - header: "مساحت زمین", - id: "land_area", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "design_area", - header: "مساحت طرح", - id: "design_area", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "organization", - header: "سازمان", - id: "organization", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "design_group", - header: "گروه طرح", - id: "design_group", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "design_title", - header: "عنوان طرح", - id: "design_title", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "state", - header: "وضعیت درخواست", - id: "state", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - ], - [] - ); - - return ( - <> - - - - - ); -}; -export default TaskList; diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/index.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/index.jsx deleted file mode 100644 index ef66f17..0000000 --- a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/index.jsx +++ /dev/null @@ -1,15 +0,0 @@ -"use client"; - -import PageTitle from "@/core/components/PageTitle"; -import { Stack } from "@mui/material"; -import TaskList from "./TaskList"; - -const GeneralManagerZaminGovComponent = () => { - return ( - - - - - ); -}; -export default GeneralManagerZaminGovComponent; diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/PrivacyOfficeList.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/PrivacyOfficeList.jsx new file mode 100644 index 0000000..913c803 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/PrivacyOfficeList.jsx @@ -0,0 +1,243 @@ +import CustomSelectByDependency from "@/core/components/DataTable/filter/fieldsType/CustomSelectByDependency"; +import DataTableWithAuth from "@/core/components/DataTableWithAuth"; +import useInquiryPrivacyState from "@/lib/hooks/useInquiryPrivacyState"; +import AutorenewIcon from "@mui/icons-material/Autorenew"; +import DangerousIcon from "@mui/icons-material/Dangerous"; +import ManageAccountsIcon from "@mui/icons-material/ManageAccounts"; +import MapsHomeWorkIcon from "@mui/icons-material/MapsHomeWork"; +import PsychologyAltIcon from "@mui/icons-material/PsychologyAlt"; +import ReceiptLongIcon from "@mui/icons-material/ReceiptLong"; +import SecurityIcon from "@mui/icons-material/Security"; +import WindowIcon from "@mui/icons-material/Window"; +import { Box, Stack } from "@mui/material"; +import moment from "jalali-moment"; +import { useMemo } from "react"; +import RowActions from "./RowActions"; +import { GET_PRIVACY_ADMIN_LIST } from "@/core/utils/routes"; +import ShowPrimaryArea from "./ShowPrimaryArea"; + +const PrivacyOfficeList = () => { + const stateIcon = (state_id) => { + if (state_id === 1) return ; + if (state_id === 2 || state_id === 5 || state_id === 13) return ; + if (state_id === 3 || state_id === 6 || state_id === 14) + return ; + if (state_id === 4 || state_id === 7 || state_id === 15) return ; + if (state_id === 8) return ; + if (state_id === 9 || state_id === 11) return ; + if (state_id === 10) return ; + if (state_id === 12) return ; + }; + const columns = useMemo(() => { + return [ + { + accessorKey: "panjare_vahed_id", + header: "کدرهگیری درخواست", + id: "panjare_vahed_id", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => <>{row.original.panjare_vahed_id}, + }, + { + accessorKey: "national_id", + header: "کد ملی", + id: "national_id", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => <>{row.original.national_id}, + }, + { + accessorKey: "state_id", + header: "وضعیت", + id: "state_id", + enableColumnFilter: true, + datatype: "numeric", + filterMode: "equals", + sortDescFirst: false, + grow: false, + size: 100, + ColumnSelectComponent: (props) => { + const { itemsList, loadingItemsList, errorItemsList } = useInquiryPrivacyState(); + + 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 }) => ( + + {stateIcon(row.original.state_id)} + + {row.original.state_name} + + + ), + }, + { + accessorKey: "plan_title", + header: "عنوان طرح", + id: "plan_title", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => <>{row.original.plan_title}, + }, + { + accessorKey: "plan_group", + header: "گروه طرح", + id: "plan_group", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => <>{row.original.plan_group}, + }, + { + accessorKey: "requested_organization", + header: "دستگاه صادر کننده", + id: "requested_organization", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => <>{row.original.requested_organization}, + }, + { + accessorKey: "worksheet_id", + header: "شناسه کاربرگ", + id: "worksheet_id", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => <>{row.original.worksheet_id}, + }, + { + accessorKey: "primary_area", + header: "نمایش محدوده طرح", + id: "primary_area", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => + row.original.primary_area ? ( + + + + ) : ( + "-" + ), + }, + { + accessorKey: "province_id", + header: "استان", + id: "province_id", + enableColumnFilter: false, + datatype: "numeric", + sortDescFirst: false, + grow: false, + size: 100, + Cell: ({ row }) => <>{row.original.province_name}, + }, + { + accessorKey: "city_id", + header: "شهر", + id: "city_id", + enableColumnFilter: false, + datatype: "numeric", + sortDescFirst: false, + grow: false, + size: 100, + Cell: ({ row }) => <>{row.original.city_name}, + }, + { + accessorKey: "isic", + header: "کد آیسیک", + id: "isic", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 100, + Cell: ({ row }) => <>{row.original.isic}, + }, + { + accessorFn: (row) => moment(row.request_date).locale("fa").format("YYYY/MM/DD"), + header: "تاریخ درخواست", + id: "request_date", + enableColumnFilter: true, + datatype: "date", + filterMode: "between", + grow: false, + size: 100, + }, + ]; + }, []); + + return ( + <> + + + + + ); +}; + +export default PrivacyOfficeList; diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ConfirmAction/index.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ConfirmAction/index.jsx new file mode 100644 index 0000000..c2a0cfc --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ConfirmAction/index.jsx @@ -0,0 +1,17 @@ +import ThumbUpIcon from "@mui/icons-material/ThumbUp"; +import { IconButton, Tooltip } from "@mui/material"; +import { useState } from "react"; + +const ConfirmAction = ({ rowId, mutate }) => { + const [openConfirmDialog, setOpenConfirmDialog] = useState(false); + return ( + <> + + setOpenConfirmDialog(true)}> + + + + + ); +}; +export default ConfirmAction; diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RejectAction/index.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RejectAction/index.jsx new file mode 100644 index 0000000..c16a405 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RejectAction/index.jsx @@ -0,0 +1,17 @@ +import ThumbDownIcon from "@mui/icons-material/ThumbDown"; +import { IconButton, Tooltip } from "@mui/material"; +import { useState } from "react"; + +const RejectAction = ({ rowId, mutate }) => { + const [openRejectDialog, setOpenRejectDialog] = useState(false); + return ( + <> + + setOpenRejectDialog(true)}> + + + + + ); +}; +export default RejectAction; diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/index.jsx new file mode 100644 index 0000000..06ea132 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/index.jsx @@ -0,0 +1,13 @@ +import { Box } from "@mui/material"; +import ConfirmAction from "./ConfirmAction"; +import RejectAction from "./RejectAction"; + +const RowActions = ({ row, mutate }) => { + return ( + + + + + ); +}; +export default RowActions; diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/ShowPrimaryArea/ShowBound.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/ShowPrimaryArea/ShowBound.jsx new file mode 100644 index 0000000..24db476 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/ShowPrimaryArea/ShowBound.jsx @@ -0,0 +1,29 @@ +import { useEffect, useRef } from "react"; +import { FeatureGroup, useMap } from "react-leaflet"; + +const ShowBound = ({ bound }) => { + const map = useMap(); + const featureRef = useRef(null); + + const safeFitBounds = (layer) => { + if (!layer || !map) return; + try { + const latLngs = layer.getLatLngs(); + map.fitBounds(latLngs, { + paddingTopLeft: [20, 20], + paddingBottomRight: [20, 20], + }); + } catch (e) { + console.warn("fitBounds failed:", e); + } + }; + + useEffect(() => { + bound?.editing?.disable(); + featureRef.current.addLayer(bound); + safeFitBounds(bound); + }, []); + + return ; +}; +export default ShowBound; diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/ShowPrimaryArea/index.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/ShowPrimaryArea/index.jsx new file mode 100644 index 0000000..98e24d0 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/ShowPrimaryArea/index.jsx @@ -0,0 +1,69 @@ +const { + Button, + IconButton, + Tooltip, + Box, + Dialog, + DialogTitle, + Typography, + DialogContent, + DialogActions, +} = require("@mui/material"); +import LayersIcon from "@mui/icons-material/Layers"; +import CloseIcon from "@mui/icons-material/Close"; +import { useMemo, useState } from "react"; +import MapLayer from "@/core/components/MapLayer"; +import ShowBound from "./ShowBound"; + +const ShowPrimaryArea = ({ primaryArea }) => { + const [openShowAreaDialog, setOpenShowAreaDialog] = useState(false); + const bound = useMemo(() => { + const latLngCoords = primaryArea.coordinates.map((coord) => [coord[1], coord[0]]); + return primaryArea.type === "polygon" ? L.polygon(latLngCoords) : L.polyline(latLngCoords); + }, [primaryArea]); + + return ( + + + setOpenShowAreaDialog(true)}> + + + + setOpenShowAreaDialog(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" + > + + + محدوده طرح + + setOpenShowAreaDialog(false)} size="small"> + + + + + + + + + + + + + + + ); +}; + +export default ShowPrimaryArea; diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/index.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/index.jsx new file mode 100644 index 0000000..ce52276 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/index.jsx @@ -0,0 +1,14 @@ +"use client"; +import PageTitle from "@/core/components/PageTitle"; +import { Stack } from "@mui/material"; +import PrivacyOfficeList from "./PrivacyOfficeList"; + +const PrivacyOfficePage = () => { + return ( + + + + + ); +}; +export default PrivacyOfficePage; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/MapActionButtons.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/MapActionButtons.jsx deleted file mode 100644 index 600372d..0000000 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/MapActionButtons.jsx +++ /dev/null @@ -1,100 +0,0 @@ -import { Box, Button, ButtonGroup } from "@mui/material"; -import AutoModeIcon from "@mui/icons-material/AutoMode"; -import DeleteIcon from "@mui/icons-material/Delete"; -import EditLocationAltIcon from "@mui/icons-material/EditLocationAlt"; -import SaveIcon from "@mui/icons-material/Save"; -import CancelIcon from "@mui/icons-material/Cancel"; - -const MapActionButtons = ({ - disableToCreate, - disableToEditAndDelete, - disableToSaveAndCancel, - onDraw, - onEdit, - onRemove, - onSave, - onCancel, -}) => ( - <> - - - - - - - - - - - - - -); - -export default MapActionButtons; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/MapModifyDialog.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/MapModifyDialog.jsx deleted file mode 100644 index 218cce5..0000000 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/MapModifyDialog.jsx +++ /dev/null @@ -1,96 +0,0 @@ -"use client"; - -import { - Box, - Button, - Chip, - Dialog, - DialogActions, - DialogContent, - Divider, - FormControl, - FormControlLabel, - FormLabel, - Radio, - RadioGroup, - Typography, -} from "@mui/material"; -import dynamic from "next/dynamic"; -import MapLoading from "@/core/components/MapLayer/Loading"; -import "leaflet-draw/dist/leaflet.draw.css"; -import GppMaybeIcon from "@mui/icons-material/GppMaybe"; -import PolygonForDesign from "./PolygonForDesign"; - -const MapLayer = dynamic(() => import("@/core/components/MapLayer"), { - loading: () => , - ssr: false, -}); - -const MapModifyDialog = ({ mapModifyModal, setMapModifyModal }) => { - const handleClose = () => { - setMapModifyModal(false); - }; - - return ( - - - - - - - - - - - - - - نکته: اصلاح ننمودن طرح به منزله تایید طرح میباشد. - - - - - - آیا طرح نیاز به ایجاد راه دسترسی دارد؟ - - - } label="بله" /> - } label="خیر" /> - - - - - - - - - - ); -}; - -export default MapModifyDialog; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/PolygonForDesign.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/PolygonForDesign.jsx deleted file mode 100644 index f765e41..0000000 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/PolygonForDesign.jsx +++ /dev/null @@ -1,115 +0,0 @@ -"use client"; - -import { FeatureGroup, useMap } from "react-leaflet"; -import { EditControl } from "react-leaflet-draw"; -import { useEffect, useRef, useState } from "react"; -import MapActionButtons from "./MapActionButtons"; - -const PolygonForDesign = () => { - const map = useMap(); - const editableFG = useRef(null); - const [polygonLayer, setPolygonLayer] = useState(null); - const [disableToCreate, setDisableToCreate] = useState(false); - const [disableToEditAndDelete, setDisableToEditAndDelete] = useState(true); - const [disableToSaveAndCancel, setDisableToSaveAndCancel] = useState(true); - const [editToolbar, setEditToolbar] = useState(null); - - useEffect(() => { - const { L } = window; - L.drawLocal.draw.handlers.polygon.tooltip = { - start: "برای شروع کشیدن پلیگان، کلیک کنید.", - cont: "گوشه های دیگر پلیگان را نیز انتخاب کنید.", - end: "برای اتمام رسم پلیگان، نقطه آخر را به اول متصل نمایید.", - }; - L.drawLocal.edit.handlers.edit.tooltip = { - text: "برای ذخیر یا لغو تغییرات، از دکمه های بالا سمت چپ استفاده نمایید.", - subtext: "نقاط مشخص شده را گرفته و برای ویرایش جابجا نمایید.", - }; - }, []); - - const handleDrawPolygon = () => { - const { L } = window; - const drawControl = new L.Draw.Polygon(map); - drawControl.enable(); - setDisableToCreate(true); - }; - - const handleEditPolygon = () => { - const { L } = window; - if (editableFG.current && polygonLayer) { - const editControlInstance = new L.EditToolbar.Edit(map, { - featureGroup: editableFG.current, - }); - editControlInstance.enable(); - setEditToolbar(editControlInstance); - setDisableToEditAndDelete(true); - setDisableToSaveAndCancel(false); - } - }; - - const handleRemovePolygon = () => { - if (polygonLayer && editableFG.current) { - editableFG.current.removeLayer(polygonLayer); - setPolygonLayer(null); - setDisableToEditAndDelete(true); - setDisableToCreate(false); - } - }; - - const handleSavePolygon = () => { - if (editToolbar) { - editToolbar.save(); - editToolbar.disable(); - setDisableToEditAndDelete(false); - setDisableToSaveAndCancel(true); - } - }; - - const handleCancelEdit = () => { - if (editToolbar) { - editToolbar.revertLayers(); - editToolbar.disable(); - setDisableToEditAndDelete(false); - setDisableToSaveAndCancel(true); - } - }; - - const handlePolygonCreate = (e) => { - const layer = e.layer; - setPolygonLayer(layer); - editableFG.current.addLayer(layer); - setDisableToEditAndDelete(false); - }; - - return ( - <> - - - - - - ); -}; - -export default PolygonForDesign; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/index.jsx deleted file mode 100644 index 970f93c..0000000 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/index.jsx +++ /dev/null @@ -1,29 +0,0 @@ -import { IconButton, Tooltip } from "@mui/material"; -import MapIcon from "@mui/icons-material/Map"; -import { useState } from "react"; -import MapModifyDialog from "./MapModifyDialog"; - -const MapModify = ({ rowId, mutate }) => { - const [mapModifyModal, setMapModifyModal] = useState(false); - - const openMapModifyDialog = () => { - setMapModifyModal(true); - }; - - return ( - <> - - - - - - - - ); -}; -export default MapModify; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx deleted file mode 100644 index 221e411..0000000 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx +++ /dev/null @@ -1,139 +0,0 @@ -import { - Autocomplete, - Button, - CircularProgress, - DialogActions, - DialogContent, - FormControl, - FormHelperText, - InputLabel, - OutlinedInput, - Stack, - TextField, - Typography, -} from "@mui/material"; -import { Controller, useForm } from "react-hook-form"; -import { yupResolver } from "@hookform/resolvers/yup"; -import { object, string } from "yup"; -import StyledForm from "@/core/components/StyledForm"; -import useProvinces from "@/lib/hooks/useProvince"; -import useRequest from "@/lib/hooks/useRequest"; -import { REFER_ADMIN_PROVINCE } from "@/core/utils/routes"; - -const validationSchema = object({ - description: string().required("وارد کردن توضیحات الزامیست!"), - province: string().required("وارد کردن استان الزامیست!"), -}); - -const ReferFormContext = ({ setOpenReferDialog, rowId, mutate }) => { - const defaultValues = { - description: "", - province: "", - }; - const { provinces, loadingProvinces, errorProvinces } = useProvinces(); - const requestServer = useRequest({ notificationSuccess: true }); - const { - control, - register, - handleSubmit, - formState: { isSubmitting, errors, touchedFields }, - } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "all" }); - - const onSubmit = async (data) => { - const formData = new FormData(); - formData.append("description", data.description); - formData.append("provinceId", data.province); - - requestServer(`${REFER_ADMIN_PROVINCE}/${rowId}`, "post", { - data: formData, - }) - .then(() => { - setOpenReferDialog(false); - mutate(); - }) - .catch(() => {}); - }; - return ( - - - - - - - توضیحات - - - - {errors.description ? errors.description.message : null} - - - - - ( - - - {errorProvinces ? ( - خطایی در دریافت استان ها رخ داده است! - ) : loadingProvinces ? ( - - - درحال دریافت لیست استان ها - - ) : ( - province.id === value) || null} - disablePortal - options={provinces} - getOptionLabel={(province) => province.name_fa} - isOptionEqualToValue={(option, value) => option.id === value.id} - onChange={(event, newValue) => { - onChange(newValue ? newValue.id : ""); - }} - renderInput={(params) => ( - - )} - /> - )} - - {errors.province ? errors.province.message : null} - - - )} - /> - - - - - - - - - ); -}; -export default ReferFormContext; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/index.jsx deleted file mode 100644 index ee76b95..0000000 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/index.jsx +++ /dev/null @@ -1,41 +0,0 @@ -import { Dialog, DialogTitle, IconButton, Stack, Tooltip } from "@mui/material"; -import ReplyIcon from "@mui/icons-material/Reply"; -import DialogTransition from "@/core/components/DialogTransition"; -import { useState } from "react"; -import ReferFormContext from "./ReferFormContext"; - -const ReferForm = ({ rowId, mutate }) => { - const [openReferDialog, setOpenReferDialog] = useState(false); - return ( - - - { - setOpenReferDialog(true); - }} - > - - - - - - ارجاع به استان دیگر - - - - - ); -}; -export default ReferForm; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/DescriptionForm.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/DescriptionForm.jsx deleted file mode 100644 index ba2cdeb..0000000 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/DescriptionForm.jsx +++ /dev/null @@ -1,29 +0,0 @@ -import { FormControl, FormHelperText, InputLabel, OutlinedInput, Stack } from "@mui/material"; - -const DescriptionForm = ({ errors, register }) => { - return ( - - - - توضیحات - - - - {errors.description ? errors.description.message : null} - - - - ); -}; -export default DescriptionForm; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/PrevCartableOpinion.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/PrevCartableOpinion.jsx deleted file mode 100644 index 74f9b45..0000000 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/PrevCartableOpinion.jsx +++ /dev/null @@ -1,27 +0,0 @@ -import { Card, CardContent, CardHeader, CircularProgress, Divider, Stack, Typography } from "@mui/material"; -import usePrevStateOpinion from "@/lib/hooks/usePrevStateopinion"; - -const PrevCartableOpinion = () => { - const { message, loadingMessage, errorMessage } = usePrevStateOpinion(); - return ( - - - - - {errorMessage ? ( - خطا در دریافت اطلاعات !!! - ) : loadingMessage ? ( - - - درحال دریافت اطلاعات - - ) : ( - {message} - )} - - - - - ); -}; -export default PrevCartableOpinion; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx deleted file mode 100644 index ef005b8..0000000 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx +++ /dev/null @@ -1,57 +0,0 @@ -import { - Card, - CardContent, - FormControl, - FormControlLabel, - FormLabel, - RadioGroup, - Stack, - Typography, -} from "@mui/material"; -import Radio from "@mui/material/Radio"; - -const QuestionSafetyForm = ({ register, errors }) => { - return ( - - - - - - - آیا ایمنی راه این طرح مورد تایید است ؟ - - - - - } - label="بله" - {...register("RadioGroup")} - /> - } - label="خیر" - {...register("RadioGroup")} - /> - - - {errors.RadioGroup && ( - - {errors.RadioGroup.message} - - )} - - - - - ); -}; -export default QuestionSafetyForm; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/RoadSaftyFormContext.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/RoadSaftyFormContext.jsx deleted file mode 100644 index 8be0c6c..0000000 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/RoadSaftyFormContext.jsx +++ /dev/null @@ -1,80 +0,0 @@ -import { DialogActions, DialogContent, Stack } from "@mui/material"; -import StyledForm from "@/core/components/StyledForm"; -import useRequest from "@/lib/hooks/useRequest"; -import { useForm } from "react-hook-form"; -import { yupResolver } from "@hookform/resolvers/yup"; -import { object, string } from "yup"; -import QuestionSafetyForm from "./QuestionSafetyForm"; -import PrevCartableOpinion from "./PrevCartableOpinion"; -import DescriptionForm from "./DescriptionForm"; -import SubmitButtonsAdmin from "./SubmitButtonsAdmin"; -import { SUBMIT_ROAD_SAFETY_FORM } from "@/core/utils/routes"; -import ApplicantRequestDetail from "@/core/components/ApplicantRequestDetail"; -const fakeData = { - id: 1, - shomareh_darkhast: "2124", - ostan: "ostan", - shahr: "shahr", - shahrestan: "shahrestan", - bakhsh: "bakhsh", - roosta: "roosta", - tarikh_darkhast: "tarikh_darkhast", - sazman: "sazman", - masahat_zamin: "masahat_zamin", - masahat_tarh: "masahat_tarh", - gorooh_tarh: "gorooh_tarh", - onvane_tarh: "onvane_tarh", - address: "کرج - فلان جا - جنب پاساژ - نزدیک اونجا - اونور خیابون - زیر رو گذر - روی زیر گذر", - file_mosavab: "file", - polygon: [ - [51.515, -0.09], - [51.52, -0.1], - [51.52, -0.12], - ], -}; -const validationSchema = object({ - description: string().required("وارد کردن توضیحات الزامیست!"), - RadioGroup: string().required("تاییدیه ایمنی راه ضروریست!"), -}); -const RoadSafetyFormContext = ({ rowId, mutate, setOpenRoadSafetyForm }) => { - const defaultValues = { - description: "", - RadioGroup: "", - }; - const requestServer = useRequest({ notificationSuccess: true }); - const { - register, - handleSubmit, - formState: { isSubmitting, errors }, - } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "all" }); - const onSubmit = async (data) => { - const formData = new FormData(); - formData.append("description", data.description); - formData.append("provinceId", data.RadioGroup); - - requestServer(`${SUBMIT_ROAD_SAFETY_FORM}/${rowId}`, "post", { - data: formData, - }) - .then(() => { - setOpenRoadSafetyForm(false); - mutate(); - }) - .catch(() => {}); - }; - return ( - - - - - - - - - - - - - - ); -}; -export default RoadSafetyFormContext; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/SubmitButtonsAdmin.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/SubmitButtonsAdmin.jsx deleted file mode 100644 index 611457f..0000000 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/SubmitButtonsAdmin.jsx +++ /dev/null @@ -1,21 +0,0 @@ -import { Button } from "@mui/material"; - -const SubmitButtonsAdmin = ({ setOpenRoadSafetyForm, isSubmitting }) => { - return ( - <> - - - - ); -}; -export default SubmitButtonsAdmin; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/index.jsx deleted file mode 100644 index 9787ef5..0000000 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/index.jsx +++ /dev/null @@ -1,52 +0,0 @@ -import { Dialog, IconButton, Stack, Tooltip } from "@mui/material"; -import EngineeringIcon from "@mui/icons-material/Engineering"; -import DialogTransition from "@/core/components/DialogTransition"; -import { useState } from "react"; -import RoadSafetyFormContext from "./RoadSaftyFormContext"; -import { Close } from "@mui/icons-material"; - -const RoadSafetyForm = ({ rowId, mutate }) => { - const [openRoadSafetyForm, setOpenRoadSafetyForm] = useState(false); - return ( - - - { - setOpenRoadSafetyForm(true); - }} - > - - - - - setOpenRoadSafetyForm(false)} - sx={{ - position: "absolute", - right: 8, - top: 8, - zIndex: 10, - color: (theme) => theme.palette.grey[500], - }} - > - - - - - - ); -}; -export default RoadSafetyForm; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/TaskDetail/DetailDialog.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/TaskDetail/DetailDialog.jsx deleted file mode 100644 index 777eecf..0000000 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/TaskDetail/DetailDialog.jsx +++ /dev/null @@ -1,75 +0,0 @@ -"use client"; - -import { Dialog, DialogContent } from "@mui/material"; -import { object, string } from "yup"; -import useRequest from "@/lib/hooks/useRequest"; -import { useForm } from "react-hook-form"; -import { yupResolver } from "@hookform/resolvers/yup"; -import StyledForm from "@/core/components/StyledForm"; -import ApplicantRequestDetail from "@/core/components/ApplicantRequestDetail"; - -const fakeData = { - id: 1, - shomareh_darkhast: "2124", - ostan: "ostan", - shahr: "shahr", - shahrestan: "shahrestan", - bakhsh: "bakhsh", - roosta: "roosta", - tarikh_darkhast: "tarikh_darkhast", - sazman: "sazman", - masahat_zamin: "masahat_zamin", - masahat_tarh: "masahat_tarh", - gorooh_tarh: "gorooh_tarh", - onvane_tarh: "onvane_tarh", - address: "کرج - فلان جا - جنب پاساژ - نزدیک اونجا - اونور خیابون - زیر رو گذر - روی زیر گذر", - file_mosavab: "file", - polygon: [ - [51.515, -0.09], - [51.52, -0.1], - [51.52, -0.12], - ], -}; - -const validationSchema = object({ - description: string().required("وارد کردن توضیحات الزامیست!"), -}); - -const DetailDialog = ({ taskModal, setTaskModal, rowId, mutate }) => { - const requestServer = useRequest({ auth: true }); - const defaultValues = { - description: "", - }; - const handleClose = () => { - setTaskModal(false); - }; - - const { - register, - handleSubmit, - formState: { isSubmitting, errors, touchedFields }, - } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "all" }); - - const onSubmit = async (data) => { - const formData = new FormData(); - formData.append("description", data.description); - requestServer(`api-for-send-to-harim/${rowId}`, "post", { - data: formData, - }) - .then(() => { - handleClose(); - mutate(); - }) - .catch(() => {}); - }; - return ( - - - - - - - - ); -}; -export default DetailDialog; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/TaskDetail/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/TaskDetail/index.jsx deleted file mode 100644 index 1641840..0000000 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/TaskDetail/index.jsx +++ /dev/null @@ -1,26 +0,0 @@ -"use client"; - -import { IconButton, Tooltip } from "@mui/material"; -import AssignmentIcon from "@mui/icons-material/Assignment"; -import DetailDialog from "./DetailDialog"; -import { useState } from "react"; - -const TaskDetail = ({ rowId, mutate }) => { - const [taskModal, setTaskModal] = useState(false); - - const openDetailDialog = () => { - setTaskModal(true); - }; - - return ( - <> - - - - - - - - ); -}; -export default TaskDetail; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx deleted file mode 100644 index 2d324bc..0000000 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx +++ /dev/null @@ -1,17 +0,0 @@ -import ReferForm from "./Refer"; -import TaskDetail from "./TaskDetail"; -import { Box } from "@mui/material"; -import RoadSafetyForm from "./RoadSafetyForm"; -import MapModify from "./MapModify"; - -const RowActions = ({ row, mutate }) => { - return ( - - - - - - - ); -}; -export default RowActions; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx deleted file mode 100644 index 188c1d6..0000000 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx +++ /dev/null @@ -1,145 +0,0 @@ -"use client"; - -import { useMemo } from "react"; -import { Box } from "@mui/material"; -import DataTableWithAuth from "@/core/components/DataTableWithAuth"; -import RowActions from "./RowActions"; - -const TaskList = () => { - const columns = useMemo( - () => [ - { - accessorKey: "id", - header: "کد یکتا", - id: "id", - enableColumnFilter: false, - datatype: "text", - filterMode: "notEquals", - }, - { - accessorKey: "aplication_number", - header: "شماره درخواست", - id: "aplication_number", - enableColumnFilter: false, - datatype: "text", - filterMode: "notEquals", - }, - { - accessorKey: "application_date", - header: "تاریخ درخواست", - id: "application_date", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "province", - header: "استان", - id: "province", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "township", - header: "شهرستان", - id: "township", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "city", - header: "شهر", - id: "city", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "county", - header: "بخش", - id: "county", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "village", - header: "روستا", - id: "village", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "land_area", - header: "مساحت زمین", - id: "land_area", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "design_area", - header: "مساحت طرح", - id: "design_area", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "organization", - header: "سازمان", - id: "organization", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "design_group", - header: "گروه طرح", - id: "design_group", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "design_title", - header: "عنوان طرح", - id: "design_title", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - { - accessorKey: "state", - header: "وضعیت درخواست", - id: "state", - enableColumnFilter: false, - datatype: "text", - filterMode: "equals", - }, - ], - [] - ); - - return ( - <> - - - - - ); -}; -export default TaskList; diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/index.jsx deleted file mode 100644 index 936d610..0000000 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/index.jsx +++ /dev/null @@ -1,15 +0,0 @@ -"use client"; - -import PageTitle from "@/core/components/PageTitle"; -import { Stack } from "@mui/material"; -import TaskList from "./TaskList"; - -const ProvinceAdminZaminGovComponent = () => { - return ( - - - - - ); -}; -export default ProvinceAdminZaminGovComponent; diff --git a/src/core/utils/geoCalculations.js b/src/core/utils/geoCalculations.js new file mode 100644 index 0000000..ebf8a96 --- /dev/null +++ b/src/core/utils/geoCalculations.js @@ -0,0 +1,35 @@ +import * as turf from "@turf/turf"; + +export const calculatePolygonMetrics = (coordinates, isLatLngOrder = true) => { + if (!coordinates || coordinates.length < 3) { + return { area: 0, sides: [], coordinates: [] }; + } + + const geoCoords = isLatLngOrder + ? coordinates.map(([lat, lng]) => [lng, lat]) + : coordinates.map(([lng, lat]) => [lng, lat]); + + if ( + geoCoords[0][0] !== geoCoords[geoCoords.length - 1][0] || + geoCoords[0][1] !== geoCoords[geoCoords.length - 1][1] + ) { + geoCoords.push(geoCoords[0]); + } + + const polygon = turf.polygon([geoCoords]); + + const area = turf.area(polygon); + + const sides = []; + for (let i = 0; i < geoCoords.length - 1; i++) { + const line = turf.lineString([geoCoords[i], geoCoords[i + 1]]); + const length = turf.length(line, { units: "meters" }); + sides.push(length); + } + + return { + area, + sides, + coordinates: geoCoords, + }; +}; diff --git a/src/core/utils/pageMenuDev.js b/src/core/utils/pageMenuDev.js index 5fda757..23c42d7 100644 --- a/src/core/utils/pageMenuDev.js +++ b/src/core/utils/pageMenuDev.js @@ -24,6 +24,10 @@ import RouteIcon from "@mui/icons-material/Route"; import ScienceIcon from "@mui/icons-material/Science"; import SpaceDashboardIcon from "@mui/icons-material/SpaceDashboard"; import SpeedIcon from "@mui/icons-material/Speed"; +import PsychologyAltIcon from "@mui/icons-material/PsychologyAlt"; +import MapsHomeWorkIcon from "@mui/icons-material/MapsHomeWork"; +import SecurityIcon from "@mui/icons-material/Security"; +import ManageAccountsIcon from "@mui/icons-material/ManageAccounts"; export const pageMenuDev = [ { @@ -295,32 +299,36 @@ export const pageMenuDev = [ hasSubitems: true, Subitems: [ { - id: "cityAdminZaminGov", - label: "استعلام حرائم پنجره واحد", + id: "cityAdmin", + label: "کارتابل شهرستان", type: "page", - route: "/dashboard/inquiry-privacy/city-admin/zamin-gov", - permissions: [], + route: "/dashboard/inquiry-privacy/city-admin", + icon: , + permissions: ["all"], }, { - id: "provinceAdminZaminGov", - label: "استعلام حرائم پنجره واحد", + id: "privacyOffice", + label: "کارتابل اداره حریم", type: "page", - route: "/dashboard/inquiry-privacy/province-admin/zamin-gov", - permissions: [], + route: "/dashboard/inquiry-privacy/privacy-office", + icon: , + permissions: ["all"], }, { - id: "assistantZaminGov", - label: "استعلام حرائم پنجره واحد", + id: "assistant", + label: "کارتابل معاون", type: "page", - route: "/dashboard/inquiry-privacy/assistant/zamin-gov", - permissions: [], + route: "/dashboard/inquiry-privacy/assistant", + icon: , + permissions: ["all"], }, { - id: "generalManagerZaminGov", - label: "استعلام حرائم پنجره واحد", + id: "generalManager", + label: "کارتابل مدیر", type: "page", - route: "/dashboard/inquiry-privacy/general-manager/zamin-gov", - permissions: [], + route: "/dashboard/inquiry-privacy/general-manager", + icon: , + permissions: ["all"], }, ], }, diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js index 1ddf8dc..8572b6f 100644 --- a/src/core/utils/routes.js +++ b/src/core/utils/routes.js @@ -234,3 +234,9 @@ export const GET_RAHDARAN_TABLE_LIST = api + "/api/v3/rahdaran"; export const DELETE_RAHDARAN_ITEM = api + "/api/v3/rahdaran"; export const UPDATE_RAHDARAN_ITEM = api + "/api/v3/rahdaran"; export const CREATE_RAHDARAN_ITEM = api + "/api/v3/rahdaran"; + +// estelam harim +export const GET_CITY_ADMIN_LIST = api + "/api/v3/harim/province_office"; +export const GET_INQUIRY_PRIVACY_STATE_LIST = api + "/api/v3/harim/detail/states"; +export const CITY_ADMIN_FEEDBACK = api + "/api/v3/harim/province_office/feedback"; +export const GET_PRIVACY_ADMIN_LIST = api + "/api/v3/harim/harim_office"; diff --git a/src/lib/hooks/useInquiryPrivacyState.js b/src/lib/hooks/useInquiryPrivacyState.js new file mode 100644 index 0000000..a66d83f --- /dev/null +++ b/src/lib/hooks/useInquiryPrivacyState.js @@ -0,0 +1,30 @@ +import { GET_INQUIRY_PRIVACY_STATE_LIST } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; +import { useEffect, useState } from "react"; + +const useInquiryPrivacyState = () => { + const requestServer = useRequest(); + const [itemsList, setItemsList] = useState([]); + const [loadingItemsList, setLoadingItemsList] = useState(true); + const [errorItemsList, setErrorItemsList] = useState(null); + + useEffect(() => { + const fetchItems = async () => { + try { + const response = await requestServer(`${GET_INQUIRY_PRIVACY_STATE_LIST}`); + setItemsList(response.data.data); + setLoadingItemsList(false); + setErrorItemsList(false); + } catch (e) { + setErrorItemsList(e); + setLoadingItemsList(false); + } + }; + + fetchItems(); + }, []); + + return { itemsList, loadingItemsList, errorItemsList }; +}; + +export default useInquiryPrivacyState;