import { Fragment, useEffect, useState } from 'react'; import { Button, Content, Dropdown, DropdownList, Flex, FlexItem, MenuToggle, MenuToggleElement, PageSection, Pagination, SelectOption, SelectList, SelectGroup, Toolbar, ToolbarContent, ToolbarGroup, ToolbarItem, OverflowMenuDropdownItem, PaginationVariant, Label, Select, OverflowMenu, OverflowMenuContent, OverflowMenuControl, OverflowMenuGroup, OverflowMenuItem, PageSectionVariants } from '@patternfly/react-core'; import { Table, Thead, Tr, Th, Tbody, Td } from '@patternfly/react-table'; import CloneIcon from '@patternfly/react-icons/dist/esm/icons/clone-icon'; import EditIcon from '@patternfly/react-icons/dist/esm/icons/edit-icon'; import SyncIcon from '@patternfly/react-icons/dist/esm/icons/sync-icon'; import RhUiCodeIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-code-icon'; import RhMicronsSortDownLargeToSmallIcon from '@patternfly/react-icons/dist/esm/icons/rh-microns-sort-down-large-to-small-icon'; import RhUiBranchFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-branch-fill-icon'; import CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon'; import { DashboardWrapper } from '@patternfly/react-table/dist/esm/demos/DashboardWrapper'; import RhUiEllipsisVerticalFillIcon from '@patternfly/react-icons/dist/esm/icons/rh-ui-ellipsis-vertical-fill-icon'; import { rows, columns, SampleDataRow } from '@patternfly/react-table/dist/esm/demos/sampleData'; type Direction = 'asc' | 'desc' | undefined; export const TableSortableResponsive: React.FunctionComponent = () => { const [isKebabDropdownOpen, setIsKebabDropdownOpen] = useState(false); const sortRows = (rows: SampleDataRow[], sortIndex: number, sortDirection: Direction) => [...rows].sort((a, b) => { let returnValue = 0; if (typeof Object.values(a)[sortIndex] === 'number') { // numeric sort returnValue = Object.values(a)[sortIndex] - Object.values(b)[sortIndex]; } else { // string sort using natural sort returnValue = Object.values(a)[sortIndex].localeCompare(Object.values(b)[sortIndex], undefined, { numeric: true }); } if (sortDirection === 'desc') { return returnValue * -1; } return returnValue; }); const [sortedData, setSortedData] = useState([...sortRows(rows, 0, 'asc')]); const [sortedRows, setSortedRows] = useState([...sortedData]); const [page, setPage] = useState(1); const [perPage, setPerPage] = useState(10); // index of the currently active column const [activeSortIndex, setActiveSortIndex] = useState(0); // sort direction of the currently active column const [activeSortDirection, setActiveSortDirection] = useState('asc'); // sort dropdown expansion const [isSortDropdownOpen, setIsSortDropdownOpen] = useState(false); const onSort = (_event: any, index: number, direction: Direction) => { setActiveSortIndex(index); setActiveSortDirection(direction); setSortedData(sortRows(rows, index, direction)); }; const kebabDropdownItems = [Some action]; useEffect(() => { setSortedRows(sortedData.slice((page - 1) * perPage, page * perPage)); }, [sortedData, page, perPage]); const handleSetPage = (_evt: React.MouseEvent | React.KeyboardEvent | MouseEvent, newPage: number) => { setPage(newPage); }; const handlePerPageSelect = (_evt: React.MouseEvent | React.KeyboardEvent | MouseEvent, newPerPage: number) => { setPerPage(newPerPage); }; const renderPagination = (variant: 'top' | 'bottom' | PaginationVariant, isCompact: boolean) => ( ); const renderLabel = (labelText: string) => { switch (labelText) { case 'Running': return ; case 'Stopped': return ; case 'Needs Maintenance': return ; case 'Down': return ; } }; const tableToolbar = ( setIsKebabDropdownOpen(!isKebabDropdownOpen)} onOpenChange={(isKebabDropdownOpen: boolean) => setIsKebabDropdownOpen(isKebabDropdownOpen)} toggle={(toggleRef: React.Ref) => ( setIsKebabDropdownOpen(!isKebabDropdownOpen)} isExpanded={false} icon={} /> )} isOpen={isKebabDropdownOpen} > {kebabDropdownItems}