UNPKG

ngx-selectbox-may

Version:

Angular selectbox with autocomplete

939 lines (930 loc) 68.7 kB
import { Injectable, Pipe, NgModule, Component, Input, ElementRef, ViewChild, ViewChildren, forwardRef, Output, EventEmitter, ContentChild, defineInjectable } from '@angular/core'; import { NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var NGXSelectMayRow = /** @class */ (function () { function NGXSelectMayRow(isSelected, data) { this.isSelected = isSelected; this.data = data; } /** * @param {?} value * @return {?} */ NGXSelectMayRow.prototype.setKey = /** * @param {?} value * @return {?} */ function (value) { this.value = value; }; /** * @param {?} label * @return {?} */ NGXSelectMayRow.prototype.setLabel = /** * @param {?} label * @return {?} */ function (label) { this.label = label; }; return NGXSelectMayRow; }()); var NGXSelectMayConfigs = /** @class */ (function () { function NGXSelectMayConfigs() { this._labelField = ""; this._placeholderText = ""; this._emptyText = ""; this._showEmptyResultsLabel = true; this._cssClass = ""; } Object.defineProperty(NGXSelectMayConfigs.prototype, "labelField", { get: /** * @return {?} */ function () { return this._labelField; }, set: /** * @param {?} value * @return {?} */ function (value) { this._labelField = value; }, enumerable: true, configurable: true }); Object.defineProperty(NGXSelectMayConfigs.prototype, "valueField", { get: /** * @return {?} */ function () { return this._valueField; }, set: /** * @param {?} value * @return {?} */ function (value) { this._valueField = value; }, enumerable: true, configurable: true }); Object.defineProperty(NGXSelectMayConfigs.prototype, "placeholderText", { get: /** * @return {?} */ function () { return this._placeholderText; }, set: /** * @param {?} value * @return {?} */ function (value) { this._placeholderText = value; }, enumerable: true, configurable: true }); Object.defineProperty(NGXSelectMayConfigs.prototype, "emptyText", { get: /** * @return {?} */ function () { return this._emptyText; }, set: /** * @param {?} value * @return {?} */ function (value) { this._emptyText = value; }, enumerable: true, configurable: true }); Object.defineProperty(NGXSelectMayConfigs.prototype, "showEmptyResultsLabel", { get: /** * @return {?} */ function () { return this._showEmptyResultsLabel; }, set: /** * @param {?} value * @return {?} */ function (value) { this._showEmptyResultsLabel = value; }, enumerable: true, configurable: true }); Object.defineProperty(NGXSelectMayConfigs.prototype, "cssClass", { get: /** * @return {?} */ function () { return this._cssClass; }, set: /** * @param {?} value * @return {?} */ function (value) { this._cssClass = value; }, enumerable: true, configurable: true }); Object.defineProperty(NGXSelectMayConfigs.prototype, "isMultiSelect", { get: /** * @return {?} */ function () { return this._isMultiSelect; }, set: /** * @param {?} value * @return {?} */ function (value) { this._isMultiSelect = value; }, enumerable: true, configurable: true }); NGXSelectMayConfigs.ROW_ACTIVE_CLASS = "active"; NGXSelectMayConfigs.EMPTY_TEXT = "No results found"; NGXSelectMayConfigs.MULTI_SELECTED_LABEL = "#COUNT #ITEMS Selected"; NGXSelectMayConfigs.LOADING_TEXT = "Please wait..."; return NGXSelectMayConfigs; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var NgxSelectboxMayService = /** @class */ (function () { function NgxSelectboxMayService() { } /** * @param {?} items * @param {?} configs * @return {?} */ NgxSelectboxMayService.prototype.createDropdownRows = /** * @param {?} items * @param {?} configs * @return {?} */ function (items, configs) { /** @type {?} */ var arr = []; items.forEach(function (element) { /** @type {?} */ var row = new NGXSelectMayRow(false, element); row.setKey(configs.valueField ? element[configs.valueField] : element); row.setLabel(configs.labelField ? element[configs.labelField] : element); arr.push(row); }); return arr; }; /** * @param {?} allRows * @param {?} configs * @return {?} */ NgxSelectboxMayService.prototype.reconfigureDropdownRowLabelsAndValues = /** * @param {?} allRows * @param {?} configs * @return {?} */ function (allRows, configs) { allRows.forEach(function (element) { element.setKey(configs.valueField ? element.data[configs.valueField] : element.data); element.setLabel(configs.labelField ? element.data[configs.labelField] : element.data); }); }; /** * @param {?} configs * @param {?} selectedRows * @return {?} */ NgxSelectboxMayService.prototype.createDropdownLabel = /** * @param {?} configs * @param {?} selectedRows * @return {?} */ function (configs, selectedRows) { //Check is configured to select multiple choices if (configs.isMultiSelect) { if (selectedRows.length > 1) { return NGXSelectMayConfigs.MULTI_SELECTED_LABEL.replace("#COUNT", selectedRows.length.toString()).replace("#ITEMS", "Items"); } else if (selectedRows.length == 1) { return NGXSelectMayConfigs.MULTI_SELECTED_LABEL.replace("#COUNT", selectedRows.length.toString()).replace("#ITEMS", "Item"); } else { return NGXSelectMayConfigs.MULTI_SELECTED_LABEL.replace("#COUNT", selectedRows.length.toString()).replace("#ITEMS", "Items"); } } else { return selectedRows.length > 0 ? selectedRows[0].label : ""; } }; /** * @param {?} configs * @param {?} selectedRows * @param {?} allRows * @param {?} row * @return {?} */ NgxSelectboxMayService.prototype.setSelectedItems = /** * @param {?} configs * @param {?} selectedRows * @param {?} allRows * @param {?} row * @return {?} */ function (configs, selectedRows, allRows, row) { //Check is configured to select multiple choices if (configs.isMultiSelect) ; else { if (!row.isSelected) { this.unselectAllSelectedRows(allRows); row.isSelected = true; selectedRows = []; selectedRows.push(row); } } return selectedRows; }; /** * @param {?} allRows * @return {?} */ NgxSelectboxMayService.prototype.unselectAllSelectedRows = /** * @param {?} allRows * @return {?} */ function (allRows) { allRows.forEach(function (r) { r.isSelected = false; }); }; /** * @param {?} allRows * @param {?} value * @return {?} */ NgxSelectboxMayService.prototype.selectItemByValue = /** * @param {?} allRows * @param {?} value * @return {?} */ function (allRows, value) { /** @type {?} */ var filteredVal = allRows.filter(function (r) { return r.value === value; }); if (filteredVal.length > 0) filteredVal[0].isSelected = true; return filteredVal; }; /** * @param {?} allRows * @param {?} values * @return {?} */ NgxSelectboxMayService.prototype.selectItemsByValue = /** * @param {?} allRows * @param {?} values * @return {?} */ function (allRows, values) { /** @type {?} */ var a = []; values.forEach(function (v) { /** @type {?} */ var filteredVal = allRows.filter(function (r) { return r.value === v; }); if (filteredVal.length > 0) filteredVal[0].isSelected = true; a.push(filteredVal[0]); }); return a; }; NgxSelectboxMayService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ NgxSelectboxMayService.ctorParameters = function () { return []; }; /** @nocollapse */ NgxSelectboxMayService.ngInjectableDef = defineInjectable({ factory: function NgxSelectboxMayService_Factory() { return new NgxSelectboxMayService(); }, token: NgxSelectboxMayService, providedIn: "root" }); return NgxSelectboxMayService; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var NgxSelectboxMayComponent = /** @class */ (function () { function NgxSelectboxMayComponent(_selectboxref, selectboxService) { this._selectboxref = _selectboxref; this.selectboxService = selectboxService; this.dropdownRows = []; this.configs = new NGXSelectMayConfigs(); this.selectedRows = []; this.show_items = false; this.searchText = ""; this.isEnable = true; this.propagateChange = function (_) { }; this.propagateOnTouch = function (_) { }; this.onKeyUp = new EventEmitter(); this.onSelect = new EventEmitter(); this.onBlur = new EventEmitter(); } Object.defineProperty(NgxSelectboxMayComponent.prototype, "items", { set: /** * @param {?} items * @return {?} */ function (items) { this.createDropdownRows(items); }, enumerable: true, configurable: true }); Object.defineProperty(NgxSelectboxMayComponent.prototype, "cssClass", { set: /** * @param {?} cssClass * @return {?} */ function (cssClass) { this.configs.cssClass = cssClass; }, enumerable: true, configurable: true }); Object.defineProperty(NgxSelectboxMayComponent.prototype, "valueField", { set: /** * @param {?} valueField * @return {?} */ function (valueField) { this.configs.valueField = valueField; }, enumerable: true, configurable: true }); Object.defineProperty(NgxSelectboxMayComponent.prototype, "labelField", { set: /** * @param {?} labelField * @return {?} */ function (labelField) { this.configs.labelField = labelField; this.reconfigureLabelsAndValues(); }, enumerable: true, configurable: true }); Object.defineProperty(NgxSelectboxMayComponent.prototype, "placeholder", { set: /** * @param {?} placeholder * @return {?} */ function (placeholder) { this.configs.placeholderText = placeholder; }, enumerable: true, configurable: true }); Object.defineProperty(NgxSelectboxMayComponent.prototype, "emptyText", { set: /** * @param {?} emptyText * @return {?} */ function (emptyText) { this.configs.emptyText = emptyText; }, enumerable: true, configurable: true }); Object.defineProperty(NgxSelectboxMayComponent.prototype, "showEmptyResultText", { set: /** * @param {?} showEmptyText * @return {?} */ function (showEmptyText) { this.configs.showEmptyResultsLabel = showEmptyText; }, enumerable: true, configurable: true }); Object.defineProperty(NgxSelectboxMayComponent.prototype, "isMulti", { set: /** * @param {?} isMulti * @return {?} */ function (isMulti) { this.configs.isMultiSelect = isMulti; }, enumerable: true, configurable: true }); Object.defineProperty(NgxSelectboxMayComponent.prototype, "isLoading", { set: /** * @param {?} isLoading * @return {?} */ function (isLoading) { this._isLoading = isLoading; }, enumerable: true, configurable: true }); Object.defineProperty(NgxSelectboxMayComponent.prototype, "loadingText", { set: /** * @param {?} loadingText * @return {?} */ function (loadingText) { this._loadingText = loadingText; }, enumerable: true, configurable: true }); /** * @return {?} */ NgxSelectboxMayComponent.prototype.ngOnInit = /** * @return {?} */ function () { }; /** * @param {?} items * @return {?} */ NgxSelectboxMayComponent.prototype.createDropdownRows = /** * @param {?} items * @return {?} */ function (items) { this.dropdownRows = this.selectboxService.createDropdownRows(items, this.configs); this.setValuesPassedExternal(this.ngModelValue); }; /** * @return {?} */ NgxSelectboxMayComponent.prototype.reconfigureLabelsAndValues = /** * @return {?} */ function () { this.selectboxService.reconfigureDropdownRowLabelsAndValues(this.dropdownRows, this.configs); }; /** * @return {?} */ NgxSelectboxMayComponent.prototype.getSelectboxLabel = /** * @return {?} */ function () { /** @type {?} */ var label = this.selectboxService.createDropdownLabel(this.configs, this.selectedRows); return label ? label : this.configs.placeholderText; }; /** * @return {?} */ NgxSelectboxMayComponent.prototype.getEmptyTextLabel = /** * @return {?} */ function () { return this.configs.emptyText ? this.configs.emptyText : NGXSelectMayConfigs.EMPTY_TEXT; }; /** * @return {?} */ NgxSelectboxMayComponent.prototype.getLoadingText = /** * @return {?} */ function () { return this._loadingText ? this._loadingText : NGXSelectMayConfigs.LOADING_TEXT; }; /** * @return {?} */ NgxSelectboxMayComponent.prototype.onClickSelectBox = /** * @return {?} */ function () { this.showItemsWindow(); }; /** * @return {?} */ NgxSelectboxMayComponent.prototype.getActiveClass = /** * @return {?} */ function () { return NGXSelectMayConfigs.ROW_ACTIVE_CLASS; }; /** * @return {?} */ NgxSelectboxMayComponent.prototype.showItemsWindow = /** * @return {?} */ function () { this.show_items = true; }; /** * @return {?} */ NgxSelectboxMayComponent.prototype.hideItemsWindow = /** * @return {?} */ function () { this.onBlur.emit(this.searchText); this.resetFilters(); this.show_items = false; }; /** * @return {?} */ NgxSelectboxMayComponent.prototype.onRemoveClick = /** * @return {?} */ function () { this.selectboxService.unselectAllSelectedRows(this.dropdownRows); this.selectedRows = []; this.publishValue(); }; /** * @param {?} e * @return {?} */ NgxSelectboxMayComponent.prototype.onSearchKeydown = /** * @param {?} e * @return {?} */ function (e) { if (e.key == "Escape") { this.hideItemsWindow(); } //Up and Down arrow events if (e.keyCode == 38 || e.keyCode == 40) { e.preventDefault(); } }; /** * @param {?} e * @return {?} */ NgxSelectboxMayComponent.prototype.onSearchKeyup = /** * @param {?} e * @return {?} */ function (e) { if (e.keyCode == 38 || e.keyCode == 40 || e.key == "Escape") { e.preventDefault(); } else { this.onKeyUp.emit(this.searchText); } }; /** * @return {?} */ NgxSelectboxMayComponent.prototype.resetFilters = /** * @return {?} */ function () { this.searchText = ""; }; /** * @param {?} row * @param {?} index * @return {?} */ NgxSelectboxMayComponent.prototype.onClickItem = /** * @param {?} row * @param {?} index * @return {?} */ function (row, index) { if (this.configs.isMultiSelect) ; else { this.selectedRows = this.selectboxService.setSelectedItems(this.configs, this.selectedRows, this.dropdownRows, row); this.onSelect.emit(row.data); this.hideItemsWindow(); } this.publishValue(); }; /** * @return {?} */ NgxSelectboxMayComponent.prototype.publishValue = /** * @return {?} */ function () { /** @type {?} */ var values = this.selectedRows.map(function (r) { return r.value; }); if (this.configs.isMultiSelect) { this.propagateChange(values); } else { this.propagateChange(values.length > 0 ? values[0] : ""); } }; /** * @param {?} obj * @return {?} */ NgxSelectboxMayComponent.prototype.setValuesPassedExternal = /** * @param {?} obj * @return {?} */ function (obj) { if (this.configs.isMultiSelect) { this.selectedRows = this.selectboxService.selectItemsByValue(this.dropdownRows, obj); } else { this.selectedRows = this.selectboxService.selectItemByValue(this.dropdownRows, obj); } }; Object.defineProperty(NgxSelectboxMayComponent.prototype, "content", { /* * * On Item browse open window begin & document outside click event Begins * */ set: /* * * On Item browse open window begin & document outside click event Begins * */ /** * @param {?} content * @return {?} */ function (content) { this.itemWindow = content; // this.positionWindow(); this.focusToSearchField(); this.scrollToSelectedItem(); }, enumerable: true, configurable: true }); /** * @return {?} */ NgxSelectboxMayComponent.prototype.positionWindow = /** * @return {?} */ function () { if (this.searchField) { /** @type {?} */ var selectBoxRef = this._selectboxref.nativeElement; /** @type {?} */ var viewportOffset = selectBoxRef.getBoundingClientRect(); console.log(viewportOffset); this.itemWindow.nativeElement.setAttribute('style', 'width: ' + (selectBoxRef.firstChild.offsetWidth + 3) + 'px; top: ' + (viewportOffset.top - 5) + 'px; margin-left: -12px;'); } }; /** * @return {?} */ NgxSelectboxMayComponent.prototype.focusToSearchField = /** * @return {?} */ function () { if (this.searchField) { this.searchField.nativeElement.focus(); } }; /** * @return {?} */ NgxSelectboxMayComponent.prototype.scrollToSelectedItem = /** * @return {?} */ function () { var _this = this; this.listItems.forEach(function (li) { if (li.nativeElement.classList.contains(NGXSelectMayConfigs.ROW_ACTIVE_CLASS)) { /** @type {?} */ var scrollLi = li.nativeElement; _this.itemWindow.nativeElement.getElementsByTagName("ul")[0].scrollTop = scrollLi.offsetTop - (scrollLi.offsetHeight + 20); } }); }; /** * @param {?} e * @return {?} */ NgxSelectboxMayComponent.prototype.onClickOutside = /** * @param {?} e * @return {?} */ function (e) { if (!this._selectboxref.nativeElement.contains(event.target) && this.show_items) { this.hideItemsWindow(); } }; /** * @param {?} e * @return {?} */ NgxSelectboxMayComponent.prototype.onWindowResize = /** * @param {?} e * @return {?} */ function (e) { // this.positionWindow(); }; /** * @return {?} */ NgxSelectboxMayComponent.prototype.setDisable = /** * @return {?} */ function () { this.hideItemsWindow(); this.isEnable = false; }; /** * @return {?} */ NgxSelectboxMayComponent.prototype.setEnable = /** * @return {?} */ function () { this.isEnable = true; }; /** * @param {?} obj * @return {?} */ NgxSelectboxMayComponent.prototype.writeValue = /** * @param {?} obj * @return {?} */ function (obj) { this.ngModelValue = obj; this.setValuesPassedExternal(obj); }; /** * @param {?} fn * @return {?} */ NgxSelectboxMayComponent.prototype.registerOnChange = /** * @param {?} fn * @return {?} */ function (fn) { this.propagateChange = fn; }; /** * @param {?} fn * @return {?} */ NgxSelectboxMayComponent.prototype.registerOnTouched = /** * @param {?} fn * @return {?} */ function (fn) { this.propagateOnTouch = fn; }; /** * @param {?} isDisabled * @return {?} */ NgxSelectboxMayComponent.prototype.setDisabledState = /** * @param {?} isDisabled * @return {?} */ function (isDisabled) { console.log(isDisabled, "set disable"); if (isDisabled) { this.setDisable(); } else { this.setEnable(); } }; NgxSelectboxMayComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-selectbox-may', host: { '(document:click)': 'onClickOutside($event)', '(window:resize)': 'onWindowResize($event)' }, template: "<div [ngClass]=\"configs.cssClass\" class=\"__ngx-selectbox-may\">\n <span class=\"__selected-label\">\n <span>{{getSelectboxLabel()}}</span>\n </span>\n <div *ngIf=\"_isLoading\" class=\"__loading-text\">{{getLoadingText()}}</div>\n <div class=\"__clickable-area\" (click)=\"onClickSelectBox()\"></div>\n <button *ngIf=\"selectedRows.length>0 && isEnable\" type=\"button\" class=\"__remove-selected-btn\" (click)=\"onRemoveClick()\">\n <i></i>\n </button>\n <div *ngIf=\"show_items\" class=\"__item-list-browser\" #item_window>\n <div class=\"__item-search\">\n <input #search_field type=\"text\" max-length=\"15\" (keydown)=\"onSearchKeydown($event)\"\n (keyup)=\"onSearchKeyup($event)\" placeholder=\"search\" [(ngModel)]=\"searchText\" />\n </div>\n <ng-container *ngTemplateOutlet=\"actionTemplate\"></ng-container>\n <ul class=\"__ngx-selectbox-ul\">\n <ng-container *ngFor=\"let item of dropdownRows | ngx_item_filter:searchText; let i = index; let l = count\">\n <li #li_item *ngIf=\"l>0\" (click)=\"onClickItem(item, i)\" [ngClass]=\"item.isSelected ? getActiveClass() : ''\">\n {{item.label}}\n </li>\n </ng-container>\n <li class=\"__empty-items\"\n *ngIf=\"(dropdownRows | ngx_item_filter:searchText).length === 0 && configs.showEmptyResultsLabel\">\n {{getEmptyTextLabel()}}\n </li>\n </ul>\n </div>\n <div *ngIf=\"!isEnable\" class=\"__disabled-mask\"></div>\n</div>", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(function () { return NgxSelectboxMayComponent; }), multi: true, } ], styles: [".__ngx-selectbox-may{position:relative;min-width:200px;padding:3px 40px 3px 10px;display:flex;align-items:center;cursor:pointer;background-color:#fff}.__ngx-selectbox-may .__disabled-mask{position:absolute;background-color:rgba(0,0,0,.15);top:0;left:0;right:0;bottom:0}.__ngx-selectbox-may::before{content:\"\\f107\";position:absolute;font-family:FontAwesome;color:#3f495b;right:10px;top:0;bottom:0;display:flex;align-items:center;font-size:14px}.__ngx-selectbox-may .__selected-label{position:relative;display:block;width:100%;text-align:left;height:19px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.__ngx-selectbox-may .__remove-selected-btn{background-color:transparent;border:0;outline:0;cursor:pointer;position:absolute;right:20px;top:0;bottom:0;display:flex;align-items:center}.__ngx-selectbox-may .__clickable-area{position:absolute;top:0;left:0;right:0;bottom:0}.__ngx-selectbox-may .__remove-selected-btn i::before{content:\"\\f00d\";font-family:FontAwesome;font-style:normal!important;-webkit-text-stroke:.5px #f1f4f8}.__ngx-selectbox-may .__selected-label .__remove-selected-btn::before{content:\"\\f00c\";position:absolute;font-family:FontAwesome;right:12px;font-size:12px;top:0;bottom:0;display:flex;align-items:center;-webkit-text-stroke:.5px #f1f4f8}.__ngx-selectbox-may .__item-list-browser{position:absolute;background-color:#fff;border-radius:4px;border:1px solid #dfe3e9;box-shadow:0 3px 18px -6px rgba(0,0,0,.5);z-index:1;top:-2px;left:-2px;right:-2px}.__ngx-selectbox-may .__item-list-browser ul{max-height:200px;overflow-y:auto;padding:0;margin:0;border-top:1px solid #dfe3e9}.__ngx-selectbox-may .__item-list-browser ul li{color:#777;font-size:13px;text-align:left;padding:9px 24px 9px 12px;border-bottom:1px solid #dfe3e9;cursor:pointer;line-height:17px}.__ngx-selectbox-may .__item-list-browser ul li.selected,.__ngx-selectbox-may .__item-list-browser ul li:hover{background-color:#f1f4f8;color:#2ea2f8}.__ngx-selectbox-may .__item-list-browser ul li.active{background-color:#f1f4f8;color:#2ea2f8;position:relative}.__ngx-selectbox-may .__item-list-browser ul li.active::before{content:\"\\f00c\";position:absolute;font-family:FontAwesome;right:12px;font-size:12px;-webkit-text-stroke:.5px #f1f4f8;top:0;bottom:0;display:flex;align-items:center}.__ngx-selectbox-may .__item-list-browser ul li.__empty-items{color:#ff7f74;background-color:#fff4f4;cursor:auto}.__ngx-selectbox-may .__item-list-browser ul li:last-child{border-bottom:none}.__ngx-selectbox-may .__item-list-browser .__item-search{padding:5px;display:flex;position:relative}.__ngx-selectbox-may .__item-list-browser .__item-search::before{content:\"\\f002\";position:absolute;font-family:FontAwesome;right:16px;-webkit-text-stroke:.5px #fff;color:#ced0da;top:0;bottom:0;display:flex;align-items:center}.__ngx-selectbox-may .__item-list-browser .__item-search input[type=text]{width:100%;border:1px solid #dfe3e9;border-radius:4px;padding:8px 30px 8px 10px;outline:0}.__ngx-selectbox-may .__item-list-browser .__item-search input[type=text]:focus{border:1px solid #2ea2f8;box-shadow:0 0 0 3px #2ea2f84d}.__ngx-selectbox-may .__item-list-browser ul::-webkit-scrollbar{width:11px;height:18px}.__ngx-selectbox-may .__item-list-browser ul::-webkit-scrollbar-thumb{height:6px;border:3px solid transparent;background-clip:padding-box;-webkit-border-radius:7px;background-color:rgba(0,0,0,.15);-webkit-box-shadow:inset -1px -1px 0 rgba(0,0,0,.05) inset 1px 1px 0 rgba(0,0,0,.05)}.__ngx-selectbox-may .__item-list-browser ul::-webkit-scrollbar-button{width:0;height:0;display:none}.__ngx-selectbox-may .__item-list-browser ul::-webkit-scrollbar-corner{background-color:transparent}.__ngx-selectbox-may .__loading-text{position:absolute;background-color:#e5e5e5;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;padding-left:10px;border-radius:4px;z-index:2}"] }] } ]; /** @nocollapse */ NgxSelectboxMayComponent.ctorParameters = function () { return [ { type: ElementRef }, { type: NgxSelectboxMayService } ]; }; NgxSelectboxMayComponent.propDecorators = { items: [{ type: Input, args: ["items",] }], cssClass: [{ type: Input, args: ["css-class",] }], valueField: [{ type: Input, args: ["value-field",] }], labelField: [{ type: Input, args: ["label-field",] }], placeholder: [{ type: Input, args: ["placeholder",] }], emptyText: [{ type: Input, args: ["empty-text",] }], showEmptyResultText: [{ type: Input, args: ["show-empty-text",] }], isMulti: [{ type: Input, args: ["is-multi",] }], isLoading: [{ type: Input, args: ["is-loading",] }], loadingText: [{ type: Input, args: ["loading-text",] }], onKeyUp: [{ type: Output, args: ["search-keyup",] }], onSelect: [{ type: Output, args: ["on-select-item",] }], onBlur: [{ type: Output, args: ["on-blur",] }], searchField: [{ type: ViewChild, args: ['search_field',] }], listItems: [{ type: ViewChildren, args: ["li_item",] }], actionTemplate: [{ type: ContentChild, args: ['actionTemplate',] }], content: [{ type: ViewChild, args: ['item_window',] }] }; return NgxSelectboxMayComponent; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var NGXSelectboxMayPipe = /** @class */ (function () { function NGXSelectboxMayPipe() { } /** * @param {?} items * @param {?} filter * @return {?} */ NGXSelectboxMayPipe.prototype.transform = /** * @param {?} items * @param {?} filter * @return {?} */ function (items, filter) { if (!items || !filter) { return items; } // filter items array, items which match and return true will be // kept, false will be filtered out return items.filter(function (item) { return item.label.toUpperCase().indexOf(filter.toUpperCase()) !== -1; }); }; NGXSelectboxMayPipe.decorators = [ { type: Pipe, args: [{ name: 'ngx_item_filter', pure: false },] } ]; return NGXSelectboxMayPipe; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ var NgxSelectboxMayModule = /** @class */ (function () { function NgxSelectboxMayModule() { } NgxSelectboxMayModule.decorators = [ { type: NgModule, args: [{ declarations: [NgxSelectboxMayComponent, NGXSelectboxMayPipe], imports: [ BrowserModule, BrowserAnimationsModule, FormsModule ], exports: [NgxSelectboxMayComponent] },] } ]; return NgxSelectboxMayModule; }()); /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ export { NgxSelectboxMayService, NgxSelectboxMayComponent, NGXSelectMayRow, NGXSelectMayConfigs, NGXSelectboxMayPipe, NgxSelectboxMayModule }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXNlbGVjdGJveC1tYXkuanMubWFwIiwic291cmNlcyI6WyJuZzovL25neC1zZWxlY3Rib3gtbWF5L2xpYi9uZ3gtc2VsZWN0Ym94LW1heS1jb25maWdzLnRzIiwibmc6Ly9uZ3gtc2VsZWN0Ym94LW1heS9saWIvbmd4LXNlbGVjdGJveC1tYXkuc2VydmljZS50cyIsIm5nOi8vbmd4LXNlbGVjdGJveC1tYXkvbGliL25neC1zZWxlY3Rib3gtbWF5LmNvbXBvbmVudC50cyIsIm5nOi8vbmd4LXNlbGVjdGJveC1tYXkvbGliL05HWFNlbGVjdGJveE1heVBpcGUudHMiLCJuZzovL25neC1zZWxlY3Rib3gtbWF5L2xpYi9uZ3gtc2VsZWN0Ym94LW1heS5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIE5HWFNlbGVjdE1heVJvd3tcbiAgICBpc1NlbGVjdGVkOmJvb2xlYW47XG4gICAgZGF0YTphbnk7XG4gICAgdmFsdWU6YW55O1xuICAgIGxhYmVsOnN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGlzU2VsZWN0ZWQ6Ym9vbGVhbiwgZGF0YTphbnkpe1xuICAgICAgICB0aGlzLmlzU2VsZWN0ZWQgPSBpc1NlbGVjdGVkO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cblxuICAgIHNldEtleSh2YWx1ZTphbnkpe1xuICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgfVxuXG4gICAgc2V0TGFiZWwobGFiZWw6c3RyaW5nKXtcbiAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsO1xuICAgIH1cbn1cblxuXG5leHBvcnQgY2xhc3MgTkdYU2VsZWN0TWF5Q29uZmlnc3tcblxuXG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBST1dfQUNUSVZFX0NMQVNTID0gXCJhY3RpdmVcIjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEVNUFRZX1RFWFQgPSBcIk5vIHJlc3VsdHMgZm91bmRcIjtcbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1VTFRJX1NFTEVDVEVEX0xBQkVMID0gXCIjQ09VTlQgI0lURU1TIFNlbGVjdGVkXCI7XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBMT0FESU5HX1RFWFQgPSBcIlBsZWFzZSB3YWl0Li4uXCI7XG5cbiAgICBwcml2YXRlIF9sYWJlbEZpZWxkOiBzdHJpbmcgPSBcIlwiO1xuICAgIHB1YmxpYyBnZXQgbGFiZWxGaWVsZCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFiZWxGaWVsZDtcbiAgICB9XG4gICAgcHVibGljIHNldCBsYWJlbEZpZWxkKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5fbGFiZWxGaWVsZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3ZhbHVlRmllbGQ6IGFueTtcbiAgICBwdWJsaWMgZ2V0IHZhbHVlRmllbGQoKTogYW55IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlRmllbGQ7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgdmFsdWVGaWVsZCh2YWx1ZTogYW55KSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlRmllbGQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9wbGFjZWhvbGRlclRleHQ6IHN0cmluZyA9IFwiXCI7XG4gICAgcHVibGljIGdldCBwbGFjZWhvbGRlclRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BsYWNlaG9sZGVyVGV4dDtcbiAgICB9XG4gICAgcHVibGljIHNldCBwbGFjZWhvbGRlclRleHQodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9wbGFjZWhvbGRlclRleHQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9lbXB0eVRleHQ6IHN0cmluZyA9IFwiXCI7XG4gICAgcHVibGljIGdldCBlbXB0eVRleHQoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtcHR5VGV4dDtcbiAgICB9XG4gICAgcHVibGljIHNldCBlbXB0eVRleHQodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLl9lbXB0eVRleHQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zaG93RW1wdHlSZXN1bHRzTGFiZWw6IGJvb2xlYW4gPSB0cnVlO1xuICAgIHB1YmxpYyBnZXQgc2hvd0VtcHR5UmVzdWx0c0xhYmVsKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2hvd0VtcHR5UmVzdWx0c0xhYmVsO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IHNob3dFbXB0eVJlc3VsdHNMYWJlbCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9zaG93RW1wdHlSZXN1bHRzTGFiZWwgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9jc3NDbGFzczogc3RyaW5nID0gXCJcIjtcbiAgICBwdWJsaWMgZ2V0IGNzc0NsYXNzKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jc3NDbGFzcztcbiAgICB9XG4gICAgcHVibGljIHNldCBjc3NDbGFzcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuX2Nzc0NsYXNzID0gdmFsdWU7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIF9pc011bHRpU2VsZWN0OiBib29sZWFuO1xuICAgIHB1YmxpYyBnZXQgaXNNdWx0aVNlbGVjdCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzTXVsdGlTZWxlY3Q7XG4gICAgfVxuICAgIHB1YmxpYyBzZXQgaXNNdWx0aVNlbGVjdCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLl9pc011bHRpU2VsZWN0ID0gdmFsdWU7XG4gICAgfVxuXG59IiwiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTkdYU2VsZWN0TWF5Q29uZmlncywgTkdYU2VsZWN0TWF5Um93IH0gZnJvbSAnLi9uZ3gtc2VsZWN0Ym94LW1heS1jb25maWdzJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTmd4U2VsZWN0Ym94TWF5U2VydmljZSB7XG5cbiAgY29uc3RydWN0b3IoKSB7IH1cblxuICBjcmVhdGVEcm9wZG93blJvd3MoaXRlbXM6YW55W10sIGNvbmZpZ3M6TkdYU2VsZWN0TWF5Q29uZmlncyk6QXJyYXk8TkdYU2VsZWN0TWF5Um93PntcbiAgICBsZXQgYXJyID0gW107XG4gICAgaXRlbXMuZm9yRWFjaChlbGVtZW50ID0+IHtcbiAgICAgIGxldCByb3cgPSBuZXcgTkdYU2VsZWN0TWF5Um93KGZhbHNlLCBlbGVtZW50KTtcbiAgICAgIHJvdy5zZXRLZXkoY29uZmlncy52YWx1ZUZpZWxkID8gZWxlbWVudFtjb25maWdzLnZhbHVlRmllbGRdIDogZWxlbWVudCk7XG4gICAgICByb3cuc2V0TGFiZWwoY29uZmlncy5sYWJlbEZpZWxkID8gZWxlbWVudFtjb25maWdzLmxhYmVsRmllbGRdIDogZWxlbWVudCk7XG4gICAgICBhcnIucHVzaChyb3cpO1xuICAgIH0pO1xuICAgIHJldHVybiBhcnI7XG4gIH1cblxuICByZWNvbmZpZ3VyZURyb3Bkb3duUm93TGFiZWxzQW5kVmFsdWVzKGFsbFJvd3M6QXJyYXk8TkdYU2VsZWN0TWF5Um93PiwgY29uZmlnczpOR1hTZWxlY3RNYXlDb25maWdzKXtcbiAgICBhbGxSb3dzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICBlbGVtZW50LnNldEtleShjb25maWdzLnZhbHVlRmllbGQgPyBlbGVtZW50LmRhdGFbY29uZmlncy52YWx1ZUZpZWxkXSA6IGVsZW1lbnQuZGF0YSk7XG4gICAgICBlbGVtZW50LnNldExhYmVsKGNvbmZpZ3MubGFiZWxGaWVsZCA/IGVsZW1lbnQuZGF0YVtjb25maWdzLmxhYmVsRmllbGRdIDogZWxlbWVudC5kYXRhKTtcbiAgICB9KTtcbiAgfVxuXG5cbiAgY3JlYXRlRHJvcGRvd25MYWJlbChjb25maWdzOk5HWFNlbGVjdE1heUNvbmZpZ3MsIHNlbGVjdGVkUm93czpBcnJheTxOR1hTZWxlY3RNYXlSb3c+KXtcbiAgICAvL0NoZWNrIGlzIGNvbmZpZ3VyZWQgdG8gc2VsZWN0IG11bHRpcGxlIGNob2ljZXNcbiAgICBpZihjb25maWdzLmlzTXVsdGlTZWxlY3Qpe1xuXG4gICAgICBpZihzZWxlY3RlZFJvd3MubGVuZ3RoID4gMSl7XG4gICAgICAgIHJldHVybiBOR1hTZWxlY3RNYXlDb25maWdzLk1VTFRJX1NFTEVDVEVEX0xBQkVMLnJlcGxhY2UoXCIjQ09VTlRcIiwgc2VsZWN0ZWRSb3dzLmxlbmd0aC50b1N0cmluZygpKS5yZXBsYWNlKFwiI0lURU1TXCIsIFwiSXRlbXNcIik7XG4gICAgICB9ZWxzZSBpZihzZWxlY3RlZFJvd3MubGVuZ3RoID09IDEpe1xuICAgICAgICByZXR1cm4gTkdYU2VsZWN0TWF5Q29uZmlncy5NVUxUSV9TRUxFQ1RFRF9MQUJFTC5yZXBsYWNlKFwiI0NPVU5UXCIsIHNlbGVjdGVkUm93cy5sZW5ndGgudG9TdHJpbmcoKSkucmVwbGFjZShcIiNJVEVNU1wiLCBcIkl0ZW1cIik7XG4gICAgICB9ZWxzZXtcbiAgICAgICAgcmV0dXJuIE5HWFNlbGVjdE1heUNvbmZpZ3MuTVVMVElfU0VMRUNURURfTEFCRUwucmVwbGFjZShcIiNDT1VOVFwiLCBzZWxlY3RlZFJvd3MubGVuZ3RoLnRvU3RyaW5nKCkpLnJlcGxhY2UoXCIjSVRFTVNcIiwgXCJJdGVtc1wiKTtcbiAgICAgIH1cblxuICAgIH1lbHNle1xuICAgICAgcmV0dXJuIHNlbGVjdGVkUm93cy5sZW5ndGggPiAwID8gc2VsZWN0ZWRSb3dzWzBdLmxhYmVsIDogXCJcIjtcbiAgICB9XG4gIH1cblxuICBzZXRTZWxlY3RlZEl0ZW1zKGNvbmZpZ3M6TkdYU2VsZWN0TWF5Q29uZmlncywgc2VsZWN0ZWRSb3dzOkFycmF5PE5HWFNlbGVjdE1heVJvdz4sYWxsUm93czpBcnJheTxOR1hTZWxlY3RNYXlSb3c+LCByb3c6TkdYU2VsZWN0TWF5Um93KXtcbiAgICAvL0NoZWNrIGlzIGNvbmZpZ3VyZWQgdG8gc2VsZWN0IG11bHRpcGxlIGNob2ljZXNcbiAgICBpZihjb25maWdzLmlzTXVsdGlTZWxlY3Qpe1xuICAgICAgXG4gICAgfWVsc2V7XG4gICAgICBpZighcm93LmlzU2VsZWN0ZWQpe1xuICAgICAgICB0aGlzLnVuc2VsZWN0QWxsU2VsZWN0ZWRSb3dzKGFsbFJvd3MpO1xuICAgICAgICByb3cuaXNTZWxlY3RlZCA9IHRydWU7XG4gICAgICAgIHNlbGVjdGVkUm93cyA9IFtdO1xuICAgICAgICBzZWxlY3RlZFJvd3MucHVzaChyb3cpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0ZWRSb3dzO1xuICB9XG5cbiAgdW5zZWxlY3RBbGxTZWxlY3RlZFJvd3MoYWxsUm93czpBcnJheTxOR1hTZWxlY3RNYXlSb3c+KXtcbiAgICBhbGxSb3dzLmZvckVhY2gociA9PiB7XG4gICAgICByLmlzU2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIHNlbGVjdEl0ZW1CeVZhbHVlKGFsbFJvd3M6QXJyYXk8TkdYU2VsZWN0TWF5Um93PiwgdmFsdWU6YW55KXtcbiAgICBsZXQgZmlsdGVyZWRWYWwgPSBhbGxSb3dzLmZpbHRlcihyID0+IHIudmFsdWUgPT09IHZhbHVlKTtcbiAgICBpZihmaWx0ZXJlZFZhbC5sZW5ndGggPiAwKSBmaWx0ZXJlZFZhbFswXS5pc1NlbGVjdGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gZmlsdGVyZWRWYWw7XG4gIH1cblxuICBzZWxlY3RJdGVtc0J5VmFsdWUoYWxsUm93czpBcnJheTxOR1hTZWxlY3RNYXlSb3c+LCB2YWx1ZXM6QXJyYXk8YW55Pil7XG4gICAgbGV0IGEgPSBbXTtcbiAgICB2YWx1ZXMuZm9yRWFjaCh2ID0+IHtcbiAgICAgIGxldCBmaWx0ZXJlZFZhbCA9IGFsbFJvd3MuZmlsdGVyKHIgPT4gci52YWx1ZSA9PT0gdik7XG4gICAgICBpZihmaWx0ZXJlZFZhbC5sZW5ndGggPiAwKSBmaWx0ZXJlZFZhbFswXS5pc1NlbGVjdGVkID0gdHJ1ZTsgYS5wdXNoKGZpbHRlcmVkVmFsWzBdKTtcbiAgICB9KVxuICAgIHJldHVybiBhO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgVmlld0NoaWxkcmVuLCBRdWVyeUxpc3QsIGZvcndhcmRSZWYsIEhvc3RMaXN0ZW5lciwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIENvbnRlbnRDaGlsZCwgVGVtcGxhdGVSZWYsIE9uRGVzdHJveSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBOZ3hTZWxlY3Rib3hNYXlTZXJ2aWNlIH0gZnJvbSAnLi9uZ3gtc2VsZWN0Ym94LW1heS5zZXJ2aWNlJztcbmltcG9ydCB7IE5HWFNlbGVjdE1heUNvbmZpZ3MsIE5HWFNlbGVjdE1heVJvdyB9IGZyb20gJy4vbmd4LXNlbGVjdGJveC1tYXktY29uZmlncyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1zZWxlY3Rib3gtbWF5JyxcbiAgaG9zdDoge1xuICAgICcoZG9jdW1lbnQ6Y2xpY2spJzogJ29uQ2xpY2tPdXRzaWRlKCRldmVudCknLFxuICAgICcod2luZG93OnJlc2l6ZSknOiAnb25XaW5kb3dSZXNpemUoJGV2ZW50KSdcbiAgfSxcbiAgdGVtcGxhdGVVcmw6ICcuL25neC1zZWxlY3Rib3gtbWF5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbmd4LXNlbGVjdGJveC1tYXkuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ3hTZWxlY3Rib3hNYXlDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIE5neFNlbGVjdGJveE1heUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuXG4gIGRyb3Bkb3duUm93czogQXJyYXk8TkdYU2VsZWN0TWF5Um93PiA9IFtdO1xuICBjb25maWdzOiBOR1hTZWxlY3RNYXlDb25maWdzID0gbmV3IE5HWFNlbGVjdE1heUNvbmZpZ3MoKTtcbiAgc2VsZWN0ZWRSb3dzOiBBcnJheTxOR1hTZWxlY3RNYXlSb3c+ID0gW107XG4gIHNob3dfaXRlbXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgc2VhcmNoVGV4dDogc3RyaW5nID0gXCJcIjtcbiAgaXNFbmFibGU6Ym9vbGVhbiA9IHRydWU7XG4gIHByb3BhZ2F0ZUNoYW5nZSA9IChfOiBhbnkpID0+IHsgfTtcbiAgcHJvcGFnYXRlT25Ub3VjaCA9IChfOiBhbnkpID0+IHsgfTtcblxuICBASW5wdXQoXCJpdGVtc1wiKVxuICBzZXQgaXRlbXMoaXRlbXM6IGFueVtdKSB7XG4gICAgdGhpcy5jcmVhdGVEcm9wZG93blJvd3MoaXRlbXMpO1xuICB9XG5cbiAgQElucHV0KFwiY3NzLWNsYXNzXCIpXG4gIHNldCBjc3NDbGFzcyhjc3NDbGFzczogc3RyaW5nKSB7XG4gICAgdGhpcy5jb25maWdzLmNzc0NsYXNzID0gY3NzQ2xhc3M7XG4gIH1cblxuICBASW5wdXQoXCJ2YWx1ZS1maWVsZFwiKVxuICBzZXQgdmFsdWVGaWVsZCh2YWx1ZUZpZWxkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbmZpZ3MudmFsdWVGaWVsZCA9IHZhbHVlRmllbGQ7XG4gIH1cblxuICBASW5wdXQoXCJsYWJlbC1maWVsZFwiKVxuICBzZXQgbGFiZWxGaWVsZChsYWJlbEZpZWxkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbmZpZ3MubGFiZWxGaWVsZCA9IGxhYmVsRmllbGQ7XG4gICAgdGhpcy5yZWNvbmZpZ3VyZUxhYmVsc0FuZFZhbHVlcygpO1xuICB9XG5cbiAgQElucHV0KFwicGxhY2Vob2xkZXJcIilcbiAgc2V0IHBsYWNlaG9sZGVyKHBsYWNlaG9sZGVyOiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbmZpZ3MucGxhY2Vob2xkZXJUZXh0ID0gcGxhY2Vob2xkZXI7XG4gIH1cblxuICBASW5wdXQoXCJlbXB0eS10ZXh0XCIpXG4gIHNldCBlbXB0eVRleHQoZW1wdHlUZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLmNvbmZpZ3MuZW1wdHlUZXh0ID0gZW1wdHlUZXh0O1xuICB9XG5cbiAgQElucHV0KFwic2hvdy1lbXB0eS10ZXh0XCIpXG4gIHNldCBzaG93RW1wdHlSZXN1bHRUZXh0KHNob3dFbXB0eVRleHQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNvbmZpZ3Muc2hvd0VtcHR5UmVzdWx0c0xhYmVsID0gc2hvd0VtcHR5VGV4dDtcbiAgfVxuXG4gIEBJbnB1dChcImlzLW11bHRpXCIpXG4gIHNldCBpc011bHRpKGlzTXVsdGk6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmNvbmZpZ3MuaXNNdWx0aVNlbGVjdCA9IGlzTXVsdGk7XG4gIH1cblxuICBfaXNMb2FkaW5nOiBib29sZWFuO1xuICBASW5wdXQoXCJpcy1sb2FkaW5nXCIpXG4gIHNldCBpc0xvYWRpbmcoaXNMb2FkaW5nOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNMb2FkaW5nID0gaXNMb2FkaW5nO1xuICB9XG5cbiAgX2xvYWRpbmdUZXh0OiBzdHJpbmc7XG4gIEBJbnB1dChcImxvYWRpbmctdGV4dFwiKVxuICBzZXQgbG9hZGluZ1RleHQobG9hZGluZ1RleHQ6IHN0cmluZykge1xuICAgIHRoaXMuX2xvYWRpbmdUZXh0ID0gbG9hZGluZ1RleHQ7XG4gIH1cblxuICBAT3V0cHV0KFwic2VhcmNoLWtleXVwXCIpIG9uS2V5VXAgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoXCJvbi1zZWxlY3QtaXRlbVwiKSBvblNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgQE91dHB1dChcIm9uLWJsdXJcIikgb25CbHVyID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaF9maWVsZCcpIHNlYXJjaEZpZWxkOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkcmVuKFwibGlfaXRlbVwiKSBsaXN0SXRlbXM6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcbiAgaXRlbVdpbmRvdzogRWxlbWVudFJlZjtcblxuICBAQ29udGVudENoaWxkKCdhY3Rpb25UZW1wbGF0ZScpIGFjdGlvblRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxFbGVtZW50UmVmPjtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfc2VsZWN0Ym94cmVmOiBFbGVtZW50UmVmLCBwcml2YXRlIHNlbGVjdGJveFNlcnZpY2U6IE5neFNlbGVjdGJveE1heVNlcnZpY2UpIHtcblxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gIH1cblxuXG4gIGNyZWF0ZURyb3Bkb3duUm93cyhpdGVtczogYW55W10pIHtcbiAgICB0aGlzLmRyb3Bkb3duUm93cyA9IHRoaXMuc2VsZWN0Ym94U2VydmljZS5jcmVhdGVEcm9wZG93blJvd3MoaXRlbXMsIHRoaXMuY29uZmlncyk7XG4gICAgdGhpcy5zZXRWYWx1ZXNQYXNzZWRFeHRlcm5hbCh0aGlzLm5nTW9kZWxWYWx1ZSk7XG4gIH1cblxuICByZWNvbmZpZ3VyZUxhYmVsc0FuZFZhbHVlcygpIHtcbiAgICB0aGlzLnNlbGVjdGJveFNlcnZpY2UucmVjb25maWd1cmVEcm9wZG93blJvd0xhYmVsc0FuZFZhbHVlcyh0aGlzLmRyb3Bkb3duUm93cywgdGhpcy5jb25maWdzKTtcbiAgfVxuXG4gIGdldFNlbGVjdGJveExhYmVsKCkge1xuICAgIGxldCBsYWJlbCA9IHRoaXMuc2VsZWN0Ym94U2VydmljZS5jcmVhdGVEcm9wZG93bkxhYmVsKHRoaXMuY29uZmlncywgdGhpcy5zZWxlY3RlZFJvd3MpO1xuICAgIHJldHVybiBsYWJlbCA/IGxhYmVsIDogdGhpcy5jb25maWdzLnBsYWNlaG9sZGVyVGV4dDtcbiAgfVxuXG4gIGdldEVtcHR5VGV4dExhYmVsKCkge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ3MuZW1wdHlUZXh0ID8gdGhpcy5jb25maWdzLmVtcHR5VGV4dCA6IE5HWFNlbGVjdE1heUNvbmZpZ3MuRU1QVFlfVEVYVDtcbiAgfVxuXG4gIGdldExvYWRpbmdUZXh0KCkge1xuICAgIHJldHVybiB0aGlzLl9sb2FkaW5nVGV4dCA/IHRoaXMuX2xvYWRpbmdUZXh0IDogTkdYU2VsZWN0TWF5Q29uZmlncy5MT0FESU5HX1RFWFQ7XG4gIH1cblxuICBvbkNsaWNrU2VsZWN0Qm94KCkge1xuICAgIHRoaXMuc2hvd0l0ZW1zV2luZG93KCk7XG4gIH1cblxuICBnZXRBY3RpdmVDbGFzcygpIHtcbiAgICByZXR1cm4gTkdYU2VsZWN0TWF5Q29uZmlncy5ST1dfQUNUSVZFX0NMQVNTO1xuICB9XG5cbiAgc2hvd0l0ZW1zV2luZG93KCkge1xuICAgIHRoaXMuc2hvd19pdGVtcyA9IHRydWU7XG4gIH1cblxuICBoaWRlSXRlbXNXaW5kb3coKSB7XG4gICAgdGhpcy5vbkJsdXIuZW1pdCh0aGlzLnNlYXJjaFRleHQpO1xuICAgIHRoaXMucmVzZXRGaWx0ZXJzKCk7XG4gICAgdGhpcy5zaG93X2l0ZW1zID0gZmFsc2U7XG4gIH1cblxuICBvblJlbW92ZUNsaWNrKCkge1xuICAgIHRoaXMuc2VsZWN0Ym94U2VydmljZS51bnNlbGVjdEFsbFNlbGVjdGVkUm93cyh0aGlzLmRyb3Bkb3duUm93cyk7XG4gICAgdGhpcy5zZWxlY3RlZFJvd3MgPSBbXTtcbiAgICB0aGlzLnB1Ymxpc2hWYWx1ZSgpO1xuICB9XG5cbiAgb25TZWFyY2hLZXlkb3duKGUpIHtcbiAgICBpZiAoZS5rZXkgPT0gXCJFc2NhcGVcIikge1xuICAgICAgdGhpcy5oaWRlSXRlbXNXaW5kb3coKTtcbiAgICB9XG4gICAgLy9VcCBhbmQgRG93biBhcnJvdyBldmVudHNcbiAgICBpZiAoZS5rZXlDb2RlID09IDM4IHx8IGUua2V5Q29kZSA9PSA0MCkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VhcmNoS2V5dXAoZSkge1xuICAgIGlmIChlLmtleUNvZGUgPT0gMzggfHwgZS5rZXlDb2RlID09IDQwIHx8IGUua2V5ID09IFwiRXNjYXBlXCIpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLm9uS2V5VXAuZW1pdCh0aGlzLnNlYXJjaFRleHQpO1xuICAgIH1cbiAgfVxuXG4gIHJlc2V0RmlsdGVycygpIHtcbiAgICB0aGlzLnNlYXJjaFRleHQgPSBcIlwiO1xuICB9XG5cbiAgb25DbGlja0l0ZW0ocm93OiBOR1hTZWxlY3RNYXlSb3csIGluZGV4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5jb25maWdzLmlzTXVsdGlTZWxlY3QpIHtcblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93cyA9IHRoaXMuc2VsZWN0Ym94U2VydmljZS5zZXRTZWxlY3RlZEl0ZW1zKHRoaXMuY29uZmlncywgdGhpcy5zZWxlY3RlZFJvd3MsIHRoaXMuZHJvcGRvd25Sb3dzLCByb3cpO1xuICAgICAgdGhpcy5vblNlbGVjdC5lbWl0KHJvdy5kYXRhKTtcbiAgICAgIHRoaXMuaGlkZUl0ZW1zV2luZG93KCk7XG4gICAgfVxuICAgIHRoaXMucHVibGlzaFZhbHVlKCk7XG4gIH1cblxuICBwdWJsaXNoVmFsdWUoKSB7XG4gICAgbGV0IHZhbHVlcyA9IHRoaXMuc2VsZWN0ZWRSb3dzLm1hcChyID0+IHIudmFsdWUpO1xuICAgIGlmICh0aGlzLmNvbmZpZ3MuaXNNdWx0aVNlbGVjdCkge1xuICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodmFsdWVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodmFsdWVzLmxlbmd0aCA+IDAgPyB2YWx1ZXNbMF0gOiBcIlwiKTtcbiAgICB9XG4gIH1cblxuICBzZXRWYWx1ZXNQYXNzZWRFeHRlcm5hbChvYmo6IGFueSkge1xuICAgIGlmICh0aGlzLmNvbmZpZ3MuaXNNdWx0aVNlbGVjdCkge1xuICAgICAgdGhpcy5zZWxlY3RlZFJvd3MgPSB0aGlzLnNlbGVjdGJveFNlcnZpY2Uuc2VsZWN0SXRlbXNCeVZhbHVlKHRoaXMuZHJvcGRvd25Sb3dzLCBvYmopO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnNlbGVjdGVkUm93cyA9IHRoaXMuc2VsZWN0Ym94U2VydmljZS5zZWxlY3RJdGVtQnlWYWx1ZSh0aGlzLmRyb3Bkb3duUm93cywgb2JqKTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAqXG4gICogT24gSXRlbSBicm93c2Ugb3BlbiB3aW5kb3cgYmVnaW4gJiBkb2N1bWVudCBvdXRzaWRlIGNsaWNrIGV2ZW50IEJlZ2luc1xuICAqIFxuICAqL1xuXG4gIEBWaWV3Q2hpbGQoJ2l0ZW1fd2luZG93Jykgc2V0IGNvbnRlbnQoY29udGVudDogRWxlbWVudFJlZikge1xuICAgIHRoaXMuaXRlbVdpbmRvdyA9IGNvbnRlbnQ7XG4gICAgLy8gdGhpcy5wb3NpdGlvbldpbmRvdygpO1xuICAgIHRoaXMuZm9jdXNUb1NlYXJjaEZpZWxkKCk7XG4gICAgdGhpcy5zY3JvbGxUb1NlbGVjdGVkSXRlbSgpO1xuICB9XG5cbiAgcG9zaXRpb25XaW5kb3coKSB7XG4gICAgaWYgKHRoaXMuc2VhcmNoRmllbGQpIHtcbiAgICAgIGNvbnN0IHNlbGVjdEJveFJlZiA9IHRoaXMuX3NlbGVjdGJveHJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgdmFyIHZpZXdwb3J0T2Zmc2V0ID0gc2VsZWN0Qm94UmVmLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc29sZS5sb2codmlld3BvcnRPZmZzZXQpO1xuICAgICAgdGhpcy5pdGVtV2luZG93Lm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHlsZScsICd3aWR0aDogJyArIChzZWxlY3RCb3hSZWYuZmlyc3RDaGlsZC5vZmZzZXRXaWR0aCArIDMpICsgJ3B4OyB0b3A6ICcgKyAodmlld3BvcnRPZmZzZXQudG9wIC0gNSkgKyAncHg7IG1hcmdpbi1sZWZ0OiAtMTJweDsnKTtcbiAgICB9XG4gIH1cblxuICBmb2N1c1RvU2VhcmNoRmllbGQoKSB7XG4gICAgaWYgKHRoaXMuc2VhcmNoRmllbGQpIHtcbiAgICAgIHRoaXMuc2VhcmNoRmllbGQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIHNjcm9sbFRvU2VsZWN0ZWRJdGVtKCkge1xuICAgIHRoaXMubGlzdEl0ZW1zLmZvckVhY2gobGkgPT4ge1xuICAgICAgaWYgKGxpLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKE5HWFNlbGVjdE1heUNvbmZpZ3MuUk9XX0FDVElWRV9DTEFTUykpIHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsTGkgPSBsaS5uYXRpdmVFbGVtZW50O1xuICAgICAgICB0aGlzLml0ZW1XaW5kb3cubmF0aXZlRWxlbWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcInVsXCIpWzBdLnNjcm9sbFRvcCA9IHNjcm9sbExpLm9mZnNldFRvcCAtIChzY3JvbGxMaS5vZmZzZXRIZWlnaHQgKyAyMCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvbkNsaWNrT3V0c2lkZShlKSB7XG4gICAgaWYgKCF0aGlzLl9zZWxlY3Rib3hyZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQpICYmIHRoaXMuc2hvd19pdGVtcykge1xuICAgICAgdGhpcy5oaWRlSXRlbXNXaW5kb3coKTtcbiAgICB9XG4gIH1cblxuICBvbldpbmRvd1Jlc2l6ZShlKSB7XG4gICAgLy8gdGhpcy5wb3NpdGlvbldpbmRvdygpO1xuICB9XG5cbiAgc2V0RGlzYWJsZSgpe1xuICAgIHRoaXMuaGlkZUl0ZW1zV2luZG93KCk7XG4gICAgdGhpcy5pc0VuYWJsZSA9IGZhbHNlO1xuICB9XG5cbiAgc2V0RW5hYmxlKCl7XG4gICAgdGhpcy5pc0VuYWJsZSA9IHRydWU7XG4gIH1cblxuICAvKlxuICAqXG4gICogT24gSXRlbSBicm93c2Ugb3BlbiB3aW5kb3cgYmVnaW4gJiBkb2N1bWVudCBvdXRzaWRlIGNsaWNrIGV2ZW50IEVuZHNcbiAgKiBcbiAgKi9cblxuXG5cbiAgLypcbiAgLy9vbiBkb2N1bWVudCBrZXkgdXAgYW5kIGRvd25cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSkgb25LZXlkb3duSGFuZGxlcihldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIGlmKChldmVudC5rZXlDb2RlID09IDM4IHx8IGV2ZW50LmtleUNvZGUgPT0gNDApICYmIHRoaXMuaXRlbVdpbmRvdyAmJiB0aGlzLmNsb25lZEl0ZW1zLmxlbmd0aCA+IDApe1xuICAgICAgICB2YXIgaW5kZXggPSAtMTtcbiAgICAgIC