UNPKG

mdc-autocomplete-list

Version:

MdcAutocomplete in conjunction with MdcAutocompleteList and MdcAutocompleteListItem are a pack of angular components to provide an autocomplete functionality to Angular MDC web.

209 lines (208 loc) 19.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { Component, ContentChildren, QueryList, Input, Output } from '@angular/core'; import { MdcAutocompleteListItem } from 'mdc-autocomplete-list-item'; import { Subject } from 'rxjs'; // tslint:disable-next-line:component-class-suffix export class MdcAutocompleteList { constructor() { this.itemSelected = new Subject(); this.maxVisibleItems = Number.POSITIVE_INFINITY; this._visible = false; this._filter = ''; } /** * @return {?} */ get visible() { return this._visible; } /** * @param {?} v * @return {?} */ set visible(v) { this._visible = v; if (v) { this.filterItems(); this.focusFirstItem(); } else { this.unfocusAllItems(); } } /** * @return {?} */ get filter() { return this._filter; } /** * @param {?} f * @return {?} */ set filter(f) { this._filter = f; this.filterItems(); this.focusFirstItem(); } /** * @return {?} */ ngOnInit() { } /** * @return {?} */ ngAfterContentChecked() { this.autocompleteListItems.toArray().forEach((item) => { if (item.itemClicked.observers.length === 0) { // Only allow one subscription item.itemClicked.subscribe((itemValue) => { this.itemSelected.next(itemValue); }); } if (item.itemHovered.observers.length === 0) { // Only allow one subscription item.itemHovered.subscribe((itemValue) => { this.unfocusAllItems(); item.focused = true; }); } }); } /** * @return {?} */ unfocusAllItems() { this.autocompleteListItems.toArray().forEach((item) => { item.focused = false; }); } /** * @return {?} */ focusNextItem() { /** @type {?} */ const focusedItems = this.autocompleteListItems.filter((item, index, list) => item.focused); /** @type {?} */ const focusedItem = focusedItems.length > 0 ? focusedItems[0] : null; /** @type {?} */ const visibleItems = this.autocompleteListItems.filter((item, index, list) => item.visible); if (focusedItem) { /** @type {?} */ const focusedItemIndex = visibleItems.indexOf(focusedItem); /** @type {?} */ const nextFocusedItem = (visibleItems.length >= focusedItemIndex + 1) ? visibleItems[focusedItemIndex + 1] : null; if (nextFocusedItem) { focusedItem.focused = false; nextFocusedItem.focused = true; nextFocusedItem.scrollIntoView(); } } else { if (visibleItems.length > 0) { visibleItems[0].focused = true; } } } /** * @return {?} */ focusPreviousItem() { /** @type {?} */ const focusedItems = this.autocompleteListItems.filter((item, index, list) => item.focused); /** @type {?} */ const focusedItem = focusedItems.length > 0 ? focusedItems[0] : null; /** @type {?} */ const visibleItems = this.autocompleteListItems.filter((item, index, list) => item.visible); if (focusedItem) { /** @type {?} */ const focusedItemIndex = visibleItems.indexOf(focusedItem); /** @type {?} */ const previousFocusedItem = (focusedItemIndex > 0) ? visibleItems[focusedItemIndex - 1] : null; if (previousFocusedItem) { focusedItem.focused = false; previousFocusedItem.focused = true; previousFocusedItem.scrollIntoView(); } } else { if (visibleItems.length > 0) { visibleItems[0].focused = true; } } } /** * @return {?} */ focusFirstItem() { this.unfocusAllItems(); /** @type {?} */ const visibleItems = this.autocompleteListItems.filter((item, index, list) => item.visible); if (visibleItems.length > 0) { visibleItems[0].focused = true; } } /** * @return {?} */ selectFocusedItem() { /** @type {?} */ const focusedItems = this.autocompleteListItems.filter((item, index, list) => item.focused); /** @type {?} */ const focusedItem = focusedItems.length > 0 ? focusedItems[0] : null; if (focusedItem) { this.itemSelected.next(focusedItem.value); } } /** * @return {?} */ filterItems() { /** @type {?} */ let showing = 0; this.autocompleteListItems.forEach((item, index, list) => { if (showing < this.maxVisibleItems && item.filterString.toUpperCase().includes(this._filter.toUpperCase())) { item.visible = true; showing++; } else { item.visible = false; item.focused = false; } }); } } MdcAutocompleteList.decorators = [ { type: Component, args: [{ selector: 'mdc-autocomplete-list', template: `<ul *ngIf="visible" class="mdc-elevation--z2"> <ng-content></ng-content> </ul> `, styles: [`ul{position:absolute;min-width:200px;max-height:400px;padding:0;margin:0;background-color:#fff;overflow-y:scroll;list-style:none}`] },] }, ]; /** @nocollapse */ MdcAutocompleteList.ctorParameters = () => []; MdcAutocompleteList.propDecorators = { maxVisibleItems: [{ type: Input }], itemSelected: [{ type: Output }], autocompleteListItems: [{ type: ContentChildren, args: [MdcAutocompleteListItem,] }] }; if (false) { /** @type {?} */ MdcAutocompleteList.prototype.maxVisibleItems; /** @type {?} */ MdcAutocompleteList.prototype.itemSelected; /** @type {?} */ MdcAutocompleteList.prototype.autocompleteListItems; /** @type {?} */ MdcAutocompleteList.prototype._visible; /** @type {?} */ MdcAutocompleteList.prototype._filter; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0b2NvbXBsZXRlLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbWRjLWF1dG9jb21wbGV0ZS1saXN0LyIsInNvdXJjZXMiOlsibGliL2F1dG9jb21wbGV0ZS1saXN0L2F1dG9jb21wbGV0ZS1saXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxlQUFlLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQXVCLE1BQU0sZUFBZSxDQUFDO0FBQ2xILE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFL0I7QUFTQSxNQUFNO0lBaUNKOzRCQTlCOEMsSUFBSSxPQUFPLEVBQUU7UUErQnpELElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDO1FBQ2hELElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO0tBQ25COzs7O1FBNUJVLE9BQU87UUFDaEIsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7Ozs7OztRQUdaLE9BQU8sQ0FBQyxDQUFVO1FBQzNCLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDTixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3ZCO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDTixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7U0FDeEI7Ozs7O1FBR1EsTUFBTTtRQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDOzs7Ozs7UUFHWCxNQUFNLENBQUMsQ0FBUztRQUN6QixJQUFJLENBQUMsT0FBTyxH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QUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2dCQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzthQUN0QjtTQUNGLENBQUMsQ0FBQzs7OztZQTdJTixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHVCQUF1QjtnQkFDakMsUUFBUSxFQUFFOzs7Q0FHWDtnQkFDQyxNQUFNLEVBQUUsQ0FBQyxtSUFBbUksQ0FBQzthQUM5STs7Ozs7OEJBSUUsS0FBSzsyQkFDTCxNQUFNO29DQUVOLGVBQWUsU0FBQyx1QkFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgQ29udGVudENoaWxkcmVuLCBRdWVyeUxpc3QsIElucHV0LCBPdXRwdXQsIEFmdGVyQ29udGVudENoZWNrZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWRjQXV0b2NvbXBsZXRlTGlzdEl0ZW0gfSBmcm9tICdtZGMtYXV0b2NvbXBsZXRlLWxpc3QtaXRlbSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbWRjLWF1dG9jb21wbGV0ZS1saXN0JyxcclxuICB0ZW1wbGF0ZTogYDx1bCAqbmdJZj1cInZpc2libGVcIiBjbGFzcz1cIm1kYy1lbGV2YXRpb24tLXoyXCI+XHJcbiAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG48L3VsPlxyXG5gLFxyXG4gIHN0eWxlczogW2B1bHtwb3NpdGlvbjphYnNvbHV0ZTttaW4td2lkdGg6MjAwcHg7bWF4LWhlaWdodDo0MDBweDtwYWRkaW5nOjA7bWFyZ2luOjA7YmFja2dyb3VuZC1jb2xvcjojZmZmO292ZXJmbG93LXk6c2Nyb2xsO2xpc3Qtc3R5bGU6bm9uZX1gXVxyXG59KVxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LWNsYXNzLXN1ZmZpeFxyXG5leHBvcnQgY2xhc3MgTWRjQXV0b2NvbXBsZXRlTGlzdCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJDb250ZW50Q2hlY2tlZCB7XHJcblxyXG4gIEBJbnB1dCgpIG1heFZpc2libGVJdGVtczogbnVtYmVyO1xyXG4gIEBPdXRwdXQoKSBwdWJsaWMgaXRlbVNlbGVjdGVkOiBTdWJqZWN0PGFueT4gPSBuZXcgU3ViamVjdCgpO1xyXG5cclxuICBAQ29udGVudENoaWxkcmVuKE1kY0F1dG9jb21wbGV0ZUxpc3RJdGVtKSBhdXRvY29tcGxldGVMaXN0SXRlbXM6ICBRdWVyeUxpc3Q8TWRjQXV0b2NvbXBsZXRlTGlzdEl0ZW0+O1xyXG4gIF92aXNpYmxlOiBib29sZWFuO1xyXG4gIF9maWx0ZXI6IHN0cmluZztcclxuXHJcbiAgcHVibGljIGdldCB2aXNpYmxlKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX3Zpc2libGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IHZpc2libGUodjogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fdmlzaWJsZSA9IHY7XHJcbiAgICBpZiAodikge1xyXG4gICAgICB0aGlzLmZpbHRlckl0ZW1zKCk7XHJcbiAgICAgIHRoaXMuZm9jdXNGaXJzdEl0ZW0oKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMudW5mb2N1c0FsbEl0ZW1zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGZpbHRlcigpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlcjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXQgZmlsdGVyKGY6IHN0cmluZykge1xyXG4gICAgdGhpcy5fZmlsdGVyID0gZjtcclxuICAgIHRoaXMuZmlsdGVySXRlbXMoKTtcclxuICAgIHRoaXMuZm9jdXNGaXJzdEl0ZW0oKTtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgdGhpcy5tYXhWaXNpYmxlSXRlbXMgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XHJcbiAgICB0aGlzLl92aXNpYmxlID0gZmFsc2U7XHJcbiAgICB0aGlzLl9maWx0ZXIgPSAnJztcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRDaGVja2VkKCkge1xyXG4gICAgdGhpcy5hdXRvY29tcGxldGVMaXN0SXRlbXMudG9BcnJheSgpLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgaWYgKGl0ZW0uaXRlbUNsaWNrZWQub2JzZXJ2ZXJzLmxlbmd0aCA9PT0gMCkgeyAvLyBPbmx5IGFsbG93IG9uZSBzdWJzY3JpcHRpb25cclxuICAgICAgICBpdGVtLml0ZW1DbGlja2VkLnN1YnNjcmliZSgoaXRlbVZhbHVlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLml0ZW1TZWxlY3RlZC5uZXh0KGl0ZW1WYWx1ZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChpdGVtLml0ZW1Ib3ZlcmVkLm9ic2VydmVycy5sZW5ndGggPT09IDApIHsgLy8gT25seSBhbGxvdyBvbmUgc3Vic2NyaXB0aW9uXHJcbiAgICAgICAgaXRlbS5pdGVtSG92ZXJlZC5zdWJzY3JpYmUoKGl0ZW1WYWx1ZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy51bmZvY3VzQWxsSXRlbXMoKTtcclxuICAgICAgICAgIGl0ZW0uZm9jdXNlZCA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHVuZm9jdXNBbGxJdGVtcygpIHtcclxuICAgIHRoaXMuYXV0b2NvbXBsZXRlTGlzdEl0ZW1zLnRvQXJyYXkoKS5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0uZm9jdXNlZCA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZm9jdXNOZXh0SXRlbSgpIHtcclxuICAgIGNvbnN0IGZvY3VzZWRJdGVtcyA9IHRoaXMuYXV0b2NvbXBsZXRlTGlzdEl0ZW1zLmZpbHRlcigoaXRlbSwgaW5kZXgsIGxpc3QpID0+IGl0ZW0uZm9jdXNlZCk7XHJcbiAgICBjb25zdCBmb2N1c2VkSXRlbSA9IGZvY3VzZWRJdGVtcy5sZW5ndGggPiAwID8gZm9jdXNlZEl0ZW1zWzBdIDogbnVsbDtcclxuICAgIGNvbnN0IHZpc2libGVJdGVtcyA9IHRoaXMuYXV0b2NvbXBsZXRlTGlzdEl0ZW1zLmZpbHRlcigoaXRlbSwgaW5kZXgsIGxpc3QpID0+IGl0ZW0udmlzaWJsZSk7XHJcblxyXG4gICAgaWYgKGZvY3VzZWRJdGVtKSB7XHJcbiAgICAgIGNvbnN0IGZvY3VzZWRJdGVtSW5kZXggPSB2aXNpYmxlSXRlbXMuaW5kZXhPZihmb2N1c2VkSXRlbSk7XHJcbiAgICAgIGNvbnN0IG5leHRGb2N1c2VkSXRlbSA9ICh2aXNpYmxlSXRlbXMubGVuZ3RoID49IGZvY3VzZWRJdGVtSW5kZXggKyAxKSA/IHZpc2libGVJdGVtc1tmb2N1c2VkSXRlbUluZGV4ICsgMV0gOiBudWxsO1xyXG4gICAgICBpZiAobmV4dEZvY3VzZWRJdGVtKSB7XHJcbiAgICAgICAgZm9jdXNlZEl0ZW0uZm9jdXNlZCA9IGZhbHNlO1xyXG4gICAgICAgIG5leHRGb2N1c2VkSXRlbS5mb2N1c2VkID0gdHJ1ZTtcclxuICAgICAgICBuZXh0Rm9jdXNlZEl0ZW0uc2Nyb2xsSW50b1ZpZXcoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHZpc2libGVJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdmlzaWJsZUl0ZW1zWzBdLmZvY3VzZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZm9jdXNQcmV2aW91c0l0ZW0oKSB7XHJcbiAgICBjb25zdCBmb2N1c2VkSXRlbXMgPSB0aGlzLmF1dG9jb21wbGV0ZUxpc3RJdGVtcy5maWx0ZXIoKGl0ZW0sIGluZGV4LCBsaXN0KSA9PiBpdGVtLmZvY3VzZWQpO1xyXG4gICAgY29uc3QgZm9jdXNlZEl0ZW0gPSBmb2N1c2VkSXRlbXMubGVuZ3RoID4gMCA/IGZvY3VzZWRJdGVtc1swXSA6IG51bGw7XHJcbiAgICBjb25zdCB2aXNpYmxlSXRlbXMgPSB0aGlzLmF1dG9jb21wbGV0ZUxpc3RJdGVtcy5maWx0ZXIoKGl0ZW0sIGluZGV4LCBsaXN0KSA9PiBpdGVtLnZpc2libGUpO1xyXG5cclxuICAgIGlmIChmb2N1c2VkSXRlbSkge1xyXG4gICAgICBjb25zdCBmb2N1c2VkSXRlbUluZGV4ID0gdmlzaWJsZUl0ZW1zLmluZGV4T2YoZm9jdXNlZEl0ZW0pO1xyXG4gICAgICBjb25zdCBwcmV2aW91c0ZvY3VzZWRJdGVtID0gKGZvY3VzZWRJdGVtSW5kZXggPiAwKSA/IHZpc2libGVJdGVtc1tmb2N1c2VkSXRlbUluZGV4IC0gMV0gOiBudWxsO1xyXG4gICAgICBpZiAocHJldmlvdXNGb2N1c2VkSXRlbSkge1xyXG4gICAgICAgIGZvY3VzZWRJdGVtLmZvY3VzZWQgPSBmYWxzZTtcclxuICAgICAgICBwcmV2aW91c0ZvY3VzZWRJdGVtLmZvY3VzZWQgPSB0cnVlO1xyXG4gICAgICAgIHByZXZpb3VzRm9jdXNlZEl0ZW0uc2Nyb2xsSW50b1ZpZXcoKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHZpc2libGVJdGVtcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdmlzaWJsZUl0ZW1zWzBdLmZvY3VzZWQgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZm9jdXNGaXJzdEl0ZW0oKSB7XHJcbiAgICB0aGlzLnVuZm9jdXNBbGxJdGVtcygpO1xyXG4gICAgY29uc3QgdmlzaWJsZUl0ZW1zID0gdGhpcy5hdXRvY29tcGxldGVMaXN0SXRlbXMuZmlsdGVyKChpdGVtLCBpbmRleCwgbGlzdCkgPT4gaXRlbS52aXNpYmxlKTtcclxuICAgIGlmICh2aXNpYmxlSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICB2aXNpYmxlSXRlbXNbMF0uZm9jdXNlZCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2VsZWN0Rm9jdXNlZEl0ZW0oKSB7XHJcbiAgICBjb25zdCBmb2N1c2VkSXRlbXMgPSB0aGlzLmF1dG9jb21wbGV0ZUxpc3RJdGVtcy5maWx0ZXIoKGl0ZW0sIGluZGV4LCBsaXN0KSA9PiBpdGVtLmZvY3VzZWQpO1xyXG4gICAgY29uc3QgZm9jdXNlZEl0ZW0gPSBmb2N1c2VkSXRlbXMubGVuZ3RoID4gMCA/IGZvY3VzZWRJdGVtc1swXSA6IG51bGw7XHJcblxyXG4gICAgaWYgKGZvY3VzZWRJdGVtKSB7XHJcbiAgICAgIHRoaXMuaXRlbVNlbGVjdGVkLm5leHQoZm9jdXNlZEl0ZW0udmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmaWx0ZXJJdGVtcygpIHtcclxuICAgIGxldCBzaG93aW5nID0gMDtcclxuICAgIHRoaXMuYXV0b2NvbXBsZXRlTGlzdEl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4LCBsaXN0KSA9PiB7XHJcbiAgICAgIGlmIChzaG93aW5nIDwgdGhpcy5tYXhWaXNpYmxlSXRlbXMgJiYgaXRlbS5maWx0ZXJTdHJpbmcudG9VcHBlckNhc2UoKS5pbmNsdWRlcyh0aGlzLl9maWx0ZXIudG9VcHBlckNhc2UoKSkpIHtcclxuICAgICAgICBpdGVtLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgIHNob3dpbmcrKztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBpdGVtLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICBpdGVtLmZvY3VzZWQgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiJdfQ==