From d7d4848f2a2fec4161a3814571eaf6a44d7f8fb7 Mon Sep 17 00:00:00 2001 From: wixarm Date: Mon, 23 Feb 2026 16:33:34 +0330 Subject: [PATCH] feat: domains management --- src/Pages/Domains.tsx | 84 ++++++++++++ src/Pages/LiveStock/Users.tsx | 2 +- src/Pages/Management.tsx | 6 +- src/partials/{Access => Admin}/Access.tsx | 0 src/partials/{Access => Admin}/AddAccess.tsx | 0 src/partials/Admin/AddDomain.tsx | 125 ++++++++++++++++++ src/partials/{Access => Admin}/AddPage.tsx | 0 src/partials/{Access => Admin}/EditAccess.tsx | 0 src/partials/{Access => Admin}/Pages.tsx | 0 .../{Access => Admin}/UnusedAccess.tsx | 0 src/routes/paths.ts | 1 + src/utils/getCategoryParameters.ts | 6 + src/utils/getFaPermissions.ts | 3 + 13 files changed, 223 insertions(+), 4 deletions(-) create mode 100644 src/Pages/Domains.tsx rename src/partials/{Access => Admin}/Access.tsx (100%) rename src/partials/{Access => Admin}/AddAccess.tsx (100%) create mode 100644 src/partials/Admin/AddDomain.tsx rename src/partials/{Access => Admin}/AddPage.tsx (100%) rename src/partials/{Access => Admin}/EditAccess.tsx (100%) rename src/partials/{Access => Admin}/Pages.tsx (100%) rename src/partials/{Access => Admin}/UnusedAccess.tsx (100%) diff --git a/src/Pages/Domains.tsx b/src/Pages/Domains.tsx new file mode 100644 index 0000000..05de24a --- /dev/null +++ b/src/Pages/Domains.tsx @@ -0,0 +1,84 @@ +import { useEffect, useState } from "react"; +import { useApiRequest } from "../utils/useApiRequest"; +import { useModalStore } from "../context/zustand-store/appStore"; +import Table from "../components/Table/Table"; +import { Grid } from "../components/Grid/Grid"; +import Button from "../components/Button/Button"; +import { AddDomain } from "../partials/Admin/AddDomain"; +import { Popover } from "../components/PopOver/PopOver"; +import { Tooltip } from "../components/Tooltip/Tooltip"; +import { DeleteButtonForPopOver } from "../components/PopOverButtons/PopOverButtons"; + +export default function Domains() { + const { openModal } = useModalStore(); + const [domainsInfo, setDomainsInfo] = useState({ page: 1, page_size: 10 }); + const [domainsTableData, setDomainsTableData] = useState([]); + + const { data: domainsData, refetch } = useApiRequest({ + api: "/core/domain/", + method: "get", + params: domainsInfo, + queryKey: ["domains", domainsInfo], + }); + + useEffect(() => { + if (domainsData?.results) { + const formattedData = domainsData.results.map((item: any, i: number) => { + return [ + domainsInfo.page === 1 + ? i + 1 + : i + domainsInfo.page_size * (domainsInfo.page - 1) + 1, + item?.fa_name, + item?.code, + item?.name, + + + + + + + ); +} diff --git a/src/Pages/LiveStock/Users.tsx b/src/Pages/LiveStock/Users.tsx index 6e01982..6451e99 100644 --- a/src/Pages/LiveStock/Users.tsx +++ b/src/Pages/LiveStock/Users.tsx @@ -11,7 +11,7 @@ import { useDrawerStore, useModalStore, } from "../../context/zustand-store/appStore"; -import { EditAccess } from "../../partials/Access/EditAccess"; +import { EditAccess } from "../../partials/Admin/EditAccess"; import { AddUser } from "../../partials/LiveStock/management/AddUser"; import ShowStringList from "../../components/ShowStringList/ShowStringList"; import ShowMoreInfo from "../../components/ShowMoreInfo/ShowMoreInfo"; diff --git a/src/Pages/Management.tsx b/src/Pages/Management.tsx index c03fe25..6b00488 100644 --- a/src/Pages/Management.tsx +++ b/src/Pages/Management.tsx @@ -1,9 +1,9 @@ import { useState } from "react"; import { Grid } from "../components/Grid/Grid"; import Tabs from "../components/Tab/Tab"; -import Pages from "../partials/Access/Pages"; -import Access from "../partials/Access/Access"; -import UnusedAccess from "../partials/Access/UnusedAccess"; +import Pages from "../partials/Admin/Pages"; +import Access from "../partials/Admin/Access"; +import UnusedAccess from "../partials/Admin/UnusedAccess"; const tabItems = [ { label: "صفحات" }, diff --git a/src/partials/Access/Access.tsx b/src/partials/Admin/Access.tsx similarity index 100% rename from src/partials/Access/Access.tsx rename to src/partials/Admin/Access.tsx diff --git a/src/partials/Access/AddAccess.tsx b/src/partials/Admin/AddAccess.tsx similarity index 100% rename from src/partials/Access/AddAccess.tsx rename to src/partials/Admin/AddAccess.tsx diff --git a/src/partials/Admin/AddDomain.tsx b/src/partials/Admin/AddDomain.tsx new file mode 100644 index 0000000..34141f6 --- /dev/null +++ b/src/partials/Admin/AddDomain.tsx @@ -0,0 +1,125 @@ +import { zodResolver } from "@hookform/resolvers/zod"; +import Button from "../../components/Button/Button"; +import { Grid } from "../../components/Grid/Grid"; +import Textfield from "../../components/Textfeild/Textfeild"; +import { useForm, Controller } from "react-hook-form"; +import { + zValidateString, + zValidateEnglishString, +} from "../../data/getFormTypeErrors"; +import { z } from "zod"; +import { useApiMutation } from "../../utils/useApiRequest"; +import { useToast } from "../../hooks/useToast"; +import { useModalStore } from "../../context/zustand-store/appStore"; +import { getToastResponse } from "../../data/getToastResponse"; + +const schema = z.object({ + code: zValidateString("کد حوزه"), + name: zValidateEnglishString("نام انگلیسی حوزه"), + fa_name: zValidateString("نام حوزه"), +}); + +type AddDomainProps = { + getData: () => void; + item?: any; +}; + +type FormValues = z.infer; + +export const AddDomain = ({ getData, item }: AddDomainProps) => { + const showToast = useToast(); + const { closeModal } = useModalStore(); + + const { + control, + handleSubmit, + formState: { errors }, + } = useForm({ + resolver: zodResolver(schema), + defaultValues: { + code: item?.code || "", + name: item?.name || "", + fa_name: item?.fa_name || "", + }, + }); + + const mutation = useApiMutation({ + api: `/core/domain/${item ? item?.id + "/" : ""}`, + method: item ? "put" : "post", + }); + + const onSubmit = async (data: FormValues) => { + try { + await mutation.mutateAsync({ + code: data.code, + name: data.name, + fa_name: data.fa_name, + }); + showToast(getToastResponse(item, "حوزه"), "success"); + closeModal(); + getData(); + } catch (error: any) { + if (error?.status === 403) { + showToast( + error?.response?.data?.message || "این مورد تکراری است!", + "error", + ); + } else { + showToast( + error?.response?.data?.message || "خطا در ثبت اطلاعات!", + "error", + ); + } + } + }; + + return ( +
+ + ( + + )} + /> + ( + + )} + /> + ( + + )} + /> + + + + ); +}; diff --git a/src/partials/Access/AddPage.tsx b/src/partials/Admin/AddPage.tsx similarity index 100% rename from src/partials/Access/AddPage.tsx rename to src/partials/Admin/AddPage.tsx diff --git a/src/partials/Access/EditAccess.tsx b/src/partials/Admin/EditAccess.tsx similarity index 100% rename from src/partials/Access/EditAccess.tsx rename to src/partials/Admin/EditAccess.tsx diff --git a/src/partials/Access/Pages.tsx b/src/partials/Admin/Pages.tsx similarity index 100% rename from src/partials/Access/Pages.tsx rename to src/partials/Admin/Pages.tsx diff --git a/src/partials/Access/UnusedAccess.tsx b/src/partials/Admin/UnusedAccess.tsx similarity index 100% rename from src/partials/Access/UnusedAccess.tsx rename to src/partials/Admin/UnusedAccess.tsx diff --git a/src/routes/paths.ts b/src/routes/paths.ts index 2310570..ad040c1 100644 --- a/src/routes/paths.ts +++ b/src/routes/paths.ts @@ -6,6 +6,7 @@ export const MENU = "/menu"; export const TRAINING = "/training"; //Admin Routes +export const DOMAINS = "/domains"; export const PERMISSION_ACCESS = "/permission-access"; //Management diff --git a/src/utils/getCategoryParameters.ts b/src/utils/getCategoryParameters.ts index 7d30b4b..11960dd 100644 --- a/src/utils/getCategoryParameters.ts +++ b/src/utils/getCategoryParameters.ts @@ -26,8 +26,14 @@ import Tagging from "../Pages/LiveStock/Tagging"; import TagDistribtution from "../Pages/LiveStock/TagDistribution"; import TagDistribtutionDetails from "../Pages/LiveStock/TagDistributionDetails"; import Tags from "../partials/LiveStock/tagging/Tags"; +import Domains from "../Pages/Domains"; export const adminCategoryItems = [ + { + name: "domains", + path: R.DOMAINS, + component: Domains, + }, { name: "permission_control", path: R.PERMISSION_ACCESS, diff --git a/src/utils/getFaPermissions.ts b/src/utils/getFaPermissions.ts index 802ee85..7a9ffef 100644 --- a/src/utils/getFaPermissions.ts +++ b/src/utils/getFaPermissions.ts @@ -4,6 +4,9 @@ export function getFaPermissions(permission: string) { case "permission_control": faPermission = "مدیریت دسترسی"; break; + case "domains": + faPermission = "مدیریت حوزه ها"; + break; case "users": faPermission = "کاربران"; break;