first commit

This commit is contained in:
2026-03-26 08:11:29 +03:30
parent f9e3d66a19
commit b8f6526ba4
225 changed files with 18865 additions and 151 deletions

View File

@@ -0,0 +1,7 @@
export default function Loading() {
return (
<div className="flex items-center justify-center h-screen">
<div className="animate-spin w-8 h-8 border-4 border-neutral-800 border-t-transparent rounded-full"></div>
</div>
)
}

View File

@@ -0,0 +1,64 @@
"use client";
import UpdateDoctorForm from "@/components/forms/doctor/update/UpdateDoctorForm";
import Loader from "@/components/Loader";
import SectionTitle from "@/components/SectionTitle";
import { useGetAllExpertiseList } from "@/hooks/expertise";
import { useGetLanguages } from "@/hooks/languages";
import {useGetSingleUser, useUpdateUser} from "@/hooks/users";
import Link from "next/link";
import {useParams, useRouter} from "next/navigation";
import {Suspense, useState} from "react";
export default function Page() {
const params = useParams();
const id = params?.id;
const router = useRouter();
const [loading] = useState(false);
const {
data: languages,
} = useGetLanguages();
const {
data: expertises,
} = useGetAllExpertiseList();
const {
data: singleUser,
} = useGetSingleUser(id?.toString() ?? "");
const {mutateAsync} = useUpdateUser();
const {data} = singleUser || {};
return (
<div>
<div className="flex items-center justify-between mb-10">
<SectionTitle label="فرم ویرایش عضو دپارتمان " />
<div className="flex items-center justify-center gap-x-4">
<Link
href={`/department/members/new`}
className="text-sm bg-[#313131] px-4 py-2 rounded-lg text-white"
>
افزودن عضو جدید
</Link>
<Link
href={`/department/members`}
className="text-sm bg-primary px-4 py-2 rounded-lg text-white"
>
مشاهده لیست اعضاء دپارتمان
</Link>
</div>
</div>
<Suspense fallback={<Loader />}>
{data && expertises && languages && !loading && (
<UpdateDoctorForm
expertises={expertises?.data}
router={router}
languages={languages?.data}
preValues={data}
id={id?.toString() ??""}
updateFn={mutateAsync}
/>
)}
</Suspense>
</div>
);
}

View File

@@ -0,0 +1,7 @@
"use client"
import { notFound } from 'next/navigation'
export default function Page() {
return notFound
}

View File

@@ -0,0 +1,103 @@
"use client";
import DenyAccess from "@/components/DenyAccess";
import CreateDepartmentMember from "@/components/forms/department/new/CreateDepartmentMember";
import Loader from "@/components/Loader";
import SectionTitle from "@/components/SectionTitle";
import {API_URL} from "@/constants";
import {Expertise, Language} from "@/types";
import Link from "next/link";
import {useRouter} from "next/navigation";
import {Suspense, useEffect, useState} from "react";
async function fetchLanguages() {
const res = await fetch(`${API_URL}/language/get/all`,{cache:"no-cache"});
if (!res.ok && res.status==500) {
throw new Error("Failed to get data");
}
if(!res.ok && res.status==404){
return []
}
const data = await res.json();
return data;
}
async function fetchExpertise() {
const res = await fetch(`${API_URL}/expertise/fa/get/all/list`,{cache:"no-cache"});
if (!res.ok && res.status==500) {
throw new Error("Failed to get data");
}
if(!res.ok && res.status==404){
return []
}
const data = await res.json();
return data;
}
export default function Page() {
const router = useRouter();
const [loading, setLoading] = useState(false);
const [data, setData] = useState<Language[]>([]);
const [expertises, setExpertises] = useState<Expertise[]>([]);
useEffect(() => {
let active = true;
setLoading(true);
fetchExpertise()
.then((res) => {
if (!active) return;
setExpertises(res.data);
})
.catch(console.error)
.finally(() => active && setLoading(false));
return () => {
active = false;
};
}, []);
useEffect(() => {
let active = true;
setLoading(true);
fetchLanguages()
.then((res) => {
if (!active) return;
setData(res.data);
})
.catch(console.error)
.finally(() => active && setLoading(false));
return () => {
active = false;
};
}, []);
if (loading) {
return <Loader />;
}
return (
<div>
<div className="flex items-center justify-between mb-10">
<SectionTitle label="فرم افزودن عضو جدید" />
<Link href={`/department/members`} className="text-sm bg-primary px-4 py-2 rounded-lg text-white">مشاهده لیست اعضاء دپارتمان</Link>
</div>
<Suspense fallback={<Loader />}>
{data?.length > 0 ? expertises?.length > 0 ? <CreateDepartmentMember
expertises={expertises}
router={router}
languages={data}
/> : <DenyAccess label="تخصص" link="/expertise/new"/> : <DenyAccess label="زبان" link="/languages"/> }
</Suspense>
</div>
);
}

View File

@@ -0,0 +1,49 @@
import DepartmentMembersTable from "@/components/DepartmentMembersTable";
import Loader from "@/components/Loader";
import RoleGuard from "@/components/RoleGuard";
import SearchBox from "@/components/SearchBox";
import UsersTableExport from "@/components/usersTableExport";
import {Plus} from "lucide-react";
import Link from "next/link";
import React, {Suspense} from "react";
export default function Page() {
return (
<>
<section>
<div className="flex items-center justify-between">
<div className="flex items-center justify-start gap-x-8">
<SearchBox
inputName="search"
label="نام خانوادگی"
hasLabel
placeholder="جستجو نام خانوادگی اعضا ..."
route="department"
/>
</div>
<div className="flex items-center justify-end gap-x-7">
<RoleGuard roles={["ADMIN", "DEVELOPER"]}>
<Link
href={"/department/members/new"}
className="text-white bg-primary py-1.5 px-3 rounded-lg flex items-center gap-x-2 text-sm"
>
<Plus size={"20"} />
<span>افزودن عضو جدید</span>
</Link>
</RoleGuard>
<RoleGuard roles={["ADMIN","DEVELOPER"]}>
<UsersTableExport table="DEPARTMENT" />
</RoleGuard>
</div>
</div>
<div className="space-y-4 mt-10">
<Suspense fallback={<Loader />}>
<DepartmentMembersTable />
</Suspense>
</div>
</section>
</>
);
}