mdc-autocomplete
Version:
MdcAutocomplete in conjunction with MdcAutocompleteList and MdcAutocompleteListItem are a pack of angular components to provide an autocomplete functionality to Angular MDC web.
229 lines (219 loc) • 18.4 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('mdc-autocomplete-list'), require('mdc-autocomplete-list-item'), require('@angular-mdc/web'), require('@angular/forms')) :
typeof define === 'function' && define.amd ? define('mdc-autocomplete', ['exports', '@angular/core', 'mdc-autocomplete-list', 'mdc-autocomplete-list-item', '@angular-mdc/web', '@angular/forms'], factory) :
(factory((global['mdc-autocomplete'] = {}),global.ng.core,null,null,null,global.ng.forms));
}(this, (function (exports,i0,mdcAutocompleteList,mdcAutocompleteListItem,web,forms) { 'use strict';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var MdcAutocompleteService = (function () {
function MdcAutocompleteService() {
}
MdcAutocompleteService.decorators = [
{ type: i0.Injectable, args: [{
providedIn: 'root'
},] },
];
/** @nocollapse */
MdcAutocompleteService.ctorParameters = function () { return []; };
/** @nocollapse */ MdcAutocompleteService.ngInjectableDef = i0.defineInjectable({ factory: function MdcAutocompleteService_Factory() { return new MdcAutocompleteService(); }, token: MdcAutocompleteService, providedIn: "root" });
return MdcAutocompleteService;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var MdcAutocompleteComponent = (function () {
function MdcAutocompleteComponent() {
}
/**
* @return {?}
*/
MdcAutocompleteComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
};
MdcAutocompleteComponent.decorators = [
{ type: i0.Component, args: [{
selector: 'mdc-mdc-autocomplete',
template: "\n <p>\n mdc-autocomplete works!\n </p>\n ",
styles: []
},] },
];
/** @nocollapse */
MdcAutocompleteComponent.ctorParameters = function () { return []; };
return MdcAutocompleteComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var MdcAutocomplete = (function () {
function MdcAutocomplete() {
this.itemSelected = new i0.EventEmitter();
this.label = '';
}
Object.defineProperty(MdcAutocomplete.prototype, "value", {
get: /**
* @return {?}
*/ function () { return this._value; },
set: /**
* @param {?} val
* @return {?}
*/ function (val) {
this._value = val;
this.autocompleteList.filter = val;
},
enumerable: true,
configurable: true
});
/**
* @return {?}
*/
MdcAutocomplete.prototype.ngOnInit = /**
* @return {?}
*/
function () {
};
/**
* @return {?}
*/
MdcAutocomplete.prototype.ngAfterContentInit = /**
* @return {?}
*/
function () {
var _this = this;
this.setNativeInputAtrributes();
this.autocompleteList.itemSelected.subscribe(function (itemValue) {
_this.selectedItemValue = itemValue;
_this.value = itemValue.toString();
_this.itemSelected.emit(itemValue);
_this.autocompleteList.visible = false;
});
};
/**
* @param {?} event
* @return {?}
*/
MdcAutocomplete.prototype.onKeyDown = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.key === 'ArrowDown') {
this.autocompleteList.focusNextItem();
}
else if (event.key === 'ArrowUp') {
this.autocompleteList.focusPreviousItem();
}
else if (event.key === 'Enter') {
this.autocompleteList.selectFocusedItem();
}
};
/**
* @param {?} event
* @return {?}
*/
MdcAutocomplete.prototype.onKeyUp = /**
* @param {?} event
* @return {?}
*/
function (event) {
if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp' && event.key !== 'Enter') {
this.onTextFieldChange();
}
};
/**
* @return {?}
*/
MdcAutocomplete.prototype.onTextFieldChange = /**
* @return {?}
*/
function () {
this.autocompleteList.visible = true;
this.autocompleteList.filter = this.textField.value;
};
/**
* @param {?} focus
* @return {?}
*/
MdcAutocomplete.prototype.onFocus = /**
* @param {?} focus
* @return {?}
*/
function (focus) {
var _this = this;
setTimeout(function () {
_this.autocompleteList.visible = focus;
}, 100);
};
/**
* @return {?}
*/
MdcAutocomplete.prototype.setNativeInputAtrributes = /**
* @return {?}
*/
function () {
/** @type {?} */
var nativeInput = this.textField.elementRef.nativeElement.querySelector('input');
nativeInput.autocomplete = 'off';
// @ts-ignore
nativeInput.autocorrect = 'off';
// @ts-ignore
nativeInput.autocapitalize = 'off';
};
MdcAutocomplete.decorators = [
{ type: i0.Component, args: [{
selector: 'mdc-autocomplete',
template: "<div class=\"autocomplete\">\n <mdc-text-field #textField [(ngModel)]=\"value\" [label]=\"label\" (keydown)=\"onKeyDown($event)\" (keyup)=\"onKeyUp($event)\"\n (click)=\"onFocus(true)\" (focus)=\"onFocus(true)\" (focusout)=\"onFocus(false)\" (blur)=\"onFocus(false)\"\n autocomplete=\"off\" autocorrect=\"off\" autocapitalize=\"off\">\n </mdc-text-field>\n <ng-content select=\"mdc-autocomplete-list\"></ng-content>\n</div>\n",
styles: [".autocomplete{display:inline-block}"]
},] },
];
/** @nocollapse */
MdcAutocomplete.ctorParameters = function () { return []; };
MdcAutocomplete.propDecorators = {
label: [{ type: i0.Input }],
itemSelected: [{ type: i0.Output }],
textField: [{ type: i0.ViewChild, args: ['textField',] }],
autocompleteList: [{ type: i0.ContentChild, args: [mdcAutocompleteList.MdcAutocompleteList,] }]
};
return MdcAutocomplete;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
var MdcAutocompleteModule = (function () {
function MdcAutocompleteModule() {
}
MdcAutocompleteModule.decorators = [
{ type: i0.NgModule, args: [{
imports: [
mdcAutocompleteList.MdcAutocompleteListModule,
mdcAutocompleteListItem.MdcAutocompleteListItemModule,
web.MdcTextFieldModule,
forms.FormsModule
],
declarations: [MdcAutocompleteComponent, MdcAutocomplete],
exports: [MdcAutocomplete]
},] },
];
return MdcAutocompleteModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
*/
exports.MdcAutocompleteService = MdcAutocompleteService;
exports.MdcAutocompleteModule = MdcAutocompleteModule;
exports.MdcAutocomplete = MdcAutocomplete;
exports.ɵa = MdcAutocompleteComponent;
Object.defineProperty(exports, '__esModule', { value: true });
})));
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRjLWF1dG9jb21wbGV0ZS51bWQuanMubWFwIiwic291cmNlcyI6WyJuZzovL21kYy1hdXRvY29tcGxldGUvbGliL21kYy1hdXRvY29tcGxldGUuc2VydmljZS50cyIsIm5nOi8vbWRjLWF1dG9jb21wbGV0ZS9saWIvbWRjLWF1dG9jb21wbGV0ZS5jb21wb25lbnQudHMiLCJuZzovL21kYy1hdXRvY29tcGxldGUvbGliL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUuY29tcG9uZW50LnRzIiwibmc6Ly9tZGMtYXV0b2NvbXBsZXRlL2xpYi9tZGMtYXV0b2NvbXBsZXRlLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBNZGNBdXRvY29tcGxldGVTZXJ2aWNlIHtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7IH1cclxufVxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdtZGMtbWRjLWF1dG9jb21wbGV0ZScsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxwPlxyXG4gICAgICBtZGMtYXV0b2NvbXBsZXRlIHdvcmtzIVxyXG4gICAgPC9wPlxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTWRjQXV0b2NvbXBsZXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgfVxyXG5cclxufVxyXG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkLCBDb250ZW50Q2hpbGQsIEFmdGVyQ29udGVudEluaXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBJbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNZGNUZXh0RmllbGQgfSBmcm9tICdAYW5ndWxhci1tZGMvd2ViJztcclxuaW1wb3J0IHsgTWRjQXV0b2NvbXBsZXRlTGlzdCB9IGZyb20gJ21kYy1hdXRvY29tcGxldGUtbGlzdCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ21kYy1hdXRvY29tcGxldGUnLFxyXG4gIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cImF1dG9jb21wbGV0ZVwiPlxyXG4gIDxtZGMtdGV4dC1maWVsZCAjdGV4dEZpZWxkIFsobmdNb2RlbCldPVwidmFsdWVcIiBbbGFiZWxdPVwibGFiZWxcIiAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiIChrZXl1cCk9XCJvbktleVVwKCRldmVudClcIlxyXG4gIChjbGljayk9XCJvbkZvY3VzKHRydWUpXCIgKGZvY3VzKT1cIm9uRm9jdXModHJ1ZSlcIiAoZm9jdXNvdXQpPVwib25Gb2N1cyhmYWxzZSlcIiAoYmx1cik9XCJvbkZvY3VzKGZhbHNlKVwiXHJcbiAgYXV0b2NvbXBsZXRlPVwib2ZmXCIgYXV0b2NvcnJlY3Q9XCJvZmZcIiBhdXRvY2FwaXRhbGl6ZT1cIm9mZlwiPlxyXG4gIDwvbWRjLXRleHQtZmllbGQ+XHJcbiAgPG5nLWNvbnRlbnQgc2VsZWN0PVwibWRjLWF1dG9jb21wbGV0ZS1saXN0XCI+PC9uZy1jb250ZW50PlxyXG48L2Rpdj5cclxuYCxcclxuICBzdHlsZXM6IFtgLmF1dG9jb21wbGV0ZXtkaXNwbGF5OmlubGluZS1ibG9ja31gXVxyXG59KVxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y29tcG9uZW50LWNsYXNzLXN1ZmZpeFxyXG5leHBvcnQgY2xhc3MgTWRjQXV0b2NvbXBsZXRlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlckNvbnRlbnRJbml0IHtcclxuXHJcbiAgQElucHV0KCkgbGFiZWw6IHN0cmluZztcclxuICBAT3V0cHV0KCkgcHVibGljIGl0ZW1TZWxlY3RlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3RleHRGaWVsZCcpIHRleHRGaWVsZDogTWRjVGV4dEZpZWxkO1xyXG4gIEBDb250ZW50Q2hpbGQoTWRjQXV0b2NvbXBsZXRlTGlzdCkgYXV0b2NvbXBsZXRlTGlzdDogTWRjQXV0b2NvbXBsZXRlTGlzdDtcclxuXHJcbiAgX3ZhbHVlOiBzdHJpbmc7XHJcbiAgcHVibGljIGdldCB2YWx1ZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fdmFsdWU7IH1cclxuICBwdWJsaWMgc2V0IHZhbHVlKHZhbDogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl92YWx1ZSA9IHZhbDtcclxuICAgIHRoaXMuYXV0b2NvbXBsZXRlTGlzdC5maWx0ZXIgPSB2YWw7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RlZEl0ZW1WYWx1ZTogYW55O1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMubGFiZWwgPSAnJztcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xyXG4gICAgdGhpcy5zZXROYXRpdmVJbnB1dEF0cnJpYnV0ZXMoKTtcclxuXHJcbiAgICB0aGlzLmF1dG9jb21wbGV0ZUxpc3QuaXRlbVNlbGVjdGVkLnN1YnNjcmliZSgoaXRlbVZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtVmFsdWUgPSBpdGVtVmFsdWU7XHJcbiAgICAgIHRoaXMudmFsdWUgPSBpdGVtVmFsdWUudG9TdHJpbmcoKTtcclxuICAgICAgdGhpcy5pdGVtU2VsZWN0ZWQuZW1pdChpdGVtVmFsdWUpO1xyXG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZUxpc3QudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmIChldmVudC5rZXkgPT09ICdBcnJvd0Rvd24nKSB7XHJcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlTGlzdC5mb2N1c05leHRJdGVtKCk7XHJcbiAgICB9IGVsc2UgaWYgKGV2ZW50LmtleSA9PT0gJ0Fycm93VXAnKSB7XHJcbiAgICAgIHRoaXMuYXV0b2NvbXBsZXRlTGlzdC5mb2N1c1ByZXZpb3VzSXRlbSgpO1xyXG4gICAgfSBlbHNlIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcclxuICAgICAgdGhpcy5hdXRvY29tcGxldGVMaXN0LnNlbGVjdEZvY3VzZWRJdGVtKCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIG9uS2V5VXAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgIGlmIChldmVudC5rZXkgIT09ICdBcnJvd0Rvd24nICYmIGV2ZW50LmtleSAhPT0gJ0Fycm93VXAnICYmIGV2ZW50LmtleSAhPT0gJ0VudGVyJykge1xyXG4gICAgICB0aGlzLm9uVGV4dEZpZWxkQ2hhbmdlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblRleHRGaWVsZENoYW5nZSgpIHtcclxuICAgIHRoaXMuYXV0b2NvbXBsZXRlTGlzdC52aXNpYmxlID0gdHJ1ZTtcclxuICAgIHRoaXMuYXV0b2NvbXBsZXRlTGlzdC5maWx0ZXIgPSB0aGlzLnRleHRGaWVsZC52YWx1ZTtcclxuICB9XHJcblxyXG4gIG9uRm9jdXMoZm9jdXM6IGJvb2xlYW4pIHtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmF1dG9jb21wbGV0ZUxpc3QudmlzaWJsZSA9IGZvY3VzO1xyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0TmF0aXZlSW5wdXRBdHJyaWJ1dGVzKCkge1xyXG4gICAgY29uc3QgbmF0aXZlSW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQgPSB0aGlzLnRleHRGaWVsZC5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKTtcclxuICAgIG5hdGl2ZUlucHV0LmF1dG9jb21wbGV0ZSA9ICdvZmYnO1xyXG4gICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgbmF0aXZlSW5wdXQuYXV0b2NvcnJlY3QgPSAnb2ZmJztcclxuICAgIC8vIEB0cy1pZ25vcmVcclxuICAgIG5hdGl2ZUlucHV0LmF1dG9jYXBpdGFsaXplID0gJ29mZic7XHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1kY0F1dG9jb21wbGV0ZUNvbXBvbmVudCB9IGZyb20gJy4vbWRjLWF1dG9jb21wbGV0ZS5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBNZGNBdXRvY29tcGxldGUgfSBmcm9tICcuL2F1dG9jb21wbGV0ZS9hdXRvY29tcGxldGUuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTWRjQXV0b2NvbXBsZXRlTGlzdE1vZHVsZSB9IGZyb20gJ21kYy1hdXRvY29tcGxldGUtbGlzdCc7XHJcbmltcG9ydCB7IE1kY0F1dG9jb21wbGV0ZUxpc3RJdGVtTW9kdWxlIH0gZnJvbSAnbWRjLWF1dG9jb21wbGV0ZS1saXN0LWl0ZW0nO1xyXG5pbXBvcnQgeyBNZGNUZXh0RmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci1tZGMvd2ViJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gIGltcG9ydHM6IFtcclxuICAgIE1kY0F1dG9jb21wbGV0ZUxpc3RNb2R1bGUsXHJcbiAgICBNZGNBdXRvY29tcGxldGVMaXN0SXRlbU1vZHVsZSxcclxuICAgIE1kY1RleHRGaWVsZE1vZHVsZSxcclxuICAgIEZvcm1zTW9kdWxlXHJcbiAgXSxcclxuICBkZWNsYXJhdGlvbnM6IFtNZGNBdXRvY29tcGxldGVDb21wb25lbnQsIE1kY0F1dG9jb21wbGV0ZV0sXHJcbiAgZXhwb3J0czogW01kY0F1dG9jb21wbGV0ZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIE1kY0F1dG9jb21wbGV0ZU1vZHVsZSB7IH1cclxuIl0sIm5hbWVzIjpbIkluamVjdGFibGUiLCJDb21wb25lbnQiLCJFdmVudEVtaXR0ZXIiLCJJbnB1dCIsIk91dHB1dCIsIlZpZXdDaGlsZCIsIkNvbnRlbnRDaGlsZCIsIk1kY0F1dG9jb21wbGV0ZUxpc3QiLCJOZ01vZHVsZSIsIk1kY0F1dG9jb21wbGV0ZUxpc3RNb2R1bGUiLCJNZGNBdXRvY29tcGxldGVMaXN0SXRlbU1vZHVsZSIsIk1kY1RleHRGaWVsZE1vZHVsZSIsIkZvcm1zTW9kdWxlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7UUFPRTtTQUFpQjs7b0JBTGxCQSxhQUFVLFNBQUM7d0JBQ1YsVUFBVSxFQUFFLE1BQU07cUJBQ25COzs7OztxQ0FKRDs7Ozs7OztBQ0FBO1FBYUU7U0FBaUI7Ozs7UUFFakIsMkNBQVE7OztZQUFSO2FBQ0M7O29CQWRGQyxZQUFTLFNBQUM7d0JBQ1QsUUFBUSxFQUFFLHNCQUFzQjt3QkFDaEMsUUFBUSxFQUFFLHdEQUlUO3dCQUNELE1BQU0sRUFBRSxFQUFFO3FCQUNYOzs7O3VDQVZEOzs7Ozs7O0FDQUE7UUFrQ0U7Z0NBZG1ELElBQUlDLGVBQVksRUFBRTtZQWVuRSxJQUFJLENBQUMsS0FBSyxHQUFHLEVBQUUsQ0FBQztTQUNqQjs4QkFWVSxrQ0FBSzs7OzhCQUFhLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQzs7OzswQkFDL0IsR0FBVztnQkFDMUIsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDOzs7Ozs7OztRQVNyQyxrQ0FBUTs7O1lBQVI7YUFDQzs7OztRQUVELDRDQUFrQjs7O1lBQWxCO2dCQUFBLGlCQVNDO2dCQVJDLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO2dCQUVoQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxD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