Skip to content
This repository was archived by the owner on Sep 5, 2024. It is now read-only.

Commit f2fca2e

Browse files
committed
fix(select): md-select-header closes on mouse click when not using multiple
- if the click event came from within a `md-select-header`, `stopImmediatePropagation()` to keep the menu from closing - fix demo's input being too short to display label when 'Kale' is selected - rename some events and add types - update select header input's placeholder and add an aria-label Fixes #11969
1 parent 3205b33 commit f2fca2e

File tree

5 files changed

+49
-34
lines changed

5 files changed

+49
-34
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
md-input-container {
2-
margin-right: 10px;
2+
margin-right: 10px;
33
}

src/components/select/demoSelectHeader/index.html

+6-6
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,17 @@ <h1 class="md-title">Pick a vegetable below</h1>
66
<label>Vegetables</label>
77
<md-select ng-model="selectedVegetables"
88
md-on-close="clearSearchTerm()"
9-
data-md-container-class="selectdemoSelectHeader"
9+
md-container-class="selectdemoSelectHeader"
1010
multiple>
1111
<md-select-header class="demo-select-header">
12-
<input ng-model="searchTerm"
13-
type="search"
14-
placeholder="Search for a vegetable.."
12+
<input ng-model="searchTerm" aria-label="Vegetable filter"
13+
type="search" placeholder="Ex. Onions"
1514
class="demo-header-searchbox md-text">
1615
</md-select-header>
1716
<md-optgroup label="vegetables">
18-
<md-option ng-value="vegetable" ng-repeat="vegetable in vegetables |
19-
filter:searchTerm">{{vegetable}}</md-option>
17+
<md-option ng-value="vegetable" ng-repeat="vegetable in vegetables | filter:searchTerm">
18+
{{vegetable}}
19+
</md-option>
2020
</md-optgroup>
2121
</md-select>
2222
</md-input-container>
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
1-
angular
2-
.module('selectDemoSelectHeader', ['ngMaterial'])
3-
.controller('SelectHeaderController', function($scope, $element) {
4-
$scope.vegetables = ['Corn' ,'Onions' ,'Kale' ,'Arugula' ,'Peas', 'Zucchini'];
5-
$scope.searchTerm;
6-
$scope.clearSearchTerm = function() {
7-
$scope.searchTerm = '';
8-
};
9-
// The md-select directive eats keydown events for some quick select
10-
// logic. Since we have a search input here, we don't need that logic.
11-
$element.find('input').on('keydown', function(ev) {
12-
ev.stopPropagation();
13-
});
1+
(function () {
2+
'use strict';
3+
angular.module('selectDemoSelectHeader', ['ngMaterial'])
4+
.controller('SelectHeaderController', function ($scope, $element) {
5+
$scope.vegetables = ['Corn', 'Onions', 'Kale', 'Arugula', 'Peas', 'Zucchini'];
6+
$scope.searchTerm = '';
7+
$scope.clearSearchTerm = function () {
8+
$scope.searchTerm = '';
9+
};
10+
// The md-select directive eats keydown events for some quick select
11+
// logic. Since we have a search input here, we don't need that logic.
12+
$element.find('input').on('keydown', function (ev) {
13+
ev.stopPropagation();
1414
});
15+
});
16+
})();
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,24 @@
11
/* Please note: All these selectors are only applied to children of elements with the 'selectdemoSelectHeader' class */
2-
32
.demo-header-searchbox {
43
border: none;
54
outline: none;
65
height: 100%;
76
width: 100%;
87
padding: 0;
98
}
10-
119
.demo-select-header {
1210
box-shadow: 0 1px 0 0 rgba(0, 0, 0, 0.1), 0 0 0 0 rgba(0, 0, 0,
1311
0.14), 0 0 0 0 rgba(0, 0, 0, 0.12);
14-
padding-left: 10.667px;
12+
padding-left: 16px;
1513
height: 48px;
1614
cursor: pointer;
1715
position: relative;
1816
display: flex;
19-
align-items: center;
2017
width: auto;
2118
}
22-
2319
md-content._md {
2420
max-height: 240px;
2521
}
22+
md-input-container {
23+
min-width: 112px;
24+
}

src/components/select/select.js

+23-9
Original file line numberDiff line numberDiff line change
@@ -688,19 +688,33 @@ function SelectMenuDirective($parse, $mdUtil, $mdConstant, $mdTheming) {
688688
element.on('click', clickListener);
689689
element.on('keypress', keyListener);
690690

691-
function keyListener(e) {
692-
if (e.keyCode === 13 || e.keyCode === 32) {
693-
clickListener(e);
691+
/**
692+
* @param {KeyboardEvent} keyboardEvent
693+
*/
694+
function keyListener(keyboardEvent) {
695+
if (keyboardEvent.keyCode === 13 || keyboardEvent.keyCode === 32) {
696+
clickListener(keyboardEvent);
694697
}
695698
}
696699

697-
function clickListener(ev) {
698-
var option = $mdUtil.getClosest(ev.target, 'md-option');
700+
/**
701+
* @param {Event} mouseEvent
702+
* @return {void}
703+
*/
704+
function clickListener(mouseEvent) {
705+
var option = $mdUtil.getClosest(mouseEvent.target, 'md-option');
699706
var optionCtrl = option && angular.element(option).data('$mdOptionController');
700-
if (!option || !optionCtrl) return;
701-
if (option.hasAttribute('disabled')) {
702-
ev.stopImmediatePropagation();
703-
return false;
707+
708+
if (!option || !optionCtrl) {
709+
// Avoid closing the menu when the select header's input is clicked
710+
if (mouseEvent.target && mouseEvent.target.parentNode &&
711+
mouseEvent.target.parentNode.tagName === 'MD-SELECT-HEADER') {
712+
mouseEvent.stopImmediatePropagation();
713+
}
714+
return;
715+
} else if (option.hasAttribute('disabled')) {
716+
mouseEvent.stopImmediatePropagation();
717+
return;
704718
}
705719

706720
var optionHashKey = selectMenuCtrl.hashGetter(optionCtrl.value);

0 commit comments

Comments
 (0)