diff --git a/src/app/api/fake-cities/route.js b/src/app/api/fake-cities/route.js
new file mode 100644
index 0000000..ad8512a
--- /dev/null
+++ b/src/app/api/fake-cities/route.js
@@ -0,0 +1,18 @@
+const data = [
+ {
+ id : 1,
+ name : "تهران"
+ },
+ {
+ id : 2,
+ name : "ری"
+ },
+ {
+ id : 3,
+ name : "اندیشه"
+ },
+];
+
+export async function GET() {
+ return Response.json({ data });
+}
\ No newline at end of file
diff --git a/src/app/api/fake-data/route.js b/src/app/api/fake-data/route.js
index 9b7ab03..2dca9c3 100644
--- a/src/app/api/fake-data/route.js
+++ b/src/app/api/fake-data/route.js
@@ -1,5 +1,39 @@
const data = [
- // put your fake data here
+ {
+ id : 1,
+ aplication_number : 1,
+ application_date : "1",
+ province:"tehran",
+ city:"tehran"
+ },
+ {
+ id : 2,
+ aplication_number : 2,
+ application_date : "1",
+ province:"tehran",
+ city:"tehran"
+ },
+ {
+ id : 3,
+ aplication_number : 3,
+ application_date : "1",
+ province:"tehran",
+ city:"tehran"
+ },
+ {
+ id : 4,
+ aplication_number : 4,
+ application_date : "1",
+ province:"tehran",
+ city:"tehran"
+ },
+ {
+ id : 5,
+ aplication_number : 5,
+ application_date : "1",
+ province:"tehran",
+ city:"tehran"
+ },
];
export async function GET() {
diff --git a/src/app/api/fake-provinces/route.js b/src/app/api/fake-provinces/route.js
new file mode 100644
index 0000000..c044fdc
--- /dev/null
+++ b/src/app/api/fake-provinces/route.js
@@ -0,0 +1,18 @@
+const data = [
+ {
+ id : 1,
+ name : "تهران"
+ },
+ {
+ id : 2,
+ name : "مشهد"
+ },
+ {
+ id : 3,
+ name : "اصفهان"
+ },
+];
+
+export async function GET() {
+ return Response.json({ data });
+}
\ No newline at end of file
diff --git a/src/app/api/fake-submit/[id]/route.js b/src/app/api/fake-submit/[id]/route.js
new file mode 100644
index 0000000..c8e821b
--- /dev/null
+++ b/src/app/api/fake-submit/[id]/route.js
@@ -0,0 +1,3 @@
+export async function POST() {
+ return Response.json({message : "Done"});
+}
\ No newline at end of file
diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx
new file mode 100644
index 0000000..44a9d7e
--- /dev/null
+++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx
@@ -0,0 +1,140 @@
+import {
+ Autocomplete,
+ Button, CircularProgress,
+ DialogActions,
+ DialogContent,
+ FormControl, FormHelperText,
+ InputLabel, OutlinedInput,
+ Stack,
+ TextField, Typography
+} from "@mui/material";
+import {Controller, useForm} from "react-hook-form";
+import {yupResolver} from "@hookform/resolvers/yup";
+import {object, string} from "yup";
+import StyledForm from "@/core/components/StyledForm";
+import useCities from "@/lib/hooks/useCities";
+import useRequest from "@/lib/hooks/useRequest";
+import {REFER_ADMIN_CITY} from "@/core/utils/routes";
+
+const validationSchema = object({
+ description: string().required("وارد کردن توضیحات الزامیست!"),
+ city: string().required("وارد کردن شهرستان الزامیست!"),
+});
+
+const ReferFormContext = ({setOpenReferDialog, rowId, mutate}) => {
+ const defaultValues = {
+ description: "",
+ city: "",
+ };
+ const { cities, loadingCities, errorCities } = useCities()
+ const requestServer = useRequest({auth: true})
+ const {
+ control,
+ register,
+ handleSubmit,
+ formState: {isSubmitting, errors, touchedFields},
+ } = useForm({defaultValues, resolver: yupResolver(validationSchema), mode : "onBlur"})
+
+ const onSubmit = async (data) => {
+ const formData = new FormData();
+ formData.append("description", data.description);
+ formData.append("cityId", data.city);
+ requestServer(`${REFER_ADMIN_CITY}/${rowId}`, 'post', {
+ data: formData,
+ }).then(() => {
+ setOpenReferDialog(false)
+ mutate()
+ }).catch(() => {})
+ }
+ return (
+
+
+
+
+
+ توضیحات
+
+ {errors.description ? errors.description.message : null}
+
+
+
+ (
+
+
+ {errorCities ? (
+ خطایی در دریافت شهرستان ها رخ داده است!
+ ) :
+ loadingCities ? (
+
+
+ درحال دریافت لیست شهرستان ها
+
+ ) : (
+ city.id === value) || null}
+ disablePortal
+ options={cities}
+ getOptionLabel={(city) => city.name}
+ isOptionEqualToValue={(option, value) => option.id === value.id}
+ onChange={(event, newValue) => {
+ onChange(newValue ? newValue.id : "");
+ }}
+ renderInput={(params) => (
+
+ )}
+ />
+ )}
+
+ {errors.city ? errors.city.message : null}
+
+
+ )}
+ />
+
+
+
+
+
+
+
+
+ )
+}
+export default ReferFormContext
\ No newline at end of file
diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/index.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/index.jsx
new file mode 100644
index 0000000..b746879
--- /dev/null
+++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/index.jsx
@@ -0,0 +1,36 @@
+import {Dialog, DialogTitle, IconButton, Stack, Tooltip} from "@mui/material";
+import ReplyIcon from '@mui/icons-material/Reply';
+import DialogTransition from "@/core/components/DialogTransition";
+import ReferFormContext from "@/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer/ReferFormContext";
+import {useState} from "react";
+
+const ReferForm = ({rowId, mutate}) => {
+ const [openReferDialog, setOpenReferDialog] = useState(false)
+ return(
+
+
+ {
+ setOpenReferDialog(true)
+ }}
+ >
+
+
+
+
+
+ )
+}
+export default ReferForm
\ No newline at end of file
diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/index.jsx
new file mode 100644
index 0000000..a1ff5bc
--- /dev/null
+++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/index.jsx
@@ -0,0 +1,8 @@
+import ReferForm from "@/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions/Refer";
+
+const RowActions = ({row, mutate}) => {
+ return(
+ //rowId should pass
+ )
+}
+export default RowActions
\ No newline at end of file
diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx
index 6951ea6..16bd2d4 100644
--- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx
+++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/TaskList.jsx
@@ -4,10 +4,19 @@ import { useMemo } from "react";
import { Box, IconButton, Tooltip } from "@mui/material";
import DataTableWithAuth from "@/core/components/DataTableWithAuth";
import AssignmentIcon from "@mui/icons-material/Assignment";
+import RowActions from "@/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/RowActions";
const TaskList = () => {
const columns = useMemo(
() => [
+ {
+ accessorKey: "id",
+ header: "کد یکتا",
+ id: "id",
+ enableColumnFilter: false,
+ datatype: "text",
+ filterFn: "notEquals",
+ },
{
accessorKey: "aplication_number",
header: "شماره درخواست",
@@ -112,16 +121,7 @@ const TaskList = () => {
table_name={"cityAdminZaminGovList"}
enableRowActions
positionActionsColumn={"last"}
- renderRowActions={({ row, table }) => (
-
- console.log("next part")}
- >
-
-
-
- )}
+ renderRowActions={({ row, table }) => }
/>
>
diff --git a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx
index 29f2aeb..fe573a5 100644
--- a/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx
+++ b/src/components/dashboard/inquiryPrivacy/cityAdmin/zaminGov/index.jsx
@@ -1,10 +1,10 @@
"use client";
-
import PageTitle from "@/core/components/PageTitle";
import { Stack } from "@mui/material";
import TaskList from "./TaskList";
const CityAdminZaminGovComponent = () => {
+
return (
diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx
new file mode 100644
index 0000000..c43d922
--- /dev/null
+++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext.jsx
@@ -0,0 +1,141 @@
+import {
+ Autocomplete,
+ Button, CircularProgress,
+ DialogActions,
+ DialogContent,
+ FormControl, FormHelperText,
+ InputLabel, OutlinedInput,
+ Stack,
+ TextField, Typography
+} from "@mui/material";
+import {Controller, useForm} from "react-hook-form";
+import {yupResolver} from "@hookform/resolvers/yup";
+import {object, string} from "yup";
+import StyledForm from "@/core/components/StyledForm";
+import useProvinces from "@/lib/hooks/useProvince";
+import useRequest from "@/lib/hooks/useRequest";
+import {REFER_ADMIN_PROVINCE} from "@/core/utils/routes";
+
+const validationSchema = object({
+ description: string().required("وارد کردن توضیحات الزامیست!"),
+ province: string().required("وارد کردن استان الزامیست!"),
+});
+
+const ReferFormContext = ({setOpenReferDialog, rowId, mutate}) => {
+ const defaultValues = {
+ description: "",
+ province: "",
+ };
+ const { provinces, loadingProvinces, errorProvinces } = useProvinces()
+ const requestServer = useRequest({auth: true})
+ const {
+ control,
+ register,
+ handleSubmit,
+ formState: {isSubmitting, errors, touchedFields},
+ } = useForm({defaultValues, resolver: yupResolver(validationSchema), mode : "onBlur"})
+
+ const onSubmit = async (data) => {
+ const formData = new FormData();
+ formData.append("description", data.description);
+ formData.append("provinceId", data.province);
+
+ requestServer(`${REFER_ADMIN_PROVINCE}/${rowId}`, 'post', {
+ data: formData,
+ }).then(() => {
+ setOpenReferDialog(false)
+ mutate()
+ }).catch(() => {})
+ }
+ return (
+
+
+
+
+
+ توضیحات
+
+ {errors.description ? errors.description.message : null}
+
+
+
+ (
+
+
+ {errorProvinces ? (
+ خطایی در دریافت استان ها رخ داده است!
+ ) :
+ loadingProvinces ? (
+
+
+ درحال دریافت لیست استان ها
+
+ ) : (
+ province.id === value) || null}
+ disablePortal
+ options={provinces}
+ getOptionLabel={(province) => province.name}
+ isOptionEqualToValue={(option, value) => option.id === value.id}
+ onChange={(event, newValue) => {
+ onChange(newValue ? newValue.id : "");
+ }}
+ renderInput={(params) => (
+
+ )}
+ />
+ )}
+
+ {errors.province ? errors.province.message : null}
+
+
+ )}
+ />
+
+
+
+
+
+
+
+
+ )
+}
+export default ReferFormContext
\ No newline at end of file
diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/index.jsx
new file mode 100644
index 0000000..171a03d
--- /dev/null
+++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/index.jsx
@@ -0,0 +1,37 @@
+import {Dialog, DialogTitle, IconButton, Stack, Tooltip} from "@mui/material";
+import ReplyIcon from '@mui/icons-material/Reply';
+import DialogTransition from "@/core/components/DialogTransition";
+import {useState} from "react";
+import ReferFormContext
+ from "@/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer/ReferFormContext";
+
+const ReferForm = ({rowId, mutate}) => {
+ const [openReferDialog, setOpenReferDialog] = useState(false)
+ return(
+
+
+ {
+ setOpenReferDialog(true)
+ }}
+ >
+
+
+
+
+
+ )
+}
+export default ReferForm
\ No newline at end of file
diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx
new file mode 100644
index 0000000..9924ac7
--- /dev/null
+++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/index.jsx
@@ -0,0 +1,8 @@
+import ReferForm from "@/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions/Refer";
+
+const RowActions = ({row, mutate}) => {
+ return(
+ //rowId should pass
+ )
+}
+export default RowActions
\ No newline at end of file
diff --git a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx
index 02b750e..a7f9a46 100644
--- a/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx
+++ b/src/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/TaskList.jsx
@@ -4,10 +4,19 @@ import { useMemo } from "react";
import { Box, IconButton, Tooltip } from "@mui/material";
import DataTableWithAuth from "@/core/components/DataTableWithAuth";
import AssignmentIcon from "@mui/icons-material/Assignment";
+import RowActions from "@/components/dashboard/inquiryPrivacy/provinceAdmin/zaminGov/RowActions";
const TaskList = () => {
const columns = useMemo(
() => [
+ {
+ accessorKey: "id",
+ header: "کد یکتا",
+ id: "id",
+ enableColumnFilter: false,
+ datatype: "text",
+ filterFn: "notEquals",
+ },
{
accessorKey: "aplication_number",
header: "شماره درخواست",
@@ -112,16 +121,7 @@ const TaskList = () => {
table_name={"provinceAdminZaminGovList"}
enableRowActions
positionActionsColumn={"last"}
- renderRowActions={({ row, table }) => (
-
- console.log("next part")}
- >
-
-
-
- )}
+ renderRowActions={({ row, table }) => }
/>
>
diff --git a/src/core/utils/routes.js b/src/core/utils/routes.js
index 8e4b47b..0bbfb0a 100644
--- a/src/core/utils/routes.js
+++ b/src/core/utils/routes.js
@@ -6,3 +6,7 @@ export const CHANGE_USER_PASSWORD = api + "/api/v3/profile/change_password";
export const GET_LOGIN_ROUTE = api + "/login_dev";
export const GET_PERMISSIONS_ROUTE = api + "/webapi/user/get-permission";
export const GET_SIDEBAR_BADGE_ROUTE = api + "/v2/activity_statistics";
+export const REFER_ADMIN_PROVINCE = "/v3/api/fake-submit"
+export const REFER_ADMIN_CITY = "/v3/api/fake-submit"
+export const GET_CITY_LISTS = "/v3/api/fake-cities"
+export const GET_PROVINCE_LISTS = "/v3/api/fake-provinces"
diff --git a/src/lib/hooks/useCities.js b/src/lib/hooks/useCities.js
new file mode 100644
index 0000000..e86a673
--- /dev/null
+++ b/src/lib/hooks/useCities.js
@@ -0,0 +1,29 @@
+import { useState, useEffect } from "react";
+import axios from "axios";
+import {GET_CITY_LISTS} from "@/core/utils/routes";
+
+const useCities = () => {
+ const [cities, setCities] = useState([]);
+ const [loadingCities, setLoadingCities] = useState(true);
+ const [errorCities, setErrorCities] = useState(null);
+
+ useEffect(() => {
+ const fetchCities = async () => {
+ try {
+ const response = await axios.get(`${GET_CITY_LISTS}`);
+ setCities(response.data.data);
+ setLoadingCities(false);
+ } catch (e) {
+ console.error("Error fetching cities:", e);
+ setErrorCities(e);
+ setLoadingCities(false);
+ }
+ };
+
+ fetchCities();
+ }, []);
+
+ return { cities, loadingCities, errorCities };
+};
+
+export default useCities;
diff --git a/src/lib/hooks/useProvince.js b/src/lib/hooks/useProvince.js
new file mode 100644
index 0000000..5a96cf2
--- /dev/null
+++ b/src/lib/hooks/useProvince.js
@@ -0,0 +1,29 @@
+import { useState, useEffect } from "react";
+import axios from "axios";
+import {GET_PROVINCE_LISTS} from "@/core/utils/routes";
+
+const useProvinces = () => {
+ const [provinces, setProvinces] = useState([]);
+ const [loadingProvinces, setLoadingProvinces] = useState(true);
+ const [errorProvinces, setErrorProvinces] = useState(null);
+
+ useEffect(() => {
+ const fetchCities = async () => {
+ try {
+ const response = await axios.get(`${GET_PROVINCE_LISTS}`); // Fetch the cities from the API
+ setProvinces(response.data.data); // Set the cities data
+ setLoadingProvinces(false); // Set loading to false after successful fetch
+ } catch (e) {
+ console.error("Error fetching cities:", e);
+ setErrorProvinces(e);
+ setLoadingProvinces(false);
+ }
+ };
+
+ fetchCities(); // Call the fetch function
+ }, []); // Empty dependency array to ensure it only runs once
+
+ return { provinces, loadingProvinces, errorProvinces };
+};
+
+export default useProvinces;