From c636bffeb79ab8edb1cb37bbd37c69d0e7076d7a Mon Sep 17 00:00:00 2001 From: baslani Date: Mon, 17 Nov 2025 10:21:10 +0330 Subject: [PATCH 01/20] implemented privacy Office Actions modal structure --- .../privacy-office/PrivacyOfficeList.jsx | 30 +++++++- .../RowActions/ActionsDialog.jsx | 76 +++++++++++++++++++ .../RowActions/ConfirmAction/index.jsx | 6 +- .../RowActions/ReferralAction/index.jsx | 15 ++++ .../RowActions/RejectAction/index.jsx | 6 +- .../privacy-office/RowActions/index.jsx | 11 ++- 6 files changed, 129 insertions(+), 15 deletions(-) create mode 100644 src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ActionsDialog.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ReferralAction/index.jsx diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/PrivacyOfficeList.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/PrivacyOfficeList.jsx index 913c803..27a8f85 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"; @@ -11,9 +12,10 @@ import SecurityIcon from "@mui/icons-material/Security"; import WindowIcon from "@mui/icons-material/Window"; import { Box, Stack } from "@mui/material"; import moment from "jalali-moment"; -import { useMemo } from "react"; +import { useMemo, useState } from "react"; import RowActions from "./RowActions"; -import { GET_PRIVACY_ADMIN_LIST } from "@/core/utils/routes"; + +import ActionDialog from "./RowActions/ActionsDialog"; import ShowPrimaryArea from "./ShowPrimaryArea"; const PrivacyOfficeList = () => { @@ -28,6 +30,21 @@ const PrivacyOfficeList = () => { if (state_id === 10) return ; if (state_id === 12) return ; }; + + const [modal, setModal] = useState({ + open: false, + type: null, // "reject" | "confirm" | "referral" + row: null, + }); + + const handleOpenModal = (type, row) => { + setModal({ open: true, type, row }); + }; + + const handleCloseModal = () => { + setModal({ open: false, type: null, row: null }); + }; + const columns = useMemo(() => { return [ { @@ -233,9 +250,16 @@ const PrivacyOfficeList = () => { table_name={"PrivacyOfficeList"} enableRowActions positionActionsColumn={"first"} - RowActions={RowActions} + RowActions={(props) => } /> + + ); }; 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..1dae411 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ActionsDialog.jsx @@ -0,0 +1,76 @@ +import { + Box, + Button, + Checkbox, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + FormControlLabel, + TextField, +} from "@mui/material"; +import { useEffect, useState } from "react"; + +const ActionDialog = ({ open, type, rowDataId, onClose }) => { + const [description, setDescription] = useState(""); + const [checked, setChecked] = useState(false); + + useEffect(() => { + if (open) { + setDescription(""); + setChecked(false); + } + }, [open]); + + const actionLabel = { + reject: "رد درخواست", + confirm: "تایید درخواست", + referral: "ارجاع درخواست", + }[type]; + + const handleSubmit = () => { + console.log("Row data id: ", rowDataId); + console.log("Action type: ", type); + console.log("Desctiption: ", description); + console.log("Checked: ", checked); + + // TODO: Implement api call + + onClose(); + }; + + return ( + + {actionLabel} + + + + setDescription(e.target.value)} + /> + + setChecked(e.target.checked)} />} + label="تایید انجام عملیات" + /> + + + + + + + + + ); +}; + +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..ca0b3d5 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ConfirmAction/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ConfirmAction/index.jsx @@ -1,13 +1,11 @@ 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 }) => { return ( <> - setOpenConfirmDialog(true)}> + 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..28667cf --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ReferralAction/index.jsx @@ -0,0 +1,15 @@ +import { Reply } from "@mui/icons-material"; +import { IconButton, Tooltip } from "@mui/material"; + +const ReferralAction = ({ onClick }) => { + 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..b2e40ab 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RejectAction/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RejectAction/index.jsx @@ -1,13 +1,11 @@ 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 }) => { return ( <> - setOpenRejectDialog(true)}> + diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/index.jsx index 06ea132..b45eb01 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/index.jsx @@ -1,13 +1,16 @@ import { Box } from "@mui/material"; import ConfirmAction from "./ConfirmAction"; +import ReferralAction from "./ReferralAction"; import RejectAction from "./RejectAction"; -const RowActions = ({ row, mutate }) => { +const RowActions = ({ row, onActionClick }) => { return ( - - - + + onActionClick("referral", row)} /> + onActionClick("reject", row)} /> + onActionClick("confirm", row)} /> ); }; + export default RowActions; From 40f54ed619a5d94e58a1f495513973602ba55ee4 Mon Sep 17 00:00:00 2001 From: baslani Date: Mon, 17 Nov 2025 11:18:08 +0330 Subject: [PATCH 02/20] implemented ActionsDialog forms logic --- .../privacy-office/PrivacyOfficeList.jsx | 15 ++-- .../RowActions/ActionsDialog.jsx | 79 +++++++++++++------ .../RowActions/ReferralAction/index.jsx | 2 +- .../privacy-office/RowActions/index.jsx | 13 ++- 4 files changed, 68 insertions(+), 41 deletions(-) diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/PrivacyOfficeList.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/PrivacyOfficeList.jsx index 27a8f85..c339a16 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/PrivacyOfficeList.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/PrivacyOfficeList.jsx @@ -34,15 +34,15 @@ const PrivacyOfficeList = () => { const [modal, setModal] = useState({ open: false, type: null, // "reject" | "confirm" | "referral" - row: null, + rowId: null, }); - const handleOpenModal = (type, row) => { - setModal({ open: true, type, row }); + const handleOpenModal = (type, rowId) => { + setModal({ open: true, type, rowId }); }; const handleCloseModal = () => { - setModal({ open: false, type: null, row: null }); + setModal({ open: false, type: null, rowId: null }); }; const columns = useMemo(() => { @@ -254,12 +254,7 @@ const PrivacyOfficeList = () => { /> - + ); }; diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ActionsDialog.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ActionsDialog.jsx index 1dae411..75a1bf6 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ActionsDialog.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ActionsDialog.jsx @@ -10,17 +10,30 @@ import { TextField, } from "@mui/material"; import { useEffect, useState } from "react"; +import { Controller, useForm } from "react-hook-form"; const ActionDialog = ({ open, type, rowDataId, onClose }) => { - const [description, setDescription] = useState(""); - const [checked, setChecked] = useState(false); + const [needsAccessRoad, setNeedsAccessRoad] = useState(false); + const { + control, + handleSubmit, + reset, + formState: { isSubmitting }, + } = useForm({ + defaultValues: { + expert_description: "", + need_payment: false, + }, + }); useEffect(() => { if (open) { - setDescription(""); - setChecked(false); + reset({ + expert_description: "", + need_payment: false, + }); } - }, [open]); + }, [open, reset]); const actionLabel = { reject: "رد درخواست", @@ -28,13 +41,12 @@ const ActionDialog = ({ open, type, rowDataId, onClose }) => { referral: "ارجاع درخواست", }[type]; - const handleSubmit = () => { - console.log("Row data id: ", rowDataId); - console.log("Action type: ", type); - console.log("Desctiption: ", description); - console.log("Checked: ", checked); + const onSubmit = (formData) => { + console.log("Row data id:", rowDataId); + console.log("Action type:", type); + console.log("Form data:", formData); - // TODO: Implement api call + // TODO: Implement the API call here onClose(); }; @@ -44,28 +56,43 @@ const ActionDialog = ({ open, type, rowDataId, onClose }) => { {actionLabel} - - setDescription(e.target.value)} - /> - - setChecked(e.target.checked)} />} - label="تایید انجام عملیات" + + } /> + {type === "confirm" && ( + <> + ( + } + label="نیاز به پرداخت" + /> + )} + /> + setNeedsAccessRoad(e.target.checked)} + /> + } + label="به راه دسترسی نیاز دارد" + /> + + )} - - diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ReferralAction/index.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ReferralAction/index.jsx index 28667cf..7f56971 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ReferralAction/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ReferralAction/index.jsx @@ -4,7 +4,7 @@ import { IconButton, Tooltip } from "@mui/material"; const ReferralAction = ({ onClick }) => { return ( <> - + diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/index.jsx index b45eb01..61c5a54 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/index.jsx @@ -3,12 +3,17 @@ import ConfirmAction from "./ConfirmAction"; import ReferralAction from "./ReferralAction"; import RejectAction from "./RejectAction"; -const RowActions = ({ row, onActionClick }) => { +const RowActions = ({ + row: { + original: { id }, + }, + onActionClick, +}) => { return ( - onActionClick("referral", row)} /> - onActionClick("reject", row)} /> - onActionClick("confirm", row)} /> + onActionClick("referral", id)} /> + onActionClick("reject", id)} /> + onActionClick("confirm", id)} /> ); }; From 16d30665d046100364f75047362937505f6917d1 Mon Sep 17 00:00:00 2001 From: baslani Date: Mon, 17 Nov 2025 17:12:11 +0330 Subject: [PATCH 03/20] restructured actions for privacy office table --- .../privacy-office/PrivacyOfficeList.jsx | 21 +--- .../RowActions/ActionsDialog.jsx | 97 ++----------------- .../RowActions/ConfirmAction/index.jsx | 4 +- .../RowActions/Forms/ComputePaymentForm.jsx | 3 + .../RowActions/Forms/ConfirmFileForm.jsx | 3 + .../RowActions/Forms/ConfirmRequestForm.jsx | 3 + .../RowActions/Forms/ReferForm.jsx | 9 ++ .../RowActions/Forms/RejectFileForm.jsx | 3 + .../RowActions/Forms/RejectRequestForm.jsx | 3 + .../RowActions/ReferralAction/index.jsx | 4 +- .../RowActions/RejectAction/index.jsx | 4 +- .../RowActions/RenderActionForm.jsx | 76 +++++++++++++++ .../privacy-office/RowActions/index.jsx | 56 ++++++++--- src/core/utils/routes.js | 1 + 14 files changed, 161 insertions(+), 126 deletions(-) create mode 100644 src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ComputePaymentForm.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmFileForm.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmRequestForm.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ReferForm.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectFileForm.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectRequestForm.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/PrivacyOfficeList.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/PrivacyOfficeList.jsx index c339a16..b6932ca 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/PrivacyOfficeList.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/PrivacyOfficeList.jsx @@ -12,10 +12,9 @@ import SecurityIcon from "@mui/icons-material/Security"; import WindowIcon from "@mui/icons-material/Window"; import { Box, Stack } from "@mui/material"; import moment from "jalali-moment"; -import { useMemo, useState } from "react"; +import { useMemo } from "react"; import RowActions from "./RowActions"; -import ActionDialog from "./RowActions/ActionsDialog"; import ShowPrimaryArea from "./ShowPrimaryArea"; const PrivacyOfficeList = () => { @@ -31,20 +30,6 @@ const PrivacyOfficeList = () => { if (state_id === 12) return ; }; - const [modal, setModal] = useState({ - open: false, - type: null, // "reject" | "confirm" | "referral" - rowId: null, - }); - - const handleOpenModal = (type, rowId) => { - setModal({ open: true, type, rowId }); - }; - - const handleCloseModal = () => { - setModal({ open: false, type: null, rowId: null }); - }; - const columns = useMemo(() => { return [ { @@ -250,11 +235,9 @@ const PrivacyOfficeList = () => { table_name={"PrivacyOfficeList"} enableRowActions positionActionsColumn={"first"} - RowActions={(props) => } + RowActions={RowActions} /> - - ); }; diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ActionsDialog.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ActionsDialog.jsx index 75a1bf6..92afece 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ActionsDialog.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ActionsDialog.jsx @@ -1,101 +1,18 @@ -import { - Box, - Button, - Checkbox, - Dialog, - DialogActions, - DialogContent, - DialogTitle, - FormControlLabel, - TextField, -} from "@mui/material"; -import { useEffect, useState } from "react"; -import { Controller, useForm } from "react-hook-form"; - -const ActionDialog = ({ open, type, rowDataId, onClose }) => { - const [needsAccessRoad, setNeedsAccessRoad] = useState(false); - const { - control, - handleSubmit, - reset, - formState: { isSubmitting }, - } = useForm({ - defaultValues: { - expert_description: "", - need_payment: false, - }, - }); - - useEffect(() => { - if (open) { - reset({ - expert_description: "", - need_payment: false, - }); - } - }, [open, reset]); +import { Dialog, DialogTitle } from "@mui/material"; +import RenderActionForm from "./RenderActionForm"; +const ActionDialog = ({ open, type, rowData, onClose, mutate }) => { const actionLabel = { - reject: "رد درخواست", - confirm: "تایید درخواست", - referral: "ارجاع درخواست", + reject_request: "رد درخواست", + confirm_request: "تایید درخواست", + refer_request: "ارجاع درخواست", }[type]; - const onSubmit = (formData) => { - console.log("Row data id:", rowDataId); - console.log("Action type:", type); - console.log("Form data:", formData); - - // TODO: Implement the API call here - - onClose(); - }; - return ( {actionLabel} - - - } - /> - {type === "confirm" && ( - <> - ( - } - label="نیاز به پرداخت" - /> - )} - /> - setNeedsAccessRoad(e.target.checked)} - /> - } - label="به راه دسترسی نیاز دارد" - /> - - )} - - - - - - - + ); }; 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 ca0b3d5..bdb4b35 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ConfirmAction/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ConfirmAction/index.jsx @@ -1,11 +1,11 @@ import ThumbUpIcon from "@mui/icons-material/ThumbUp"; import { IconButton, Tooltip } from "@mui/material"; -const ConfirmAction = ({ onClick }) => { +const ConfirmAction = ({ onClick, disabled }) => { return ( <> - + 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..d40f0a3 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ComputePaymentForm.jsx @@ -0,0 +1,3 @@ +export default function ComputePaymentForm({ mutate }) { + return
ComputePaymentForm
; +} 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..5f98d49 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmFileForm.jsx @@ -0,0 +1,3 @@ +export default function ConfirmFileForm({ mutate }) { + return
ConfirmFileForm
; +} 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..5d0ca86 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmRequestForm.jsx @@ -0,0 +1,3 @@ +export default function ConfirmRequestForm({ mutate }) { + return
ConfirmRequestForm
; +} 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..543bc33 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ReferForm.jsx @@ -0,0 +1,9 @@ +import { Box } from "@mui/material"; + +export default function ReferForm({ mutate }) { + 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..42080a3 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectFileForm.jsx @@ -0,0 +1,3 @@ +export default function RejectFileForm({ mutate }) { + return
RejectFileForm
; +} 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..bca7ee3 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectRequestForm.jsx @@ -0,0 +1,3 @@ +export default function RejectRequestForm({ mutate }) { + return
RejectRequestForm
; +} diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ReferralAction/index.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ReferralAction/index.jsx index 7f56971..a75ef8c 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ReferralAction/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ReferralAction/index.jsx @@ -1,11 +1,11 @@ import { Reply } from "@mui/icons-material"; import { IconButton, Tooltip } from "@mui/material"; -const ReferralAction = ({ onClick }) => { +const ReferralAction = ({ onClick, disabled }) => { return ( <> - + 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 b2e40ab..edd0346 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RejectAction/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RejectAction/index.jsx @@ -1,11 +1,11 @@ import ThumbDownIcon from "@mui/icons-material/ThumbDown"; import { IconButton, Tooltip } from "@mui/material"; -const RejectAction = ({ onClick }) => { +const RejectAction = ({ onClick, disabled }) => { return ( <> - + 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..d901c13 --- /dev/null +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx @@ -0,0 +1,76 @@ +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 }) { + const formType = `${type}_${rowData?.state_id}`; + + console.log(formType); + + 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(formType)}; +} + +/* + + } + /> + {type === "confirm_request" && ( + <> + ( + } + label="نیاز به پرداخت وجه خزانه" + /> + )} + /> + setNeedsAccessRoad(e.target.checked)} + /> + } + label="نیاز به راه دسترسی" + /> + + )} + + + + + + +*/ diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/index.jsx index 61c5a54..6cc004d 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/index.jsx @@ -1,20 +1,54 @@ 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: { - original: { id }, - }, - onActionClick, -}) => { +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 ( - - onActionClick("referral", id)} /> - onActionClick("reject", id)} /> - onActionClick("confirm", id)} /> - + <> + + handleOpenModal("refer_request", original)} + disabled={disabled.referral} + /> + handleOpenModal("reject_request", original)} disabled={disabled.reject} /> + handleOpenModal("confirm_request", original)} + disabled={disabled.confirm} + /> + + + ); }; diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js index 8572b6f..b2bb76d 100644 --- a/src/core/utils/routes.js +++ b/src/core/utils/routes.js @@ -240,3 +240,4 @@ 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"; From 9aa6ca961740d6bf1298436702226fa460b69d5b Mon Sep 17 00:00:00 2001 From: baslani Date: Tue, 18 Nov 2025 09:41:12 +0330 Subject: [PATCH 04/20] implemented refer modal --- .../RowActions/Forms/ReferForm.jsx | 33 +++++++++++++++++-- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ReferForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ReferForm.jsx index 543bc33..46af9d4 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ReferForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ReferForm.jsx @@ -1,9 +1,36 @@ -import { Box } from "@mui/material"; +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 }) { + const [isSubmitting, setIsSubmitting] = useState(false); + const { control, handleSubmit } = useForm({ + defaultValues: { + expert_description: "", + }, + }); + + const onSubmit = (data) => { + console.log(data); + setIsSubmitting(true); + mutate(); + }; -export default function ReferForm({ mutate }) { return ( -
+ } + /> + + + +
); } From e4b17eb6cf19fed93b649a9f475805063ca6d8a3 Mon Sep 17 00:00:00 2001 From: baslani Date: Tue, 18 Nov 2025 10:11:43 +0330 Subject: [PATCH 05/20] implemented RejectRequestForm modal --- .../RowActions/Forms/RejectRequestForm.jsx | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectRequestForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectRequestForm.jsx index bca7ee3..9f98b33 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectRequestForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectRequestForm.jsx @@ -1,3 +1,36 @@ -export default function RejectRequestForm({ mutate }) { - return
RejectRequestForm
; +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 }) { + const [isSubmitting, setIsSubmitting] = useState(false); + const { control, handleSubmit } = useForm({ + defaultValues: { + expert_description: "", + }, + }); + + const onSubmit = (data) => { + console.log(data); + setIsSubmitting(true); + mutate(); + }; + + return ( + + } + /> + + + + + + ); } From 89ab9b5ada856e683f28d1b5e3a79f05ad4f3a24 Mon Sep 17 00:00:00 2001 From: baslani Date: Tue, 18 Nov 2025 10:18:31 +0330 Subject: [PATCH 06/20] implemented RejectFileForm modal --- .../RowActions/Forms/RejectFileForm.jsx | 40 ++++++++++++++++++- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectFileForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectFileForm.jsx index 42080a3..3e1fa56 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectFileForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectFileForm.jsx @@ -1,3 +1,39 @@ -export default function RejectFileForm({ mutate }) { - return
RejectFileForm
; +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 }) { + const [isSubmitting, setIsSubmitting] = useState(false); + const { control, handleSubmit } = useForm({ + defaultValues: { + expert_description: "", + }, + }); + + const onSubmit = (data) => { + console.log("file rejected"); + + console.log(data); + setIsSubmitting(true); + mutate(); + onClose(); + }; + + return ( + + } + /> + + + + + + ); } From b0a8634d049ceee5f2b38271845450282853577d Mon Sep 17 00:00:00 2001 From: baslani Date: Tue, 18 Nov 2025 13:00:42 +0330 Subject: [PATCH 07/20] implemented ConfirmRequestForm modal --- .../RowActions/Forms/ConfirmRequestForm.jsx | 61 ++++++++++++++++++- 1 file changed, 59 insertions(+), 2 deletions(-) diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmRequestForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmRequestForm.jsx index 5d0ca86..3f090fb 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmRequestForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmRequestForm.jsx @@ -1,3 +1,60 @@ -export default function ConfirmRequestForm({ mutate }) { - return
ConfirmRequestForm
; +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 }) { + const [isSubmitting, setIsSubmitting] = useState(false); + const { control, handleSubmit } = useForm({ + defaultValues: { + expert_description: "", + need_payment: false, + needsAccessRoad: false, + }, + }); + + const onSubmit = (data) => { + console.log(data); + setIsSubmitting(true); + mutate(); + onClose(); + }; + + return ( + + } + /> + ( + } + label="نیاز به پرداخت وجه خزانه" + /> + )} + /> + ( + } + label="نیاز به پرداخت وجه خزانه" + /> + )} + /> + + + + + + + ); } From 7901e86be6bddd75e1cc30ee64753ce13187419d Mon Sep 17 00:00:00 2001 From: baslani Date: Tue, 18 Nov 2025 14:36:09 +0330 Subject: [PATCH 08/20] implemented ConfirmFileForm modal --- .../RowActions/Forms/ConfirmFileForm.jsx | 39 ++++++++++++++++++- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmFileForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmFileForm.jsx index 5f98d49..1eb4d5b 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmFileForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmFileForm.jsx @@ -1,3 +1,38 @@ -export default function ConfirmFileForm({ mutate }) { - return
ConfirmFileForm
; +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 }) { + const [isSubmitting, setIsSubmitting] = useState(false); + const { control, handleSubmit } = useForm({ + defaultValues: { + expert_description: "", + }, + }); + + const onSubmit = (data) => { + console.log(data); + setIsSubmitting(true); + mutate(); + onClose(); + }; + + return ( + + } + /> + + + + + + + ); } From 24461ffc6a6bccc25ca3cec9347a7d83f8d0f852 Mon Sep 17 00:00:00 2001 From: baslani Date: Tue, 18 Nov 2025 14:36:38 +0330 Subject: [PATCH 09/20] implemented ComputePaymentForm modal --- .../RowActions/Forms/ComputePaymentForm.jsx | 130 +++++++++++++++++- 1 file changed, 128 insertions(+), 2 deletions(-) diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ComputePaymentForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ComputePaymentForm.jsx index d40f0a3..b49c61a 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ComputePaymentForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ComputePaymentForm.jsx @@ -1,3 +1,129 @@ -export default function ComputePaymentForm({ mutate }) { - return
ComputePaymentForm
; +import { Box, Button, DialogActions, FormControl, InputLabel, MenuItem, Select, TextField } from "@mui/material"; +import { useEffect, useState } from "react"; +import { Controller, useForm, useWatch } from "react-hook-form"; + +export default function ComputePaymentForm({ mutate, onClose }) { + const [isSubmitting, setIsSubmitting] = useState(false); + + const price_fee = 1; // TODO: Replace with value from .env + + const { control, handleSubmit, setValue } = useForm({ + defaultValues: { + expert_description: "", + traffic: "", + road_type: "", + position: "", + final_area_space: "", + payment_amount: "", + }, + }); + + // Watch dependent fields for recalculation + const { traffic, road_type, position, final_area_space } = useWatch({ + control, + }); + + useEffect(() => { + const t = parseFloat(traffic || ""); + const r = parseFloat(road_type || ""); + const p = parseFloat(position || ""); + const area = parseFloat(final_area_space || ""); + + if (t && r && p && area) { + const result = t * r * p * area * price_fee; + setValue("payment_amount", result.toString()); + } else { + setValue("payment_amount", ""); + } + }, [traffic, road_type, position, final_area_space, price_fee, setValue]); + + const onSubmit = (data) => { + console.log(data); + setIsSubmitting(true); + mutate(); + onClose(); + }; + + return ( + + + ( + + ترافیک + + + )} + /> + + ( + + نوع راه + + + )} + /> + + + + ( + + موقعیت اقتصادی + + + )} + /> + + ( + + )} + /> + + + ( + + )} + /> + + } + /> + + + + + + + ); } From 522215690df383cdd8bc62fceac3fb19d6d08021 Mon Sep 17 00:00:00 2001 From: baslani Date: Tue, 18 Nov 2025 14:39:02 +0330 Subject: [PATCH 10/20] implemented form rendering logic --- .../RowActions/ActionsDialog.jsx | 2 +- .../RowActions/RenderActionForm.jsx | 60 +++---------------- 2 files changed, 9 insertions(+), 53 deletions(-) diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ActionsDialog.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ActionsDialog.jsx index 92afece..75fe025 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ActionsDialog.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ActionsDialog.jsx @@ -12,7 +12,7 @@ const ActionDialog = ({ open, type, rowData, onClose, mutate }) => { {actionLabel} - + ); }; diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx index d901c13..874916c 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx @@ -6,71 +6,27 @@ import ReferForm from "./Forms/ReferForm"; import RejectFileForm from "./Forms/RejectFileForm"; import RejectRequestForm from "./Forms/RejectRequestForm"; -export default function RenderActionForm({ type, rowData, mutate }) { +export default function RenderActionForm({ type, rowData, mutate, onClose }) { const formType = `${type}_${rowData?.state_id}`; - console.log(formType); - function renderForm() { switch (formType) { case "refer_request_2": - return ; + return ; case "reject_request_2": - return ; + return ; case "reject_request_5": - return ; + return ; case "confirm_request_2": - return ; + return ; case "confirm_request_5": - return ; + return ; case "confirm_request_13": - return ; + return ; default: return <>; } } - return {renderForm(formType)}; + return {renderForm()}; } - -/* - - } - /> - {type === "confirm_request" && ( - <> - ( - } - label="نیاز به پرداخت وجه خزانه" - /> - )} - /> - setNeedsAccessRoad(e.target.checked)} - /> - } - label="نیاز به راه دسترسی" - /> - - )} - - - - - - -*/ From a6788fdaeffe2b157c7fd41a70ee9ce398b1508c Mon Sep 17 00:00:00 2001 From: baslani Date: Tue, 18 Nov 2025 15:05:38 +0330 Subject: [PATCH 11/20] implemented referal action for privacy office --- .../RowActions/Forms/ReferForm.jsx | 43 ++++++++++++++++--- .../RowActions/RenderActionForm.jsx | 2 +- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ReferForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ReferForm.jsx index 46af9d4..30477f7 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ReferForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ReferForm.jsx @@ -1,19 +1,37 @@ +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 }) { +export default function ReferForm({ mutate, onClose, rowId }) { const [isSubmitting, setIsSubmitting] = useState(false); - const { control, handleSubmit } = useForm({ + const request = useRequest({ notificationSuccess: true }); + + const { + control, + handleSubmit, + formState: { errors }, + } = useForm({ defaultValues: { expert_description: "", }, }); const onSubmit = (data) => { - console.log(data); setIsSubmitting(true); - mutate(); + try { + request(`${PRIVACY_ADMIN_ACTION_API}/refer_request/${rowId}`, "post", { + data, + }).then(() => { + onClose(); + mutate(); + }); + } catch (error) { + console.log(error); + } finally { + setIsSubmitting(false); + } }; return ( @@ -21,14 +39,27 @@ export default function ReferForm({ mutate, onClose }) { } + rules={{ + required: "توضیحات الزامی است", + }} + render={({ field }) => ( + + )} /> diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx index 874916c..63a1305 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx @@ -12,7 +12,7 @@ export default function RenderActionForm({ type, rowData, mutate, onClose }) { function renderForm() { switch (formType) { case "refer_request_2": - return ; + return ; case "reject_request_2": return ; case "reject_request_5": From 1276fe3079ff8e2ce2ba8e22f074370bd7618810 Mon Sep 17 00:00:00 2001 From: baslani Date: Tue, 18 Nov 2025 15:53:01 +0330 Subject: [PATCH 12/20] implemented reject action for privacy office --- .../RowActions/Forms/ReferForm.jsx | 2 +- .../RowActions/Forms/RejectRequestForm.jsx | 45 ++++++++++++++++--- .../RowActions/RenderActionForm.jsx | 2 +- 3 files changed, 41 insertions(+), 8 deletions(-) diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ReferForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ReferForm.jsx index 30477f7..231f08f 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ReferForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ReferForm.jsx @@ -6,7 +6,7 @@ import { Controller, useForm } from "react-hook-form"; export default function ReferForm({ mutate, onClose, rowId }) { const [isSubmitting, setIsSubmitting] = useState(false); - const request = useRequest({ notificationSuccess: true }); + const request = useRequest({ notificationSuccess: true, notificationFailed: true }); const { control, diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectRequestForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectRequestForm.jsx index 9f98b33..daf1961 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectRequestForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectRequestForm.jsx @@ -1,19 +1,38 @@ +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 }) { +export default function RejectRequestForm({ mutate, onClose, rowId }) { const [isSubmitting, setIsSubmitting] = useState(false); - const { control, handleSubmit } = useForm({ + const request = useRequest({ notificationSuccess: true, notificationFailed: true }); + + const { + control, + handleSubmit, + formState: { errors }, + } = useForm({ defaultValues: { expert_description: "", }, }); const onSubmit = (data) => { - console.log(data); setIsSubmitting(true); - mutate(); + + try { + request(`${PRIVACY_ADMIN_ACTION_API}/reject_request/${rowId}`, "post", { + data, + }).then(() => { + onClose(); + mutate(); + }); + } catch (err) { + console.log(err); + } finally { + setIsSubmitting(false); + } }; return ( @@ -21,14 +40,28 @@ export default function RejectRequestForm({ mutate, onClose }) { } + rules={{ + required: "توضیحات الزامی است", + }} + render={({ field }) => ( + + )} /> + diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx index 63a1305..12b538a 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx @@ -14,7 +14,7 @@ export default function RenderActionForm({ type, rowData, mutate, onClose }) { case "refer_request_2": return ; case "reject_request_2": - return ; + return ; case "reject_request_5": return ; case "confirm_request_2": From 5a7f8d167527b0e11d9ca460cd7f5ed019b4b100 Mon Sep 17 00:00:00 2001 From: baslani Date: Tue, 18 Nov 2025 15:57:44 +0330 Subject: [PATCH 13/20] implemented reject file action for privacy office --- .../RowActions/Forms/RejectFileForm.jsx | 48 +++++++++++++++---- .../RowActions/RenderActionForm.jsx | 2 +- 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectFileForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectFileForm.jsx index 3e1fa56..0427eef 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectFileForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/RejectFileForm.jsx @@ -1,22 +1,38 @@ +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 }) { +export default function RejectFileForm({ mutate, onClose, rowId }) { const [isSubmitting, setIsSubmitting] = useState(false); - const { control, handleSubmit } = useForm({ + const request = useRequest({ notificationSuccess: true, notificationFailed: true }); + + const { + control, + handleSubmit, + formState: { errors }, + } = useForm({ defaultValues: { expert_description: "", }, }); const onSubmit = (data) => { - console.log("file rejected"); - - console.log(data); setIsSubmitting(true); - mutate(); - onClose(); + + try { + request(`${PRIVACY_ADMIN_ACTION_API}/file_rejected/${rowId}`, "post", { + data, + }).then(() => { + onClose(); + mutate(); + }); + } catch (err) { + console.log(err); + } finally { + setIsSubmitting(false); + } }; return ( @@ -24,14 +40,28 @@ export default function RejectFileForm({ mutate, onClose }) { } + rules={{ + required: "توضیحات الزامی است", + }} + render={({ field }) => ( + + )} /> + diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx index 12b538a..43f5061 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx @@ -16,7 +16,7 @@ export default function RenderActionForm({ type, rowData, mutate, onClose }) { case "reject_request_2": return ; case "reject_request_5": - return ; + return ; case "confirm_request_2": return ; case "confirm_request_5": From 2e68ac4472ad8cc03e3cdaf64d04fb7249523f41 Mon Sep 17 00:00:00 2001 From: baslani Date: Wed, 19 Nov 2025 10:06:50 +0330 Subject: [PATCH 14/20] implemented confirm action for privacy office --- .../RowActions/Forms/ConfirmRequestForm.jsx | 50 ++++++++++++++++--- .../RowActions/RenderActionForm.jsx | 2 +- 2 files changed, 44 insertions(+), 8 deletions(-) diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmRequestForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmRequestForm.jsx index 3f090fb..fdfabd7 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmRequestForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmRequestForm.jsx @@ -1,10 +1,18 @@ +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 }) { +export default function ConfirmRequestForm({ mutate, onClose, rowId }) { const [isSubmitting, setIsSubmitting] = useState(false); - const { control, handleSubmit } = useForm({ + const request = useRequest({ notificationSuccess: true, notificationFailed: true }); + + const { + control, + handleSubmit, + formState: { errors }, + } = useForm({ defaultValues: { expert_description: "", need_payment: false, @@ -13,10 +21,25 @@ export default function ConfirmRequestForm({ mutate, onClose }) { }); const onSubmit = (data) => { - console.log(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); - mutate(); - onClose(); + try { + request(url, "post", { + data: body, + }).then(() => { + mutate(); + onClose(); + }); + } catch (error) { + } finally { + setIsSubmitting(false); + } }; return ( @@ -24,8 +47,20 @@ export default function ConfirmRequestForm({ mutate, onClose }) { } + rules={{ required: "توضیحات الزامی است" }} + render={({ field }) => ( + + )} /> + )} /> + ( } - label="نیاز به پرداخت وجه خزانه" + label="نیاز به راه دسترسی" /> )} /> diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx index 43f5061..7888e45 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx @@ -18,7 +18,7 @@ export default function RenderActionForm({ type, rowData, mutate, onClose }) { case "reject_request_5": return ; case "confirm_request_2": - return ; + return ; case "confirm_request_5": return ; case "confirm_request_13": From 16b2e209a3f4501d7f075997c249f1f63370c396 Mon Sep 17 00:00:00 2001 From: baslani Date: Wed, 19 Nov 2025 10:16:07 +0330 Subject: [PATCH 15/20] implemented confirm file action for privacy office --- .../RowActions/Forms/ConfirmFileForm.jsx | 45 ++++++++++++++++--- .../RowActions/RenderActionForm.jsx | 2 +- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmFileForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmFileForm.jsx index 1eb4d5b..80bda88 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmFileForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ConfirmFileForm.jsx @@ -1,20 +1,38 @@ +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 }) { +export default function ConfirmFileForm({ mutate, onClose, rowId }) { const [isSubmitting, setIsSubmitting] = useState(false); - const { control, handleSubmit } = useForm({ + const request = useRequest({ notificationSuccess: true, notificationFailed: true }); + + const { + control, + handleSubmit, + formState: { errors }, + } = useForm({ defaultValues: { expert_description: "", }, }); const onSubmit = (data) => { - console.log(data); setIsSubmitting(true); - mutate(); - onClose(); + + try { + request(`${PRIVACY_ADMIN_ACTION_API}/file_accepted/${rowId}`, "post", { + data, + }).then(() => { + onClose(); + mutate(); + }); + } catch (err) { + console.log(err); + } finally { + setIsSubmitting(false); + } }; return ( @@ -22,7 +40,20 @@ export default function ConfirmFileForm({ mutate, onClose }) { } + rules={{ + required: "توضیحات الزامی است", + }} + render={({ field }) => ( + + )} /> @@ -30,7 +61,7 @@ export default function ConfirmFileForm({ mutate, onClose }) { انصراف diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx index 7888e45..51c465a 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx @@ -20,7 +20,7 @@ export default function RenderActionForm({ type, rowData, mutate, onClose }) { case "confirm_request_2": return ; case "confirm_request_5": - return ; + return ; case "confirm_request_13": return ; default: From 0e4fc65d25f96c8f377fdc51fff471710dce8f04 Mon Sep 17 00:00:00 2001 From: baslani Date: Wed, 19 Nov 2025 11:47:29 +0330 Subject: [PATCH 16/20] fixed MUI tooltip error --- .../privacy-office/RowActions/ConfirmAction/index.jsx | 8 +++++--- .../privacy-office/RowActions/ReferralAction/index.jsx | 8 +++++--- .../privacy-office/RowActions/RejectAction/index.jsx | 8 +++++--- 3 files changed, 15 insertions(+), 9 deletions(-) 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 bdb4b35..7820320 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ConfirmAction/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ConfirmAction/index.jsx @@ -5,9 +5,11 @@ const ConfirmAction = ({ onClick, disabled }) => { 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 index a75ef8c..85a693f 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ReferralAction/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/ReferralAction/index.jsx @@ -5,9 +5,11 @@ const ReferralAction = ({ onClick, disabled }) => { return ( <> - - - + + + + + ); 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 edd0346..e467e87 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RejectAction/index.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RejectAction/index.jsx @@ -5,9 +5,11 @@ const RejectAction = ({ onClick, disabled }) => { return ( <> - - - + + + + + ); From d9f27bda742fd6ac373fff83ee654affe72c067c Mon Sep 17 00:00:00 2001 From: baslani Date: Wed, 19 Nov 2025 15:42:56 +0330 Subject: [PATCH 17/20] implemented payment computing for privacy office --- jsconfig.json | 33 +++- .../city-admin/ShowPrimaryArea/index.jsx | 18 +- .../RowActions/Forms/ComputePaymentForm.jsx | 168 ++++++++++++++---- .../RowActions/RenderActionForm.jsx | 2 +- src/core/utils/utils.js | 15 ++ 5 files changed, 176 insertions(+), 60 deletions(-) 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/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/RowActions/Forms/ComputePaymentForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ComputePaymentForm.jsx index b49c61a..01d3a5d 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ComputePaymentForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ComputePaymentForm.jsx @@ -1,47 +1,92 @@ -import { Box, Button, DialogActions, FormControl, InputLabel, MenuItem, Select, TextField } from "@mui/material"; +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"; -export default function ComputePaymentForm({ mutate, onClose }) { +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 price_fee = 1; // TODO: Replace with value from .env + const coordsArea = safeParsePolygon(rowData.final_area); + const coordsPlan = safeParsePolygon(rowData.final_plan); - const { control, handleSubmit, setValue } = useForm({ + 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: "", + final_area_space: calculatedArea, // عرصه + final_plan_space: calculatedPlan, // عیان payment_amount: "", }, }); - // Watch dependent fields for recalculation - const { traffic, road_type, position, final_area_space } = useWatch({ + 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 area = parseFloat(final_area_space || ""); - if (t && r && p && area) { - const result = t * r * p * area * price_fee; - setValue("payment_amount", result.toString()); + 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, final_area_space, price_fee, setValue]); + }, [traffic, road_type, position, setValue, calculatedArea, calculatedPlan]); const onSubmit = (data) => { - console.log(data); setIsSubmitting(true); - mutate(); - onClose(); + + try { + request(`${PRIVACY_ADMIN_ACTION_API}/computing_payment/${rowData.id}`, "post", { + data, + }); + } catch (error) { + console.error("Error submitting payment:", error); + } finally { + setIsSubmitting(false); + } }; return ( @@ -50,14 +95,18 @@ export default function ComputePaymentForm({ mutate, onClose }) { ( ترافیک - سبک متوسط سنگین + {errors.traffic && ( + {errors.traffic.message} + )} )} /> @@ -65,39 +114,66 @@ export default function ComputePaymentForm({ mutate, onClose }) { ( نوع راه - فرعی و راه‌آهن اصلی و بزرگراه آزادراه + {errors.road_type && ( + {errors.road_type.message} + )} )} /> - - ( - - موقعیت اقتصادی - - - )} - /> + ( + + موقعیت اقتصادی + + {errors.position && ( + {errors.position.message} + )} + + )} + /> + ( - + + )} + /> + ( + )} /> @@ -105,15 +181,35 @@ export default function ComputePaymentForm({ mutate, onClose }) { ( - - )} + render={({ field }) => { + const { value } = field; + + return ( + + ); + }} /> } + rules={{ required: "توضیحات ناظر اجباری است" }} + render={({ field }) => ( + + )} /> diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx index 51c465a..846cc1a 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/RenderActionForm.jsx @@ -22,7 +22,7 @@ export default function RenderActionForm({ type, rowData, mutate, onClose }) { case "confirm_request_5": return ; case "confirm_request_13": - return ; + return ; default: return <>; } 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; + } +} From 6c48dd4a05749a38850295e846616d64be354892 Mon Sep 17 00:00:00 2001 From: baslani Date: Wed, 19 Nov 2025 15:47:46 +0330 Subject: [PATCH 18/20] fixed date issue and active status for toll houses --- .../tollHouse/Form/CreateTollHouse/TollHouseInfo.jsx | 4 ++-- src/components/infrastructure/tollHouse/TollHouseList.jsx | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) 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, From 98f783ee4401c988a91cb2171bb929df916aa273 Mon Sep 17 00:00:00 2001 From: baslani Date: Wed, 26 Nov 2025 09:04:14 +0330 Subject: [PATCH 19/20] fixed computing payment form's submit action --- .../privacy-office/RowActions/Forms/ComputePaymentForm.jsx | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ComputePaymentForm.jsx b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ComputePaymentForm.jsx index 01d3a5d..eb0fa47 100644 --- a/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ComputePaymentForm.jsx +++ b/src/components/dashboard/inquiryPrivacy/privacy-office/RowActions/Forms/ComputePaymentForm.jsx @@ -81,6 +81,9 @@ export default function ComputePaymentForm({ mutate, onClose, rowData }) { try { request(`${PRIVACY_ADMIN_ACTION_API}/computing_payment/${rowData.id}`, "post", { data, + }).then(() => { + onClose(); + mutate(); }); } catch (error) { console.error("Error submitting payment:", error); From 294ca463ff089253a7b670da6036681684bb0d25 Mon Sep 17 00:00:00 2001 From: baslani Date: Wed, 26 Nov 2025 11:21:17 +0330 Subject: [PATCH 20/20] implemented technical deputy list table page --- .../{assistant => technical-deputy}/page.js | 3 +- .../ConfirmRoadSafetyDialog.jsx | 48 +++++ .../ConfirmRoadSafetyFormContext.jsx | 85 ++++++++ .../PrevCartableOpinion.jsx | 16 ++ .../Questions/DescriptionForm.jsx | 29 +++ .../Questions/QuestionVerifyNeedRoadForm.jsx | 34 ++++ .../QuestionVerifyRoadSafetyForm.jsx | 34 ++++ .../Questions/Refer/Form.jsx | 78 +++++++ .../Questions/Refer/index.jsx | 34 ++++ .../ConfirmRoadSafetyForm/Questions/index.jsx | 72 +++++++ .../ConfirmRoadSafetyForm/index.jsx | 51 +++++ .../ConfirmRoadSafetyDialog.jsx | 49 +++++ .../ConfirmRoadSafetyFormContext.jsx | 92 +++++++++ .../PrevCartableOpinion.jsx | 16 ++ .../Questions/DescriptionForm.jsx | 29 +++ .../Questions/QuestionVerifyNeedRoadForm.jsx | 34 ++++ .../QuestionVerifyRoadSafetyForm.jsx | 34 ++++ .../Questions/Refer/Form.jsx | 70 +++++++ .../Questions/Refer/index.jsx | 34 ++++ .../Questions/index.jsx | 65 ++++++ .../ConfirmVerifyLicenseForm/index.jsx | 51 +++++ .../ConfirmRoadSafetyDialog.jsx | 43 ++++ .../ConfirmRoadSafetyFormContext.jsx | 92 +++++++++ .../PrevCartableOpinion.jsx | 16 ++ .../Questions/DescriptionForm.jsx | 29 +++ .../Questions/QuestionVerifyNeedRoadForm.jsx | 34 ++++ .../Questions/Refer/Form.jsx | 70 +++++++ .../Questions/Refer/index.jsx | 34 ++++ .../Questions/index.jsx | 64 ++++++ .../ConfirmVerifyRoadSafetyForm/index.jsx | 51 +++++ .../technical-deputy/RowActions/index.jsx | 22 ++ .../ShowPrimaryArea/ShowBound.jsx | 29 +++ .../ShowPrimaryArea/index.jsx | 60 ++++++ .../technical-deputy/TechnicalDeputyList.jsx | 190 ++++++++++++++++++ .../inquiryPrivacy/technical-deputy/index.jsx | 15 ++ src/core/components/TabPanel.jsx | 11 + src/core/utils/pageMenuDev.js | 2 +- src/core/utils/routes.js | 1 + 38 files changed, 1719 insertions(+), 2 deletions(-) rename src/app/(withAuth)/(dashboardLayout)/dashboard/inquiry-privacy/{assistant => technical-deputy}/page.js (70%) create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/ConfirmRoadSafetyDialog.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/ConfirmRoadSafetyFormContext.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/PrevCartableOpinion.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/DescriptionForm.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/QuestionVerifyNeedRoadForm.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/QuestionVerifyRoadSafetyForm.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/Refer/Form.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/Refer/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/Questions/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmRoadSafetyForm/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/ConfirmRoadSafetyDialog.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/ConfirmRoadSafetyFormContext.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/PrevCartableOpinion.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/DescriptionForm.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/QuestionVerifyNeedRoadForm.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/QuestionVerifyRoadSafetyForm.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/Refer/Form.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/Refer/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/Questions/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyLicenseForm/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/ConfirmRoadSafetyDialog.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/ConfirmRoadSafetyFormContext.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/PrevCartableOpinion.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/Questions/DescriptionForm.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/Questions/QuestionVerifyNeedRoadForm.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/Questions/Refer/Form.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/Questions/Refer/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/Questions/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/ConfirmVerifyRoadSafetyForm/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/RowActions/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/ShowPrimaryArea/ShowBound.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/ShowPrimaryArea/index.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/TechnicalDeputyList.jsx create mode 100644 src/components/dashboard/inquiryPrivacy/technical-deputy/index.jsx create mode 100644 src/core/components/TabPanel.jsx 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/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/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 b2bb76d..e9e7119 100644 --- a/src/core/utils/routes.js +++ b/src/core/utils/routes.js @@ -241,3 +241,4 @@ 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";