import type { Route } from './+types' import { PlusCircleIcon, PlusIcon } from 'lucide-react' import { DateTime } from 'luxon' import { MeiliSearchFilterBuilder } from 'meilisearch-helper' import { Suspense, useState } from 'react' import { Await, Link, useSearchParams } from 'react-router' import { CustomizeColumns, DataTable } from '@/components/data-table' import { RangeCalendarFilter } from '@/components/range-calendar-filter' import { createSearch } from '@/lib/meili' import { FacetedFilter } from '@repo/ui/components/faceted-filter' import { SearchForm } from '@repo/ui/components/search-form' import { Skeleton } from '@repo/ui/components/skeleton' import { Button } from '@repo/ui/components/ui/button' import { Kbd } from '@repo/ui/components/ui/kbd' import { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger, SelectValue } from '@repo/ui/components/ui/select' import { columns, statuses, type Enrollment } from './columns' export function meta({}: Route.MetaArgs) { return [{ title: 'Matrículas' }] } const dtOptions = { zone: 'America/Sao_Paulo' } export async function loader({ params, context, request }: Route.LoaderArgs) { const { searchParams } = new URL(request.url) const { orgid } = params const query = searchParams.get('q') || '' const field = searchParams.get('field') || '' const from = searchParams.get('from') || '' const to = searchParams.get('to') || '' const status = searchParams.getAll('status') || [] const page = Number(searchParams.get('p')) + 1 const hitsPerPage = Number(searchParams.get('perPage')) || 25 let builder = new MeiliSearchFilterBuilder().where('org_id', '=', orgid) if (status.length) { builder = builder.where('status', 'in', status) } if (field && from && to) { builder = builder.where(field, 'between', [from, to]) } return { data: createSearch({ index: 'betaeducacao-prod-enrollments', sort: ['created_at:desc'], filter: builder.build(), query, page, hitsPerPage, env: context.cloudflare.env }) } } const formatted = new Intl.DateTimeFormat('en-CA', { year: 'numeric', month: '2-digit', day: '2-digit' }) export default function Route({ loaderData: { data } }) { const [searchParams, setSearchParams] = useSearchParams() const [from, to] = [searchParams.get('from'), searchParams.get('to')] const [rangeField, setRangeField] = useState( searchParams.get('field') || 'created_at' ) return ( }>

Gerenciar matrículas

Matricule colaboradores de forma rápida e acompanhe seu progresso.

{({ hits, page, hitsPerPage, totalHits }) => { return (
Pressione / para pesquisar... } onChange={(value) => setSearchParams((searchParams) => { searchParams.set('q', String(value)) searchParams.delete('p') return searchParams }) } />
{ setSearchParams((searchParams) => { searchParams.delete('status') searchParams.delete('p') if (statuses.length) { statuses.forEach((s) => searchParams.has('status', s) ? null : searchParams.append('status', s) ) } return searchParams }) }} title="Status" options={Object.entries(statuses).map(([key, value]) => ({ value: key, ...value }))} /> { setSearchParams((searchParams) => { if (dateRange) { searchParams.set('field', rangeField) searchParams.set( 'from', formatted.format(dateRange.from) ) searchParams.set( 'to', formatted.format(dateRange.to) ) } else { searchParams.delete('from') searchParams.delete('to') searchParams.delete('field') } return searchParams }) }} >
) }}
) }