diff --git a/packages/react-core/src/components/OverflowMenu/OverflowMenuDropdownItem.tsx b/packages/react-core/src/components/OverflowMenu/OverflowMenuDropdownItem.tsx index d44260b1b3d..28f857511df 100644 --- a/packages/react-core/src/components/OverflowMenu/OverflowMenuDropdownItem.tsx +++ b/packages/react-core/src/components/OverflowMenu/OverflowMenuDropdownItem.tsx @@ -1,24 +1,24 @@ import * as React from 'react'; -import { DropdownItem, DropdownItemProps } from '../Dropdown'; +import { DropdownItem, DropdownItemProps } from '../../next/components/Dropdown'; import { OverflowMenuContext } from './OverflowMenuContext'; -export interface OverflowMenuDropdownItemProps extends DropdownItemProps { +export interface OverflowMenuDropdownItemProps extends Omit { /** Indicates when a dropdown item shows and hides the corresponding list item */ isShared?: boolean; - /** Indicates the index of the list item */ - index?: number; + /** Identifies the component in the dropdown onSelect callback */ + itemId?: string | number; } export const OverflowMenuDropdownItem: React.FunctionComponent = ({ children, isShared = false, - index, + itemId, ...additionalProps }: OverflowMenuDropdownItemProps) => ( {value => (!isShared || value.isBelowBreakpoint) && ( - + {children} ) diff --git a/packages/react-core/src/components/OverflowMenu/__tests__/Generated/OverflowMenuDropdownItem.test.tsx b/packages/react-core/src/components/OverflowMenu/__tests__/Generated/OverflowMenuDropdownItem.test.tsx index 49799c8747d..e3ecf91b55a 100644 --- a/packages/react-core/src/components/OverflowMenu/__tests__/Generated/OverflowMenuDropdownItem.test.tsx +++ b/packages/react-core/src/components/OverflowMenu/__tests__/Generated/OverflowMenuDropdownItem.test.tsx @@ -3,14 +3,11 @@ import React from 'react'; import { render } from '@testing-library/react'; import { OverflowMenuDropdownItem } from '../../OverflowMenuDropdownItem'; -import { DropdownArrowContext } from '../../../Dropdown'; describe('OverflowMenuDropdownItem', () => { it('should match snapshot', () => { const { asFragment } = render( - - - + ); expect(asFragment()).toMatchSnapshot(); }); diff --git a/packages/react-core/src/components/OverflowMenu/__tests__/Generated/__snapshots__/OverflowMenuDropdownItem.test.tsx.snap b/packages/react-core/src/components/OverflowMenu/__tests__/Generated/__snapshots__/OverflowMenuDropdownItem.test.tsx.snap index 095afd9ab46..4fa128180ae 100644 --- a/packages/react-core/src/components/OverflowMenu/__tests__/Generated/__snapshots__/OverflowMenuDropdownItem.test.tsx.snap +++ b/packages/react-core/src/components/OverflowMenu/__tests__/Generated/__snapshots__/OverflowMenuDropdownItem.test.tsx.snap @@ -3,19 +3,27 @@ exports[`OverflowMenuDropdownItem should match snapshot 1`] = `
  • diff --git a/packages/react-core/src/components/OverflowMenu/examples/OverflowMenu.md b/packages/react-core/src/components/OverflowMenu/examples/OverflowMenu.md index def06f678b9..616e9893291 100644 --- a/packages/react-core/src/components/OverflowMenu/examples/OverflowMenu.md +++ b/packages/react-core/src/components/OverflowMenu/examples/OverflowMenu.md @@ -9,13 +9,15 @@ propComponents: 'OverflowMenuControl', 'OverflowMenuDropdownItem', 'OverflowMenuGroup', - 'OverflowMenuItem', + 'OverflowMenuItem' ] --- import AlignLeftIcon from '@patternfly/react-icons/dist/esm/icons/align-left-icon'; import AlignCenterIcon from '@patternfly/react-icons/dist/esm/icons/align-center-icon'; import AlignRightIcon from '@patternfly/react-icons/dist/esm/icons/align-right-icon'; +import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'; +import { Dropdown as DropdownNext, DropdownList } from '@patternfly/react-core/next'; ## Examples @@ -29,9 +31,11 @@ import { OverflowMenuContent, OverflowMenuGroup, OverflowMenuItem, - OverflowMenuDropdownItem + OverflowMenuDropdownItem, + MenuToggle } from '@patternfly/react-core'; -import { Dropdown, KebabToggle } from '@patternfly/react-core'; +import { Dropdown as DropdownNext, DropdownList } from '@patternfly/react-core/next'; +import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'; class SimpleOverflowMenu extends React.Component { constructor(props) { @@ -39,12 +43,12 @@ class SimpleOverflowMenu extends React.Component { this.state = { isOpen: false }; - this.onToggle = (_event, isOpen) => { + this.onToggle = () => { this.setState({ - isOpen + isOpen: !this.state.isOpen }); }; - this.onSelect = event => { + this.onSelect = (event) => { this.setState({ isOpen: !this.state.isOpen }); @@ -54,19 +58,19 @@ class SimpleOverflowMenu extends React.Component { render() { const { isOpen } = this.state; const dropdownItems = [ - + Item 1 , - + Item 2 , - + Item 3 , - + Item 4 , - + Item 5 ]; @@ -82,15 +86,28 @@ class SimpleOverflowMenu extends React.Component { - } + toggle={(toggleRef) => ( + + + + )} isOpen={isOpen} - isPlain - dropdownItems={dropdownItems} - isFlipEnabled - menuAppendTo="parent" - /> + onOpenChange={(isOpen) => + this.setState({ + isOpen + }) + } + > + {dropdownItems} + ); @@ -108,9 +125,13 @@ import { OverflowMenuContent, OverflowMenuGroup, OverflowMenuItem, - OverflowMenuDropdownItem + OverflowMenuDropdownItem, + MenuToggle, + Button, + ButtonVariant } from '@patternfly/react-core'; -import { Dropdown, KebabToggle, Button, ButtonVariant } from '@patternfly/react-core'; +import { Dropdown as DropdownNext, DropdownList } from '@patternfly/react-core/next'; +import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'; import AlignLeftIcon from '@patternfly/react-icons/dist/esm/icons/align-left-icon'; import AlignCenterIcon from '@patternfly/react-icons/dist/esm/icons/align-center-icon'; import AlignRightIcon from '@patternfly/react-icons/dist/esm/icons/align-right-icon'; @@ -121,12 +142,12 @@ class OverflowMenuGroupTypes extends React.Component { this.state = { isOpen: false }; - this.onToggle = (_event, isOpen) => { + this.onToggle = () => { this.setState({ - isOpen + isOpen: !this.state.isOpen }); }; - this.onSelect = event => { + this.onSelect = (event) => { this.setState({ isOpen: !this.state.isOpen }); @@ -136,31 +157,31 @@ class OverflowMenuGroupTypes extends React.Component { render() { const { isOpen } = this.state; const dropdownItems = [ - + Item 1 , - + Item 2 , - + Item 3 , - + Primary , - + Secondary , - + Tertiary , - + Action 1 , - + Action 2 , - + Action 3 ]; @@ -202,15 +223,28 @@ class OverflowMenuGroupTypes extends React.Component { - } + toggle={(toggleRef) => ( + + + + )} isOpen={isOpen} - isPlain - dropdownItems={dropdownItems} - isFlipEnabled - menuAppendTo="parent" - /> + onOpenChange={(isOpen) => + this.setState({ + isOpen + }) + } + > + {dropdownItems} + ); @@ -228,9 +262,13 @@ import { OverflowMenuContent, OverflowMenuGroup, OverflowMenuItem, - OverflowMenuDropdownItem + OverflowMenuDropdownItem, + MenuToggle, + Button, + ButtonVariant } from '@patternfly/react-core'; -import { Dropdown, KebabToggle, Button, ButtonVariant } from '@patternfly/react-core'; +import { Dropdown as DropdownNext, DropdownList } from '@patternfly/react-core/next'; +import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'; import AlignLeftIcon from '@patternfly/react-icons/dist/esm/icons/align-left-icon'; import AlignCenterIcon from '@patternfly/react-icons/dist/esm/icons/align-center-icon'; import AlignRightIcon from '@patternfly/react-icons/dist/esm/icons/align-right-icon'; @@ -241,12 +279,12 @@ class OverflowMenuAdditionalOptions extends React.Component { this.state = { isOpen: false }; - this.onToggle = (_event, isOpen) => { + this.onToggle = () => { this.setState({ - isOpen + isOpen: !this.state.isOpen }); }; - this.onSelect = event => { + this.onSelect = (event) => { this.setState({ isOpen: !this.state.isOpen }); @@ -256,25 +294,27 @@ class OverflowMenuAdditionalOptions extends React.Component { render() { const { isOpen } = this.state; const dropdownItems = [ - + Primary , - + Secondary , - + Tertiary , - + Action 4 , - + Action 5 , - + Action 6 , - Action 7 + + Action 7 + ]; return ( @@ -309,15 +349,28 @@ class OverflowMenuAdditionalOptions extends React.Component { - } + toggle={(toggleRef) => ( + + + + )} isOpen={isOpen} - isPlain - dropdownItems={dropdownItems} - isFlipEnabled - menuAppendTo="parent" - /> + onOpenChange={(isOpen) => + this.setState({ + isOpen + }) + } + > + {dropdownItems} + ); @@ -335,9 +388,13 @@ import { OverflowMenuContent, OverflowMenuGroup, OverflowMenuItem, - OverflowMenuDropdownItem + OverflowMenuDropdownItem, + MenuToggle, + Button, + ButtonVariant } from '@patternfly/react-core'; -import { Dropdown, KebabToggle, Button, ButtonVariant } from '@patternfly/react-core'; +import { Dropdown as DropdownNext, DropdownList } from '@patternfly/react-core/next'; +import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'; class OverflowMenuPersist extends React.Component { constructor(props) { @@ -345,12 +402,12 @@ class OverflowMenuPersist extends React.Component { this.state = { isOpen: false }; - this.onToggle = (_event, isOpen) => { + this.onToggle = () => { this.setState({ - isOpen + isOpen: !this.state.isOpen }); }; - this.onSelect = event => { + this.onSelect = (event, itemId) => { this.setState({ isOpen: !this.state.isOpen }); @@ -360,13 +417,15 @@ class OverflowMenuPersist extends React.Component { render() { const { isOpen } = this.state; const dropdownItems = [ - + Secondary , - + Tertiary , - Action 4 + + Action 4 + ]; return ( @@ -384,15 +443,28 @@ class OverflowMenuPersist extends React.Component { - } + toggle={(toggleRef) => ( + + + + )} isOpen={isOpen} - isPlain - dropdownItems={dropdownItems} - isFlipEnabled - menuAppendTo="parent" - /> + onOpenChange={(isOpen) => + this.setState({ + isOpen + }) + } + > + {dropdownItems} + ); @@ -407,4 +479,5 @@ By passing in the `breakpointReference` property, the overflow menu's breakpoint You can change the container width in this example by adjusting the slider. As the container width changes, the overflow menu will change between a horizontal menu and a vertical dropdown despite the viewport width not changing. ```ts file="./OverflowMenuBreakpointOnContainer.tsx" + ``` diff --git a/packages/react-core/src/components/OverflowMenu/examples/OverflowMenuBreakpointOnContainer.tsx b/packages/react-core/src/components/OverflowMenu/examples/OverflowMenuBreakpointOnContainer.tsx index a8fd7513a14..75f231cb5bb 100644 --- a/packages/react-core/src/components/OverflowMenu/examples/OverflowMenuBreakpointOnContainer.tsx +++ b/packages/react-core/src/components/OverflowMenu/examples/OverflowMenuBreakpointOnContainer.tsx @@ -6,18 +6,19 @@ import { OverflowMenuGroup, OverflowMenuItem, OverflowMenuDropdownItem, - Dropdown, - KebabToggle, + MenuToggle, Slider } from '@patternfly/react-core'; +import { Dropdown as DropdownNext, DropdownList } from '@patternfly/react-core/next'; +import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'; export const OverflowMenuBreakpointOnContainer: React.FunctionComponent = () => { const [isOpen, setIsOpen] = React.useState(false); const [containerWidth, setContainerWidth] = React.useState(100); const containerRef = React.useRef(null); - const onToggle = (_event: any, isOpen: boolean) => { - setIsOpen(isOpen); + const onToggle = () => { + setIsOpen(!isOpen); }; const onSelect = () => { @@ -36,19 +37,19 @@ export const OverflowMenuBreakpointOnContainer: React.FunctionComponent = () => }; const dropdownItems = [ - + Item 1 , - + Item 2 , - + Item 3 , - + Item 4 , - + Item 5 ]; @@ -83,15 +84,24 @@ export const OverflowMenuBreakpointOnContainer: React.FunctionComponent = () => - } + toggle={toggleRef => ( + + + + )} isOpen={isOpen} - isPlain - dropdownItems={dropdownItems} - isFlipEnabled - menuAppendTo="parent" - /> + onOpenChange={isOpen => setIsOpen(isOpen)} + > + {dropdownItems} + diff --git a/packages/react-core/src/components/Toolbar/examples/Toolbar.md b/packages/react-core/src/components/Toolbar/examples/Toolbar.md index 491f1e3503c..3ae904b69b6 100644 --- a/packages/react-core/src/components/Toolbar/examples/Toolbar.md +++ b/packages/react-core/src/components/Toolbar/examples/Toolbar.md @@ -10,6 +10,8 @@ import CloneIcon from '@patternfly/react-icons/dist/esm/icons/clone-icon'; import SyncIcon from '@patternfly/react-icons/dist/esm/icons/sync-icon'; import FilterIcon from '@patternfly/react-icons/dist/esm/icons/filter-icon'; import SearchIcon from '@patternfly/react-icons/dist/esm/icons/search-icon'; +import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'; +import { Dropdown as DropdownNext, DropdownItem as DropdownItemNext, DropdownList } from '@patternfly/react-core/next'; ## Examples diff --git a/packages/react-core/src/components/Toolbar/examples/ToolbarStacked.tsx b/packages/react-core/src/components/Toolbar/examples/ToolbarStacked.tsx index ef19b4b1ea7..1ab9f847903 100644 --- a/packages/react-core/src/components/Toolbar/examples/ToolbarStacked.tsx +++ b/packages/react-core/src/components/Toolbar/examples/ToolbarStacked.tsx @@ -2,19 +2,17 @@ import React from 'react'; import { Button, ButtonVariant, - KebabToggle, Select, SelectOption, SelectOptionObject, SelectVariant, Pagination, Dropdown, - DropdownSeparator, DropdownToggle, DropdownToggleCheckbox, DropdownItem, - DropdownPosition, Divider, + MenuToggle, OverflowMenu, OverflowMenuContent, OverflowMenuControl, @@ -25,7 +23,9 @@ import { ToolbarToggleGroup, ToolbarItem } from '@patternfly/react-core'; +import { Dropdown as DropdownNext, DropdownItem as DropdownItemNext, DropdownList } from '@patternfly/react-core/next'; import FilterIcon from '@patternfly/react-icons/dist/esm/icons/filter-icon'; +import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'; export const ToolbarStacked: React.FunctionComponent = () => { // toggle group - three option menus with labels, two icon buttons, Kebab menu - right aligned @@ -52,8 +52,8 @@ export const ToolbarStacked: React.FunctionComponent = () => { const [page, setPage] = React.useState(1); const [perPage, setPerPage] = React.useState(20); - const onKebabToggle = (_event: any, isOpen: boolean) => { - setKebabIsOpen(isOpen); + const onKebabToggle = () => { + setKebabIsOpen(!kebabIsOpen); }; const onResourceToggle = (_event: any, isExpanded: boolean) => { @@ -65,7 +65,7 @@ export const ToolbarStacked: React.FunctionComponent = () => { setResourceIsExpanded(false); }; - const onResourceSelectDropdown = (event: React.SyntheticEvent | undefined) => { + const onResourceSelectDropdown = (event: React.MouseEvent| undefined) => { setResourceSelected(event?.target); setResourceIsExpanded(false); }; @@ -101,21 +101,21 @@ export const ToolbarStacked: React.FunctionComponent = () => { }; const dropdownItems = [ - Link, - + Link, + Action - , - + , + Disabled Link - , - + , + Disabled Action - , - , - Separated Link, - + , + , + Separated Link, + Separated Action - + ]; const splitButtonDropdownItems = [ @@ -192,14 +192,23 @@ export const ToolbarStacked: React.FunctionComponent = () => { - } - isOpen={kebabIsOpen} - isPlain - dropdownItems={dropdownItems} - position={DropdownPosition.right} - /> + ( + + + + )} + isOpen={kebabIsOpen} + > + {dropdownItems} + diff --git a/packages/react-core/src/demos/Card/Card.md b/packages/react-core/src/demos/Card/Card.md index 41a0bda9036..304fd36aab5 100644 --- a/packages/react-core/src/demos/Card/Card.md +++ b/packages/react-core/src/demos/Card/Card.md @@ -18,6 +18,9 @@ import sparkIcon from './camel-spark_200x150.png'; import swaggerIcon from './camel-swagger-java_200x150.png'; import azureIcon from './FuseConnector_Icons_AzureServices.png'; import restIcon from './FuseConnector_Icons_REST.png'; +import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'; + +import { Dropdown as DropdownNext, DropdownList } from '@patternfly/react-core/next'; ## Demos @@ -49,6 +52,7 @@ import { EmptyStateActions, Gallery, KebabToggle, + MenuToggle, OverflowMenu, OverflowMenuControl, OverflowMenuDropdownItem, @@ -67,6 +71,8 @@ import { ToolbarFilter, ToolbarContent } from '@patternfly/react-core'; +import { Dropdown as DropdownNext, DropdownList } from '@patternfly/react-core/next'; +import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'; import DashboardWrapper from '@patternfly/react-core/src/demos/examples/DashboardWrapper'; import FilterIcon from '@patternfly/react-icons/dist/esm/icons/filter-icon'; @@ -120,9 +126,9 @@ class CardViewBasic extends React.Component { })); }; - this.onToolbarKebabDropdownToggle = (_event, isLowerToolbarKebabDropdownOpen) => { + this.onToolbarKebabDropdownToggle = () => { this.setState({ - isLowerToolbarKebabDropdownOpen + isOpen: !this.state.isLowerToolbarKebabDropdownOpen }); }; @@ -495,19 +501,19 @@ class CardViewBasic extends React.Component { } = this.state; const toolbarKebabDropdownItems = [ - Link, - + Link, + Action , - + Disabled Link , - + Disabled Action , - , - Separated Link, - + , + Separated Link, + Separated Action ]; @@ -522,15 +528,23 @@ class CardViewBasic extends React.Component { - } + toggle={toggleRef => ( + + + + )} isOpen={isLowerToolbarKebabDropdownOpen} - isPlain - dropdownItems={toolbarKebabDropdownItems} - isFlipEnabled - menuAppendTo="parent" - /> + > + {toolbarKebabDropdownItems} + diff --git a/packages/react-core/src/demos/Tabs.md b/packages/react-core/src/demos/Tabs.md index c6aeeae04be..12dfc92b295 100644 --- a/packages/react-core/src/demos/Tabs.md +++ b/packages/react-core/src/demos/Tabs.md @@ -11,6 +11,9 @@ import CodeBranchIcon from '@patternfly/react-icons/dist/esm/icons/code-branch-i import CubeIcon from '@patternfly/react-icons/dist/esm/icons/cube-icon'; 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 EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'; +import { Dropdown as DropdownNext, DropdownList } from '@patternfly/react-core/next'; + ## Demos diff --git a/packages/react-core/src/demos/examples/Tabs/TabsAndTable.tsx b/packages/react-core/src/demos/examples/Tabs/TabsAndTable.tsx index fc856f274f0..3962a1f56b9 100644 --- a/packages/react-core/src/demos/examples/Tabs/TabsAndTable.tsx +++ b/packages/react-core/src/demos/examples/Tabs/TabsAndTable.tsx @@ -11,12 +11,12 @@ import { DrawerActions, DrawerCloseButton, DrawerPanelBody, - Dropdown, Flex, FlexItem, KebabToggle, Label, LabelGroup, + MenuToggle, OptionsMenu, OptionsMenuToggle, OverflowMenu, @@ -52,6 +52,8 @@ import { ActionsColumn, CustomActionsToggleProps } from '@patternfly/react-table'; +import { Dropdown as DropdownNext, DropdownList } from '@patternfly/react-core/next'; +import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'; import DashboardWrapper from '@patternfly/react-core/src/demos/examples/DashboardWrapper'; import CodeIcon from '@patternfly/react-icons/dist/esm/icons/code-icon'; import CodeBranchIcon from '@patternfly/react-icons/dist/esm/icons/code-branch-icon'; @@ -186,13 +188,23 @@ export const TablesAndTabs = () => { - {}} - toggle={ {}} />} + toggle={toggleRef => ( + {}} + isExpanded={false} + > + + + )} isOpen={false} - isPlain - dropdownItems={[]} - /> + > + {[]} + diff --git a/packages/react-integration/cypress/integration/overflowmenu.spec.ts b/packages/react-integration/cypress/integration/overflowmenu.spec.ts index 7e2e18bc784..35bb7fb4dea 100644 --- a/packages/react-integration/cypress/integration/overflowmenu.spec.ts +++ b/packages/react-integration/cypress/integration/overflowmenu.spec.ts @@ -26,14 +26,15 @@ describe('OverflowMenu Demo Test', () => { }); it('Verify toggle dropdown', () => { - cy.get('#simple-overflow-menu button').should('have.class', 'pf-c-dropdown__toggle'); + cy.get('#simple-overflow-menu button').should('have.class', 'pf-c-menu-toggle'); }); it('Verify dropdown menu expanded', () => { cy.get('#simple-overflow-menu button') .last() .click({ force: true }); - cy.get('#simple-overflow-menu .pf-c-dropdown').should('have.class', 'pf-m-expanded'); + cy.get('#simple-overflow-menu .pf-c-menu-toggle').should('have.class', 'pf-m-expanded'); + cy.get('#simple-overflow-menu .pf-c-menu').should('be.visible'); // close overflow menu again cy.get('#simple-overflow-menu button') .last() @@ -66,14 +67,15 @@ describe('OverflowMenu Demo Test', () => { }); it('Verify toggle dropdown', () => { - cy.get('#additional-options-overflow-menu button').should('have.class', 'pf-c-dropdown__toggle'); + cy.get('#additional-options-overflow-menu button').should('have.class', 'pf-c-menu-toggle'); }); it('Verify dropdown menu expanded', () => { cy.get('#additional-options-overflow-menu button') .last() .click({ force: true }); - cy.get('#additional-options-overflow-menu .pf-c-dropdown').should('have.class', 'pf-m-expanded'); + cy.get('#additional-options-overflow-menu .pf-c-menu-toggle').should('have.class', 'pf-m-expanded'); + cy.get('#additional-options-overflow-menu .pf-c-menu').should('be.visible'); }); }); }); @@ -105,14 +107,15 @@ describe('OverflowMenu Demo Test', () => { }); it('Verify toggle dropdown', () => { - cy.get('#persist-overflow-menu button').should('have.class', 'pf-c-dropdown__toggle'); + cy.get('#persist-overflow-menu button').should('have.class', 'pf-c-menu-toggle'); }); it('Verify dropdown menu expanded', () => { cy.get('#persist-overflow-menu button') .last() .click({ force: true }); - cy.get('#persist-overflow-menu .pf-c-dropdown').should('have.class', 'pf-m-expanded'); + cy.get('#persist-overflow-menu .pf-c-menu-toggle').should('have.class', 'pf-m-expanded'); + cy.get('#persist-overflow-menu .pf-c-menu').should('be.visible'); }); }); }); @@ -141,14 +144,15 @@ describe('OverflowMenu Demo Test', () => { }); it('Verify toggle dropdown', () => { - cy.get('#container-breakpoint-overflow-menu button').should('have.class', 'pf-c-dropdown__toggle'); + cy.get('#container-breakpoint-overflow-menu button').should('have.class', 'pf-c-menu-toggle'); }); it('Verify dropdown menu expanded', () => { cy.get('#container-breakpoint-overflow-menu button') .last() .click({ force: true }); - cy.get('#container-breakpoint-overflow-menu .pf-c-dropdown').should('have.class', 'pf-m-expanded'); + cy.get('#container-breakpoint-overflow-menu .pf-c-menu-toggle').should('have.class', 'pf-m-expanded'); + cy.get('#container-breakpoint-overflow-menu .pf-c-menu').should('be.visible'); // close overflow menu again cy.get('#container-breakpoint-overflow-menu button') .last() diff --git a/packages/react-integration/demo-app-ts/src/components/demos/OverflowMenuDemo/OverflowMenuDemo.tsx b/packages/react-integration/demo-app-ts/src/components/demos/OverflowMenuDemo/OverflowMenuDemo.tsx index 114f26fd270..b48f317a184 100644 --- a/packages/react-integration/demo-app-ts/src/components/demos/OverflowMenuDemo/OverflowMenuDemo.tsx +++ b/packages/react-integration/demo-app-ts/src/components/demos/OverflowMenuDemo/OverflowMenuDemo.tsx @@ -6,13 +6,15 @@ import { OverflowMenuGroup, OverflowMenuItem, OverflowMenuDropdownItem, - Dropdown, - KebabToggle, + MenuToggle, Button } from '@patternfly/react-core'; +import { Dropdown, DropdownList } from '@patternfly/react-core/dist/esm/next/index'; import AlignLeftIcon from '@patternfly/react-icons/dist/esm/icons/align-left-icon'; import AlignCenterIcon from '@patternfly/react-icons/dist/esm/icons/align-center-icon'; import AlignRightIcon from '@patternfly/react-icons/dist/esm/icons/align-right-icon'; +import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'; + export class OverflowMenuDemo extends React.Component { static displayName = 'OverflowMenuDemo'; state = { @@ -29,14 +31,14 @@ export class OverflowMenuDemo extends React.Component { marginBottom: '2rem' }; - onSimpleToggle = (_event: any, isSimpleOpen: boolean) => { + onSimpleToggle = (_event: any) => { this.setState({ - isSimpleOpen + isSimpleOpen: !this.state.isSimpleOpen }); }; // eslint-disable-next-line @typescript-eslint/no-unused-vars - onSimpleSelect = (_event?: React.SyntheticEvent) => { + onSimpleSelect = () => { this.setState({ isSimpleOpen: !this.state.isSimpleOpen }); @@ -45,20 +47,22 @@ export class OverflowMenuDemo extends React.Component { renderSimpleOverflowMenu() { const { isSimpleOpen } = this.state; const dropdownItems = [ - Action, - + + Action + , + Item 1 , - + Item 2 , - + Item 3 , - + Item 4 , - + Item 5 ]; @@ -76,26 +80,34 @@ export class OverflowMenuDemo extends React.Component { } + toggle={toggleRef => ( + + + + )} isOpen={isSimpleOpen} - isPlain - dropdownItems={dropdownItems} - isFlipEnabled - menuAppendTo="parent" - /> + > + {dropdownItems} + ); } - onAdditionalOptionsToggle = (_event: any, isAdditionalOptionsOpen: boolean) => { + onAdditionalOptionsToggle = (_event: any) => { this.setState({ - isAdditionalOptionsOpen + isAdditionalOptionsOpen: !this.state.isAdditionalOptionsOpen }); }; // eslint-disable-next-line @typescript-eslint/no-unused-vars - onAdditionalOptionsSelect = (_event?: React.SyntheticEvent) => { + onAdditionalOptionsSelect = () => { this.setState({ isAdditionalOptionsOpen: !this.state.isAdditionalOptionsOpen }); @@ -104,25 +116,27 @@ export class OverflowMenuDemo extends React.Component { renderOverflowMenuAdditionalOptions() { const { isAdditionalOptionsOpen } = this.state; const dropdownItems = [ - + Primary , - + Secondary , - + Tertiary , - + Action 4 , - + Action 5 , - + Action 6 , - Action 7 + + Action 7 + ]; return ( @@ -159,26 +173,34 @@ export class OverflowMenuDemo extends React.Component { } + toggle={toggleRef => ( + + + + )} isOpen={isAdditionalOptionsOpen} - isPlain - dropdownItems={dropdownItems} - isFlipEnabled - menuAppendTo="parent" - /> + > + {dropdownItems} + ); } - onPersistToggle = (_event: any, isPersistOpen: boolean) => { + onPersistToggle = () => { this.setState({ - isPersistOpen + isPersistOpen: !this.state.isPersistOpen }); }; // eslint-disable-next-line @typescript-eslint/no-unused-vars - onPersistSelect = (_event?: React.SyntheticEvent) => { + onPersistSelect = () => { this.setState({ isPersistOpen: !this.state.isPersistOpen }); @@ -187,16 +209,18 @@ export class OverflowMenuDemo extends React.Component { renderOverflowMenuPersist() { const { isPersistOpen } = this.state; const dropdownItems = [ - + Primary , - + Secondary , - + Tertiary , - Action 4 + + Action 4 + ]; return ( @@ -216,26 +240,34 @@ export class OverflowMenuDemo extends React.Component { } + toggle={toggleRef => ( + + + + )} isOpen={isPersistOpen} - isPlain - dropdownItems={dropdownItems} - isFlipEnabled - menuAppendTo="parent" - /> + > + {dropdownItems} + ); } - onContainerBreakpointToggle = (_event: any, isContainerBreakpointOpen: boolean) => { + onContainerBreakpointToggle = () => { this.setState({ - isContainerBreakpointOpen + isContainerBreakpointOpen: !this.state.isContainerBreakpointOpen }); }; // eslint-disable-next-line @typescript-eslint/no-unused-vars - onContainerBreakpointSelect = (_event?: React.SyntheticEvent) => { + onContainerBreakpointSelect = () => { this.setState({ isContainerBreakpointOpen: !this.state.isContainerBreakpointOpen }); @@ -244,20 +276,22 @@ export class OverflowMenuDemo extends React.Component { renderContainerBreakpointOverflowMenu() { const { isContainerBreakpointOpen } = this.state; const dropdownItems = [ - Action, - + + Action + , + Item 1 , - + Item 2 , - + Item 3 , - + Item 4 , - + Item 5 ]; @@ -281,13 +315,21 @@ export class OverflowMenuDemo extends React.Component { } + toggle={toggleRef => ( + + + + )} isOpen={isContainerBreakpointOpen} - isPlain - dropdownItems={dropdownItems} - isFlipEnabled - menuAppendTo="parent" - /> + > + {dropdownItems} + diff --git a/packages/react-table/src/components/TableComposable/examples/ComposableTable.md b/packages/react-table/src/components/TableComposable/examples/ComposableTable.md index 87b51b323a6..4e9f5bb2071 100644 --- a/packages/react-table/src/components/TableComposable/examples/ComposableTable.md +++ b/packages/react-table/src/components/TableComposable/examples/ComposableTable.md @@ -53,9 +53,12 @@ import FolderIcon from '@patternfly/react-icons/dist/esm/icons/folder-icon'; import FolderOpenIcon from '@patternfly/react-icons/dist/esm/icons/folder-open-icon'; import SortAmountDownIcon from '@patternfly/react-icons/dist/esm/icons/sort-amount-down-icon'; import BlueprintIcon from '@patternfly/react-icons/dist/esm/icons/blueprint-icon'; +import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'; import { css } from '@patternfly/react-styles'; import styles from '@patternfly/react-styles/css/components/Table/table'; +import { Dropdown as DropdownNext, DropdownList } from '@patternfly/react-core/next'; + ## TableComposable examples diff --git a/packages/react-table/src/components/TableComposable/examples/ComposableTableActionsOverflow.tsx b/packages/react-table/src/components/TableComposable/examples/ComposableTableActionsOverflow.tsx index 80e5b96dcba..c3298d18b5b 100644 --- a/packages/react-table/src/components/TableComposable/examples/ComposableTableActionsOverflow.tsx +++ b/packages/react-table/src/components/TableComposable/examples/ComposableTableActionsOverflow.tsx @@ -8,10 +8,11 @@ import { OverflowMenuGroup, OverflowMenuItem, OverflowMenuDropdownItem, - Dropdown, - KebabToggle + MenuToggle } from '@patternfly/react-core'; import { TableComposable, Thead, Tr, Th, Tbody, Td } from '@patternfly/react-table'; +import { Dropdown as DropdownNext, DropdownList } from '@patternfly/react-core/next'; +import EllipsisVIcon from '@patternfly/react-icons/dist/esm/icons/ellipsis-v-icon'; interface Repository { name: string; @@ -43,13 +44,13 @@ export const ComposableTableActions: React.FunctionComponent = () => { }; const dropdownItems = [ - + Pimary , - + Secondary , - + Tertiary ]; @@ -68,7 +69,7 @@ export const ComposableTableActions: React.FunctionComponent = () => { - {repos.map(repo => ( + {repos.map((repo) => ( {repo.name} {repo.branches} @@ -91,22 +92,30 @@ export const ComposableTableActions: React.FunctionComponent = () => { - - setRepos(repos.map(r => (r.name !== repo.name ? r : { ...r, isMenuOpen: !r.isMenuOpen }))) + setRepos(repos.map((r) => (r.name !== repo.name ? r : { ...r, isMenuOpen: !r.isMenuOpen }))) } - toggle={ - - setRepos(repos.map(r => (r.name !== repo.name ? r : { ...r, isMenuOpen: open }))) + toggle={(toggleRef) => ( + + setRepos(repos.map((r) => (r.name !== repo.name ? r : { ...r, isMenuOpen: !r.isMenuOpen }))) } - /> - } + isExpanded={repo.isMenuOpen} + > + + + )} isOpen={repo.isMenuOpen} - isPlain - dropdownItems={dropdownItems} - /> + onOpenChange={(isOpen) => + setRepos(repos.map((r) => (r.name !== repo.name ? r : { ...r, isMenuOpen: isOpen }))) + } + > + {dropdownItems} +