Filters
First Name | Last Name | Age | Visits | Status | Profile Progress |
---|
Show
10
import {useState} from "react"import {QButton,QCheckbox,QPagination,QProgressCircle,QTextInput,useDebounce,} from "@qui/react"import {Column,ColumnDef,flexRender,getCoreRowModel,getFilteredRowModel,getPaginationRowModel,QTable,QTbody,QTd,QTh,QThead,QTr,Table,useReactTable,useTablePagination,} from "@qui/react-table"import {Person, usePersonData} from "~utils/data"const columns: ColumnDef<Person>[] = [{cell: ({row}) => {const indeterminate = row.getIsSomeSelected()const checked = row.getIsSelected() && !indeterminatereturn (<div><QCheckboxchecked={checked}indeterminate={indeterminate}onChange={row.getToggleSelectedHandler()}/></div>)},header: ({table}) => (<QCheckboxchecked={table.getIsAllRowsSelected()}indeterminate={table.getIsSomeRowsSelected()}onChange={table.getToggleAllRowsSelectedHandler()}/>),id: "select",},{accessorKey: "firstName",cell: (info) => info.getValue(),header: "First Name",},{accessorFn: (row) => row.lastName,cell: (info) => info.getValue(),header: "Last Name",id: "lastName",},{accessorKey: "age",header: "Age",},{accessorKey: "visits",header: "Visits",},{accessorKey: "status",header: "Status",},{accessorKey: "progress",header: "Profile Progress",},]export default function Filters() {const {data = [], isFetching, refetch} = usePersonData(100000)const [rowSelection, setRowSelection] = useState({})const [globalFilter, setGlobalFilter] = useState("")const refreshData = () => refetch()// Debounce the global filter for better performance. Registering on every// keystroke causes lag for the first few keys, as fewer characters can match the// majority of the table's data.const debouncedGlobalFilter = useDebounce(globalFilter, 150)const table = useReactTable({columns,data,getCoreRowModel: getCoreRowModel(),getFilteredRowModel: getFilteredRowModel(),getPaginationRowModel: getPaginationRowModel(),onRowSelectionChange: setRowSelection,state: {globalFilter: debouncedGlobalFilter,rowSelection,},})const paginationProps = useTablePagination(table)return (<div className="overflow-x-auto p-2"><div className="flex items-center gap-3"><QTextInputonChange={(e, value) => setGlobalFilter(value)}placeholder="Search all columns..."value={globalFilter}/><QButton onClick={refreshData} variant="outline">Refresh Data</QButton>{isFetching ? <QProgressCircle size="xs" /> : null}</div><div className="mt-4 overflow-x-auto"><QTable><QThead>{table.getHeaderGroups().map((headerGroup) => (<QTr key={headerGroup.id}>{headerGroup.headers.map((header) => {return (<QTh key={header.id} colSpan={header.colSpan}>{header.isPlaceholder ? null : (<div className="inline-flex flex-col gap-1"><div className="inline-flex min-h-[28px] items-center justify-center">{flexRender(header.column.columnDef.header,header.getContext(),)}</div>{header.column.getCanFilter() ? (<Filter column={header.column} table={table} />) : null}</div>)}</QTh>)})}</QTr>))}</QThead><QTbody>{table.getRowModel().rows.map((row) => {return (<QTr key={row.id}>{row.getVisibleCells().map((cell) => {return (<QTd key={cell.id}>{flexRender(cell.column.columnDef.cell,cell.getContext(),)}</QTd>)})}</QTr>)})}</QTbody></QTable></div><div className="mt-4"><QPagination{...paginationProps}renderPageMeta={(context) =>`${context.currentPage} of ${context.totalPages}`}rowsPerPageLabel="Show"rowsPerPageOptions={[10, 20, 50]}/></div><div className="mt-4"><QButtononClick={() =>console.info("table.getSelectedRowModel().flatRows",table.getSelectedRowModel().flatRows,)}variant="outline">Log table.getSelectedRowModel().flatRows</QButton></div></div>)}function Filter({column,table,}: {column: Column<Person>table: Table<Person>}) {const firstValue = table.getPreFilteredRowModel().flatRows[0]?.getValue(column.id)const columnFilterValue = column.getFilterValue()return typeof firstValue === "number" ? (<div className="flex gap-2"><QTextInputclassName="w-24"inputProps={{min: 0, type: "number"}}onChange={(e, value) =>column.setFilterValue((old: [number, number]) => [value, old?.[1]])}placeholder="Min"size="s"value={(columnFilterValue as [number, number])?.[0] ?? ""}/><QTextInputclassName="w-24"inputProps={{min: 0, type: "number"}}onChange={(e, value) =>column.setFilterValue((old: [number, number]) => [old?.[0], value])}placeholder="Max"size="s"value={(columnFilterValue as [number, number])?.[1] ?? ""}/></div>) : (<QTextInputclassName="w-36"onChange={(e, value) => column.setFilterValue(value)}placeholder="Search..."size="s"value={(columnFilterValue ?? "") as string}/>)}