From 5702fb52cbdf805ff90c330d2244f08c3c55436f Mon Sep 17 00:00:00 2001 From: jenny-s51 Date: Thu, 28 Jul 2022 16:08:09 -0400 Subject: [PATCH] chore(table): implemented sortable demo with new data --- packages/react-table/src/docs/demos/Table.md | 406 +----------------- .../demos/table-demos/SortableResponsive.jsx | 326 ++++++++++++++ 2 files changed, 327 insertions(+), 405 deletions(-) create mode 100644 packages/react-table/src/docs/demos/table-demos/SortableResponsive.jsx diff --git a/packages/react-table/src/docs/demos/Table.md b/packages/react-table/src/docs/demos/Table.md index aa3afbf8413..36762b6d47d 100644 --- a/packages/react-table/src/docs/demos/Table.md +++ b/packages/react-table/src/docs/demos/Table.md @@ -2107,411 +2107,7 @@ class FilterTableDemo extends React.Component { ### Sortable - responsive -```js isFullscreen -import React from 'react'; -import { - Button, - Card, - Flex, - FlexItem, - InputGroup, - Toolbar, - ToolbarContent, - ToolbarGroup, - ToolbarItem, - ToolbarToggleGroup, - OptionsMenu, - OptionsMenuToggle, - Pagination, - Text, - TextContent, - Select, - SelectVariant, - SelectOption, - Nav, - NavList, - NavItem, - Dropdown, - DropdownItem, - DropdownGroup, - DropdownToggle, - Divider, - KebabToggle, - Avatar, - OptionsMenuItem, - OptionsMenuSeparator, - OptionsMenuItemGroup, - OverflowMenu, - OverflowMenuContent, - OverflowMenuControl, - OverflowMenuDropdownItem, - OverflowMenuGroup, - OverflowMenuItem, - PageSection -} from '@patternfly/react-core'; -import { ActionsColumn, TableComposable, Thead, Tr, Th, Tbody, Td } from '@patternfly/react-table'; - -import FilterIcon from '@patternfly/react-icons/dist/esm/icons/filter-icon'; -import SortAmountDownIcon from '@patternfly/react-icons/dist/esm/icons/sort-amount-down-icon'; -import CloneIcon from '@patternfly/react-icons/dist/esm/icons/clone-icon'; -import CogIcon from '@patternfly/react-icons/dist/esm/icons/cog-icon'; -import EditIcon from '@patternfly/react-icons/dist/esm/icons/edit-icon'; -import HelpIcon from '@patternfly/react-icons/dist/esm/icons/help-icon'; -import SyncIcon from '@patternfly/react-icons/dist/esm/icons/sync-icon'; -import QuestionCircleIcon from '@patternfly/react-icons/dist/esm/icons/question-circle-icon'; -import AttentionBellIcon from '@patternfly/react-icons/dist/esm/icons/attention-bell-icon'; -import CodeIcon from '@patternfly/react-icons/dist/esm/icons/code-icon'; -import CodeBranchIcon from '@patternfly/react-icons/dist/esm/icons/code-branch-icon'; -import CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon'; -import DashboardWrapper from '@patternfly/react-core/src/demos/examples/DashboardWrapper'; - -ComposableTableSortable = () => { - const [navActiveItem, setNavActiveItem] = React.useState(0); - const [isDropdownOpen, setIsDropdownOpen] = React.useState(false); - const [isKebabDropdownOpen, setIsKebabDropdownOpen] = React.useState(false); - const [isSelectOpen, setIsSelectOpen] = React.useState(false); - const [isFullKebabDropdownOpen, setIsFullKebabDropdownOpen] = React.useState(false); - - const columns = ['Repositories', 'Branches', 'Pull requests', 'Workspaces', 'Last commit']; - - const [rows, setRows] = React.useState([ - ['Node 1', 10, 25, 5, 2], - ['Node 2', 8, 30, 2, 2], - ['Node 3', 12, 48, 13, 30], - ['Node 4', 10, 25, 5, 8], - ['Node 5', 34, 21, 26, 2] - ]); - - // index of the currently active column - const [activeSortIndex, setActiveSortIndex] = React.useState(0); - // sort direction of the currently active column - const [activeSortDirection, setActiveSortDirection] = React.useState('asc'); - // sort dropdown expansion - const [isSortDropdownOpen, setIsSortDropdownOpen] = React.useState(false); - - const [selectedNodeNames, setSelectedNodeNames] = React.useState([]); - const setNodeSelected = (node, isSelecting = true) => { - if (!selectedNodeNames.includes(node)) { - setSelectedNodeNames([...selectedNodeNames, node]); - } else { - setSelectedNodeNames(selectedNodeNames.filter(n => n !== node)); - } - }; - - const selectAllNodes = (isSelecting = true) => setSelectedNodeNames(isSelecting ? rows.map(r => r[0]) : []); - const areAllReposSelected = selectedNodeNames.length === rows.length; - const isNodeSelected = node => selectedNodeNames.includes(node[0]); - - // To allow shift+click to select/deselect multiple rows - const [recentSelectedRowIndex, setRecentSelectedRowIndex] = React.useState(null); - const [shifting, setShifting] = React.useState(false); - - const onSelectNode = (node, rowIndex, isSelecting) => { - // If the user is shift + selecting the checkboxes, then all intermediate checkboxes should be selected - if (shifting && recentSelectedRowIndex !== null) { - const numberSelected = rowIndex - recentSelectedRowIndex; - const intermediateIndexes = - numberSelected > 0 - ? Array.from(new Array(numberSelected + 1), (_x, i) => i + recentSelectedRowIndex) - : Array.from(new Array(Math.abs(numberSelected) + 1), (_x, i) => i + rowIndex); - intermediateIndexes.forEach(index => setNodeSelected(rows[index], isSelecting)); - } else { - setNodeSelected(node[0], isSelecting); - } - setRecentSelectedRowIndex(rowIndex); - }; - - const onSort = (event, index, direction) => { - setActiveSortIndex(index); - setActiveSortDirection(direction); - // sorts the rows - const updatedRows = rows.sort((a, b) => { - if (typeof a[index] === 'number') { - // numeric sort - if (direction === 'asc') { - return a[index] - b[index]; - } - return b[index] - a[index]; - } else { - // string sort - if (direction === 'asc') { - return a[index].localeCompare(b[index]); - } - return b[index].localeCompare(a[index]); - } - }); - setRows(updatedRows); - }; - - const PageNav = ( - - ); - - const kebabDropdownItems = [Some action]; - - const defaultActions = () => [ - { - title: 'Settings', - onClick: () => console.log(`clicked on Settings`) - }, - { - title: 'Help', - onClick: () => console.log(`clicked on Help`) - } - ]; - - const renderPagination = (variant, isCompact) => ( - - ); - - const userDropdownItems = [ - - My profile - - User management - - Logout - - ]; - - const fullKebabItems = [ - - My profile - - User management - - Logout - , - , - - Settings - , - - Help - - ]; - - const tableToolbar = ( - - - - - {columns.map((column, columnIndex) => ( - - onSort(evt, columnIndex, activeSortDirection !== 'none' ? activeSortDirection : 'asc') - } - > - {column} - - ))} - , - , - - onSort(evt, activeSortIndex, 'asc')} - isSelected={activeSortDirection === 'asc'} - id="ascending" - key="ascending" - > - Ascending - - onSort(evt, activeSortIndex, 'desc')} - isSelected={activeSortDirection === 'desc'} - id="descending" - key="descending" - > - Descending - - - ]} - isOpen={isSortDropdownOpen} - toggle={ - setIsSortDropdownOpen(!isSortDropdownOpen)} - toggleTemplate={} - /> - } - isPlain - isGrouped - menuAppendTo="parent" - isFlipEnabled - /> - - - - - - - - - - - - - - setIsKebabDropdownOpen(!isKebabDropdownOpen)} - toggle={ setIsKebabDropdownOpen(!isKebabDropdownOpen)} />} - isOpen={isKebabDropdownOpen} - dropdownItems={kebabDropdownItems} - isFlipEnabled - menuAppendTo="parent" - /> - - - - - + + + + + + + + setIsKebabDropdownOpen(!isKebabDropdownOpen)} + toggle={ setIsKebabDropdownOpen(!isKebabDropdownOpen)} />} + isOpen={isKebabDropdownOpen} + dropdownItems={kebabDropdownItems} + isFlipEnabled + menuAppendTo="parent" + /> + + + + +