diff --git a/package.json b/package.json index 4132581..9641fc0 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "react-dom": "^18", "react-hook-form": "^7.52.1", "react-leaflet": "^4.2.1", + "react-leaflet-draw": "^0.20.4", "react-toastify": "^10.0.5", "sass": "^1.75.0", "sharp": "^0.33.4", diff --git a/src/assets/scss/map-styles.scss b/src/assets/scss/map-styles.scss new file mode 100644 index 0000000..851873f --- /dev/null +++ b/src/assets/scss/map-styles.scss @@ -0,0 +1,28 @@ +.leaflet-draw-tooltip { + background-color: #4f4f4f; + font-family: IRANSans; + color: #fff; + font-size: 10px; + padding: 2px 8px; + margin-right: 15px; + border-radius: 4px; + box-shadow: 0px 4px 8px rgba(0, 0, 0, 0.1); +} + +.leaflet-draw-tooltip:before { + content: ""; + position: absolute; + bottom: 100%; + left: 103%; + transform: rotate(90deg); + margin-left: -6px; + border-width: 6px; + border-style: solid; + border-color: transparent transparent #333 transparent; +} + +.leaflet-draw-tooltip-subtext { + font-size: 12px; + color: #ffeb3b; +} + diff --git a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx index f0be54c..cc9be16 100644 --- a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx @@ -1,10 +1,10 @@ -import {Card, CardContent, FormControl, FormLabel, Stack, Typography} from "@mui/material"; +import { Card, CardContent, FormControl, FormLabel, Stack, Typography } from "@mui/material"; const QuestionSafetyForm = () => { return ( - + @@ -15,13 +15,11 @@ const 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 index 64fbdb9..def0666 100644 --- a/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx +++ b/src/components/dashboard/inquiryPrivacy/assistant/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx @@ -40,7 +40,7 @@ const RoadSafetyFormContext = ({ rowId, mutate, setOpenRoadSafetyForm }) => { const defaultValues = { description: "", }; - const requestServer = useRequest({ notification : {success : true, show : true} }); + const requestServer = useRequest({ notification: { success: true, show: true } }); const { message, loadingMessage, errorMessage } = usePrevStateOpinion(); const { register, diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx index 7c1b0aa..10b8e38 100644 --- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx +++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx @@ -31,7 +31,7 @@ const ReferFormContext = ({ setOpenReferDialog, rowId, mutate }) => { city: "", }; const { cities, loadingCities, errorCities } = useCities(); - const requestServer = useRequest({notification : {show : true, success : true}}); + const requestServer = useRequest({ notification: { show: true, success: true } }); const { control, register, diff --git a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx index f0be54c..cc9be16 100644 --- a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/QuestionSafetyForm.jsx @@ -1,10 +1,10 @@ -import {Card, CardContent, FormControl, FormLabel, Stack, Typography} from "@mui/material"; +import { Card, CardContent, FormControl, FormLabel, Stack, Typography } from "@mui/material"; const QuestionSafetyForm = () => { return ( - + @@ -15,13 +15,11 @@ const 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 index ba31373..7ced8b8 100644 --- a/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx +++ b/src/components/dashboard/inquiryPrivacy/generalManager/zaminGov/RowActions/RoadSafetyForm/RoadSafetyFormContext.jsx @@ -40,7 +40,7 @@ const RoadSafetyFormContext = ({ rowId, mutate, setOpenRoadSafetyForm }) => { const defaultValues = { description: "", }; - const requestServer = useRequest({ notification : {success : true, show : true} }); + const requestServer = useRequest({ notification: { success: true, show: true } }); const { message, loadingMessage, errorMessage } = usePrevStateOpinion(); const { register, diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/MapActionButtons.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/MapActionButtons.jsx new file mode 100644 index 0000000..4986160 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/MapActionButtons.jsx @@ -0,0 +1,96 @@ +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; \ No newline at end of file diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/MapModifyDialog.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/MapModifyDialog.jsx new file mode 100644 index 0000000..55566a2 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/MapModifyDialog.jsx @@ -0,0 +1,91 @@ +"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 new file mode 100644 index 0000000..9dd400f --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/PolygonForDesign.jsx @@ -0,0 +1,118 @@ +"use client"; + +import "leaflet-draw/dist/leaflet.draw.css"; +import "@/assets/scss/map-styles.scss" +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; \ No newline at end of file diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/index.jsx new file mode 100644 index 0000000..5a96741 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/MapModify/index.jsx @@ -0,0 +1,25 @@ +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 index fdf9278..26f9bf8 100644 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx @@ -31,7 +31,7 @@ const ReferFormContext = ({ setOpenReferDialog, rowId, mutate }) => { province: "", }; const { provinces, loadingProvinces, errorProvinces } = useProvinces(); - const requestServer = useRequest({notification : {show : true, success : true}}); + const requestServer = useRequest({ notification: { show: true, success: true } }); const { control, register, diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/RoadSaftyFormContext.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/RoadSaftyFormContext.jsx index 64ab7c7..861400a 100644 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/RoadSaftyFormContext.jsx +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/RoadSafetyForm/RoadSaftyFormContext.jsx @@ -41,7 +41,7 @@ const RoadSafetyFormContext = ({ rowId, mutate, setOpenRoadSafetyForm }) => { description: "", RadioGroup: "", }; - const requestServer = useRequest({ notification : {success : true, show : true} }); + const requestServer = useRequest({ notification: { success: true, show: true } }); const { register, handleSubmit, diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx index 8da978b..778eaa7 100644 --- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx @@ -1,14 +1,16 @@ import ReferForm from "./Refer"; import TaskDetail from "./TaskDetail"; -import { Box } from "@mui/material"; +import {Box} from "@mui/material"; import RoadSafetyForm from "./RoadSafetyForm"; +import MapModify from "./MapModify"; -const RowActions = ({ row, mutate }) => { +const RowActions = ({row, mutate}) => { return ( - - - - + + + + + ); }; diff --git a/src/lib/hooks/useCities.js b/src/lib/hooks/useCities.js index 47bf99b..e1af9aa 100644 --- a/src/lib/hooks/useCities.js +++ b/src/lib/hooks/useCities.js @@ -4,7 +4,7 @@ import { GET_CITY_LISTS } from "@/core/utils/routes"; import useRequest from "@/lib/hooks/useRequest"; const useCities = () => { - const requestServer = useRequest() + const requestServer = useRequest(); const [cities, setCities] = useState([]); const [loadingCities, setLoadingCities] = useState(true); const [errorCities, setErrorCities] = useState(null); diff --git a/src/lib/hooks/usePrevStateopinion.js b/src/lib/hooks/usePrevStateopinion.js index f7c0d47..9104366 100644 --- a/src/lib/hooks/usePrevStateopinion.js +++ b/src/lib/hooks/usePrevStateopinion.js @@ -4,7 +4,7 @@ import { GET_PREV_STATE_OPINION } from "@/core/utils/routes"; import useRequest from "@/lib/hooks/useRequest"; const usePrevStateOpinion = () => { - const requestServer = useRequest() + const requestServer = useRequest(); const [message, setMessage] = useState([]); const [loadingMessage, setLoadingMessage] = useState(true); const [errorMessage, setErrorMessage] = useState(null); diff --git a/src/lib/hooks/useProvince.js b/src/lib/hooks/useProvince.js index b0a7dc9..a21744b 100644 --- a/src/lib/hooks/useProvince.js +++ b/src/lib/hooks/useProvince.js @@ -4,7 +4,7 @@ import { GET_PROVINCE_LISTS } from "@/core/utils/routes"; import useRequest from "@/lib/hooks/useRequest"; const useProvinces = () => { - const requestServer = useRequest() + const requestServer = useRequest(); const [provinces, setProvinces] = useState([]); const [loadingProvinces, setLoadingProvinces] = useState(true); const [errorProvinces, setErrorProvinces] = useState(null);