import { useState } from 'react' import { createFileRoute, useNavigate } from '@tanstack/react-router' import { useQuery } from '@tanstack/react-query' import { enrollmentListOptions } from '@/api/lessons' import { usePagination } from '@/hooks/use-pagination' import { DataTable, type Column } from '@/components/shared/data-table' import { Button } from '@/components/ui/button' import { Badge } from '@/components/ui/badge' import { Input } from '@/components/ui/input' import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select' import { Plus, Search } from 'lucide-react' import { useAuthStore } from '@/stores/auth.store' import type { Enrollment } from '@/types/lesson' export const Route = createFileRoute('/_authenticated/lessons/enrollments/')({ validateSearch: (search: Record) => ({ page: Number(search.page) || 1, limit: Number(search.limit) || 25, q: (search.q as string) || undefined, sort: (search.sort as string) || undefined, order: (search.order as 'asc' | 'desc') || 'desc', status: (search.status as string) || undefined, instructorId: (search.instructorId as string) || undefined, }), component: EnrollmentsListPage, }) const STATUS_LABELS: Record = { active: 'Active', paused: 'Paused', cancelled: 'Cancelled', completed: 'Completed', } function statusBadge(status: string) { const variants: Record = { active: 'default', paused: 'secondary', cancelled: 'destructive', completed: 'outline', } return {STATUS_LABELS[status] ?? status} } const columns: Column[] = [ { key: 'member_name', header: 'Member', sortable: true, render: (e) => {e.memberName ?? e.memberId} }, { key: 'instructor_name', header: 'Instructor', render: (e) => <>{e.instructorName ?? e.instructorId} }, { key: 'slot_info', header: 'Day / Time', render: (e) => <>{e.slotInfo ?? '—'} }, { key: 'status', header: 'Status', sortable: true, render: (e) => statusBadge(e.status) }, { key: 'start_date', header: 'Start', sortable: true, render: (e) => <>{new Date(e.startDate + 'T00:00:00').toLocaleDateString()} }, { key: 'rate', header: 'Rate', render: (e) => <>{e.rate ? `$${e.rate}${e.billingInterval ? ` / ${e.billingInterval} ${e.billingUnit}` : ''}` : } }, ] function EnrollmentsListPage() { const navigate = useNavigate() const hasPermission = useAuthStore((s) => s.hasPermission) const search = Route.useSearch() const { params, setPage, setSearch, setSort } = usePagination() const [searchInput, setSearchInput] = useState(params.q ?? '') const [statusFilter, setStatusFilter] = useState(search.status ?? '') const queryParams: Record = { ...params } if (statusFilter) queryParams.status = statusFilter const { data, isLoading } = useQuery(enrollmentListOptions(queryParams)) function handleSearchSubmit(e: React.FormEvent) { e.preventDefault() setSearch(searchInput) } function handleStatusChange(v: string) { const s = v === 'all' ? '' : v setStatusFilter(s) navigate({ to: '/lessons/enrollments', search: { ...search, status: s || undefined, page: 1 } }) } return (

Enrollments

{hasPermission('lessons.edit') && ( )}
setSearchInput(e.target.value)} className="pl-9 w-64" />
navigate({ to: '/lessons/enrollments/$enrollmentId', params: { enrollmentId: e.id }, search: { tab: 'details' } })} />
) }