import { useState } from 'react'; import { Dropdown, DropdownList, DropdownItem, MenuToggle, MenuToggleCheckbox, MenuToggleElement, PageSection, Pagination, Toolbar, ToolbarContent, ToolbarGroup, ToolbarItem, PaginationVariant } from '@patternfly/react-core'; import { Table, Thead, Tr, Th, Tbody, Td } from '@patternfly/react-table'; import { rows, columns, SampleDataRow } from '@patternfly/react-table/dist/esm/demos/sampleData'; import { DashboardWrapper } from '@patternfly/react-table/dist/esm/demos/DashboardWrapper'; export const TableBulkSelect: React.FunctionComponent = () => { const [isBulkSelectDropdownOpen, setIsBulkSelectDropdownOpen] = useState(false); const [bulkSelection, setBulkSelection] = useState(''); const [page, setPage] = useState(1); const [perPage, setPerPage] = useState(10); const [paginatedRows, setPaginatedRows] = useState(rows.slice(0, 10)); const [selectedRows, setSelectedRows] = useState([]); const handleSetPage = ( _evt: React.MouseEvent | React.KeyboardEvent | MouseEvent, newPage: number, _perPage: number, startIdx: number, endIdx: number ) => { setPaginatedRows(rows?.slice(startIdx, endIdx)); setPage(newPage); }; const handlePerPageSelect = ( _evt: React.MouseEvent | React.KeyboardEvent | MouseEvent, newPerPage: number, newPage: number, startIdx: number, endIdx: number ) => { setPaginatedRows(rows.slice(startIdx, endIdx)); setPage(newPage); setPerPage(newPerPage); }; const setRowSelected = (row: SampleDataRow, isSelecting: boolean) => setSelectedRows((prevSelected) => { const otherSelectedRows = prevSelected.filter((r) => r !== row.name); return isSelecting ? [...otherSelectedRows, row.name] : otherSelectedRows; }); const selectAllRows = (isSelecting: boolean) => setSelectedRows(isSelecting ? rows.map((r) => r.name) : []); const selectPageRows = (isSelecting: boolean) => setSelectedRows(isSelecting ? paginatedRows.map((r) => r.name) : []); const isRowSelected = (row: any) => selectedRows.includes(row.name); const buildPagination = (variant: 'bottom' | 'top' | PaginationVariant, isCompact: boolean) => ( ); const buildBulkSelectDropdown = () => { const numSelected = selectedRows.length; const allSelected = numSelected === rows.length; const anySelected = numSelected > 0; const someChecked = anySelected ? null : false; const isChecked = allSelected ? true : someChecked; const items = ( <> Select none (0 items) Select page ({perPage} items) Select all ({rows.length} items) ); return ( , value: string) => { if (value === 'all') { selectAllRows(bulkSelection !== 'all'); } else if (value === 'page') { selectPageRows(bulkSelection !== 'page'); } else { setSelectedRows([]); } setBulkSelection(value as string); }} isOpen={isBulkSelectDropdownOpen} onOpenChange={(isOpen: boolean) => setIsBulkSelectDropdownOpen(isOpen)} toggle={(toggleRef: React.Ref) => ( setIsBulkSelectDropdownOpen(!isBulkSelectDropdownOpen)} aria-label="Select cards" splitButtonItems={[ { anySelected ? setSelectedRows([]) : selectAllRows(bulkSelection !== 'all'); }} > {numSelected !== 0 && `${numSelected} selected`} ]} > )} > {items} ); }; const toolbar = ( {buildBulkSelectDropdown()} {buildPagination('top', false)} ); return ( {toolbar} {paginatedRows.map((row, rowIndex) => ( ))}
{columns[0]} {columns[1]} {columns[2]} {columns[3]}
, isSelecting: boolean) => setRowSelected(row, isSelecting), isSelected: isRowSelected(row) }} /> {row.name} {row.threads} {row.applications} {row.workspaces}
{buildPagination('bottom', true)}
); };