diff --git a/common/changes/office-ui-fabric-react/jspurlin-ContextualMenuFixSplitButtonSubmenuTarget_2018-03-14-22-41.json b/common/changes/office-ui-fabric-react/jspurlin-ContextualMenuFixSplitButtonSubmenuTarget_2018-03-14-22-41.json new file mode 100644 index 0000000000000..64c43c559bc62 --- /dev/null +++ b/common/changes/office-ui-fabric-react/jspurlin-ContextualMenuFixSplitButtonSubmenuTarget_2018-03-14-22-41.json @@ -0,0 +1,11 @@ +{ + "changes": [ + { + "packageName": "office-ui-fabric-react", + "comment": "ContextualMenu: SplitButtons in ContextualMenus are incorrectly using the menuLauncher portion of the splitButton for the tagrate when the menuLauncher portion is activated. This can lead to weird overhangs of the parent menu even if directionalHintFixed is not true (e.g. it will overlap the primary portion of the splitButton and potentially other items in the parent menu)", + "type": "patch" + } + ], + "packageName": "office-ui-fabric-react", + "email": "jspurlin@microsoft.com" +} \ No newline at end of file diff --git a/packages/office-ui-fabric-react/src/components/ContextualMenu/ContextualMenu.tsx b/packages/office-ui-fabric-react/src/components/ContextualMenu/ContextualMenu.tsx index 4f531f196a895..9f9a3e484bd3c 100644 --- a/packages/office-ui-fabric-react/src/components/ContextualMenu/ContextualMenu.tsx +++ b/packages/office-ui-fabric-react/src/components/ContextualMenu/ContextualMenu.tsx @@ -660,7 +660,7 @@ export class ContextualMenu extends BaseComponent) { + private _updateFocusOnMouseEvent(item: IContextualMenuItem, ev: React.MouseEvent) { const targetElement = ev.currentTarget as HTMLElement; const { subMenuHoverDelay: timeoutDuration = this._navigationIdleDelay } = this.props; @@ -833,8 +833,10 @@ export class ContextualMenu extends BaseComponent { targetElement.focus(); - this._onItemSubMenuExpand(item, targetElement); - }, timeoutDuration); + const splitButtonContainer = this._splitButtonContainers.get(item.key); + this._onItemSubMenuExpand(item, + ((item.split && splitButtonContainer) ? splitButtonContainer : targetElement) as HTMLElement); + }, this._navigationIdleDelay); } else { this._enterTimerId = this._async.setTimeout(() => { this._onSubMenuDismiss(ev); @@ -850,6 +852,17 @@ export class ContextualMenu extends BaseComponent) { + this._onItemClickBase(item, ev, ev.currentTarget as HTMLElement); + } + + private _onSplitItemClick(item: IContextualMenuItem, ev: React.MouseEvent) { + const splitButtonContainer = this._splitButtonContainers.get(item.key); + // get the whole splitButton container to base the menu off of + this._onItemClickBase(item, ev, + (splitButtonContainer ? splitButtonContainer : ev.currentTarget) as HTMLElement); + } + + private _onItemClickBase(item: IContextualMenuItem, ev: React.MouseEvent, target: HTMLElement) { const items = getSubmenuItems(item); if (!hasSubmenu(item) && (!items || !items.length)) { // This is an item without a menu. Click it. @@ -858,7 +871,7 @@ export class ContextualMenu extends BaseComponent { @@ -110,14 +110,14 @@ export class ContextualMenuCheckmarksExample extends React.Component<{}, IContex subMenuProps: { items: [ { - key: keys[6], + key: keys[9], name: 'Email message', canCheck: true, isChecked: selection![keys[9]], onClick: this._onToggleSelect }, { - key: keys[7], + key: keys[10], name: 'Calendar event', canCheck: true, isChecked: selection![keys[10]], @@ -132,6 +132,36 @@ export class ContextualMenuCheckmarksExample extends React.Component<{}, IContex onClick: this._onToggleSelect, disabled: true }, + { + key: keys[11], + iconProps: { + iconName: 'MusicInCollectionFill' + }, + subMenuProps: { + directionalHint: DirectionalHint.leftCenter, + items: [ + { + key: keys[12], + name: 'Email message', + canCheck: true, + isChecked: selection![keys[12]], + onClick: this._onToggleSelect + }, + { + key: keys[13], + name: 'Calendar event', + canCheck: true, + isChecked: selection![keys[13]], + onClick: this._onToggleSelect + } + ], + }, + name: 'Split Button Left Menu', + canCheck: true, + isChecked: selection![keys[11]], + split: true, + onClick: this._onToggleSelect, + }, ] } }