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

Commit 1e45c44

Browse files
aperlmmalerba
authored andcommitted
feat(autocomplete): Add md-autocomplete-snap="width" (#7750)
* add xw-autocomplete-wrap-override * fix white space and description * create md-autocomplete-warp="width" * add md-autocomplete-snap documentation * move if statement * add md-autocomplete-snap tests * fix merge error
1 parent cf38b29 commit 1e45c44

File tree

3 files changed

+99
-9
lines changed

3 files changed

+99
-9
lines changed

src/components/autocomplete/autocomplete.spec.js

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2659,4 +2659,68 @@ describe('<md-autocomplete>', function() {
26592659
element.remove();
26602660
});
26612661

2662-
});
2662+
describe('md-autocomplete-snap', function() {
2663+
it('should match the width of the snap element if width is set', inject(function($timeout, $material) {
2664+
var template = '\
2665+
<div style="width: 1000px" md-autocomplete-snap="width">\
2666+
<md-autocomplete\
2667+
md-selected-item="selectedItem"\
2668+
md-search-text="searchText"\
2669+
md-items="item in match(searchText)"\
2670+
md-item-text="item.display"\
2671+
placeholder="placeholder"\
2672+
style="width:200px">\
2673+
<span md-highlight-text="searchText">{{item.display}}</span>\
2674+
</md-autocomplete>\
2675+
</div>';
2676+
var scope = createScope();
2677+
var element = compile(template, scope);
2678+
var autoEl = element.find('md-autocomplete');
2679+
var ctrl = autoEl.controller('mdAutocomplete');
2680+
var ul = element.find('ul');
2681+
2682+
angular.element(document.body).append(element);
2683+
2684+
$material.flushInterimElement();
2685+
ctrl.focus();
2686+
2687+
autoEl.scope().searchText = 'fo';
2688+
waitForVirtualRepeat(autoEl);
2689+
2690+
expect(ul[0].offsetWidth).toBe(1000);
2691+
element.remove();
2692+
}));
2693+
2694+
it('should match the width of the wrap element if width is not set', inject(function($timeout, $material) {
2695+
var template = '\
2696+
<div style="width: 1000px" md-autocomplete-snap>\
2697+
<md-autocomplete\
2698+
md-selected-item="selectedItem"\
2699+
md-search-text="searchText"\
2700+
md-items="item in match(searchText)"\
2701+
md-item-text="item.display"\
2702+
placeholder="placeholder"\
2703+
style="width:200px">\
2704+
<span md-highlight-text="searchText">{{item.display}}</span>\
2705+
</md-autocomplete>\
2706+
</div>';
2707+
var scope = createScope();
2708+
var element = compile(template, scope);
2709+
var autoEl = element.find('md-autocomplete');
2710+
var ctrl = autoEl.controller('mdAutocomplete');
2711+
var ul = element.find('ul');
2712+
2713+
angular.element(document.body).append(element);
2714+
2715+
$material.flushInterimElement();
2716+
ctrl.focus();
2717+
2718+
autoEl.scope().searchText = 'fo';
2719+
waitForVirtualRepeat(autoEl);
2720+
2721+
expect(ul[0].offsetWidth).toBe(200);
2722+
element.remove();
2723+
}));
2724+
});
2725+
2726+
});

src/components/autocomplete/js/autocompleteController.js

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -251,32 +251,50 @@ function MdAutocompleteCtrl ($scope, $element, $mdUtil, $mdConstant, $mdTheming,
251251
* Gathers all of the elements needed for this controller
252252
*/
253253
function gatherElements () {
254+
255+
var snapWrap = gatherSnapWrap();
256+
254257
elements = {
255258
main: $element[0],
256259
scrollContainer: $element[0].querySelector('.md-virtual-repeat-container'),
257260
scroller: $element[0].querySelector('.md-virtual-repeat-scroller'),
258261
ul: $element.find('ul')[0],
259262
input: $element.find('input')[0],
260-
wrap: $element.find('md-autocomplete-wrap')[0],
263+
wrap: snapWrap.wrap,
264+
snap: snapWrap.snap,
261265
root: document.body
262266
};
263267

264268
elements.li = elements.ul.getElementsByTagName('li');
265-
elements.snap = getSnapTarget();
266269
elements.$ = getAngularElements(elements);
267270

268271
inputModelCtrl = elements.$.input.controller('ngModel');
269272
}
270273

271274
/**
272-
* Finds the element that the menu will base its position on
273-
* @returns {*}
275+
* Gathers the snap and wrap elements
276+
*
274277
*/
275-
function getSnapTarget () {
276-
for (var element = $element; element.length; element = element.parent()) {
277-
if (angular.isDefined(element.attr('md-autocomplete-snap'))) return element[ 0 ];
278+
function gatherSnapWrap() {
279+
var element;
280+
var value;
281+
for (element = $element; element.length; element = element.parent()) {
282+
value = element.attr('md-autocomplete-snap');
283+
if (angular.isDefined(value)) break;
278284
}
279-
return elements.wrap;
285+
286+
if (element.length) {
287+
return {
288+
snap: element[0],
289+
wrap: (value.toLowerCase() === 'width') ? element[0] : $element.find('md-autocomplete-wrap')[0]
290+
};
291+
}
292+
293+
var wrap = $element.find('md-autocomplete-wrap')[0];
294+
return {
295+
snap: wrap,
296+
wrap: wrap
297+
};
280298
}
281299

282300
/**

src/components/autocomplete/js/autocompleteDirective.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,15 @@ angular
3434
*
3535
* There is an example below of how this should look.
3636
*
37+
* ### Snapping Drop-Down
38+
*
39+
* You can cause the autocomplete drop-down to snap to an ancestor element by applying the
40+
* `md-autocomplete-snap` attribute to that element. You can also snap to the width of
41+
* the `md-autocomplete-snap` element by setting the attribute's value to `width`
42+
* (ie. `md-autocomplete-snap="width"`).
43+
*
3744
* ### Notes
45+
*
3846
* **Autocomplete Dropdown Items Rendering**
3947
*
4048
* The `md-autocomplete` uses the the <a ng-href="api/directive/mdVirtualRepeatContainer">VirtualRepeat</a>

0 commit comments

Comments
 (0)