From 0895b26fb7628adc512cc871736e1c90bdf53a51 Mon Sep 17 00:00:00 2001 From: cagataycivici Date: Wed, 19 Dec 2018 23:35:15 +0300 Subject: [PATCH] Fixed #691 - Keyboard Accessibility for MultiSelect --- src/components/multiselect/MultiSelect.js | 72 ++++++++++++++++--- .../multiselect/MultiSelectHeader.js | 10 +-- src/components/multiselect/MultiSelectItem.js | 31 +++++--- 3 files changed, 86 insertions(+), 27 deletions(-) diff --git a/src/components/multiselect/MultiSelect.js b/src/components/multiselect/MultiSelect.js index 2306ee2998..a48b4a05e3 100644 --- a/src/components/multiselect/MultiSelect.js +++ b/src/components/multiselect/MultiSelect.js @@ -21,6 +21,7 @@ export class MultiSelect extends Component { defaultLabel: 'Choose', disabled: false, filter: false, + tabIndex: '0', dataKey: null, appendTo: null, tooltip: null, @@ -41,6 +42,7 @@ export class MultiSelect extends Component { defaultLabel: PropTypes.string, disabled: PropTypes.bool, filter: PropTypes.bool, + tabIndex: PropTypes.string, dataKey: PropTypes.string, appendTo: PropTypes.object, tooltip: PropTypes.string, @@ -59,6 +61,7 @@ export class MultiSelect extends Component { this.onClick = this.onClick.bind(this); this.onPanelClick = this.onPanelClick.bind(this); this.onOptionClick = this.onOptionClick.bind(this); + this.onOptionKeyDown = this.onOptionKeyDown.bind(this); this.onFocus = this.onFocus.bind(this); this.onBlur = this.onBlur.bind(this); this.onFilter = this.onFilter.bind(this); @@ -79,6 +82,59 @@ export class MultiSelect extends Component { this.updateModel(event.originalEvent, newValue); } + onOptionKeyDown(event) { + let listItem = event.originalEvent.currentTarget; + + switch(event.originalEvent.which) { + //down + case 40: + var nextItem = this.findNextItem(listItem); + if (nextItem) { + nextItem.focus(); + } + + event.originalEvent.preventDefault(); + break; + + //up + case 38: + var prevItem = this.findPrevItem(listItem); + if (prevItem) { + prevItem.focus(); + } + + event.originalEvent.preventDefault(); + break; + + //enter + case 13: + this.onOptionClick(event); + event.originalEvent.preventDefault(); + break; + + default: + break; + } + } + + findNextItem(item) { + let nextItem = item.nextElementSibling; + + if (nextItem) + return !DomHandler.hasClass(nextItem, 'p-multiselect-item') ? this.findNextItem(nextItem) : nextItem; + else + return null; + } + + findPrevItem(item) { + let prevItem = item.previousElementSibling; + + if (prevItem) + return !DomHandler.hasClass(prevItem, 'p-multiselect-item') ? this.findPrevItem(prevItem) : prevItem; + else + return null; + } + onClick() { if(this.props.disabled) { return; @@ -364,12 +420,8 @@ export class MultiSelect extends Component { } render() { - let className = classNames('p-multiselect p-component', this.props.className, { - 'p-disabled': this.props.disabled - }); - + let className = classNames('p-multiselect p-component', this.props.className, {'p-disabled': this.props.disabled}); let label = this.renderLabel(); - let items = this.props.options; if (items) { @@ -380,8 +432,10 @@ export class MultiSelect extends Component { items = items.map((option, index) => { let optionLabel = this.getOptionLabel(option); - return ; + return ( + + ); }); } @@ -390,7 +444,7 @@ export class MultiSelect extends Component { return (
this.container = el} style={this.props.style}>
- {this.focusInput = el;}}/> + this.focusInput = el} />
@@ -398,7 +452,7 @@ export class MultiSelect extends Component {
- this.panel = el} header={header} appendTo={this.props.appendTo} onClick={this.onPanelClick} + this.panel = el} header={header} appendTo={this.props.appendTo} onClick={this.onPanelClick} scrollHeight={this.props.scrollHeight}> {items} diff --git a/src/components/multiselect/MultiSelectHeader.js b/src/components/multiselect/MultiSelectHeader.js index 3d7cbf7b25..966d646426 100644 --- a/src/components/multiselect/MultiSelectHeader.js +++ b/src/components/multiselect/MultiSelectHeader.js @@ -1,6 +1,7 @@ import React, {Component} from 'react'; import PropTypes from 'prop-types'; import {InputText} from '../inputtext/InputText'; +import {Checkbox} from '../checkbox/Checkbox'; import classNames from 'classnames'; export class MultiSelectHeader extends Component { @@ -62,14 +63,7 @@ export class MultiSelectHeader extends Component { return (
-
-
- -
-
- -
-
+ {filterElement}