diff --git a/README.md b/README.md index 406f7984..a0b9fa1b 100644 --- a/README.md +++ b/README.md @@ -186,6 +186,12 @@ ReactDOM.render( () => document.body Where to render the DOM node of popup menu when the mode is horizontal or vertical + + builtinPlacements + Object of alignConfigs for dom-align + see placements.jsx + Describes how the popup menus should be positioned + diff --git a/src/Menu.jsx b/src/Menu.jsx index e1d9d1d8..5d6d6df6 100644 --- a/src/Menu.jsx +++ b/src/Menu.jsx @@ -31,6 +31,7 @@ class Menu extends React.Component { style: PropTypes.object, activeKey: PropTypes.string, prefixCls: PropTypes.string, + builtinPlacements: PropTypes.object, }; static defaultProps = { @@ -48,6 +49,7 @@ class Menu extends React.Component { className: '', mode: 'vertical', style: {}, + builtinPlacements: {}, }; constructor(props) { diff --git a/src/SubMenu.jsx b/src/SubMenu.jsx index 1e2dbe9c..d086587e 100644 --- a/src/SubMenu.jsx +++ b/src/SubMenu.jsx @@ -359,6 +359,7 @@ export class SubMenu extends React.Component { subMenuCloseDelay: props.subMenuCloseDelay, forceSubMenuRender: props.forceSubMenuRender, triggerSubMenuAction: props.triggerSubMenuAction, + builtinPlacements: props.builtinPlacements, defaultActiveFirst: props.store.getState() .defaultActiveFirst[getMenuIdFromSubMenuEventKey(props.eventKey)], multiple: props.multiple, @@ -489,6 +490,7 @@ export class SubMenu extends React.Component { subMenuOpenDelay, forceSubMenuRender, subMenuCloseDelay, + builtinPlacements, } = props; menuAllProps.forEach(key => delete props[key]); // Set onClick to null, to ignore propagated onClick event @@ -508,7 +510,7 @@ export class SubMenu extends React.Component { prefixCls={prefixCls} popupClassName={`${prefixCls}-popup ${popupClassName}`} getPopupContainer={getPopupContainer} - builtinPlacements={placements} + builtinPlacements={Object.assign({}, placements, builtinPlacements)} popupPlacement={popupPlacement} popupVisible={isOpen} popupAlign={popupAlign} diff --git a/src/SubPopupMenu.js b/src/SubPopupMenu.js index 2aa5b071..8f96a77e 100644 --- a/src/SubPopupMenu.js +++ b/src/SubPopupMenu.js @@ -285,6 +285,7 @@ export class SubPopupMenu extends React.Component { onOpenChange: this.onOpenChange, onDeselect: this.onDeselect, onSelect: this.onSelect, + builtinPlacements: props.builtinPlacements, ...extraProps, }; if (props.mode === 'inline') { diff --git a/src/util.js b/src/util.js index 8b5006ea..eeaae638 100644 --- a/src/util.js +++ b/src/util.js @@ -95,6 +95,7 @@ export const menuAllProps = [ 'isSelected', 'store', 'activeKey', + 'builtinPlacements', // the following keys found need to be removed from test regression 'attribute', diff --git a/tests/Menu.spec.js b/tests/Menu.spec.js index aff66a29..d1f67558 100644 --- a/tests/Menu.spec.js +++ b/tests/Menu.spec.js @@ -263,4 +263,29 @@ describe('Menu', () => { wrapper.find('li').first().hasClass('rc-menu-item-active') ).toBe(true); }); + + it('should accept builtinPlacements', () => { + const builtinPlacements = { + leftTop: { + points: ['tr', 'tl'], + overflow: { + adjustX: 0, + adjustY: 0, + }, + offset: [0, 0], + }, + }; + + const wrapper = mount( + + menuItem + + menuItem + + + ); + + expect(wrapper.find('Trigger').prop('builtinPlacements').leftTop) + .toEqual(builtinPlacements.leftTop); + }); });