import FormContainer from "@/components/FormContainer"; import Pagination from "@/components/Pagination"; import Table from "@/components/Table"; import TableSearch from "@/components/TableSearch"; import { getSupabaseClient } from "@/lib/supabase"; import { ITEM_PER_PAGE } from "@/lib/settings"; import { Tables } from "@/types/supabase"; import Image from "next/image"; import { auth } from "@clerk/nextjs/server"; import GenerateTimetableForm from "@/components/forms/GenerateTimetableForm"; type TermList = Tables<"Term"> & { academicYear: Tables<"AcademicYear"> | null }; const TermListPage = async ({ searchParams, }: { searchParams: { [key: string]: string | undefined }; }) => { const { sessionClaims } = auth(); const role = (sessionClaims?.metadata as { role?: string })?.role; const teacherType = (sessionClaims?.metadata as { teacherType?: string })?.teacherType; const schoolId = (sessionClaims?.metadata as { schoolId?: string })?.schoolId; const canManageSchool = role === "admin" || (role === "teacher" && (teacherType === "INDEPENDENT" || teacherType === "AGENCY")); const columns = [ { header: "Term Name", accessor: "name" }, { header: "Academic Year", accessor: "academicYear", className: "hidden md:table-cell", }, { header: "Start Date", accessor: "startDate", className: "hidden md:table-cell", }, { header: "End Date", accessor: "endDate", className: "hidden md:table-cell", }, ...(canManageSchool ? [ { header: "Actions", accessor: "action", }, ] : []), ]; const renderRow = (item: TermList) => ( {item.name} {item.academicYear ? item.academicYear.name : "—"} {new Date(item.startDate).toLocaleDateString()} {new Date(item.endDate).toLocaleDateString()}
{canManageSchool && schoolId && ( )} {canManageSchool && ( <> )}
); const { page, ...queryParams } = searchParams; const p = page ? parseInt(page) : 1; const supabase = await getSupabaseClient(); let query = supabase .from("Term") .select("*, academicYear:AcademicYear(name)", { count: "exact" }); // ONLY show terms for the current school if (schoolId) { query = query.eq("schoolId", schoolId); } if (queryParams) { for (const [key, value] of Object.entries(queryParams)) { if (value !== undefined) { switch (key) { case "search": query = query.ilike("name", `%${value}%`); break; default: break; } } } } // PAGINATION query = query.range(ITEM_PER_PAGE * (p - 1), ITEM_PER_PAGE * p - 1); const { data: rawData, count, error } = await query; if (error) { console.error("Error fetching terms from Supabase:", error); } const data = (rawData || []) as unknown as TermList[]; return (
{/* TOP */}

School Terms

{role === "admin" && }
{/* LIST */} {/* PAGINATION */} ); }; export default TermListPage;