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;