diff --git a/jsconfig.json b/jsconfig.json index d9112b4..b51472a 100644 --- a/jsconfig.json +++ b/jsconfig.json @@ -1,12 +1,27 @@ +// javascript for production { - "compilerOptions": { - "paths": { - "@/*": [ - "./src/*" - ], - "^/*": [ - "./public/*" - ] + "compilerOptions": { + "paths": { + "@/*": ["./src/*"], + "^/*": ["./public/*"] + } } - } } + +// typescript for local development +// { +// "compilerOptions": { +// "jsx": "react-jsx", +// "noUnusedLocals": true, +// "noImplicitAny": false, +// "checkJs": true, +// "allowJs": true, +// "strict": true, +// "baseUrl": ".", +// "paths": { +// "@/*": ["./src/*"], +// "^/*": ["./public/*"] +// } +// }, +// "exclude": ["node_modules"] +// } diff --git a/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/assistant/page.js b/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/technical-deputy/page.js similarity index 70% rename from src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/assistant/page.js rename to src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/technical-deputy/page.js index c13a78d..ebcc6c3 100644 --- a/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/assistant/page.js +++ b/src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/technical-deputy/page.js @@ -1,3 +1,4 @@ +import TechnicalDeputy from "@/components/dashboard/inquiryPrivacy/technical-deputy"; import WithPermission from "@/core/middlewares/withPermission"; export const metadata = { title: "کارتابل معاون", @@ -5,7 +6,7 @@ export const metadata = { const Page = () => { return ( -

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

+
); }; diff --git a/src/components/dashboard/inquiryPrivacy/city-admin/ShowPrimaryArea/index.jsx b/src/components/dashboard/inquiryPrivacy/city-admin/ShowPrimaryArea/index.jsx index 98e24d0..76c0980 100644 --- a/src/components/dashboard/inquiryPrivacy/city-admin/ShowPrimaryArea/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/city-admin/ShowPrimaryArea/index.jsx @@ -1,18 +1,8 @@ -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"; +const { IconButton, Tooltip, Box, Dialog, DialogTitle, Typography, DialogContent } = require("@mui/material"); import MapLayer from "@/core/components/MapLayer"; +import CloseIcon from "@mui/icons-material/Close"; +import LayersIcon from "@mui/icons-material/Layers"; +import { useMemo, useState } from "react"; import ShowBound from "./ShowBound"; const ShowPrimaryArea = ({ primaryArea }) => { diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/PrivacyOfficeList.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/PrivacyOfficeList.jsx index 913c803..b6932ca 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/PrivacyOfficeList.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/PrivacyOfficeList.jsx @@ -1,5 +1,6 @@ import CustomSelectByDependency from "@/core/components/DataTable/filter/fieldsType/CustomSelectByDependency"; import DataTableWithAuth from "@/core/components/DataTableWithAuth"; +import { GET_PRIVACY_ADMIN_LIST } from "@/core/utils/routes"; import useInquiryPrivacyState from "@/lib/hooks/useInquiryPrivacyState"; import AutorenewIcon from "@mui/icons-material/Autorenew"; import DangerousIcon from "@mui/icons-material/Dangerous"; @@ -13,7 +14,7 @@ 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 = () => { @@ -28,6 +29,7 @@ const PrivacyOfficeList = () => { if (state_id === 10) return ; if (state_id === 12) return ; }; + const columns = useMemo(() => { return [ { diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ActionsDialog.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ActionsDialog.jsx new file mode 100644 index 0000000..75fe025 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ActionsDialog.jsx @@ -0,0 +1,20 @@ +import { Dialog, DialogTitle } from "@mui/material"; +import RenderActionForm from "./RenderActionForm"; + +const ActionDialog = ({ open, type, rowData, onClose, mutate }) => { + const actionLabel = { + reject_request: "رد درخواست", + confirm_request: "تایید درخواست", + refer_request: "ارجاع درخواست", + }[type]; + + return ( + + {actionLabel} + + + + ); +}; + +export default ActionDialog; diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ConfirmAction/index.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ConfirmAction/index.jsx index c2a0cfc..7820320 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ConfirmAction/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ConfirmAction/index.jsx @@ -1,15 +1,15 @@ 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); +const ConfirmAction = ({ onClick, disabled }) => { return ( <> - setOpenConfirmDialog(true)}> - - + + + + + ); diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ComputePaymentForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ComputePaymentForm.jsx new file mode 100644 index 0000000..eb0fa47 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ComputePaymentForm.jsx @@ -0,0 +1,228 @@ +import { calculatePolygonMetrics } from "@/core/utils/geoCalculations"; +import { PRIVACY_ADMIN_ACTION_API } from "@/core/utils/routes"; +import { safeParsePolygon } from "@/core/utils/utils"; +import useRequest from "@/lib/hooks/useRequest"; +import { + Box, + Button, + DialogActions, + FormControl, + FormHelperText, + InputLabel, + MenuItem, + Select, + TextField, +} from "@mui/material"; +import { useEffect, useState } from "react"; +import { Controller, useForm, useWatch } from "react-hook-form"; + +const formatNumber = (num) => { + if (!num) return ""; + return Number(num).toLocaleString("en-US"); +}; + +const price_fee = 1; // TODO: Replace with real price_fee +export default function ComputePaymentForm({ mutate, onClose, rowData }) { + const [isSubmitting, setIsSubmitting] = useState(false); + const request = useRequest({ notificationSuccess: true, notificationFailed: true }); + + const coordsArea = safeParsePolygon(rowData.final_area); + const coordsPlan = safeParsePolygon(rowData.final_plan); + + const areaMetrics = coordsArea ? calculatePolygonMetrics(coordsArea) : { area: 0 }; + const planMetrics = coordsPlan ? calculatePolygonMetrics(coordsPlan) : { area: 0 }; + + const calculatedArea = Number(areaMetrics.area.toFixed(2) || 0); + const calculatedPlan = Number(planMetrics.area.toFixed(2) || 0); + + const { + control, + handleSubmit, + setValue, + formState: { errors }, + } = useForm({ + defaultValues: { + expert_description: "", + traffic: "", + road_type: "", + position: "", + final_area_space: calculatedArea, // عرصه + final_plan_space: calculatedPlan, // عیان + payment_amount: "", + }, + }); + + const { traffic, road_type, position } = useWatch({ + control, + }); + + useEffect(() => { + const hasGeometry = calculatedArea > 0 || calculatedPlan > 0; + + const t = parseFloat(traffic || ""); + const r = parseFloat(road_type || ""); + const p = parseFloat(position || ""); + + const inputsValid = hasGeometry && !isNaN(t) && t > 0 && !isNaN(r) && r > 0 && !isNaN(p) && p > 0; + + if (inputsValid) { + const resultArea = t * r * p * calculatedArea * price_fee; + const resultPlan = t * r * p * calculatedPlan * price_fee; + + setValue("payment_amount", Math.floor(resultArea + resultPlan).toString()); + } else { + setValue("payment_amount", ""); + } + }, [traffic, road_type, position, setValue, calculatedArea, calculatedPlan]); + + const onSubmit = (data) => { + setIsSubmitting(true); + + try { + request(`${PRIVACY_ADMIN_ACTION_API}/computing_payment/${rowData.id}`, "post", { + data, + }).then(() => { + onClose(); + mutate(); + }); + } catch (error) { + console.error("Error submitting payment:", error); + } finally { + setIsSubmitting(false); + } + }; + + return ( + + + ( + + ترافیک + + {errors.traffic && ( + {errors.traffic.message} + )} + + )} + /> + + ( + + نوع راه + + {errors.road_type && ( + {errors.road_type.message} + )} + + )} + /> + + + ( + + موقعیت اقتصادی + + {errors.position && ( + {errors.position.message} + )} + + )} + /> + + + ( + + )} + /> + ( + + )} + /> + + + { + const { value } = field; + + return ( + + ); + }} + /> + + ( + + )} + /> + + + + + + + ); +} diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmFileForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmFileForm.jsx new file mode 100644 index 0000000..80bda88 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmFileForm.jsx @@ -0,0 +1,69 @@ +import { PRIVACY_ADMIN_ACTION_API } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; +import { Box, Button, DialogActions, TextField } from "@mui/material"; +import { useState } from "react"; +import { Controller, useForm } from "react-hook-form"; + +export default function ConfirmFileForm({ mutate, onClose, rowId }) { + const [isSubmitting, setIsSubmitting] = useState(false); + const request = useRequest({ notificationSuccess: true, notificationFailed: true }); + + const { + control, + handleSubmit, + formState: { errors }, + } = useForm({ + defaultValues: { + expert_description: "", + }, + }); + + const onSubmit = (data) => { + setIsSubmitting(true); + + try { + request(`${PRIVACY_ADMIN_ACTION_API}/file_accepted/${rowId}`, "post", { + data, + }).then(() => { + onClose(); + mutate(); + }); + } catch (err) { + console.log(err); + } finally { + setIsSubmitting(false); + } + }; + + return ( + + ( + + )} + /> + + + + + + + ); +} diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmRequestForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmRequestForm.jsx new file mode 100644 index 0000000..fdfabd7 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmRequestForm.jsx @@ -0,0 +1,96 @@ +import { PRIVACY_ADMIN_ACTION_API } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; +import { Box, Button, Checkbox, DialogActions, FormControlLabel, TextField } from "@mui/material"; +import { useState } from "react"; +import { Controller, useForm } from "react-hook-form"; + +export default function ConfirmRequestForm({ mutate, onClose, rowId }) { + const [isSubmitting, setIsSubmitting] = useState(false); + const request = useRequest({ notificationSuccess: true, notificationFailed: true }); + + const { + control, + handleSubmit, + formState: { errors }, + } = useForm({ + defaultValues: { + expert_description: "", + need_payment: false, + needsAccessRoad: false, + }, + }); + + const onSubmit = (data) => { + const confirmType = data.needsAccessRoad ? "need_road_access" : "without_road_access"; + const url = `${PRIVACY_ADMIN_ACTION_API}/${confirmType}/${rowId}`; + const body = { + expert_description: data.expert_description, + need_payment: data.need_payment ? 1 : 0, + }; + + setIsSubmitting(true); + try { + request(url, "post", { + data: body, + }).then(() => { + mutate(); + onClose(); + }); + } catch (error) { + } finally { + setIsSubmitting(false); + } + }; + + return ( + + ( + + )} + /> + + ( + } + label="نیاز به پرداخت وجه خزانه" + /> + )} + /> + + ( + } + label="نیاز به راه دسترسی" + /> + )} + /> + + + + + + + ); +} diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ReferForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ReferForm.jsx new file mode 100644 index 0000000..231f08f --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ReferForm.jsx @@ -0,0 +1,67 @@ +import { PRIVACY_ADMIN_ACTION_API } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; +import { Box, Button, DialogActions, TextField } from "@mui/material"; +import { useState } from "react"; +import { Controller, useForm } from "react-hook-form"; + +export default function ReferForm({ mutate, onClose, rowId }) { + const [isSubmitting, setIsSubmitting] = useState(false); + const request = useRequest({ notificationSuccess: true, notificationFailed: true }); + + const { + control, + handleSubmit, + formState: { errors }, + } = useForm({ + defaultValues: { + expert_description: "", + }, + }); + + const onSubmit = (data) => { + setIsSubmitting(true); + try { + request(`${PRIVACY_ADMIN_ACTION_API}/refer_request/${rowId}`, "post", { + data, + }).then(() => { + onClose(); + mutate(); + }); + } catch (error) { + console.log(error); + } finally { + setIsSubmitting(false); + } + }; + + return ( + + ( + + )} + /> + + + + + + ); +} diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectFileForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectFileForm.jsx new file mode 100644 index 0000000..0427eef --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectFileForm.jsx @@ -0,0 +1,69 @@ +import { PRIVACY_ADMIN_ACTION_API } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; +import { Box, Button, DialogActions, TextField } from "@mui/material"; +import { useState } from "react"; +import { Controller, useForm } from "react-hook-form"; + +export default function RejectFileForm({ mutate, onClose, rowId }) { + const [isSubmitting, setIsSubmitting] = useState(false); + const request = useRequest({ notificationSuccess: true, notificationFailed: true }); + + const { + control, + handleSubmit, + formState: { errors }, + } = useForm({ + defaultValues: { + expert_description: "", + }, + }); + + const onSubmit = (data) => { + setIsSubmitting(true); + + try { + request(`${PRIVACY_ADMIN_ACTION_API}/file_rejected/${rowId}`, "post", { + data, + }).then(() => { + onClose(); + mutate(); + }); + } catch (err) { + console.log(err); + } finally { + setIsSubmitting(false); + } + }; + + return ( + + ( + + )} + /> + + + + + + + ); +} diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectRequestForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectRequestForm.jsx new file mode 100644 index 0000000..daf1961 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectRequestForm.jsx @@ -0,0 +1,69 @@ +import { PRIVACY_ADMIN_ACTION_API } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; +import { Box, Button, DialogActions, TextField } from "@mui/material"; +import { useState } from "react"; +import { Controller, useForm } from "react-hook-form"; + +export default function RejectRequestForm({ mutate, onClose, rowId }) { + const [isSubmitting, setIsSubmitting] = useState(false); + const request = useRequest({ notificationSuccess: true, notificationFailed: true }); + + const { + control, + handleSubmit, + formState: { errors }, + } = useForm({ + defaultValues: { + expert_description: "", + }, + }); + + const onSubmit = (data) => { + setIsSubmitting(true); + + try { + request(`${PRIVACY_ADMIN_ACTION_API}/reject_request/${rowId}`, "post", { + data, + }).then(() => { + onClose(); + mutate(); + }); + } catch (err) { + console.log(err); + } finally { + setIsSubmitting(false); + } + }; + + return ( + + ( + + )} + /> + + + + + + + ); +} diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ReferralAction/index.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ReferralAction/index.jsx new file mode 100644 index 0000000..85a693f --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ReferralAction/index.jsx @@ -0,0 +1,17 @@ +import { Reply } from "@mui/icons-material"; +import { IconButton, Tooltip } from "@mui/material"; + +const ReferralAction = ({ onClick, disabled }) => { + return ( + <> + + + + + + + + + ); +}; +export default ReferralAction; diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RejectAction/index.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RejectAction/index.jsx index c16a405..e467e87 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RejectAction/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RejectAction/index.jsx @@ -1,15 +1,15 @@ 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); +const RejectAction = ({ onClick, disabled }) => { return ( <> - setOpenRejectDialog(true)}> - - + + + + + ); diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx new file mode 100644 index 0000000..846cc1a --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx @@ -0,0 +1,32 @@ +import { DialogContent } from "@mui/material"; +import ComputePaymentForm from "./Forms/ComputePaymentForm"; +import ConfirmFileForm from "./Forms/ConfirmFileForm"; +import ConfirmRequestForm from "./Forms/ConfirmRequestForm"; +import ReferForm from "./Forms/ReferForm"; +import RejectFileForm from "./Forms/RejectFileForm"; +import RejectRequestForm from "./Forms/RejectRequestForm"; + +export default function RenderActionForm({ type, rowData, mutate, onClose }) { + const formType = `${type}_${rowData?.state_id}`; + + function renderForm() { + switch (formType) { + case "refer_request_2": + return ; + case "reject_request_2": + return ; + case "reject_request_5": + return ; + case "confirm_request_2": + return ; + case "confirm_request_5": + return ; + case "confirm_request_13": + return ; + default: + return <>; + } + } + + return {renderForm()}; +} diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/index.jsx index 06ea132..6cc004d 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/index.jsx @@ -1,13 +1,55 @@ import { Box } from "@mui/material"; +import { useState } from "react"; +import ActionDialog from "./ActionsDialog"; import ConfirmAction from "./ConfirmAction"; +import ReferralAction from "./ReferralAction"; import RejectAction from "./RejectAction"; -const RowActions = ({ row, mutate }) => { +const RowActions = ({ row: { original }, mutate }) => { + const [modal, setModal] = useState({ + open: false, + type: null, // "reject_request" | "confirm_request" | "refer_request" + rowData: null, + }); + + const handleOpenModal = (type, rowData) => { + setModal({ open: true, type, rowData }); + }; + + const handleCloseModal = () => { + setModal({ open: false, type: null, rowData: null }); + }; + + const stateId = original.state_id; + + const disabled = { + referral: stateId !== 2, + reject: stateId !== 2 && stateId !== 5, + confirm: stateId !== 2 && stateId !== 5 && stateId !== 13, + }; + return ( - - - - + <> + + handleOpenModal("refer_request", original)} + disabled={disabled.referral} + /> + handleOpenModal("reject_request", original)} disabled={disabled.reject} /> + handleOpenModal("confirm_request", original)} + disabled={disabled.confirm} + /> + + + ); }; + export default RowActions; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/ConfirmRoadSafetyDialog.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/ConfirmRoadSafetyDialog.jsx new file mode 100644 index 0000000..7b8e90e --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/ConfirmRoadSafetyDialog.jsx @@ -0,0 +1,48 @@ +import DialogLoading from "@/core/components/DialogLoading"; +import { GET_REQUEST_INQUIRY_PRIVACY_ZAMIN_GOV_ASSISTANT_DETAILS } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; +import { DialogContent, Typography } from "@mui/material"; +import { useEffect, useState } from "react"; +import ConfirmRoadSafetyFormContext from "./ConfirmRoadSafetyFormContext"; + +const ConfirmRoadSafetyDialog = ({ row, handleClose, rowId, mutate }) => { + const [loading, setLoading] = useState(true); + const [data, setData] = useState(null); + const request = useRequest(); + + useEffect(() => { + const fetchData = async () => { + try { + setLoading(true); + const response = await request(`${GET_REQUEST_INQUIRY_PRIVACY_ZAMIN_GOV_ASSISTANT_DETAILS}/${rowId}`); + setData(response.data.data); + } catch (error) { + } finally { + setLoading(false); + } + }; + + fetchData(); + }, [request, rowId]); + + return ( + <> + {loading ? ( + + ) : data ? ( + + ) : ( + + اطلاعات درخواست در سامانه یافت نشد + + )} + + ); +}; +export default ConfirmRoadSafetyDialog; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/ConfirmRoadSafetyFormContext.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/ConfirmRoadSafetyFormContext.jsx new file mode 100644 index 0000000..ac10bf7 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/ConfirmRoadSafetyFormContext.jsx @@ -0,0 +1,85 @@ +import ApplicantRequestDetail from "@/core/components/ApplicantRequestDetail"; +import { Engineering, ExitToApp, InsertDriveFile, Route } from "@mui/icons-material"; +import { Button, DialogActions, DialogContent, Stack, Tab, Tabs } from "@mui/material"; +import { useState } from "react"; +import PrevCartableOpinion from "./PrevCartableOpinion"; +import Questions from "./Questions"; +import TabPanel from "@/core/components/TabPanel"; + +const ConfirmRoadSafetyFormContext = ({ row, data, rowId, mutate, handleClose }) => { + const [tabState, setTabState] = useState(0); + + const handleChangeTab = (event, newValue) => { + setTabState(newValue); + }; + + const handlePrev = () => { + if (tabState === 0) { + handleClose(); + } else { + setTabState((t) => t - 1); + } + }; + + return ( + <> + + } label="اطلاعات طرح متقاضی" /> + } label="جریان فرایند" /> + } label="تاییدیه ایمنی راه" /> + + + + + + + + + + + + + + {data.histories.map((item, index) => ( + + ))} + + + + + + + + + + + + ); +}; +export default ConfirmRoadSafetyFormContext; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/PrevCartableOpinion.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/PrevCartableOpinion.jsx new file mode 100644 index 0000000..37fe672 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/PrevCartableOpinion.jsx @@ -0,0 +1,16 @@ +import { Card, CardContent, CircularProgress, Stack, Typography } from "@mui/material"; + +const PrevCartableOpinion = ({ item }) => { + + return ( + + + + {item.previous_state_name}: {item.action_name} + توضیحات: {item.expert_description} + + + + ); +}; +export default PrevCartableOpinion; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/DescriptionForm.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/DescriptionForm.jsx new file mode 100644 index 0000000..a7099e7 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/DescriptionForm.jsx @@ -0,0 +1,29 @@ +import { Stack, TextField } from "@mui/material"; +import { Controller } from "react-hook-form"; + +const DescriptionForm = ({ control }) => { + return ( + + ( + + )} + /> + + ); +}; +export default DescriptionForm; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/QuestionVerifyNeedRoadForm.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/QuestionVerifyNeedRoadForm.jsx new file mode 100644 index 0000000..0a9a724 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/QuestionVerifyNeedRoadForm.jsx @@ -0,0 +1,34 @@ +import { + Card, + CardContent, + Stack, + Typography +} from "@mui/material"; + +const QuestionVerifyNeedRoadForm = ({ row }) => { + return ( + + + + + آیا نیاز به راه دسترسی است؟ + + + دفتر حریم راه : + + {row.original.need_road_access == 1 ? "بله" : "خیر"} + + + + + + ); +}; +export default QuestionVerifyNeedRoadForm; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/QuestionVerifyRoadSafetyForm.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/QuestionVerifyRoadSafetyForm.jsx new file mode 100644 index 0000000..1775856 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/QuestionVerifyRoadSafetyForm.jsx @@ -0,0 +1,34 @@ +import { + Card, + CardContent, + Stack, + Typography +} from "@mui/material"; + +const QuestionVerifyRoadSafetyForm = ({ row }) => { + return ( + + + + + آیا ایمنی راه این طرح مورد تایید است؟ + + + دفتر حریم راه : + + {row.original.is_possible == 1 ? "بله" : "خیر"} + + + + + + ); +}; +export default QuestionVerifyRoadSafetyForm; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/Refer/Form.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/Refer/Form.jsx new file mode 100644 index 0000000..3dfc3ee --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/Refer/Form.jsx @@ -0,0 +1,78 @@ +import StyledForm from "@/core/components/StyledForm"; +import { REFER_INQUIRY_PRIVACY_ZAMIN_GOV_ASSISTANT } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; +import { yupResolver } from "@hookform/resolvers/yup"; +import { Button, DialogActions, DialogContent, Stack, TextField } from "@mui/material"; +import { Controller, useForm } from "react-hook-form"; +import { object, string } from "yup"; + +const validationSchema = object({ + description: string().required("وارد کردن توضیحات الزامیست!"), +}); + +const defaultValues = { + description: "", +}; + +const ReferForm = ({ rowId, mutate, handleClose, setOpenReferDialog }) => { + const requestServer = useRequest({ notificationSuccess: true }); + const { + control, + handleSubmit, + formState: { isSubmitting }, + } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "all" }); + + const onSubmit = async (data) => { + await requestServer(`${REFER_INQUIRY_PRIVACY_ZAMIN_GOV_ASSISTANT}/${rowId}`, "post", { + data: { + expert_description: data.description, + }, + }) + .then(() => { + handleClose(); + setOpenReferDialog(false); + mutate(); + }) + .catch(() => {}); + }; + + return ( + <> + + + ( + + )} + /> + + + + + + + ); +}; +export default ReferForm; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/Refer/index.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/Refer/index.jsx new file mode 100644 index 0000000..1fc664c --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/Refer/index.jsx @@ -0,0 +1,34 @@ +import { Close } from "@mui/icons-material"; +import { Button, Dialog, DialogTitle, IconButton } from "@mui/material" +import { useState } from "react"; +import ReferForm from "./Form"; + +const Refer = ({ rowId, mutate, handleClose, isSubmitting }) => { + const [openReferDialog, setOpenReferDialog] = useState(false); + + return ( + <> + + { setOpenReferDialog(false) }} maxWidth="xs" fullWidth> + setOpenReferDialog(false)} + sx={{ + position: "absolute", + right: 8, + top: 8, + zIndex: 10, + color: (theme) => theme.palette.grey[500], + }} + > + + + مخالفت و ارجاع به دفتر حریم + {openReferDialog && } + + + ) +} +export default Refer \ No newline at end of file diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/index.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/index.jsx new file mode 100644 index 0000000..c35313e --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/index.jsx @@ -0,0 +1,72 @@ +import StyledForm from "@/core/components/StyledForm"; +import { CONFIRM_INQUIRY_PRIVACY_ZAMIN_GOV_ASSISTANT } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; +import { yupResolver } from "@hookform/resolvers/yup"; +import { Button, DialogActions, DialogContent, Stack } from "@mui/material"; +import { useForm } from "react-hook-form"; +import { object, string } from "yup"; +import QuestionVerifyNeedRoadForm from "./QuestionVerifyNeedRoadForm"; +import QuestionVerifyRoadSafetyForm from "./QuestionVerifyRoadSafetyForm"; +import Refer from "./Refer"; +import DescriptionForm from "./DescriptionForm"; + +const validationSchema = object({ + description: string().required("وارد کردن توضیحات الزامیست!"), +}); + +const defaultValues = { + description: "", +}; + +const Questions = ({ row, rowId, mutate, handleClose, handlePrev }) => { + const requestServer = useRequest({ notificationSuccess: true }); + + const { + control, + handleSubmit, + formState: { isSubmitting }, + } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "all" }); + + const onSubmit = async (data) => { + await requestServer(`${CONFIRM_INQUIRY_PRIVACY_ZAMIN_GOV_ASSISTANT}/${rowId}`, "post", { + data: { + expert_description: data.description, + }, + }) + .then(() => { + handleClose(); + mutate(); + }) + .catch(() => {}); + }; + + return ( + + + + + + + + + + + + + + + + + ); +}; +export default Questions; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/index.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/index.jsx new file mode 100644 index 0000000..8104adc --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/index.jsx @@ -0,0 +1,51 @@ +import { Close, Engineering } from "@mui/icons-material"; +import { Dialog, IconButton, Stack, Tooltip } from "@mui/material"; +import { useState } from "react"; +import ConfirmRoadSafetyDialog from "./ConfirmRoadSafetyDialog"; + +const ConfirmRoadSafetyForm = ({ row, rowId, mutate }) => { + const [openConfirmRoadSafetyForm, setOpenConfirmRoadSafetyForm] = useState(false); + + const openRoadSafetyDialog = () => { + setOpenConfirmRoadSafetyForm(true); + }; + + const handleClose = () => { + setOpenConfirmRoadSafetyForm(false); + }; + + return ( + + + { + openRoadSafetyDialog(); + }} + > + + + + + handleClose()} + sx={{ + position: "absolute", + right: 8, + top: 8, + zIndex: 10, + color: (theme) => theme.palette.grey[500], + }} + > + + + {openConfirmRoadSafetyForm && ( + + )} + + + ); +}; +export default ConfirmRoadSafetyForm; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/ConfirmRoadSafetyDialog.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/ConfirmRoadSafetyDialog.jsx new file mode 100644 index 0000000..8305cf4 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/ConfirmRoadSafetyDialog.jsx @@ -0,0 +1,49 @@ +import DialogLoading from "@/core/components/DialogLoading"; +import { GET_REQUEST_INQUIRY_PRIVACY_ZAMIN_GOV_ASSISTANT_DETAILS } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; +import { DialogContent, Typography } from "@mui/material"; +import { useEffect, useState } from "react"; +import ConfirmRoadSafetyFormContext from "./ConfirmRoadSafetyFormContext"; + +const ConfirmRoadSafetyDialog = ({ row, handleClose, rowId, mutate }) => { + const [loading, setLoading] = useState(true); + const [data, setData] = useState(null); + const request = useRequest(); + + useEffect(() => { + const fetchData = async () => { + try { + setLoading(true); + const response = await request(`${GET_REQUEST_INQUIRY_PRIVACY_ZAMIN_GOV_ASSISTANT_DETAILS}/${rowId}`); + setData(response.data.data); + } catch (error) { + } finally { + setLoading(false); + } + }; + + fetchData(); + }, [request, rowId]); + + return ( + <> + {loading ? ( +
Loading...
+ ) : // + data ? ( + + ) : ( + + اطلاعات درخواست در سامانه یافت نشد + + )} + + ); +}; +export default ConfirmRoadSafetyDialog; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/ConfirmRoadSafetyFormContext.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/ConfirmRoadSafetyFormContext.jsx new file mode 100644 index 0000000..41e1139 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/ConfirmRoadSafetyFormContext.jsx @@ -0,0 +1,92 @@ +import ApplicantRequestDetail from "@/core/components/ApplicantRequestDetail"; +import TabPanel from "@/core/components/TabPanel"; +import { ExitToApp, InsertDriveFile, Route, ThumbUp } from "@mui/icons-material"; +import { Button, DialogActions, DialogContent, Stack, Tab, Tabs } from "@mui/material"; +import { useState } from "react"; +import PrevCartableOpinion from "./PrevCartableOpinion"; +import Questions from "./Questions"; + + + +const ConfirmRoadSafetyFormContext = ({ row, data, rowId, mutate, handleClose }) => { + const [tabState, setTabState] = useState(0); + + const handleChangeTab = (event, newValue) => { + setTabState(newValue); + }; + + const handlePrev = () => { + if (tabState === 0) { + handleClose(); + } else { + setTabState((t) => t - 1); + } + }; + + return ( + <> + + } label="اطلاعات طرح متقاضی" /> + } label="جریان فرایند" /> + } label="تاییدیه ضمانت نامه ها" /> + + + + + + + + + + + + + + {data.histories.map((item, index) => ( + + ))} + + + + + + + + + + + + ); +}; +export default ConfirmRoadSafetyFormContext; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/PrevCartableOpinion.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/PrevCartableOpinion.jsx new file mode 100644 index 0000000..37fe672 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/PrevCartableOpinion.jsx @@ -0,0 +1,16 @@ +import { Card, CardContent, CircularProgress, Stack, Typography } from "@mui/material"; + +const PrevCartableOpinion = ({ item }) => { + + return ( + + + + {item.previous_state_name}: {item.action_name} + توضیحات: {item.expert_description} + + + + ); +}; +export default PrevCartableOpinion; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/DescriptionForm.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/DescriptionForm.jsx new file mode 100644 index 0000000..a7099e7 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/DescriptionForm.jsx @@ -0,0 +1,29 @@ +import { Stack, TextField } from "@mui/material"; +import { Controller } from "react-hook-form"; + +const DescriptionForm = ({ control }) => { + return ( + + ( + + )} + /> + + ); +}; +export default DescriptionForm; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/QuestionVerifyNeedRoadForm.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/QuestionVerifyNeedRoadForm.jsx new file mode 100644 index 0000000..a39fdec --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/QuestionVerifyNeedRoadForm.jsx @@ -0,0 +1,34 @@ +import { + Card, + CardContent, + Stack, + Typography +} from "@mui/material"; + +const QuestionVerifyNeedRoadForm = () => { + return ( + + + + + آیا ضمانت نامه ها مورد تایید است؟ + + + دفتر حریم راه : + + بله + + + + + + ); +}; +export default QuestionVerifyNeedRoadForm; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/QuestionVerifyRoadSafetyForm.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/QuestionVerifyRoadSafetyForm.jsx new file mode 100644 index 0000000..edd3232 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/QuestionVerifyRoadSafetyForm.jsx @@ -0,0 +1,34 @@ +import { + Card, + CardContent, + Stack, + Typography +} from "@mui/material"; + +const QuestionVerifyRoadSafetyForm = ({ row }) => { + return ( + + + + + آیا ایمنی راه این طرح مورد تایید است؟ + + + دفتر حریم راه : + + {row.original.isSafety ? "بله" : "خیر"} + + + + + + ); +}; +export default QuestionVerifyRoadSafetyForm; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/Refer/Form.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/Refer/Form.jsx new file mode 100644 index 0000000..cf2095e --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/Refer/Form.jsx @@ -0,0 +1,70 @@ +import { REFER_VERIFY_NEADROAD_ROAD_INQUIRY_PRIVACY_ZAMIN_GOV_ASSISTANT } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; +import { yupResolver } from "@hookform/resolvers/yup"; +import { Button, DialogActions, DialogContent, Stack, TextField } from "@mui/material"; +import { Controller, useForm } from "react-hook-form"; +import { object, string } from "yup"; +const validationSchema = object({ + description: string().required("وارد کردن توضیحات الزامیست!"), +}); + +const defaultValues = { + description: "", +}; + +const ReferForm = ({ rowId, mutate, handleClose, setOpenReferDialog }) => { + const requestServer = useRequest({ notificationSuccess: true }); + const { + control, + handleSubmit, + formState: { isSubmitting }, + } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "all" }); + + const onSubmit = async (data) => { + await requestServer(`${REFER_VERIFY_NEADROAD_ROAD_INQUIRY_PRIVACY_ZAMIN_GOV_ASSISTANT}/${rowId}`, "post", { + data: { + expert_description: data.description + }, + }) + .then(() => { + handleClose(); + setOpenReferDialog(false) + mutate(); + }) + .catch(() => { }); + }; + + return ( + <> + + + ( + + )} + /> + + + + + + + ) +} +export default ReferForm \ No newline at end of file diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/Refer/index.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/Refer/index.jsx new file mode 100644 index 0000000..1fc664c --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/Refer/index.jsx @@ -0,0 +1,34 @@ +import { Close } from "@mui/icons-material"; +import { Button, Dialog, DialogTitle, IconButton } from "@mui/material" +import { useState } from "react"; +import ReferForm from "./Form"; + +const Refer = ({ rowId, mutate, handleClose, isSubmitting }) => { + const [openReferDialog, setOpenReferDialog] = useState(false); + + return ( + <> + + { setOpenReferDialog(false) }} maxWidth="xs" fullWidth> + setOpenReferDialog(false)} + sx={{ + position: "absolute", + right: 8, + top: 8, + zIndex: 10, + color: (theme) => theme.palette.grey[500], + }} + > + + + مخالفت و ارجاع به دفتر حریم + {openReferDialog && } + + + ) +} +export default Refer \ No newline at end of file diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/index.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/index.jsx new file mode 100644 index 0000000..b8b016b --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/index.jsx @@ -0,0 +1,65 @@ +import StyledForm from "@/core/components/StyledForm"; +import { CONFIRM_INQUIRY_PRIVACY_ZAMIN_GOV_ASSISTANT, CONFIRM_VERIFY_NEADROAD_ROAD_INQUIRY_PRIVACY_ZAMIN_GOV_ASSISTANT } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; +import { yupResolver } from "@hookform/resolvers/yup"; +import { Button, DialogActions, DialogContent, Stack } from "@mui/material"; +import { useForm } from "react-hook-form"; +import { object, string } from "yup"; +import QuestionVerifyNeedRoadForm from "./QuestionVerifyNeedRoadForm"; +import QuestionVerifyRoadSafetyForm from "./QuestionVerifyRoadSafetyForm"; +import Refer from "./Refer"; +import DescriptionForm from "./DescriptionForm"; + +const validationSchema = object({ + description: string().required("وارد کردن توضیحات الزامیست!"), +}); + +const defaultValues = { + description: "", +}; + +const Questions = ({ row, rowId, mutate, handleClose, handlePrev }) => { + const requestServer = useRequest({ notificationSuccess: true }); + + const { + control, + handleSubmit, + formState: { isSubmitting }, + } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "all" }); + + const onSubmit = async (data) => { + await requestServer(`${CONFIRM_VERIFY_NEADROAD_ROAD_INQUIRY_PRIVACY_ZAMIN_GOV_ASSISTANT}/${rowId}`, "post", { + data: { + expert_description: data.description + }, + }) + .then(() => { + handleClose(); + mutate(); + }) + .catch(() => { }); + }; + + return ( + + + + + + + + + + + + + + + + ) +} +export default Questions \ No newline at end of file diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/index.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/index.jsx new file mode 100644 index 0000000..d1548ed --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/index.jsx @@ -0,0 +1,51 @@ +import { Close, ThumbUp } from "@mui/icons-material"; +import { Dialog, IconButton, Stack, Tooltip } from "@mui/material"; +import { useState } from "react"; +import ConfirmRoadSafetyDialog from "./ConfirmRoadSafetyDialog"; + +const ConfirmVerifyLicenseForm = ({ row, rowId, mutate }) => { + const [openConfirmVerifyLicenseForm, setOpenConfirmVerifyLicenseForm] = useState(false); + + const openConfirmVerifyLicenseFormDialog = () => { + setOpenConfirmVerifyLicenseForm(true); + }; + + const handleClose = () => { + setOpenConfirmVerifyLicenseForm(false); + }; + + return ( + + + { + openConfirmVerifyLicenseFormDialog(); + }} + > + + + + + handleClose()} + sx={{ + position: "absolute", + right: 8, + top: 8, + zIndex: 10, + color: (theme) => theme.palette.grey[500], + }} + > + + + {openConfirmVerifyLicenseForm && ( + + )} + + + ); +}; +export default ConfirmVerifyLicenseForm; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/ConfirmRoadSafetyDialog.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/ConfirmRoadSafetyDialog.jsx new file mode 100644 index 0000000..f3a693a --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/ConfirmRoadSafetyDialog.jsx @@ -0,0 +1,43 @@ +import DialogLoading from "@/core/components/DialogLoading"; +import { GET_REQUEST_INQUIRY_PRIVACY_ZAMIN_GOV_ASSISTANT_DETAILS } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; +import { DialogContent, Typography } from "@mui/material"; +import { useEffect, useState } from "react"; +import ConfirmRoadSafetyFormContext from "./ConfirmRoadSafetyFormContext"; + +const ConfirmRoadSafetyDialog = ({ row, handleClose, rowId, mutate }) => { + const [loading, setLoading] = useState(true); + const [data, setData] = useState(null); + const request = useRequest(); + + useEffect(() => { + const fetchData = async () => { + try { + setLoading(true); + const response = await request(`${GET_REQUEST_INQUIRY_PRIVACY_ZAMIN_GOV_ASSISTANT_DETAILS}/${rowId}`); + setData(response.data.data); + } catch (error) { + } finally { + setLoading(false); + } + }; + + fetchData(); + }, [rowId]); + + return ( + <> + {loading ? ( + + ) : data ? ( + + ) : ( + + اطلاعات درخواست در سامانه یافت نشد + + )} + + ); + +} +export default ConfirmRoadSafetyDialog \ No newline at end of file diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/ConfirmRoadSafetyFormContext.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/ConfirmRoadSafetyFormContext.jsx new file mode 100644 index 0000000..7b1fd02 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/ConfirmRoadSafetyFormContext.jsx @@ -0,0 +1,92 @@ +import ApplicantRequestDetail from "@/core/components/ApplicantRequestDetail"; +import TabPanel from "@/core/components/TabPanel"; +import { DoneAll, ExitToApp, InsertDriveFile, Route } from "@mui/icons-material"; +import { Button, DialogActions, DialogContent, Stack, Tab, Tabs } from "@mui/material"; +import { useState } from "react"; +import PrevCartableOpinion from "./PrevCartableOpinion"; +import Questions from "./Questions"; + + + +const ConfirmRoadSafetyFormContext = ({ row, data, rowId, mutate, handleClose }) => { + const [tabState, setTabState] = useState(0); + + const handleChangeTab = (event, newValue) => { + setTabState(newValue); + }; + + const handlePrev = () => { + if (tabState === 0) { + handleClose(); + } else { + setTabState((t) => t - 1); + } + }; + + return ( + <> + + } label="اطلاعات طرح متقاضی" /> + } label="جریان فرایند" /> + } label="تاییدیه دسترسی راه" /> + + + + + + + + + + + + + + {data.histories.map((item, index) => ( + + ))} + + + + + + + + + + + + ); +}; +export default ConfirmRoadSafetyFormContext; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/PrevCartableOpinion.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/PrevCartableOpinion.jsx new file mode 100644 index 0000000..37fe672 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/PrevCartableOpinion.jsx @@ -0,0 +1,16 @@ +import { Card, CardContent, CircularProgress, Stack, Typography } from "@mui/material"; + +const PrevCartableOpinion = ({ item }) => { + + return ( + + + + {item.previous_state_name}: {item.action_name} + توضیحات: {item.expert_description} + + + + ); +}; +export default PrevCartableOpinion; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/Questions/DescriptionForm.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/Questions/DescriptionForm.jsx new file mode 100644 index 0000000..a7099e7 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/Questions/DescriptionForm.jsx @@ -0,0 +1,29 @@ +import { Stack, TextField } from "@mui/material"; +import { Controller } from "react-hook-form"; + +const DescriptionForm = ({ control }) => { + return ( + + ( + + )} + /> + + ); +}; +export default DescriptionForm; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/Questions/QuestionVerifyNeedRoadForm.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/Questions/QuestionVerifyNeedRoadForm.jsx new file mode 100644 index 0000000..558d200 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/Questions/QuestionVerifyNeedRoadForm.jsx @@ -0,0 +1,34 @@ +import { + Card, + CardContent, + Stack, + Typography +} from "@mui/material"; + +const QuestionVerifyNeedRoadForm = ({ row }) => { + return ( + + + + + آیا دسترسی به راه مورد تایید است؟ + + + دفتر حریم راه : + + {row.original.is_file_good == 1 ? "بله" : "خیر"} + + + + + + ); +}; +export default QuestionVerifyNeedRoadForm; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/Questions/Refer/Form.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/Questions/Refer/Form.jsx new file mode 100644 index 0000000..cf2095e --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/Questions/Refer/Form.jsx @@ -0,0 +1,70 @@ +import { REFER_VERIFY_NEADROAD_ROAD_INQUIRY_PRIVACY_ZAMIN_GOV_ASSISTANT } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; +import { yupResolver } from "@hookform/resolvers/yup"; +import { Button, DialogActions, DialogContent, Stack, TextField } from "@mui/material"; +import { Controller, useForm } from "react-hook-form"; +import { object, string } from "yup"; +const validationSchema = object({ + description: string().required("وارد کردن توضیحات الزامیست!"), +}); + +const defaultValues = { + description: "", +}; + +const ReferForm = ({ rowId, mutate, handleClose, setOpenReferDialog }) => { + const requestServer = useRequest({ notificationSuccess: true }); + const { + control, + handleSubmit, + formState: { isSubmitting }, + } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "all" }); + + const onSubmit = async (data) => { + await requestServer(`${REFER_VERIFY_NEADROAD_ROAD_INQUIRY_PRIVACY_ZAMIN_GOV_ASSISTANT}/${rowId}`, "post", { + data: { + expert_description: data.description + }, + }) + .then(() => { + handleClose(); + setOpenReferDialog(false) + mutate(); + }) + .catch(() => { }); + }; + + return ( + <> + + + ( + + )} + /> + + + + + + + ) +} +export default ReferForm \ No newline at end of file diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/Questions/Refer/index.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/Questions/Refer/index.jsx new file mode 100644 index 0000000..1fc664c --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/Questions/Refer/index.jsx @@ -0,0 +1,34 @@ +import { Close } from "@mui/icons-material"; +import { Button, Dialog, DialogTitle, IconButton } from "@mui/material" +import { useState } from "react"; +import ReferForm from "./Form"; + +const Refer = ({ rowId, mutate, handleClose, isSubmitting }) => { + const [openReferDialog, setOpenReferDialog] = useState(false); + + return ( + <> + + { setOpenReferDialog(false) }} maxWidth="xs" fullWidth> + setOpenReferDialog(false)} + sx={{ + position: "absolute", + right: 8, + top: 8, + zIndex: 10, + color: (theme) => theme.palette.grey[500], + }} + > + + + مخالفت و ارجاع به دفتر حریم + {openReferDialog && } + + + ) +} +export default Refer \ No newline at end of file diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/Questions/index.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/Questions/index.jsx new file mode 100644 index 0000000..a52b00c --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/Questions/index.jsx @@ -0,0 +1,64 @@ +import StyledForm from "@/core/components/StyledForm"; +import { CONFIRM_VERIFY_NEADROAD_ROAD_INQUIRY_PRIVACY_ZAMIN_GOV_ASSISTANT } from "@/core/utils/routes"; +import useRequest from "@/lib/hooks/useRequest"; +import { yupResolver } from "@hookform/resolvers/yup"; +import { Button, DialogActions, DialogContent, Stack } from "@mui/material"; +import { useForm } from "react-hook-form"; +import { object, string } from "yup"; +import QuestionVerifyNeedRoadForm from "./QuestionVerifyNeedRoadForm"; +import Refer from "./Refer"; +import DescriptionForm from "./DescriptionForm"; + +const validationSchema = object({ + description: string().required("وارد کردن توضیحات الزامیست!"), +}); + +const defaultValues = { + description: "", +}; + +const Questions = ({ row, rowId, mutate, handleClose, handlePrev }) => { + const requestServer = useRequest({ notificationSuccess: true }); + + const { + control, + handleSubmit, + formState: { isSubmitting }, + } = useForm({ defaultValues, resolver: yupResolver(validationSchema), mode: "all" }); + + const onSubmit = async (data) => { + await requestServer(`${CONFIRM_VERIFY_NEADROAD_ROAD_INQUIRY_PRIVACY_ZAMIN_GOV_ASSISTANT}/${rowId}`, "post", { + data: { + expert_description: data.description + }, + }) + .then(() => { + handleClose(); + mutate(); + }) + .catch(() => { }); + }; + + return ( + + + + + + + + + + + + + + + + ) +} +export default Questions \ No newline at end of file diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/index.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/index.jsx new file mode 100644 index 0000000..213d593 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/index.jsx @@ -0,0 +1,51 @@ +import { Close, DoneAll } from "@mui/icons-material"; +import { Dialog, IconButton, Stack, Tooltip } from "@mui/material"; +import { useState } from "react"; +import ConfirmRoadSafetyDialog from "./ConfirmRoadSafetyDialog"; + +const ConfirmVerifyRoadSafetyForm = ({ row, rowId, mutate }) => { + const [openConfirmVerifyRoadSafetyForm, setOpenConfirmVerifyRoadSafetyForm] = useState(false); + + const openConfirmVerifyRoadSafetyDialog = () => { + setOpenConfirmVerifyRoadSafetyForm(true); + }; + + const handleClose = () => { + setOpenConfirmVerifyRoadSafetyForm(false); + }; + + return ( + + + { + openConfirmVerifyRoadSafetyDialog(); + }} + > + + + + + handleClose()} + sx={{ + position: "absolute", + right: 8, + top: 8, + zIndex: 10, + color: (theme) => theme.palette.grey[500], + }} + > + + + {openConfirmVerifyRoadSafetyForm && ( + + )} + + + ); +}; +export default ConfirmVerifyRoadSafetyForm; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/index.jsx new file mode 100644 index 0000000..58261f4 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/index.jsx @@ -0,0 +1,22 @@ +import { Box } from "@mui/material"; +import ConfirmRoadSafetyForm from "./ConfirmRoadSafetyForm"; +import ConfirmVerifyRoadSafetyForm from "./ConfirmVerifyRoadSafetyForm"; +import ConfirmVerifyLicenseForm from "./ConfirmVerifyLicenseForm"; + +const RowActions = ({ row, mutate }) => { + return ( + <> + // + // {row.original.state_id == 3 && ( + // + // )} + // {row.original.state_id == 6 && ( + // + // )} + // {row.original.state_id == 14 && ( + // + // )} + // + ); +}; +export default RowActions; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/ShowPrimaryArea/ShowBound.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/ShowPrimaryArea/ShowBound.jsx new file mode 100644 index 0000000..24db476 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/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/technical-deputy/ShowPrimaryArea/index.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/ShowPrimaryArea/index.jsx new file mode 100644 index 0000000..e4714de --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/ShowPrimaryArea/index.jsx @@ -0,0 +1,60 @@ +const { IconButton, Tooltip, Box, Dialog, DialogTitle, Typography, DialogContent } = require("@mui/material"); +import MapLayer from "@/core/components/MapLayer"; +import CloseIcon from "@mui/icons-material/Close"; +import LayersIcon from "@mui/icons-material/Layers"; +import { useMemo, useState } from "react"; +import ShowBound from "./ShowBound"; +import L from "leaflet"; + +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/technical-deputy/TechnicalDeputyList.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/TechnicalDeputyList.jsx new file mode 100644 index 0000000..bb3ec27 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/TechnicalDeputyList.jsx @@ -0,0 +1,190 @@ +"use client"; + +import DataTableWithAuth from "@/core/components/DataTableWithAuth"; +import { GET_INQUIRY_PRIVACY_TABLE_LIST } from "@/core/utils/routes"; +import { Box, Stack } from "@mui/material"; +import moment from "jalali-moment"; +import { useMemo } from "react"; +import RowActions from "./RowActions"; +import ShowPrimaryArea from "./ShowPrimaryArea"; + +const TechnicalDeputyList = () => { + const columns = useMemo( + () => [ + { + accessorKey: "id", + header: "کد یکتا", + id: "id", + enableColumnFilter: false, + datatype: "text", + filterMode: "notEquals", + size: 100, + }, + { + accessorKey: "panjare_vahed_id", + header: "کدرهگیری پنجره واحد", + id: "panjare_vahed_id", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + grow: false, + size: 150, + }, + { + accessorKey: "national_id", + header: "کد ملی", + id: "national_id", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + size: 120, + }, + { + accessorKey: "phone_number", + header: "تلفن", + id: "phone_number", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + size: 120, + }, + { + accessorKey: "state_name", + header: "وضعیت درخواست", + id: "state_name", + enableColumnFilter: false, + datatype: "text", + filterMode: "equals", + }, + { + accessorKey: "payment_amount", + header: "مبلغ پرداختی", + id: "payment_amount", + enableColumnFilter: true, + datatype: "text", + filterMode: "between", + Cell: ({ row }) => <>{row.original.payment_amount || "-"}, + }, + { + accessorKey: "requested_organization", + header: "دستگاه صادر کننده", + id: "requested_organization", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + }, + { + accessorKey: "province_name", + header: "استان", + id: "province_name", + enableColumnFilter: false, + datatype: "text", + filterMode: "equals", + }, + { + accessorKey: "city_name", + header: "شهر", + id: "city_name", + enableColumnFilter: false, + datatype: "text", + filterMode: "equals", + }, + { + accessorKey: "plan_group", + header: "گروه طرح", + id: "plan_group", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + }, + { + accessorKey: "plan_title", + header: "عنوان طرح", + id: "plan_title", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + }, + { + 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: "worksheet_id", + header: "شناسه کاربرگ", + id: "worksheet_id", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + }, + { + accessorKey: "isic", + header: "کد آیسیک", + id: "isic", + enableColumnFilter: true, + datatype: "text", + filterMode: "equals", + sortDescFirst: false, + columnFilterModeOptions: ["equals", "contains"], + }, + { + 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: 120, + }, + ], + [] + ); + + return ( + <> + + + + + ); +}; +export default TechnicalDeputyList; diff --git a/src/components/dashboard/inquiryPrivacy/technical-deputy/index.jsx b/src/components/dashboard/inquiryPrivacy/technical-deputy/index.jsx new file mode 100644 index 0000000..2b9a26a --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/technical-deputy/index.jsx @@ -0,0 +1,15 @@ +"use client"; + +import PageTitle from "@/core/components/PageTitle"; +import { Stack } from "@mui/material"; +import TechnicalDeputyList from "./TechnicalDeputyList"; + +const TechnicalDeputy = () => { + return ( + + + + + ); +}; +export default TechnicalDeputy; diff --git a/src/components/infrastructure/tollHouse/Form/CreateTollHouse/TollHouseInfo.jsx b/src/components/infrastructure/tollHouse/Form/CreateTollHouse/TollHouseInfo.jsx index dc56843..5d53fdf 100644 --- a/src/components/infrastructure/tollHouse/Form/CreateTollHouse/TollHouseInfo.jsx +++ b/src/components/infrastructure/tollHouse/Form/CreateTollHouse/TollHouseInfo.jsx @@ -82,8 +82,8 @@ const TollHouseInfo = ({ control }) => { value={field.value} label="وضعیت" selectors={[ - { id: 0, name: "فعال" }, - { id: 1, name: "غیر فعال" }, + { id: 1, name: "فعال" }, + { id: 0, name: "غیر فعال" }, ]} schema={{ name: "name", value: "id" }} error={error} diff --git a/src/components/infrastructure/tollHouse/TollHouseList.jsx b/src/components/infrastructure/tollHouse/TollHouseList.jsx index 4ef1674..11536b8 100644 --- a/src/components/infrastructure/tollHouse/TollHouseList.jsx +++ b/src/components/infrastructure/tollHouse/TollHouseList.jsx @@ -384,7 +384,8 @@ const TollHouseList = () => { ], }, { - accessorFn: (row) => moment(row.created_at).locale("fa").format("HH:mm | yyyy/MM/DD"), + accessorFn: (row) => + row.created_at ? moment(row.created_at).locale("fa").format("HH:mm | yyyy/MM/DD") : "-", header: "تاریخ ثبت", id: "created_at", enableColumnFilter: true, diff --git a/src/core/components/TabPanel.jsx b/src/core/components/TabPanel.jsx new file mode 100644 index 0000000..529fad0 --- /dev/null +++ b/src/core/components/TabPanel.jsx @@ -0,0 +1,11 @@ +import { Box } from "@mui/material"; + +const TabPanel = (props) => { + const { children, value, index } = props; + return ( + + ); +}; +export default TabPanel; diff --git a/src/core/utils/pageMenuDev.js b/src/core/utils/pageMenuDev.js index 23c42d7..7a68cb6 100644 --- a/src/core/utils/pageMenuDev.js +++ b/src/core/utils/pageMenuDev.js @@ -318,7 +318,7 @@ export const pageMenuDev = [ id: "assistant", label: "کارتابل معاون", type: "page", - route: "/dashboard/inquiry-privacy/assistant", + route: "/dashboard/inquiry-privacy/technical-deputy", icon: , permissions: ["all"], }, diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js index 8572b6f..e9e7119 100644 --- a/src/core/utils/routes.js +++ b/src/core/utils/routes.js @@ -240,3 +240,5 @@ 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"; +export const PRIVACY_ADMIN_ACTION_API = api + "/api/v3/harim/harim_office"; +export const GET_INQUIRY_PRIVACY_TABLE_LIST = api + "/api/v3/harim/technical_deputy"; diff --git a/src/core/utils/utils.js b/src/core/utils/utils.js index eec2824..1198244 100644 --- a/src/core/utils/utils.js +++ b/src/core/utils/utils.js @@ -148,3 +148,18 @@ export const getClosedPolygonCoordinates = (polygon) => { return coordinates; }; + +export function safeParsePolygon(polygonJson) { + if (!polygonJson) return null; + + try { + const parsed = JSON.parse(polygonJson); + if (parsed && parsed.coordinates) { + return parsed.coordinates; + } + return null; + } catch (err) { + console.error("Invalid polygon JSON:", err); + return null; + } +}