ngx-selectbox-may
Version:
Angular selectbox with autocomplete
939 lines (930 loc) • 68.7 kB
JavaScript
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