|
@@ -250,6 +250,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
|
|
|
optionListStyle: PropTypes.object,
|
|
|
searchRender: PropTypes.oneOfType([PropTypes.func, PropTypes.bool]),
|
|
|
renderSelectedItem: PropTypes.func,
|
|
|
+ 'aria-label': PropTypes.string,
|
|
|
};
|
|
|
|
|
|
static defaultProps: Partial<TreeSelectProps> = {
|
|
@@ -278,6 +279,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
|
|
|
expandAction: false,
|
|
|
clickToHide: true,
|
|
|
searchAutoFocus: false,
|
|
|
+ 'aria-label': 'TreeSelect'
|
|
|
};
|
|
|
inputRef: React.RefObject<typeof Input>;
|
|
|
tagInputRef: React.RefObject<TagInput>;
|
|
@@ -288,6 +290,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
|
|
|
onNodeClick: any;
|
|
|
onNodeDoubleClick: any;
|
|
|
onMotionEnd: any;
|
|
|
+ treeSelectID: string;
|
|
|
|
|
|
constructor(props: TreeSelectProps) {
|
|
|
super(props);
|
|
@@ -323,6 +326,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
|
|
|
this.optionsRef = React.createRef();
|
|
|
this.clickOutsideHandler = null;
|
|
|
this.foundation = new TreeSelectFoundation(this.adapter);
|
|
|
+ this.treeSelectID = Math.random().toString(36).slice(2);
|
|
|
}
|
|
|
|
|
|
// eslint-disable-next-line max-lines-per-function
|
|
@@ -645,7 +649,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
|
|
|
const style = { minWidth: dropdownMinWidth, ...dropdownStyle };
|
|
|
const popoverCls = cls(dropdownClassName, `${prefixcls}-popover`);
|
|
|
return (
|
|
|
- <div className={popoverCls} role="listbox" style={style}>
|
|
|
+ <div className={popoverCls} style={style}>
|
|
|
{this.renderTree()}
|
|
|
</div>
|
|
|
);
|
|
@@ -659,6 +663,10 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
|
|
|
this.foundation.handleClick(e);
|
|
|
};
|
|
|
|
|
|
+ handleSelectionEnterPress = (e: React.KeyboardEvent<HTMLDivElement>) => {
|
|
|
+ this.foundation.handleSelectionEnterPress(e);
|
|
|
+ };
|
|
|
+
|
|
|
showClearBtn = () => {
|
|
|
const { searchPosition } = this.props;
|
|
|
const { inputValue } = this.state;
|
|
@@ -794,6 +802,11 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
|
|
|
this.foundation.handleClear(e);
|
|
|
};
|
|
|
|
|
|
+ handleClearEnterPress = (e: React.KeyboardEvent<HTMLDivElement>) => {
|
|
|
+ e && e.stopPropagation();
|
|
|
+ this.foundation.handleClearEnterPress(e);
|
|
|
+ };
|
|
|
+
|
|
|
handleMouseOver = (e: React.MouseEvent) => {
|
|
|
this.foundation.toggleHoverState(true);
|
|
|
};
|
|
@@ -824,7 +837,14 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
|
|
|
const clearCls = cls(`${prefixcls}-clearbtn`);
|
|
|
if (showClearBtn) {
|
|
|
return (
|
|
|
- <div className={clearCls} onClick={this.handleClear} role='button' tabIndex={0}>
|
|
|
+ <div
|
|
|
+ role='button'
|
|
|
+ tabIndex={0}
|
|
|
+ aria-label="Clear TreeSelect value"
|
|
|
+ className={clearCls}
|
|
|
+ onClick={this.handleClear}
|
|
|
+ onKeyPress={this.handleClearEnterPress}
|
|
|
+ >
|
|
|
<IconClear />
|
|
|
</div>
|
|
|
);
|
|
@@ -914,25 +934,30 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
|
|
|
<Fragment key={'arrow'}>{this.renderArrow()}</Fragment>,
|
|
|
]
|
|
|
);
|
|
|
+ const tabIndex = disabled ? null : 0;
|
|
|
/**
|
|
|
* Reasons for disabling the a11y eslint rule:
|
|
|
* The following attributes(aria-controls,aria-expanded) will be automatically added by Tooltip, no need to declare here
|
|
|
*/
|
|
|
return (
|
|
|
<div
|
|
|
+ // eslint-disable-next-line jsx-a11y/role-has-required-aria-props
|
|
|
+ role='combobox'
|
|
|
+ aria-disabled={disabled}
|
|
|
+ aria-haspopup="tree"
|
|
|
+ tabIndex={tabIndex}
|
|
|
className={classNames}
|
|
|
style={style}
|
|
|
ref={this.triggerRef}
|
|
|
onClick={this.handleClick}
|
|
|
+ onKeyPress={this.handleSelectionEnterPress}
|
|
|
aria-invalid={this.props['aria-invalid']}
|
|
|
aria-errormessage={this.props['aria-errormessage']}
|
|
|
+ aria-label={this.props['aria-label']}
|
|
|
aria-labelledby={this.props['aria-labelledby']}
|
|
|
aria-describedby={this.props['aria-describedby']}
|
|
|
aria-required={this.props['aria-required']}
|
|
|
{...mouseEvent}
|
|
|
- // eslint-disable-next-line jsx-a11y/role-has-required-aria-props
|
|
|
- role='combobox'
|
|
|
- tabIndex={0}
|
|
|
>
|
|
|
{inner}
|
|
|
</div>
|
|
@@ -1077,6 +1102,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
|
|
|
}
|
|
|
return (
|
|
|
<Input
|
|
|
+ aria-label='Filter TreeSelect item'
|
|
|
ref={this.inputRef as any}
|
|
|
autofocus={searchAutoFocus}
|
|
|
placeholder={placeholder}
|
|
@@ -1255,7 +1281,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
|
|
|
labelEllipsis: typeof labelEllipsis === 'undefined' ? virtualize : labelEllipsis,
|
|
|
}}
|
|
|
>
|
|
|
- <div className={wrapperCls} role="listbox">
|
|
|
+ <div className={wrapperCls}>
|
|
|
{outerTopSlot}
|
|
|
{
|
|
|
!outerTopSlot &&
|
|
@@ -1263,7 +1289,7 @@ class TreeSelect extends BaseComponent<TreeSelectProps, TreeSelectState> {
|
|
|
isDropdownPositionSearch &&
|
|
|
this.renderInput()
|
|
|
}
|
|
|
- <div className={listCls} role="tree" style={optionListStyle}>
|
|
|
+ <div className={listCls} role="tree" aria-multiselectable={multiple ? true : false} style={optionListStyle}>
|
|
|
{noData ? this.renderEmpty() : this.renderNodeList()}
|
|
|
</div>
|
|
|
{outerBottomSlot}
|