Skip to content
Merged
Show file tree
Hide file tree
Changes from 23 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
2ffef62
made spin button and base button menu option un-focusable
Mar 8, 2018
979da51
added spin button test
Mar 9, 2018
e4ab4b4
added split button contextual menu change
Mar 9, 2018
3d95aca
got rid of un-needed code
Mar 9, 2018
64bc57b
added change files
Mar 9, 2018
e08bf24
added abillitiy to not focus on primary button for split button, but …
Mar 9, 2018
c16992b
enter on focus on split button trigger primary action
Mar 9, 2018
7bea2c0
added split button style for disabled
Mar 9, 2018
62cb458
prevent opening submenu if item is disabled
Mar 9, 2018
efb7439
tighten restrictions on opening split buttons to open with alt + down
Mar 9, 2018
f803332
refactored button name and fixed test
Mar 10, 2018
b2a4475
updated bundle size
Mar 13, 2018
b1f2c39
Merge branch 'master' into focus2
chang47 Mar 13, 2018
976c67f
changed on menu item click to bw able to take in a keyboard event
Mar 13, 2018
d3e1426
Merge branch 'focus2' of https://github.com/chang47/office-ui-fabric-…
Mar 13, 2018
0aaefaa
updated package json
Mar 13, 2018
bbc370f
fixed weird tabbing
Mar 13, 2018
0fc2cc6
changed way we structured the focus
Mar 13, 2018
965a8e9
added stop propagation
Mar 14, 2018
2603277
resolved merge conflicts
Mar 15, 2018
aaa77c3
resolved merge conflict
Mar 16, 2018
ad6e5df
changed split button container key down to work with other buttons now
Mar 16, 2018
e01436a
update bundle size
Mar 16, 2018
a33679e
added correct split button container styles
Mar 21, 2018
93ba4ae
removed unnecessary attribute
Mar 21, 2018
d19e1a6
fixed focusing on menu button when primary button is disabled
Mar 21, 2018
24ae278
added change to focus
Mar 21, 2018
0e7d887
resolved merge conflict
Mar 21, 2018
619711d
added aria hidden
Mar 21, 2018
276fe96
fixed span location and moved TODO
Mar 21, 2018
d4436d4
added support to focus on whole container in split button for context…
Mar 22, 2018
843d758
added comment
Mar 22, 2018
9186034
fixed styling issues with buttons
Mar 23, 2018
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"changes": [
{
"packageName": "office-ui-fabric-react",
"comment": "Removed focusability on buttons for split buttons and spin buttons",
"type": "patch"
}
],
"packageName": "office-ui-fabric-react",
"email": "[email protected]"
}
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ export class BaseButton extends BaseComponent<IBaseButtonProps, IBaseButtonState
'aria-label': ariaLabel,
'aria-labelledby': ariaLabelledBy,
'aria-describedby': ariaDescribedBy,
'data-is-focusable': ((this.props as any)['data-is-focusable'] === false || disabled) ? false : true,
'data-is-focusable': ((this.props as any)['data-is-focusable'] === false || disabled || this._isSplitButton) ? false : true,
'aria-pressed': checked
}
);
Expand Down Expand Up @@ -200,7 +200,9 @@ export class BaseButton extends BaseComponent<IBaseButtonProps, IBaseButtonState
}

public focus(): void {
if (this._buttonElement.value) {
if (this._isSplitButton && this._splitButtonContainer.value) {
this._splitButtonContainer.value.focus();
} else if (this._buttonElement.value) {
this._buttonElement.value.focus();
}
}
Expand Down Expand Up @@ -423,7 +425,14 @@ export class BaseButton extends BaseComponent<IBaseButtonProps, IBaseButtonState
!!this.state.menuProps,
!!checked);

buttonProps = { ...buttonProps, onClick: undefined };
assign(
buttonProps,
{
onClick: undefined,
tabIndex: -1,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Tabindex -1 still seems like a bad idea

'data-is-focusable': false
}
);

return (
<div
Expand All @@ -435,10 +444,11 @@ export class BaseButton extends BaseComponent<IBaseButtonProps, IBaseButtonState
aria-pressed={ this.props.checked }
aria-describedby={ buttonProps.ariaDescription }
className={ classNames && classNames.splitButtonContainer }
onKeyDown={ this._onMenuKeyDown }
onKeyDown={ this._onSplitButtonContainerKeyDown }
ref={ this._splitButtonContainer }
data-is-focusable={ true }
onClick={ !disabled && !primaryDisabled ? onClick : undefined }
tabIndex={ 0 }
>
<span
style={ { 'display': 'flex' } }
Expand Down Expand Up @@ -482,11 +492,11 @@ export class BaseButton extends BaseComponent<IBaseButtonProps, IBaseButtonState
'iconProps': menuIconProps,
'ariaLabel': splitButtonAriaLabel,
'aria-haspopup': true,
'aria-expanded': this._isExpanded
'aria-expanded': this._isExpanded,
'data-is-focusable': false
};

return <BaseButton { ...splitButtonProps } onMouseDown={ this._onMouseDown } />;

return <BaseButton {...splitButtonProps} onMouseDown={ this._onMouseDown } tabIndex={ -1 } />;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Adding tabIndex is an antipattern here. If this is hosted in a focusZone, it will become focusable again.

Plus, if something should not be focusable, it shouldn't be rendered as a button.

My preference here is to convert the menu click target to a DIV or SPAN which can soak clicks and touches, but not receive focus, and not attempt to render as a BaseButton.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Setting the tabIndex=-1 and data-is-focusable=false ensures that the button will not be keyboard focusable when it is or is not inside of a FocusZone.

As for if the individual portions of the splitButton should be buttons, I'm working with Narrator on defining a splitButton so that they will always be able to tell that it is in fact a split button. One approach may be a button with x, y, z markup and the fact that it contains two buttons... We could change them to be divs or spans if we want, the only downside of that is now we lose the consistency when the splitButton is rendered in a ContextualMenu. We we want to update that as well then we'll lose the ability to use the default render functionality

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That being said, I just noticed the span wrapping the splitButton contents here does not have aria-hidden="true" (which it should to align with how splitButtons are represented in ContextualMenus)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Chatted with @dzearing and we should go ahead and simplify this to not be created with two buttons

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Talking with @jspurlin offline, we were discussing the idea of just removing the wrapping span. now that there is a single hittarget, there is no need for the wrapping span, which would reduce dom (and bundle size, and work from focus zone).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@dzearing I've spent a couple of hours trying to make the fix, but there were some not so simple styles that have to be made. Considering that the PR is to add focus on split button containers and some other components, I think that's outside of the scope of this specific issue. However, I have logged a bug for this issue at VSTS: 2209061 and will take a 2nd crack at it some other time.

}

private _onMouseDown = (ev: React.MouseEvent<BaseButton>) => {
Expand All @@ -497,7 +507,23 @@ export class BaseButton extends BaseComponent<IBaseButtonProps, IBaseButtonState
ev.preventDefault();
}

private _onSplitButtonContainerKeyDown = (ev: React.KeyboardEvent<HTMLDivElement>) => {
if (ev.which === KeyCodes.enter) {
if (this._buttonElement.value) {
this._buttonElement.value.click();
ev.preventDefault();
ev.stopPropagation();
}
} else {
this._onMenuKeyDown(ev);
}
}

private _onMenuKeyDown = (ev: React.KeyboardEvent<HTMLDivElement | HTMLAnchorElement | HTMLButtonElement>) => {
if (this.props.disabled) {
return;
}

if (this.props.onKeyDown) {
this.props.onKeyDown(ev);
}
Expand All @@ -509,13 +535,26 @@ export class BaseButton extends BaseComponent<IBaseButtonProps, IBaseButtonState

Copy link
Contributor

@jspurlin jspurlin Mar 21, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It seems strange that this calls onMenuClick (considering that this is keydown)... If this want to call onMenuClick, why isn't this calling _onMenuClick?

Copy link
Contributor Author

@chang47 chang47 Mar 21, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We want to trigger the primary action when we hit the enter button if we're focusing on the html element. This works for buttons, unfortunately, the container is a div so pressing enter won't trigger the onClick event.

I can move the code in onMenuClick and call it in both places, but they would both also reference onClick events. What do you think?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think as long as _onToggleMenu is updating the focus correctly this is fine

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is resolved, we'll keep this code here and add the focus change to onToggleMenu

if (!ev.defaultPrevented &&
this.props.menuTriggerKeyCode !== null &&
ev.which === (this.props.menuTriggerKeyCode === undefined ? KeyCodes.down : this.props.menuTriggerKeyCode)) {
this._isValidMenuOpenKey(ev)) {
this._onToggleMenu();
Copy link
Contributor

@jspurlin jspurlin Mar 21, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

as part of _onToggleMenu could we set focus to the container before setting the state to toggle the menu? This would allow focus to return to the whole split button once the menu is dismissed

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would that be what we want to do? By doing this we would force the focus to go back to the menu in every scenario.

From my understanding, we want focus to go back to the previous focused element, wIth the suggested change, we always focus on the button when we close the menu.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The focus should always only be on the container (even if it was fired against the split button portion). We should never be setting focus on the individual portions of the splitButton

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added the changes here. Now we only don't focus the split button if everything is disabled.

ev.preventDefault();
ev.stopPropagation();
}
}

/**
* Returns if the user hits a valid keyboard key to open the menu
* @param ev - the keyboard event
* @returns True if user clicks on custom trigger key if enabled or alt + down arrow if not. False otherwise.
*/
private _isValidMenuOpenKey(ev: React.KeyboardEvent<HTMLDivElement | HTMLAnchorElement | HTMLButtonElement>): boolean {
if (this.props.menuTriggerKeyCode) {
return ev.which === this.props.menuTriggerKeyCode;
} else {
return ev.which === KeyCodes.down && ev.altKey;
}
}

private _onMenuClick = (ev: React.MouseEvent<HTMLAnchorElement>) => {
const { onMenuClick } = this.props;
if (onMenuClick) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -491,7 +491,7 @@ describe('Button', () => {
expect(didClick).toEqual(true);
});

it('Pressing down on SplitButton triggers menu', () => {
it('Pressing alt + down on SplitButton triggers menu', () => {
const renderedDOM: HTMLElement = renderIntoDocument(
<DefaultButton
data-automation-id='test'
Expand Down Expand Up @@ -519,7 +519,8 @@ describe('Button', () => {

ReactTestUtils.Simulate.keyDown(menuButtonElement,
{
which: KeyCodes.down
which: KeyCodes.down,
altKey: true
});
expect(renderedDOM.getAttribute('aria-expanded')).toEqual('true');
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,11 @@ export const getStyles = memoizeFunction((
justifyContent: 'center',
alignItems: 'center'
},

splitButtonContainerDisabled: {
outline: 'none',
border: 'none'
}
};

return concatStyleSets(splitButtonStyles, customStyles)!;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,33 @@ export class ButtonSplitExample extends React.Component<IButtonProps> {
} }
/>
</div>
<div>
<Label>Button Disabled</Label>
<DefaultButton
primary
data-automation-id='test'
disabled={ true }
checked={ checked }
text='Create account'
onClick={ alertClicked }
split={ true }
style={ { height: '35px' } }
menuProps={ {
items: [
{
key: 'emailMessage',
name: 'Email message',
icon: 'Mail'
},
{
key: 'calendarEvent',
name: 'Calendar event',
icon: 'Calendar'
}
]
} }
/>
</div>
</div>
);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,13 @@ export const getItemClassNames = memoizeFunction((
'ms-ContextualMenu-itemText',
styles.label
],
splitContainer: styles.splitButtonFlexContainer,
splitContainer: [
styles.splitButtonFlexContainer,
!disabled && !checked && [{
selectors: {
'.ms-Fabric.is-focusVisible &:focus, .ms-Fabric.is-focusVisible &:focus:hover': styles.rootFocused,
}
}]
],
});
});
Original file line number Diff line number Diff line change
Expand Up @@ -154,13 +154,14 @@ export const getMenuItemStyles = memoizeFunction((
flexShrink: '0',
fontSize: FontSizes.mini
},
splitButtonFlexContainer: {
display: 'flex',
height: ContextualMenuItemHeight,
flexWrap: 'nowrap',
justifyContent: 'center',
alignItems: 'center'
},
splitButtonFlexContainer: [
getFocusStyle(theme), {
display: 'flex',
height: ContextualMenuItemHeight,
flexWrap: 'nowrap',
justifyContent: 'center',
alignItems: 'center',
}],
splitButtonSeparator: {}
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -591,18 +591,21 @@ export class ContextualMenu extends BaseComponent<IContextualMenuProps, IContext

return (
<div
role={ 'button' }
aria-labelledby={ item.ariaLabel }
className={ classNames.splitContainer }
aria-disabled={ this._isItemDisabled(item) }
aria-haspopup={ true }
aria-describedby={ item.ariaDescription }
aria-checked={ item.isChecked || item.checked }
aria-posinset={ focusableElementIndex + 1 }
aria-setsize={ totalItemCount }
onKeyDown={ this._onSplitContainerItemKeyDown.bind(this, item) }
onClick={ this._executeItemClick.bind(this, item) }
tabIndex={ 0 }
data-is-focusable={ true }
>
<span
aria-hidden={ true }
className={ classNames.splitContainer }
>
<span aria-hidden={ true }>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

since the flex classname is on the div rather than the span, that just means that the span will flex to fit, but there's only one element so it will always be able to fit. Should this span have been deleted? The contents of the span should likely still be flexed.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I put it back, because I wanted to have a way to have aria-hidden for all the child elements, but seeing as each of the pieces in the child element is uniquely created here, I don't see the harm in adding aria-hidden to each of the individual pieces.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is there any reason why we aren't just putting the span back to the way it was before this change (the more scoped we make the change the better, and making this change doesn't seem necessary)?

{ this._renderSplitPrimaryButton(item, classNames, index, hasCheckmarks!, hasIcons!) }
{ this._renderSplitDivider(item) }
{ this._renderSplitIconButton(item, classNames, index) }
Expand All @@ -620,7 +623,6 @@ export class ContextualMenu extends BaseComponent<IContextualMenuProps, IContext

const itemProps = {
key: item.key,
onClick: this._executeItemClick.bind(this, item),
disabled: this._isItemDisabled(item) || item.primaryDisabled,
name: item.name,
className: classNames.splitPrimary,
Expand All @@ -629,14 +631,25 @@ export class ContextualMenu extends BaseComponent<IContextualMenuProps, IContext
isChecked: item.isChecked,
checked: item.checked,
icon: item.icon,
iconProps: item.iconProps
iconProps: item.iconProps,
'data-is-focusable': false
} as IContextualMenuItem;
return React.createElement('button',
getNativeProps(itemProps, buttonProperties),
<ChildrenRenderer item={ itemProps } classNames={ classNames } index={ index } onCheckmarkClick={ hasCheckmarks ? this._onItemClick : undefined } hasIcons={ hasIcons } />,
);
}

private _onSplitContainerItemKeyDown(item: any, ev: React.KeyboardEvent<HTMLElement>) {
if (ev.which === KeyCodes.enter) {
this._executeItemClick(item, ev);
ev.preventDefault();
ev.stopPropagation();
} else {
this._onItemKeyDown(item, ev);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm pretty sure you don't need this else as the event will continue to propagate to the next event handler.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's an interesting point to discuss, if we press enter, on a button, that's the equivalent of pressing the onClick event, but should we also try to handle the onKeyDown event too? @jspurlin what do you think?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@chang47 you are correct, in this case (handling enter) we want to tie that with executeItemClick and not also fire onItemKeyDown

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In the if statement you should prevent default and stop propagation, since it will propagate up to the keyhandler that's on the root unless you stop propagation.

}
}

private _renderSplitIconButton(item: IContextualMenuItem, classNames: IMenuItemClassNames, index: number) {
const { contextualMenuItemAs: ChildrenRenderer = ContextualMenuItem } = this.props;
const itemProps = {
Expand All @@ -650,11 +663,11 @@ export class ContextualMenu extends BaseComponent<IContextualMenuProps, IContext

return React.createElement('button',
assign({}, getNativeProps(itemProps, buttonProperties), {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Have splitButtons in menus been updated to behave the same way that splitButtons outside of menus behave? I think they will need to be updated at least to put focus on the container before the menu expands (so that focus will go back to the container when the menu collapses)

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Style wise, it has the same hover affect, because I did use the getFocusStyle, unfortunately, I introduced a regression somewhere with the styles and it's not looking right. I'm looking back at how to fix it.

As for putting the focus back, you're right that's something we should have. I'll add that in.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The base button changes should apply to the contextual menu for free. the only possible change might be when we open a sub menu, but I don't think that'll be an issue as we have to focus on the split button in the contextual menu to open it.

In the end, after we close all the sub-menu we should put our focus back to the button that opened the contextual menu anyways.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I retract my earlier statement, like we discussed offline there was a case where if we keyboard on the menu and then hover over a split button menu and hit escape we would focus on the split button and not whole div. I've fixed that.

onKeyDown: this._onItemKeyDown.bind(this, item),
onMouseEnter: this._onItemMouseEnter.bind(this, item),
onMouseLeave: this._onMouseItemLeave.bind(this, item),
onMouseDown: (ev: any) => this._onItemMouseDown(item, ev),
onMouseMove: this._onItemMouseMove.bind(this, item)
onMouseMove: this._onItemMouseMove.bind(this, item),
'data-is-focusable': false
}),
<ChildrenRenderer item={ itemProps } classNames={ classNames } index={ index } hasIcons={ false } />
);
Expand Down Expand Up @@ -856,7 +869,7 @@ export class ContextualMenu extends BaseComponent<IContextualMenuProps, IContext
ev.stopPropagation();
}

private _executeItemClick(item: IContextualMenuItem, ev: React.MouseEvent<HTMLElement>) {
private _executeItemClick(item: IContextualMenuItem, ev: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>) {
if (item.disabled || item.isDisabled) {
return;
}
Expand All @@ -870,10 +883,10 @@ export class ContextualMenu extends BaseComponent<IContextualMenuProps, IContext
(dismiss || !ev.defaultPrevented) && this.dismiss(ev, true);
}

private _onItemKeyDown(item: any, ev: KeyboardEvent) {
private _onItemKeyDown(item: any, ev: React.KeyboardEvent<HTMLElement>) {
const openKey = getRTL() ? KeyCodes.left : KeyCodes.right;

if (ev.which === openKey) {
if (ev.which === openKey && !item.disabled) {
this._onItemSubMenuExpand(item, ev.currentTarget as HTMLElement);
ev.preventDefault();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -138,7 +138,7 @@ export interface IContextualMenuProps extends React.Props<ContextualMenu>, IWith
* menu item.
* Returning true will dismiss the menu even if ev.preventDefault() was called.
*/
onItemClick?: (ev?: React.MouseEvent<HTMLElement>, item?: IContextualMenuItem) => boolean | void;
onItemClick?: (ev?: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>, item?: IContextualMenuItem) => boolean | void;

/**
* CSS class to apply to the context menu.
Expand Down Expand Up @@ -329,7 +329,7 @@ export interface IContextualMenuItem {
* Callback issued when the menu item is invoked. If ev.preventDefault() is called in onClick, click will not close menu.
* Returning true will dismiss the menu even if ev.preventDefault() was called.
*/
onClick?: (ev?: React.MouseEvent<HTMLElement>, item?: IContextualMenuItem) => boolean | void;
onClick?: (ev?: React.MouseEvent<HTMLElement> | React.KeyboardEvent<HTMLElement>, item?: IContextualMenuItem) => boolean | void;

/**
* An optional URL to navigate to upon selection
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export interface IContextualMenuMultiselectExampleState {
selection?: { [key: string]: boolean };
}

const keys: string[] = ['newItem', 'share', 'mobile', 'enablePrint', 'enableMusic', 'newSub', 'emailMessage', 'calendarEvent'];
const keys: string[] = ['newItem', 'share', 'mobile', 'enablePrint', 'enableMusic', 'newSub', 'emailMessage', 'calendarEvent', 'disabledNewSub', 'disabledEmailMessage', 'disabledCalendarEvent'];

export class ContextualMenuCheckmarksExample extends React.Component<{}, IContextualMenuMultiselectExampleState> {

Expand Down Expand Up @@ -102,6 +102,36 @@ export class ContextualMenuCheckmarksExample extends React.Component<{}, IContex
split: true,
onClick: this._onToggleSelect,
},
{
key: keys[8],
iconProps: {
iconName: 'MusicInCollectionFill'
},
subMenuProps: {
items: [
{
key: keys[6],
name: 'Email message',
canCheck: true,
isChecked: selection![keys[9]],
onClick: this._onToggleSelect
},
{
key: keys[7],
name: 'Calendar event',
canCheck: true,
isChecked: selection![keys[10]],
onClick: this._onToggleSelect
}
],
},
name: 'Split Button',
canCheck: true,
isChecked: selection![keys[8]],
split: true,
onClick: this._onToggleSelect,
disabled: true
},
]
}
}
Expand Down
Loading