import Link from 'next/link'; import { ChevronLeft, ChevronRight, GraduationCap, Plus, Users, Calendar, } from 'lucide-react'; import { getTranslations } from 'next-intl/server'; import { createCourseManagementApi } from '@kit/course-management/api'; import { formatDate, formatCurrencyAmount } from '@kit/shared/dates'; import { getSupabaseServerClient } from '@kit/supabase/server-client'; import { Badge } from '@kit/ui/badge'; import { Button } from '@kit/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@kit/ui/card'; import { ListToolbar } from '@kit/ui/list-toolbar'; import { AccountNotFound } from '~/components/account-not-found'; import { CmsPageShell } from '~/components/cms-page-shell'; import { EmptyState } from '~/components/empty-state'; import { StatsCard } from '~/components/stats-card'; import { COURSE_STATUS_VARIANT, COURSE_STATUS_LABEL_KEYS, } from '~/lib/status-badges'; interface PageProps { params: Promise<{ account: string }>; searchParams: Promise>; } const PAGE_SIZE = 25; export default async function CoursesPage({ params, searchParams }: PageProps) { const { account } = await params; const search = await searchParams; const client = getSupabaseServerClient(); const t = await getTranslations('courses'); const { data: acct } = await client .from('accounts') .select('id') .eq('slug', account) .single(); if (!acct) return ; const api = createCourseManagementApi(client); const page = Number(search.page) || 1; const [courses, stats] = await Promise.all([ api.courses.list(acct.id, { search: search.q as string, status: search.status as string, page, pageSize: PAGE_SIZE, }), api.statistics.getQuickStats(acct.id), ]); const totalPages = Math.ceil(courses.total / PAGE_SIZE); return (
{/* Header */}

{t('pages.coursesDescription')}

{/* Stats */}
} /> } /> } /> } />
{/* Search & Filters */} {/* Table or Empty State */} {courses.data.length === 0 ? ( } title={t('list.noCourses')} description={t('list.createFirst')} actionLabel={t('nav.newCourse')} actionHref={`/home/${account}/courses/new`} /> ) : ( {t('list.title', { count: courses.total })}
{courses.data.map((course: Record) => ( ))}
{t('list.courseNumber')} {t('list.courseName')} {t('list.startDate')} {t('list.endDate')} {t('list.status')} {t('list.capacity')} {t('list.fee')}
{String(course.course_number ?? '—')} {String(course.name)} {formatDate(course.start_date as string)} {formatDate(course.end_date as string)} {t( COURSE_STATUS_LABEL_KEYS[String(course.status)] ?? String(course.status), )} {course.capacity != null ? String(course.capacity) : '—'} {course.fee != null ? formatCurrencyAmount(course.fee as number) : '—'}
{/* Pagination */} {totalPages > 1 && (

{t('common.page')} {page} {t('common.of')} {totalPages} ( {courses.total} {t('common.entries')})

{page > 1 ? ( ) : ( )} {page < totalPages ? ( ) : ( )}
)}
)}
); }