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

Commit b32b473

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 (cherry picked from commit f2fca2e)
1 parent f27d30e commit b32b473

File tree

5 files changed

+49
-34
lines changed

5 files changed

+49
-34
lines changed

Diff for: src/components/select/demoBasicUsage/style.css

+1-1
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
}

Diff for: 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>

Diff for: src/components/select/demoSelectHeader/script.js

+15-13
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+
})();

Diff for: src/components/select/demoSelectHeader/style.css

+4-5
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+
}

Diff for: src/components/select/select.js

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

688-
function keyListener(e) {
689-
if (e.keyCode === 13 || e.keyCode === 32) {
690-
clickListener(e);
688+
/**
689+
* @param {KeyboardEvent} keyboardEvent
690+
*/
691+
function keyListener(keyboardEvent) {
692+
if (keyboardEvent.keyCode === 13 || keyboardEvent.keyCode === 32) {
693+
clickListener(keyboardEvent);
691694
}
692695
}
693696

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

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

0 commit comments

Comments
 (0)