first commit
This commit is contained in:
7
src/app/(dashboard)/department/loading.tsx
Normal file
7
src/app/(dashboard)/department/loading.tsx
Normal 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>
|
||||
)
|
||||
}
|
||||
64
src/app/(dashboard)/department/members/edit/[id]/page.tsx
Normal file
64
src/app/(dashboard)/department/members/edit/[id]/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
7
src/app/(dashboard)/department/members/edit/page.tsx
Normal file
7
src/app/(dashboard)/department/members/edit/page.tsx
Normal file
@@ -0,0 +1,7 @@
|
||||
|
||||
"use client"
|
||||
import { notFound } from 'next/navigation'
|
||||
|
||||
export default function Page() {
|
||||
return notFound
|
||||
}
|
||||
103
src/app/(dashboard)/department/members/new/page.tsx
Normal file
103
src/app/(dashboard)/department/members/new/page.tsx
Normal 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>
|
||||
);
|
||||
}
|
||||
49
src/app/(dashboard)/department/members/page.tsx
Normal file
49
src/app/(dashboard)/department/members/page.tsx
Normal 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>
|
||||
</>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user