import type { JSX } from "react" import { Suspense } from "react" import { User } from "lucide-react" import { requirePermission } from "@/shared/lib/auth-guard" import { Permissions } from "@/shared/types/permissions" import { getClassStudents, getTeacherClasses, getStudentsSubjectScores } from "@/modules/classes/data-access" import { StudentsFilters } from "@/modules/classes/components/students-filters" import { StudentsTable } from "@/modules/classes/components/students-table" import { EmptyState } from "@/shared/components/ui/empty-state" import { Skeleton } from "@/shared/components/ui/skeleton" import { getParam, type SearchParams } from "@/shared/lib/search-params" export const dynamic = "force-dynamic" async function StudentsResults({ searchParams, defaultClassId }: { searchParams: Promise, defaultClassId?: string }): Promise { const params = await searchParams const q = getParam(params, "q") || undefined const classId = getParam(params, "classId") const status = getParam(params, "status") // If classId is explicit in URL, use it (unless "all"). If not, use defaultClassId. // If user explicitly selects "all", classId will be "all". // However, the requirement is "Default to showing the first class". // If classId param is missing, we use defaultClassId. const targetClassId = classId ? (classId !== "all" ? classId : undefined) : defaultClassId const filteredStudents = await getClassStudents({ q, classId: targetClassId, status: status && status !== "all" ? status : undefined, }) // Fetch subject scores for all filtered students if (filteredStudents.length > 0) { const studentIds = filteredStudents.map(s => s.id) const scores = await getStudentsSubjectScores(studentIds) for (const student of filteredStudents) { student.subjectScores = scores.get(student.id) } } const hasFilters = Boolean(q || (classId && classId !== "all") || (status && status !== "all")) if (filteredStudents.length === 0) { return ( ) } return (
) } function StudentsResultsFallback() { return (
{Array.from({ length: 8 }).map((_, idx) => ( ))}
) } export default async function StudentsPage({ searchParams }: { searchParams: Promise }): Promise { await requirePermission(Permissions.CLASS_READ) const classes = await getTeacherClasses() // Logic to determine default class (first one available) const defaultClassId = classes.length > 0 ? classes[0].id : undefined return (
}> }>
) }