import type { JSX } from "react" import Link from "next/link" import { PlusCircle, BarChart3, ClipboardList } from "lucide-react" import { getTranslations } from "next-intl/server" import { Button } from "@/shared/components/ui/button" import { EmptyState } from "@/shared/components/ui/empty-state" import { ListPagination, computePagination, paginate } from "@/shared/components/ui/list-pagination" import { getAuthContext } from "@/shared/lib/auth-guard" import { getParam, type SearchParams } from "@/shared/lib/search-params" import { getTeacherClasses } from "@/modules/classes/data-access" import { getAttendanceRecords } from "@/modules/attendance/data-access" import { AttendanceFilters } from "@/modules/attendance/components/attendance-filters" import { AttendanceRecordList } from "@/modules/attendance/components/attendance-record-list" import { AttendancePageLayout } from "@/modules/attendance/components/attendance-page-layout" import type { AttendanceStatus } from "@/modules/attendance/types" export const dynamic = "force-dynamic" const VALID_STATUSES: ReadonlySet = new Set([ "present", "absent", "late", "early_leave", "excused", ]) function parseAttendanceStatus(v?: string): AttendanceStatus | undefined { return v && VALID_STATUSES.has(v) ? (v as AttendanceStatus) : undefined } const PAGE_SIZE = 20 export default async function TeacherAttendancePage({ searchParams, }: { searchParams: Promise }): Promise { const sp = await searchParams const ctx = await getAuthContext() const t = await getTranslations("attendance") const classId = getParam(sp, "classId") const status = getParam(sp, "status") const date = getParam(sp, "date") const [classes, result] = await Promise.all([ getTeacherClasses(), getAttendanceRecords({ scope: ctx.dataScope, currentUserId: ctx.userId, classId: classId && classId !== "all" ? classId : undefined, status: status && status !== "all" ? parseAttendanceStatus(status) : undefined, date: date && date.length > 0 ? date : undefined, }), ]) const classOptions = classes.map((c) => ({ id: c.id, name: c.name })) // 分页计算 const { page } = computePagination(sp, PAGE_SIZE) const total = result.items.length const totalPages = Math.max(1, Math.ceil(total / PAGE_SIZE)) const currentPage = Math.min(page, totalPages) const pagedRecords = paginate(result.items, currentPage, PAGE_SIZE) const hasFilters = Boolean(classId || status || date) const header = (

{t("title.teacherRecords")}

{t("description.teacherRecords")}

) return ( } > {result.items.length === 0 && !hasFilters ? ( ) : (
{total > 0 ? ( ) : null}
)}
) }