import type { Route } from './+types' import { PlusCircleIcon, PlusIcon } from 'lucide-react' import { MeiliSearchFilterBuilder } from 'meilisearch-helper' import { Suspense, useState } from 'react' import { Await, Link, useSearchParams } from 'react-router' import { DataTable, DataTableViewOptions } 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, type Enrollment } from './columns' import { statuses } from './data' export function meta({}: Route.MetaArgs) { return [{ title: 'Matrículas' }] } export async function loader({ params, context, request }: Route.LoaderArgs) { const { searchParams } = new URL(request.url) const { orgid } = params const query = searchParams.get('q') || '' const from = searchParams.get('from') || '' const to = searchParams.get('to') || '' const sort = searchParams.get('sort') || 'created_at:desc' 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 (from && to) { const [field, from_] = from.split(':') builder = builder.where(field, 'between', [from_, to]) } return { data: createSearch({ index: 'betaeducacao-prod-enrollments', filter: builder.build(), sort: [sort], 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 [rangeField, setRangeField] = useState('created_at') const { rangeField, dateRange } = useRangeParams('created_at') return ( }>

Gerenciar matrículas

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

{({ hits, page, hitsPerPage, totalHits }) => { return (
Digite / 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( 'from', `${rangeField}:${formatted.format(dateRange.from)}` ) searchParams.set( 'to', formatted.format(dateRange.to) ) } else { searchParams.delete('from') searchParams.delete('to') } return searchParams }) }} >
) }}
) } function useRangeParams(initRangeField: string) { const [searchParams] = useSearchParams() const [from, to] = [searchParams.get('from'), searchParams.get('to')] if (!from || !to) { return { rangeField: initRangeField, dateRange: undefined } } const [rangeField, from_] = from.split(':') return { rangeField, dateRange: { from: new Date(from_), to: new Date(to) } } }