ng4x-auto-complete
Version:
Remote autocomple for andular 4, 5, 6. Setup the url and field names of database which value will show in list, Multiple fiels can be set by comma separator. The data format of return value of remote url should be JSON. After start typing i
154 lines (148 loc) • 15.7 kB
JavaScript
import { Component, Renderer2, ViewChild, HostListener, NgModule } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { CommonModule } from '@angular/common';
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var Ng4xAutoCompleteComponent = /** @class */ (function () {
function Ng4xAutoCompleteComponent(http, renderer) {
this.http = http;
this.renderer = renderer;
this.all_list_child = [];
this.selected_row = "";
this._loading = "hidden";
}
/**
* @param {?} setting_obj
* @return {?}
*/
Ng4xAutoCompleteComponent.prototype.setting = /**
* @param {?} setting_obj
* @return {?}
*/
function (setting_obj) {
this.data_url = setting_obj.data_url;
this.db_fields = setting_obj.db_fields;
//console.log(this.data_url)
};
/**
* @return {?}
*/
Ng4xAutoCompleteComponent.prototype.clickout = /**
* @return {?}
*/
function () {
this._clearList();
};
/**
* @param {?} event
* @return {?}
*/
Ng4xAutoCompleteComponent.prototype.getData = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _this = this;
var /** @type {?} */ input_val = event.target.value;
if (input_val.length == 0) {
this._clearList();
return;
}
var /** @type {?} */ final_url = this.data_url + '?q=' + input_val;
this._loading = "visible";
this.http.get(final_url).subscribe(function (todo) {
_this._clearList();
for (var /** @type {?} */ k in todo) {
var /** @type {?} */ new_div = _this.renderer.createElement('div');
var /** @type {?} */ field_array = _this.db_fields.split(",");
var /** @type {?} */ display_text = "";
for (var /** @type {?} */ i = 0; i < field_array.length; i++) {
display_text += todo[k][field_array[i]] + " ";
}
display_text = display_text.trim();
_this.renderer.appendChild(new_div, _this.renderer.createText(display_text));
_this.all_list_child.push(new_div);
_this.renderer.listen(new_div, 'click', function (event) {
_this.text_fld.nativeElement.value = event.target.innerHTML;
var /** @type {?} */ tindex = Array.from(event.target.parentNode.children).indexOf(event.target);
_this.selected_row = todo[tindex];
});
_this.renderer.appendChild(_this.list.nativeElement, new_div);
var /** @type {?} */ theight = _this.text_fld.nativeElement.offsetHeight;
_this.renderer.setStyle(_this.list.nativeElement, "top", theight + "px");
_this.renderer.setStyle(_this.list.nativeElement, "display", "block");
_this.renderer.addClass(new_div, "ngxautocomp_list_el");
}
_this._loading = "hidden";
});
};
/**
* @return {?}
*/
Ng4xAutoCompleteComponent.prototype._clearList = /**
* @return {?}
*/
function () {
for (var /** @type {?} */ i = 0; i < this.all_list_child.length; i++)
this.renderer.removeChild(this.list.nativeElement, this.all_list_child[i]);
this.all_list_child = [];
this.renderer.setStyle(this.list.nativeElement, "display", "none");
};
/**
* @return {?}
*/
Ng4xAutoCompleteComponent.prototype.getSelectedRow = /**
* @return {?}
*/
function () {
return this.selected_row;
};
Ng4xAutoCompleteComponent.decorators = [
{ type: Component, args: [{
selector: 'ng4x-auto-complete',
template: "<div class=\"ngxautocomplete\">\n <input type=\"text\" value=\"\" name=\"ngx-autocomplete_field\" (keyup)=\"getData($event)\" #_ng_autocomp_txt>\n <div #_ng_autocom_list class=\"ngx-auto-list\"></div>\n <i class=\"fa fa-cog fa-spin\" [style.visibility]=\"_loading\" ></i>\n</div>\n",
styles: [":focus{outline:0}.ngxautocomplete{position:relative;width:100%;border:1px solid #ccc}.ngxautocomplete input{border:0;width:90%}.ngx-auto-list{display:none;position:absolute;width:100%;min-height:300px;overflow-y:scroll;border-left:1px solid #ccc;border-right:1px solid #ccc;border-bottom:1px solid #ccc;top:0;z-index:9;background:#fff}.ngxautocomp_list_el{text-align:left;cursor:pointer;padding:5px}.ngxautocomp_list_el:hover{background-color:#ccc}"]
},] },
];
/** @nocollapse */
Ng4xAutoCompleteComponent.ctorParameters = function () { return [
{ type: HttpClient },
{ type: Renderer2 }
]; };
Ng4xAutoCompleteComponent.propDecorators = {
list: [{ type: ViewChild, args: ['_ng_autocom_list',] }],
text_fld: [{ type: ViewChild, args: ['_ng_autocomp_txt',] }],
clickout: [{ type: HostListener, args: ['document:click',] }]
};
return Ng4xAutoCompleteComponent;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
var Ng4xAutoCompleteModule = /** @class */ (function () {
function Ng4xAutoCompleteModule() {
}
Ng4xAutoCompleteModule.decorators = [
{ type: NgModule, args: [{
imports: [
CommonModule
],
declarations: [Ng4xAutoCompleteComponent],
exports: [Ng4xAutoCompleteComponent]
},] },
];
return Ng4xAutoCompleteModule;
}());
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
export { Ng4xAutoCompleteModule, Ng4xAutoCompleteComponent as ɵa };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmc0eC1hdXRvLWNvbXBsZXRlLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9uZzR4LWF1dG8tY29tcGxldGUvc3JjL2FwcC9tb2R1bGVzL25nNHgtYXV0by1jb21wbGV0ZS9uZzR4LWF1dG8tY29tcGxldGUvbmc0eC1hdXRvLWNvbXBsZXRlLmNvbXBvbmVudC50cyIsIm5nOi8vbmc0eC1hdXRvLWNvbXBsZXRlL3NyYy9hcHAvbW9kdWxlcy9uZzR4LWF1dG8tY29tcGxldGUvbmc0eC1hdXRvLWNvbXBsZXRlLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIFJlbmRlcmVyMiwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBIb3N0TGlzdGVuZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7SHR0cENsaWVudH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZzR4LWF1dG8tY29tcGxldGUnLFxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJuZ3hhdXRvY29tcGxldGVcIj5cbiAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgdmFsdWU9XCJcIiBuYW1lPVwibmd4LWF1dG9jb21wbGV0ZV9maWVsZFwiIChrZXl1cCk9XCJnZXREYXRhKCRldmVudClcIiAjX25nX2F1dG9jb21wX3R4dD5cbiAgPGRpdiAjX25nX2F1dG9jb21fbGlzdCBjbGFzcz1cIm5neC1hdXRvLWxpc3RcIj48L2Rpdj5cbiAgPGkgY2xhc3M9XCJmYSBmYS1jb2cgZmEtc3BpblwiIFtzdHlsZS52aXNpYmlsaXR5XT1cIl9sb2FkaW5nXCIgPjwvaT5cbjwvZGl2PlxuYCxcbiAgc3R5bGVzOiBbYDpmb2N1c3tvdXRsaW5lOjB9Lm5neGF1dG9jb21wbGV0ZXtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlO2JvcmRlcjoxcHggc29saWQgI2NjY30ubmd4YXV0b2NvbXBsZXRlIGlucHV0e2JvcmRlcjowO3dpZHRoOjkwJX0ubmd4LWF1dG8tbGlzdHtkaXNwbGF5Om5vbmU7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJTttaW4taGVpZ2h0OjMwMHB4O292ZXJmbG93LXk6c2Nyb2xsO2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjY2NjO2JvcmRlci1yaWdodDoxcHggc29saWQgI2NjYztib3JkZXItYm90dG9tOjFweCBzb2xpZCAjY2NjO3RvcDowO3otaW5kZXg6OTtiYWNrZ3JvdW5kOiNmZmZ9Lm5neGF1dG9jb21wX2xpc3RfZWx7dGV4dC1hbGlnbjpsZWZ0O2N1cnNvcjpwb2ludGVyO3BhZGRpbmc6NXB4fS5uZ3hhdXRvY29tcF9saXN0X2VsOmhvdmVye2JhY2tncm91bmQtY29sb3I6I2NjY31gXVxufSlcbmV4cG9ydCBjbGFzcyBOZzR4QXV0b0NvbXBsZXRlQ29tcG9uZW50IHtcbiAgXG4gIGRhdGFfdXJsOmFueTtcbiAgZGJfZmllbGRzOmFueTtcbiAgYWxsX2xpc3RfY2hpbGQ9W107XG4gIHNlbGVjdGVkX3JvdzpzdHJpbmc9XCJcIlxuICBfbG9hZGluZzpzdHJpbmc9XCJoaWRkZW5cIjtcbiAgQFZpZXdDaGlsZCgnX25nX2F1dG9jb21fbGlzdCcpIGxpc3Q6RWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnX25nX2F1dG9jb21wX3R4dCcpIHRleHRfZmxkOkVsZW1lbnRSZWY7XG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBodHRwOkh0dHBDbGllbnQscHJvdGVjdGVkIHJlbmRlcmVyOlJlbmRlcmVyMikgeyB9XG4gIHNldHRpbmcoc2V0dGluZ19vYmope1xuICAgIHRoaXMuZGF0YV91cmw9c2V0dGluZ19vYmouZGF0YV91cmw7XG4gICAgdGhpcy5kYl9maWVsZHM9IHNldHRpbmdfb2JqLmRiX2ZpZWxkcztcbiAgICAvL2NvbnNvbGUubG9nKHRoaXMuZGF0YV91cmwpXG4gIH1cbiAgXG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snKVxuICBjbGlja291dCgpIHtcbiAgICBcbiAgICAgdGhpcy5fY2xlYXJMaXN0KClcbiAgfVxuICBnZXREYXRhKGV2ZW50KXtcbiAgICAgICAgbGV0IGlucHV0X3ZhbD0gZXZlbnQudGFyZ2V0LnZhbHVlXG4gICAgICAgICAgICAgIFxuICAgICAgICBpZihpbnB1dF92YWwubGVuZ3RoPT0wKXtcbiAgICAgICAgICB0aGlzLl9jbGVhckxpc3QoKTtcbiAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZpbmFsX3VybD10aGlzLmRhdGFfdXJsKyc/cT0nK2lucHV0X3ZhbFxuICAgICAgICB0aGlzLl9sb2FkaW5nPVwidmlzaWJsZVwiXG4gICAgICAgIHRoaXMuaHR0cC5nZXQoZmluYWxfdXJsKS5zdWJzY3JpYmUodG9kbz0+e1xuICAgICAgICAgICAgICB0aGlzLl9jbGVhckxpc3QoKVxuICAgICAgICAgICAgICBmb3IobGV0IGsgaW4gdG9kbyl7XG4gICAgICAgICAgICAgICAgbGV0IG5ld19kaXY9dGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgICAgICAgICBsZXQgZmllbGRfYXJyYXk9dGhpcy5kYl9maWVsZHMuc3BsaXQoXCIsXCIpXG4gICAgICAgICAgICAgICAgbGV0IGRpc3BsYXlfdGV4dD1cIlwiXG4gICAgICAgICAgICAgICAgZm9yKHZhciBpPTA7aTxmaWVsZF9hcnJheS5sZW5ndGg7aSsrKXtcbiAgICAgICAgICAgICAgICAgIGRpc3BsYXlfdGV4dCs9dG9kb1trXVtmaWVsZF9hcnJheVtpXV0rXCIgXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRpc3BsYXlfdGV4dD1kaXNwbGF5X3RleHQudHJpbSgpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyZXIuYXBwZW5kQ2hpbGQobmV3X2Rpdix0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQoZGlzcGxheV90ZXh0KSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgdGhpcy5hbGxfbGlzdF9jaGlsZC5wdXNoKG5ld19kaXYpXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4obmV3X2RpdiwnY2xpY2snLChldmVudCk9PntcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0X2ZsZC5uYXRpdmVFbGVtZW50LnZhbHVlPWV2ZW50LnRhcmdldC5pbm5lckhUTUxcbiAgICAgICAgICAgICAgICAgIGxldCB0aW5kZXg9QXJyYXkuZnJvbShldmVudC50YXJnZXQucGFyZW50Tm9kZS5jaGlsZHJlbikuaW5kZXhPZihldmVudC50YXJnZXQpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRfcm93PXRvZG9bdGluZGV4XVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmxpc3QubmF0aXZlRWxlbWVudCxuZXdfZGl2KVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHZhciB0aGVpZ2h0PXRoaXMudGV4dF9mbGQubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHRcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMubGlzdC5uYXRpdmVFbGVtZW50LFwidG9wXCIsdGhlaWdodCtcInB4XCIpXG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmxpc3QubmF0aXZlRWxlbWVudCxcImRpc3BsYXlcIixcImJsb2NrXCIpXG4gICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKG5ld19kaXYsXCJuZ3hhdXRvY29tcF9saXN0X2VsXCIpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgdGhpcy5fbG9hZGluZz1cImhpZGRlblwiXG4gICAgICAgIH0pXG5cbiAgfSBcblxuICBwcml2YXRlIF9jbGVhckxpc3QoKXtcbiAgICBmb3IobGV0IGk9MDtpPHRoaXMuYWxsX2xpc3RfY2hpbGQubGVuZ3RoO2krKylcbiAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDaGlsZCh0aGlzLmxpc3QubmF0aXZlRWxlbWVudCx0aGlzLmFsbF9saXN0X2NoaWxkW2ldKVxuICAgIHRoaXMuYWxsX2xpc3RfY2hpbGQ9W107ICAgICBcbiAgICB0aGlzLnJlbmRlcmVyLnNldFN0eWxlKHRoaXMubGlzdC5uYXRpdmVFbGVtZW50LFwiZGlzcGxheVwiLFwibm9uZVwiKVxuICB9XG5cbiAgZ2V0U2VsZWN0ZWRSb3coKTpzdHJpbmd7XG4gICAgIHJldHVybiB0aGlzLnNlbGVjdGVkX3JvdztcbiAgfVxuXG4gXG5cbn1cbiIsImltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTmc0eEF1dG9Db21wbGV0ZUNvbXBvbmVudCB9IGZyb20gJy4vbmc0eC1hdXRvLWNvbXBsZXRlL25nNHgtYXV0by1jb21wbGV0ZS5jb21wb25lbnQnO1xuXG5ATmdNb2R1bGUoe1xuICBpbXBvcnRzOiBbXG4gICAgQ29tbW9uTW9kdWxlXG4gIF0sXG4gIGRlY2xhcmF0aW9uczogW05nNHhBdXRvQ29tcGxldGVDb21wb25lbnRdLFxuICBleHBvcnRzOltOZzR4QXV0b0NvbXBsZXRlQ29tcG9uZW50XVxufSlcbmV4cG9ydCBjbGFzcyBOZzR4QXV0b0NvbXBsZXRlTW9kdWxlIHsgfVxuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7SUFzQkUsbUNBQXNCLElBQWUsRUFBVyxRQUFrQjtRQUE1QyxTQUFJLEdBQUosSUFBSSxDQUFXO1FBQVcsYUFBUSxHQUFSLFFBQVEsQ0FBVTs4QkFMbkQsRUFBRTs0QkFDRyxFQUFFO3dCQUNOLFFBQVE7S0FHK0M7Ozs7O0lBQ3ZFLDJDQUFPOzs7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