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;