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 (
+
+ );
+};
+
+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 (
+ <>
+
+
+ >
+ )
+}
+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();
+ }}
+ >
+
+
+
+
+
+ );
+};
+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 (
+ <>
+
+
+ >
+ )
+}
+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();
+ }}
+ >
+
+
+
+
+
+ );
+};
+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 (
+ <>
+
+
+ >
+ )
+}
+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();
+ }}
+ >
+
+
+
+
+
+ );
+};
+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)}>
+
+
+
+
+
+ );
+};
+
+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 (
+
+ {value === index && {children}}
+
+ );
+};
+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 a2e65a9..f479220 100644
--- a/src/core/utils/routes.js
+++ b/src/core/utils/routes.js
@@ -240,4 +240,6 @@ 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";
export const GET_GENERAL_MANAGER_LIST = api + "/api/v3/harim/general_manager";
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;
+ }
+}