Merge pull request woocommerce/woocommerce-admin#2154 from woocommerce/refactor/EllipsisMenu-renderContent

EllipsisMenu: Refactor children to renderContent
This commit is contained in:
Paul Sealock 2019-05-06 11:13:36 +12:00 committed by GitHub
commit 910160dbfa
8 changed files with 78 additions and 60 deletions

View File

@ -89,7 +89,7 @@ class DashboardCharts extends Component {
return ( return (
<EllipsisMenu <EllipsisMenu
label={ __( 'Choose which charts to display', 'woocommerce-admin' ) } label={ __( 'Choose which charts to display', 'woocommerce-admin' ) }
renderChildren={ ( { onToggle } ) => ( renderContent={ ( { onToggle } ) => (
<Fragment> <Fragment>
{ window.wcAdminFeatures[ 'dashboard/customizable' ] && ( { window.wcAdminFeatures[ 'dashboard/customizable' ] && (
<div className="woocommerce-ellipsis-menu__item"> <div className="woocommerce-ellipsis-menu__item">

View File

@ -73,7 +73,7 @@ class Leaderboards extends Component {
'Choose which leaderboards to display and other settings', 'Choose which leaderboards to display and other settings',
'woocommerce-admin' 'woocommerce-admin'
) } ) }
renderChildren={ ( { onToggle } ) => ( renderContent={ ( { onToggle } ) => (
<Fragment> <Fragment>
{ window.wcAdminFeatures[ 'dashboard/customizable' ] && ( { window.wcAdminFeatures[ 'dashboard/customizable' ] && (
<div className="woocommerce-ellipsis-menu__item"> <div className="woocommerce-ellipsis-menu__item">

View File

@ -84,7 +84,7 @@ class StorePerformance extends Component {
'Choose which analytics to display and the section name', 'Choose which analytics to display and the section name',
'woocommerce-admin' 'woocommerce-admin'
) } ) }
renderChildren={ ( { onToggle } ) => ( renderContent={ ( { onToggle } ) => (
<Fragment> <Fragment>
{ window.wcAdminFeatures[ 'dashboard/customizable' ] && ( { window.wcAdminFeatures[ 'dashboard/customizable' ] && (
<div className="woocommerce-ellipsis-menu__item"> <div className="woocommerce-ellipsis-menu__item">

View File

@ -235,10 +235,15 @@ class OrdersPanel extends Component {
} }
const menu = ( const menu = (
<EllipsisMenu label="Demo Menu"> <EllipsisMenu
<MenuTitle>Test</MenuTitle> label="Demo Menu"
<MenuItem onInvoke={ noop }>Test</MenuItem> renderContent={ () => (
</EllipsisMenu> <Fragment>
<MenuTitle>Test</MenuTitle>
<MenuItem onInvoke={ noop }>Test</MenuItem>
</Fragment>
) }
/>
); );
const title = const title =

View File

@ -1,7 +1,8 @@
# unreleased # 3.0.0 (unreleased)
- TableCard component: new `onPageChange` prop. - TableCard component: new `onPageChange` prop.
- Pagination no longer considers `0` a valid input and triggers `onPageChange` on the input blur event. - Pagination no longer considers `0` a valid input and triggers `onPageChange` on the input blur event.
- Tweaks to SummaryListPlaceholder height in order to better match SummaryNumber. - Tweaks to SummaryListPlaceholder height in order to better match SummaryNumber.
- EllipsisMenu component (breaking change): Remove `children` prop in favor of a render prop `renderContent` so that function arguments `isOpen`, `onToggle`, and `onClose` can be passed down.
# 2.0.0 # 2.0.0
- Chart legend component now uses withInstanceId HOC so the ids used in several HTML elements are unique. - Chart legend component now uses withInstanceId HOC so the ids used in several HTML elements are unique.

View File

@ -1,26 +1,40 @@
```jsx ```jsx
import { EllipsisMenu, MenuItem, MenuTitle } from '@woocommerce/components'; import { EllipsisMenu, MenuItem, MenuTitle, Button } from '@woocommerce/components';
const MyEllipsisMenu = withState( { const MyEllipsisMenu = withState( {
showCustomers: true, showCustomers: true,
showOrders: true, showOrders: true,
} )( ( { setState, showCustomers, showOrders } ) => ( } )( ( { setState, showCustomers, showOrders } ) => (
<EllipsisMenu label="Choose which analytics to display"> <EllipsisMenu label="Choose which analytics to display"
<MenuTitle>Display Stats</MenuTitle> renderContent={ ( { onToggle } )=> {
<MenuItem onInvoke={ () => setState( { showCustomers: ! showCustomers } ) }> return (
<ToggleControl <div>
label="Show Customers" <MenuTitle>Display Stats</MenuTitle>
checked={ showCustomers } <MenuItem onInvoke={ () => setState( { showCustomers: ! showCustomers } ) }>
onChange={ () => setState( { showCustomers: ! showCustomers } ) } <ToggleControl
/> label="Show Customers"
</MenuItem> checked={ showCustomers }
<MenuItem onInvoke={ () => setState( { showOrders: ! showOrders } ) }> onChange={ () => setState( { showCustomers: ! showCustomers } ) }
<ToggleControl />
label="Show Orders" </MenuItem>
checked={ showOrders } <MenuItem onInvoke={ () => setState( { showOrders: ! showOrders } ) }>
onChange={ () => setState( { showOrders: ! showOrders } ) } <ToggleControl
/> label="Show Orders"
</MenuItem> checked={ showOrders }
</EllipsisMenu> onChange={ () => setState( { showOrders: ! showOrders } ) }
/>
</MenuItem>
<MenuItem onInvoke={ onToggle }>
<Button
label="Close menu"
onClick={ onToggle }
>
Close Menu
</Button>
</MenuItem>
</div>
);
} }
/>
) ); ) );
``` ```

View File

@ -12,12 +12,12 @@ import PropTypes from 'prop-types';
*/ */
class EllipsisMenu extends Component { class EllipsisMenu extends Component {
render() { render() {
const { children, label, renderChildren } = this.props; const { label, renderContent } = this.props;
if ( ! children && ! renderChildren ) { if ( ! renderContent ) {
return null; return null;
} }
const renderToggle = ( { onToggle, isOpen } ) => { const renderEllipsis = ( { onToggle, isOpen } ) => {
const toggleClassname = classnames( 'woocommerce-ellipsis-menu__toggle', { const toggleClassname = classnames( 'woocommerce-ellipsis-menu__toggle', {
'is-opened': isOpen, 'is-opened': isOpen,
} ); } );
@ -33,11 +33,9 @@ class EllipsisMenu extends Component {
); );
}; };
// @todo Make all children rendered by render props so Dropdown args can be passed? const renderMenu = renderContentArgs => (
const renderContent = renderContentArgs => (
<NavigableMenu className="woocommerce-ellipsis-menu__content"> <NavigableMenu className="woocommerce-ellipsis-menu__content">
{ children && children } { renderContent( renderContentArgs ) }
{ renderChildren && renderChildren( renderContentArgs ) }
</NavigableMenu> </NavigableMenu>
); );
@ -46,8 +44,8 @@ class EllipsisMenu extends Component {
<Dropdown <Dropdown
contentClassName="woocommerce-ellipsis-menu__popover" contentClassName="woocommerce-ellipsis-menu__popover"
position="bottom left" position="bottom left"
renderToggle={ renderToggle } renderToggle={ renderEllipsis }
renderContent={ renderContent } renderContent={ renderMenu }
/> />
</div> </div>
); );
@ -60,13 +58,9 @@ EllipsisMenu.propTypes = {
*/ */
label: PropTypes.string.isRequired, label: PropTypes.string.isRequired,
/** /**
* A list of `MenuTitle`/`MenuItem` components * A function returning `MenuTitle`/`MenuItem` components as a render prop. Arguments from Dropdown passed as function arguments.
*/ */
children: PropTypes.node, renderContent: PropTypes.func,
/**
* A list of `MenuTitle`/`MenuItem` components as a render prop. Arguments from Dropdown passed as function arguments.
*/
renderChildren: PropTypes.func,
}; };
export default EllipsisMenu; export default EllipsisMenu;

View File

@ -340,25 +340,29 @@ class TableCard extends Component {
), ),
] } ] }
menu={ menu={
showMenu && <EllipsisMenu label={ __( 'Choose which values to display', 'woocommerce-admin' ) }> showMenu && <EllipsisMenu label={ __( 'Choose which values to display', 'woocommerce-admin' ) }
<MenuTitle>{ __( 'Columns:', 'woocommerce-admin' ) }</MenuTitle> renderContent={ () => (
{ allHeaders.map( ( { key, label, required } ) => { <Fragment>
if ( required ) { <MenuTitle>{ __( 'Columns:', 'woocommerce-admin' ) }</MenuTitle>
return null; { allHeaders.map( ( { key, label, required } ) => {
} if ( required ) {
return ( return null;
<MenuItem }
checked={ showCols.includes( key ) } return (
isCheckbox <MenuItem
isClickable checked={ showCols.includes( key ) }
key={ key } isCheckbox
onInvoke={ this.onColumnToggle( key ) } isClickable
> key={ key }
{ label } onInvoke={ this.onColumnToggle( key ) }
</MenuItem> >
); { label }
} ) } </MenuItem>
</EllipsisMenu> );
} ) }
</Fragment>
) }
/>
} }
> >
{ isLoading ? ( { isLoading ? (