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 Link from "next/link"; import { auth } from "@clerk/nextjs/server"; type SlotList = Tables<"SchoolTimetableSlot"> & { schoolTimetable: (Tables<"SchoolTimetable"> & { academicYear: Tables<"AcademicYear"> | null }) | null; }; const TimetableSlotListPage = 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: "Slot Name", accessor: "name", }, { header: "Timetable", accessor: "schoolTimetable", className: "hidden md:table-cell", }, { header: "Start Time", accessor: "startTime", className: "hidden md:table-cell", }, { header: "End Time", accessor: "endTime", className: "hidden md:table-cell", }, { header: "Teaching Slot", accessor: "isTeachingSlot", className: "hidden md:table-cell", }, ...(canManageSchool ? [ { header: "Actions", accessor: "action", }, ] : []), ]; const renderRow = (item: SlotList) => ( {item.name} {item.schoolTimetable ? `${item.schoolTimetable.name}${item.schoolTimetable.academicYear ? ` (${item.schoolTimetable.academicYear.name})` : ""}` : "—"} {item.startTime} {item.endTime} {item.isTeachingSlot ? "Yes" : "No"}
{canManageSchool && ( <> )}
); const { page, ...queryParams } = searchParams; const p = page ? parseInt(page) : 1; const supabase = await getSupabaseClient(); const schoolTimetableId = queryParams.schoolTimetableId ? parseInt(queryParams.schoolTimetableId) : undefined; let query = supabase .from("SchoolTimetableSlot") .select("*, schoolTimetable:SchoolTimetable(id, name, academicYear:AcademicYear(name))", { count: "exact" }) .order("position", { ascending: true }); if (schoolId) { query = query.eq("schoolId", schoolId); } if (schoolTimetableId && !Number.isNaN(schoolTimetableId)) { query = query.eq("schoolTimetableId", schoolTimetableId); } 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 timetable slots from Supabase:", error); } const data = (rawData || []) as unknown as SlotList[]; let filterTimetableName: string | null = null; if (schoolTimetableId && !Number.isNaN(schoolTimetableId)) { const { data: st } = await supabase .from("SchoolTimetable") .select("name, academicYear:AcademicYear(name)") .eq("id", schoolTimetableId) .single(); if (st) { const ay = (st as { academicYear?: { name: string } }).academicYear; filterTimetableName = ay ? `${st.name} (${ay.name})` : st.name; } } return (
{/* TOP */} {filterTimetableName && (
Showing slots for: {filterTimetableName} Show all slots
)}

Timetable Slots

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