import { Fragment, useState } from 'react'; import { Badge, Button, Bullseye, EmptyState, EmptyStateActions, EmptyStateBody, EmptyStateFooter, Label, MenuToggle, MenuToggleElement, Toolbar, ToolbarItem, ToolbarContent, ToolbarFilter, ToolbarToggleGroup, ToolbarGroup, Select, SelectOption, SearchInput, ToolbarLabelGroup } from '@patternfly/react-core'; import SearchIcon from '@patternfly/react-icons/dist/esm/icons/search-icon'; import FilterIcon from '@patternfly/react-icons/dist/esm/icons/filter-icon'; import { Table, TableText, Thead, Tr, Th, Tbody, Td } from '@patternfly/react-table'; import { rows, columns } from '@patternfly/react-table/dist/esm/demos/sampleData'; export const TableFilterable: React.FunctionComponent = () => { const [filters, setFilters] = useState>({ location: [], name: [], status: [] }); const [currentCategory, setCurrentCategory] = useState('Status'); const [isFilterDropdownOpen, setIsFilterDropdownOpen] = useState(false); const [isCategoryDropdownOpen, setIsCategoryDropdownOpen] = useState(false); const [inputValue, setInputValue] = useState(''); const rowData = rows.slice(0, 10); const onDelete = (type: string | ToolbarLabelGroup, id: string) => { if (type === 'Location') { setFilters({ ...filters, location: filters.location.filter((fil: string) => fil !== id) }); } else if (type === 'Name') { setFilters({ ...filters, name: filters.name.filter((fil: string) => fil !== id) }); } else if (type === 'Status') { setFilters({ ...filters, status: filters.status.filter((fil: string) => fil !== id) }); } else { setFilters({ location: [], name: [], status: [] }); } }; const onCategoryToggle = () => { setIsCategoryDropdownOpen(!isCategoryDropdownOpen); }; const onCategorySelect = (event: React.MouseEvent, value: string) => { setCurrentCategory(value); setIsCategoryDropdownOpen(false); }; const onFilterToggle = () => { setIsFilterDropdownOpen(!isFilterDropdownOpen); }; const onFilterSelect = () => { setIsFilterDropdownOpen(!isFilterDropdownOpen); }; const onInputChange = (newValue: string) => { setInputValue(newValue); }; const onStatusSelect = (event: React.MouseEvent, selection: string) => { const checked = (event.target as HTMLInputElement).checked; setFilters({ ...filters, status: checked ? [...filters.status, selection] : filters.status.filter((value) => value !== selection) }); setIsFilterDropdownOpen(false); }; const onNameInput = (event: React.KeyboardEvent) => { if (event.key && event.key !== 'Enter') { return; } const prevFilters = filters.name; setFilters({ ...filters, name: prevFilters.includes(inputValue) ? prevFilters : [...prevFilters, inputValue] }); }; const onLocationSelect = (event: React.MouseEvent, selection: string) => { setFilters({ ...filters, location: [selection] }); setIsFilterDropdownOpen(false); onFilterSelect(); }; const buildCategoryDropdown = () => { const categoryMenuItems = [ Location , Name , Status ]; return ( ); }; const buildFilterDropdown = () => { const locationMenuItems = [ Raleigh , San Francisco , Boston , Atlanta ]; const statusMenuItems = [ Running , Stopped , Down , Degraded , Needs maintenance ]; return ( onDelete(category, label as string)} categoryName="Location" showToolbarItem={currentCategory === 'Location'} > onDelete(category, label as string)} categoryName="Name" showToolbarItem={currentCategory === 'Name'} > onInputChange(value)} value={inputValue} onClear={() => { onInputChange(''); }} onSearch={onNameInput} /> onDelete(category, label as string)} categoryName="Status" showToolbarItem={currentCategory === 'Status'} > ); }; const renderToolbar = () => ( setFilters({ location: [], name: [], status: [] })} collapseListedFiltersBreakpoint="xl" > } breakpoint="xl"> {buildCategoryDropdown()} {buildFilterDropdown()} ); const filteredRows = filters.name.length > 0 || filters.location.length > 0 || filters.status.length > 0 ? rowData.filter( (row) => (filters.name.length === 0 || filters.name.some((name) => row.name.toLowerCase().includes(name.toLowerCase()))) && (filters.location.length === 0 || filters.location.includes(row.location)) && (filters.status.length === 0 || filters.status.includes(row.status)) ) : rowData; const emptyState = ( No results match the filter criteria. Clear all filters and try again. ); const renderLabel = (labelText: string) => { switch (labelText) { case 'Running': return ; case 'Stopped': return ; case 'Needs maintenance': return ; case 'Down': return ; } }; return ( {renderToolbar()} {filteredRows.slice(0, 10).map((row, rowIndex) => ( <> ))} {filteredRows.length === 0 && ( )}
{columns[0]} {columns[1]} {columns[2]} {columns[3]} {columns[4]} {columns[5]} {columns[6]} {columns[7]}
{row.name} {row.threads} {row.applications} {row.workspaces} {renderLabel(row.status)} {row.location} {row.lastModified} {row.url}
{emptyState}
); };