diff --git a/apps/admin.saladeaula.digital/app/components/data-table/data-table.tsx b/apps/admin.saladeaula.digital/app/components/data-table/data-table.tsx index 2c2694d..0dfc850 100644 --- a/apps/admin.saladeaula.digital/app/components/data-table/data-table.tsx +++ b/apps/admin.saladeaula.digital/app/components/data-table/data-table.tsx @@ -6,6 +6,7 @@ import { useReactTable, type ColumnDef, type ColumnSort, + type RowSelectionState, type SortingState, type Table, type VisibilityState @@ -34,7 +35,7 @@ interface DataTableProps { children?: ReactNode columns: ColumnDef[] data: TData[] - onRowSelectionChange?: (rowSelection: TData[]) => void + setSelectedRows?: (selectedRows: TData[]) => void pageIndex: number sort: SortingState pageSize: number @@ -62,16 +63,17 @@ export function DataTable({ pageIndex, pageSize, rowCount, - onRowSelectionChange, + setSelectedRows, hiddenColumn = [] }: DataTableProps) { - const [searchParams, setSearchParams] = useSearchParams() - const hiddenColumn_ = Object.fromEntries( + const columnVisibilityInit = Object.fromEntries( hiddenColumn.map((column) => [column, false]) ) + + const [searchParams, setSearchParams] = useSearchParams() const [columnVisibility, setColumnVisibility] = - useState(hiddenColumn_) - const [rowSelection, setRowSelection] = useState({}) + useState(columnVisibilityInit) + const [rowSelection, setRowSelection] = useState({}) const sortParam = searchParams.get('sort') const sorting = sortParam ? sortParam.split(',').map((s) => { @@ -84,9 +86,7 @@ export function DataTable({ const newState = typeof updater === 'function' ? updater({ pageIndex, pageSize }) : updater - onRowSelectionChange?.([]) setRowSelection({}) - setSearchParams((searchParams) => { searchParams.set('p', newState?.pageIndex.toString()) searchParams.set('perPage', newState?.pageSize.toString()) @@ -135,8 +135,8 @@ export function DataTable({ useEffect(() => { const selected = table.getSelectedRowModel().flatRows.map((r) => r.original) - onRowSelectionChange?.(selected) - }, [rowSelection, table]) + setSelectedRows?.(selected) + }, [rowSelection]) return ( diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments._index/data.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments._index/data.tsx index 1e000a8..d345e15 100644 --- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments._index/data.tsx +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments._index/data.tsx @@ -52,3 +52,18 @@ export const sortings: Record = { failed_at: 'Reprovado em', canceled_at: 'Cancelado em' } + +export const headers = { + id: 'ID', + 'user.name': 'Nome', + 'user.email': 'Email', + 'user.cpf': 'CPF', + 'course.name': 'Curso', + status: 'Status', + progress: 'Progresso', + created_at: 'Cadastrado em', + started_at: 'Iniciado em', + completed_at: 'Concluído em', + failed_at: 'Reprovado em', + canceled_at: 'Cancelado em' +} diff --git a/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments._index/route.tsx b/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments._index/route.tsx index 9bd676b..5cef01a 100644 --- a/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments._index/route.tsx +++ b/apps/admin.saladeaula.digital/app/routes/_.$orgid.enrollments._index/route.tsx @@ -34,7 +34,7 @@ import { } from '@repo/ui/components/ui/dropdown-menu' import { Kbd } from '@repo/ui/components/ui/kbd' import { columns, type Enrollment } from './columns' -import { sortings, statuses } from './data' +import { headers, sortings, statuses } from './data' export function meta({}: Route.MetaArgs) { return [{ title: 'Matrículas' }] @@ -83,7 +83,7 @@ const formatted = new Intl.DateTimeFormat('en-CA', { export default function Route({ loaderData: { data } }) { const [searchParams, setSearchParams] = useSearchParams() - const [rowSelection, setRowSelection] = useState([]) + const [selectedRows, setSelectedRows] = useState([]) const status = searchParams.get('status') const rangeParams = useRangeParams() @@ -99,133 +99,134 @@ export default function Route({ loaderData: { data } }) { - {({ hits, page, hitsPerPage, totalHits }) => { - return ( - -
- {rowSelection.length ? ( - <> -
- - -
- - ) : ( - <> -
- - Digite /{' '} - para pesquisar - - } - onChange={(value) => + {({ hits, page, hitsPerPage, totalHits }) => ( + +
+ {selectedRows.length ? ( + <> +
+ + +
+ + ) : ( + <> +
+ + Digite / para + pesquisar + + } + onChange={(value) => + setSearchParams((searchParams) => { + searchParams.set('q', String(value)) + searchParams.delete('p') + return searchParams + }) + } + /> +
+ +
+
+ { setSearchParams((searchParams) => { - searchParams.set('q', String(value)) + searchParams.delete('status') searchParams.delete('p') + + if (statuses.length) { + searchParams.set('status', statuses.join(',')) + } + return searchParams }) - } + }} + options={Object.entries(statuses).map( + ([key, value]) => ({ + value: key, + ...value + }) + )} + /> + + ({ + value, + label + }) + )} + onChange={(props) => { + setSearchParams((searchParams) => { + if (!props) { + searchParams.delete('from') + searchParams.delete('to') + return searchParams + } + + const { rangeField, dateRange } = props + + searchParams.set( + 'from', + `${rangeField}:${formatted.format(dateRange?.from)}` + ) + searchParams.set( + 'to', + formatted.format(dateRange?.to) + ) + + return searchParams + }) + }} />
-
-
- { - setSearchParams((searchParams) => { - searchParams.delete('status') - searchParams.delete('p') +
+ - if (statuses.length) { - searchParams.set('status', statuses.join(',')) - } - - return searchParams - }) - }} - options={Object.entries(statuses).map( - ([key, value]) => ({ - value: key, - ...value - }) - )} - /> - - ({ - value, - label - }) - )} - onChange={(props) => { - setSearchParams((searchParams) => { - if (!props) { - searchParams.delete('from') - searchParams.delete('to') - return searchParams - } - - const { rangeField, dateRange } = props - - searchParams.set( - 'from', - `${rangeField}:${formatted.format(dateRange?.from)}` - ) - searchParams.set( - 'to', - formatted.format(dateRange?.to) - ) - - return searchParams - }) - }} - /> -
- -
- - - -
+
- - )} -
- - ) - }} +
+ + )} +
+
+ )} ) @@ -251,32 +252,19 @@ function useRangeParams() { } export function DropdownMenuExport({ - rowSelection = [] + headers, + selectedRows = [] }: { - rowSelection: object[] + headers: Record + selectedRows: object[] }) { - const headers = { - id: 'ID', - 'user.name': 'Nome', - 'user.email': 'Email', - 'user.cpf': 'CPF', - 'course.name': 'Curso', - status: 'Status', - progress: 'Progresso', - created_at: 'Cadastrado em', - started_at: 'Iniciado em', - completed_at: 'Concluído em', - failed_at: 'Reprovado em', - canceled_at: 'Cancelado em' - } - const handleExport = (bookType: BookType) => () => { - if (!rowSelection.length) { + if (!selectedRows.length) { return } const header = Object.keys(headers) - const data = rowSelection.map((data) => { + const data = selectedRows.map((data) => { const obj: Record = flatten(data) return Object.fromEntries(header.map((k) => [k, obj?.[k]])) })