@inaccess-fang/ui-components
Version:
The Inaccess UI Components Library for the Front-end projects
158 lines • 28.6 kB
JavaScript
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
import { sortBy } from '../../core/utils/fang-comp-lib.utils';
const dropdownTypeMap = {
'default': 'dropdown-wrapper',
'compact': 'dropdown-wrapper-sm',
'large': 'dropdown-wrapper-lg'
};
export class FangDropdownComponent {
constructor() {
this.config = {};
this.selectedItemsChanged = new EventEmitter();
this.isDropdownOpen = false;
this.selectedItems = [];
this.searchInputText = '';
}
ngOnChanges(changes) {
if (changes['data']) {
if (this.config.hasChipGroup && this.config.chipGroupConfig) {
this.config.chipGroupConfig.propertyAccessKey = this.config.propertyAccessKey;
this.config.chipGroupConfig.interaction = 'close';
}
// Transform dropdownData to string[]
this.dropdownData = [...this.data].map((el) => {
return this.getPropertyValue(el);
});
this.filteredDropdownData = [...this.dropdownData];
this.filteredDropdownData = this.sortData(this.filteredDropdownData);
}
if (changes['config'].isFirstChange()) {
if (!this.config.type) {
this.config.type = 'default';
}
if (this.config.isGrowable === undefined) {
this.config.isGrowable = true;
}
if (this.config.isPortfolio) {
this.config.hasContainer = false;
this.config.chipGroupConfig.alignment = 'group-inline';
this.config.chipGroupConfig.chipBackground = undefined;
}
}
}
selectItem(item) {
if (this.config.hasMultiSelect) {
const isElementSelected = this.selectedItems.find((el) => this.getPropertyValue(el) === item);
if (!isElementSelected) {
this.selectedItems = [...this.selectedItems, this.data.find((el) => this.getPropertyValue(el) === item)];
}
else {
this.selectedItems = this.selectedItems.filter((el) => this.getPropertyValue(el) !== item);
}
// Chip Group & portfolio
if (this.config.hasChipGroup && this.config.chipGroupConfig) {
this.dropdownData = this.dropdownData.filter((el) => el !== item);
this.filteredDropdownData = this.filteredDropdownData.filter((el) => el !== item);
this.filteredDropdownData = this.sortData(this.filteredDropdownData);
}
this.selectedItemsChanged.emit(this.selectedItems);
// TODO Tree implementation
}
else { // single select
this.selectedItems = [this.data.find((el) => this.getPropertyValue(el) === item)];
this.isDropdownOpen = false;
this.selectedItemsChanged.emit(this.selectedItems);
}
}
toggleDropdown(arrowPressed = false, event = undefined) {
event && event.stopPropagation();
if (arrowPressed || !this.config.hasChipGroup || (this.config.hasChipGroup && !this.selectedItems.length && !arrowPressed)) {
this.isDropdownOpen = !this.isDropdownOpen;
}
}
getPropertyValue(element) {
return this.config.propertyAccessKey
? element[this.config.propertyAccessKey]
: element;
}
isItemSelected(item) {
return this.selectedItems.find((el) => this.getPropertyValue(el) === item);
}
removeChip(item) {
this.selectedItems = this.selectedItems.filter((el) => el !== item);
// re-add chip to list only if its not portfolio
if (this.config.hasChipGroup && this.config.chipGroupConfig) {
this.dropdownData = [...this.dropdownData, this.getPropertyValue(item)];
this.filteredDropdownData = [...this.filteredDropdownData, this.getPropertyValue(item)];
this.filteredDropdownData = this.sortData(this.filteredDropdownData);
}
}
getConcatSelectedItems(items) {
return items.map(item => this.getPropertyValue(item)).join(', ');
}
selectAll() {
this.selectedItems = [...this.data];
if (this.config.hasChipGroup) {
this.dropdownData = [];
this.filteredDropdownData = [];
}
else {
this.dropdownData = this.selectedItems.map((selectedItem) => {
return this.getPropertyValue(selectedItem);
});
}
}
clearAll() {
this.selectedItems = [];
if (this.config.hasChipGroup) {
this.dropdownData = [...this.data].map((dataEl) => {
return this.getPropertyValue(dataEl);
});
this.filteredDropdownData = [...this.dropdownData];
this.filteredDropdownData = this.sortData(this.filteredDropdownData);
}
}
proceedToSelection(item, event = undefined) {
event && event.stopPropagation();
if (!!this.selectedItems.find((el) => this.getPropertyValue(el) === item)
|| (this.config.multiActions && this.config.multiActions.selectLimit && this.config.multiActions.selectLimit > this.selectedItems.length)
|| (this.config.multiActions && !this.config.multiActions.selectLimit)
|| !this.config.multiActions) {
this.selectItem(item);
}
}
sortData(data) {
return sortBy(data);
}
getDropdownSize() {
return dropdownTypeMap[this.config.type];
}
totalSelectedItems() {
if (this.config.titleConfig && this.config.titleConfig.isTitleConcatenated) {
if (this.config.multiActions && this.config.multiActions.selectLimit) {
return `${this.getConcatSelectedItems(this.selectedItems)} (${this.selectedItems.length}/${this.config.multiActions.selectLimit})`;
}
return `${this.getConcatSelectedItems(this.selectedItems)} (${this.selectedItems.length})`;
}
else {
if (this.config.multiActions && this.config.multiActions.selectLimit) {
return `Total Selected (${this.selectedItems.length}/${this.config.multiActions.selectLimit})`;
}
return `Total Selected (${this.selectedItems.length})`;
}
}
}
FangDropdownComponent.decorators = [
{ type: Component, args: [{
selector: 'fang-dropdown',
template: "<div uds-ui class=\"light-theme\" (clickOutsideElement)=\"isDropdownOpen=false\">\n\t<div class=\" {{getDropdownSize()}}\"\n\t\t [ngClass]=\"{'no-container ': config.hasContainer !== undefined && !config.hasContainer,\n\t\t\t\t\t 'reverse': config.isPortfolio,\n\t\t\t\t\t 'grow': config.isGrowable && !config.isPortfolio}\"\n\t\t style=\"margin: 0 12px\">\n\t\t<div class=\"input\" (click)=\"toggleDropdown(false)\">\n\n\t\t\t<!-- Single Item Select -->\n\t\t\t<ng-container *ngIf=\"!config.hasMultiSelect\">\n\t\t\t\t<p *ngIf=\"!selectedItems.length\" class=\"text-placeholder\">\n\t\t\t\t\t{{config.titleConfig && config.titleConfig.placeholder ? config.titleConfig.placeholder : 'Select item...'}}\n\t\t\t\t</p>\n\t\t\t\t<p *ngIf=\"selectedItems.length\">{{getPropertyValue(selectedItems[0])}}</p>\n\t\t\t</ng-container>\n\n\t\t\t<!-- Multi Item Select -->\n\t\t\t<ng-container *ngIf=\"config.hasMultiSelect\">\n\t\t\t\t<!-- CheckList -->\n\t\t\t\t<p *ngIf=\"!selectedItems.length && !config.isPortfolio\" class=\"text-placeholder\">\n\t\t\t\t\t{{config.titleConfig && config.titleConfig.placeholder ? config.titleConfig.placeholder : 'Select items...'}}\n\t\t\t\t</p>\n\n\t\t\t\t<!-- Multi Select title -->\n\t\t\t\t<ng-container *ngIf=\"selectedItems.length && !config.hasChipGroup\">\n\t\t\t\t\t<p>{{totalSelectedItems()}}</p>\n\t\t\t\t</ng-container>\n\n\t\t\t\t<!-- Portfolio title -->\n\t\t\t\t<ng-container *ngIf=\"!selectedItems.length && config.isPortfolio\">\n\t\t\t\t\t<p>PORTFOLIOS</p>\n\t\t\t\t</ng-container>\n\n\t\t\t\t<!-- Chip Group & Portfolio -->\n\t\t\t\t<fang-chip-group *ngIf=\"config.hasChipGroup && this.selectedItems.length\"\n\t\t\t\t\t\t\t\t [data]=\"this.selectedItems\"\n\t\t\t\t\t\t\t\t [config]=\"config.chipGroupConfig\"\n\t\t\t\t\t\t\t\t (dataChange)=\"removeChip($event)\">\n\t\t\t\t</fang-chip-group>\n\t\t\t</ng-container>\n\n\t\t\t<!-- Arrow\t-->\n\t\t\t<button class=\"btn-icon grow\" (click)=\"toggleDropdown(true,$event)\">\n\t\t\t\t<i [ngClass]=\"{'ic-caret-down-sm': !isDropdownOpen, 'ic-caret-up-sm': isDropdownOpen}\"></i>\n\t\t\t</button>\n\t\t</div>\n\n\t\t<div class=\"dropdown-container\">\n\t\t\t<!-- Multi Actions -->\n\t\t\t<div class=\"dropdown-header\">\n\t\t\t\t<div class=\"dropdown-header-select\" *ngIf=\"isDropdownOpen && config.hasMultiActions && config.multiActions\">\n\t\t\t\t\t<button *ngIf=\"config.multiActions.hasClearAll\"\n\t\t\t\t\t\t\t[disabled]=\"!selectedItems.length\"\n\t\t\t\t\t\t\tclass=\"btn-secondary-sm\"\n\t\t\t\t\t\t\t(click)=\"clearAll()\">\n\t\t\t\t\t\tclearAll\n\t\t\t\t\t</button>\n\t\t\t\t\t<button [disabled]=\"!(dropdownData && dropdownData.length && ((dropdownData.length <= config.multiActions.selectLimit) || config.multiActions.selectLimit === undefined))\n\t\t\t\t\t\t\t\t\t\t|| (selectedItems.length === dropdownData.length)\"\n\t\t\t\t\t\t\tclass=\"btn-primary-sm\"\n\t\t\t\t\t\t\t(click)=\"(selectedItems.length !== dropdownData.length) && selectAll()\">\n\t\t\t\t\t\tselectAll\n\t\t\t\t\t</button>\n\t\t\t\t</div>\n\n\t\t\t\t<!-- Search field -->\n\t\t\t\t<div *ngIf=\"config.hasSearchField\"\n\t\t\t\t\t [hidden]=\"!isDropdownOpen || !dropdownData.length\"\n\t\t\t\t\t class=\"dropdown-header-search\">\n\t\t\t\t\t<fang-search [data]=\"dropdownData\"\n\t\t\t\t\t\t\t\t [config]=\"config.searchFieldConfig\"\n\t\t\t\t\t\t\t\t (filteredDataChange)=\"filteredDropdownData = $event\"\n\t\t\t\t\t\t\t\t (inputTextChange)=\"searchInputText = $event\">\n\t\t\t\t\t</fang-search>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<!-- Dropdown List\t-->\n\t\t\t<div class=\"dropdown-body\" *ngIf=\"isDropdownOpen\">\n\t\t\t\t<div *ngFor=\"let item of filteredDropdownData\"\n\t\t\t\t\t class=\"dropdown-option\"\n\t\t\t\t\t [ngClass]=\"{'select': config.hasMultiSelect && isItemSelected(item)}\"\n\t\t\t\t\t (click)=\"proceedToSelection(item,$event)\">\n\t\t\t\t\t<p>{{item}}</p>\n\t\t\t\t\t<i *ngIf=\"config.hasMultiSelect && isItemSelected(item)\" class=\"ic-check\"> </i>\n\t\t\t\t</div>\n\t\t\t\t<p *ngIf=\"!filteredDropdownData.length && searchInputText.length\" class=\"no-options\">No results found</p>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n",
changeDetection: ChangeDetectionStrategy.OnPush,
styles: [""]
},] }
];
FangDropdownComponent.propDecorators = {
data: [{ type: Input }],
config: [{ type: Input }],
selectedItemsChanged: [{ type: Output }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFuZy1kcm9wZG93bi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvaWFzb25hcy9EZXNrdG9wL2N1cnJlbnQvZmFuZy11aS1jb21wb25lbnRzLWxpYnJhcnkvcHJvamVjdHMvZmFuZy11aS1jb21wb25lbnRzL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2Ryb3Bkb3duL2ZhbmctZHJvcGRvd24uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWdCLE1BQU0sZUFBZSxDQUFDO0FBRXhILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUU1RCxNQUFNLGVBQWUsR0FBRztJQUN2QixTQUFTLEVBQUUsa0JBQWtCO0lBQzdCLFNBQVMsRUFBRSxxQkFBcUI7SUFDaEMsT0FBTyxFQUFFLHFCQUFxQjtDQUM5QixDQUFBO0FBU0QsTUFBTSxPQUFPLHFCQUFxQjtJQVBsQztRQVNpQixXQUFNLEdBQXVCLEVBQUUsQ0FBQztRQUUvQix5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBUyxDQUFDO1FBSTNELG1CQUFjLEdBQVksS0FBSyxDQUFDO1FBQ2hDLGtCQUFhLEdBQVUsRUFBRSxDQUFDO1FBQzFCLG9CQUFlLEdBQVcsRUFBRSxDQUFDO0lBOEpyQyxDQUFDO0lBNUpBLFdBQVcsQ0FBQyxPQUFzQjtRQUNqQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUVwQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFO2dCQUM1RCxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDO2dCQUM5RSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FB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QUFPLG1CQUFtQixJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFBO1NBQ3REO0lBQ0YsQ0FBQzs7O1lBOUtELFNBQVMsU0FBQztnQkFDVixRQUFRLEVBQUUsZUFBZTtnQkFFekIsd2pJQUE2QztnQkFDN0MsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07O2FBQy9DOzs7bUJBR0MsS0FBSztxQkFDTCxLQUFLO21DQUVMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RmFuZ0Ryb3Bkb3duQ29uZmlnfSBmcm9tICcuL2ZhbmctZHJvcGRvd24uY29tcG9uZW50Lm1vZGVsJztcbmltcG9ydCB7c29ydEJ5fSBmcm9tICcuLi8uLi9jb3JlL3V0aWxzL2ZhbmctY29tcC1saWIudXRpbHMnO1xuXG5jb25zdCBkcm9wZG93blR5cGVNYXAgPSB7XG5cdCdkZWZhdWx0JzogJ2Ryb3Bkb3duLXdyYXBwZXInLFxuXHQnY29tcGFjdCc6ICdkcm9wZG93bi13cmFwcGVyLXNtJyxcblx0J2xhcmdlJzogJ2Ryb3Bkb3duLXdyYXBwZXItbGcnXG59XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ2ZhbmctZHJvcGRvd24nLFxuXHRzdHlsZVVybHM6IFsnLi9mYW5nLWRyb3Bkb3duLmNvbXBvbmVudC5zY3NzJ10sXG5cdHRlbXBsYXRlVXJsOiAnLi9mYW5nLWRyb3Bkb3duLmNvbXBvbmVudC5odG1sJyxcblx0Y2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5cbmV4cG9ydCBjbGFzcyBGYW5nRHJvcGRvd25Db21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuXHRASW5wdXQoKSBwdWJsaWMgZGF0YTogYW55W107XG5cdEBJbnB1dCgpIHB1YmxpYyBjb25maWc6IEZhbmdEcm9wZG93bkNvbmZpZyA9IHt9O1xuXG5cdEBPdXRwdXQoKSBwdWJsaWMgc2VsZWN0ZWRJdGVtc0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuXG5cdHB1YmxpYyBkcm9wZG93bkRhdGE6IHN0cmluZ1tdO1xuXHRwdWJsaWMgZmlsdGVyZWREcm9wZG93bkRhdGE6IHN0cmluZ1tdO1xuXHRwdWJsaWMgaXNEcm9wZG93bk9wZW46IGJvb2xlYW4gPSBmYWxzZTtcblx0cHVibGljIHNlbGVjdGVkSXRlbXM6IGFueVtdID0gW107XG5cdHB1YmxpYyBzZWFyY2hJbnB1dFRleHQ6IHN0cmluZyA9ICcnO1xuXG5cdG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcblx0XHRpZiAoY2hhbmdlc1snZGF0YSddKSB7XG5cblx0XHRcdGlmICh0aGlzLmNvbmZpZy5oYXNDaGlwR3JvdXAgJiYgdGhpcy5jb25maWcuY2hpcEdyb3VwQ29uZmlnKSB7XG5cdFx0XHRcdHRoaXMuY29uZmlnLmNoaXBHcm91cENvbmZpZy5wcm9wZXJ0eUFjY2Vzc0tleSA9IHRoaXMuY29uZmlnLnByb3BlcnR5QWNjZXNzS2V5O1xuXHRcdFx0XHR0aGlzLmNvbmZpZy5jaGlwR3JvdXBDb25maWcuaW50ZXJhY3Rpb24gPSAnY2xvc2UnO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUcmFuc2Zvcm0gZHJvcGRvd25EYXRhIHRvIHN0cmluZ1tdXG5cdFx0XHR0aGlzLmRyb3Bkb3duRGF0YSA9IFsuLi50aGlzLmRhdGFdLm1hcCgoZWw6IGFueSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKGVsKTtcblx0XHRcdH0pO1xuXG5cdFx0XHR0aGlzLmZpbHRlcmVkRHJvcGRvd25EYXRhID0gWy4uLnRoaXMuZHJvcGRvd25EYXRhXTtcblxuXHRcdFx0dGhpcy5maWx0ZXJlZERyb3Bkb3duRGF0YSA9IHRoaXMuc29ydERhdGEodGhpcy5maWx0ZXJlZERyb3Bkb3duRGF0YSk7XG5cdFx0fVxuXG5cdFx0aWYgKGNoYW5nZXNbJ2NvbmZpZyddLmlzRmlyc3RDaGFuZ2UoKSkge1xuXHRcdFx0aWYgKCF0aGlzLmNvbmZpZy50eXBlKSB7XG5cdFx0XHRcdHRoaXMuY29uZmlnLnR5cGUgPSAnZGVmYXVsdCc7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmNvbmZpZy5pc0dyb3dhYmxlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5jb25maWcuaXNHcm93YWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLmNvbmZpZy5pc1BvcnRmb2xpbykge1xuXHRcdFx0XHR0aGlzLmNvbmZpZy5oYXNDb250YWluZXIgPSBmYWxzZTtcblx0XHRcdFx0dGhpcy5jb25maWcuY2hpcEdyb3VwQ29uZmlnLmFsaWdubWVudCA9ICdncm91cC1pbmxpbmUnO1xuXHRcdFx0XHR0aGlzLmNvbmZpZy5jaGlwR3JvdXBDb25maWcuY2hpcEJhY2tncm91bmQgPSB1bmRlZmluZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdH1cblxuXHRwcml2YXRlIHNlbGVjdEl0ZW0oaXRlbTogc3RyaW5nKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuY29uZmlnLmhhc011bHRpU2VsZWN0KSB7XG5cdFx0XHRjb25zdCBpc0VsZW1lbnRTZWxlY3RlZDogYm9vbGVhbiA9IHRoaXMuc2VsZWN0ZWRJdGVtcy5maW5kKChlbDogYW55KSA9PiB0aGlzLmdldFByb3BlcnR5VmFsdWUoZWwpID09PSBpdGVtKTtcblxuXHRcdFx0aWYgKCFpc0VsZW1lbnRTZWxlY3RlZCkge1xuXHRcdFx0XHR0aGlzLnNlbGVjdGVkSXRlbXMgPSBbLi4udGhpcy5zZWxlY3RlZEl0ZW1zLCB0aGlzLmRhdGEuZmluZCgoZWw6IGFueSkgPT4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKGVsKSA9PT0gaXRlbSldO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1zID0gdGhpcy5zZWxlY3RlZEl0ZW1zLmZpbHRlcigoZWw6IGFueSkgPT4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKGVsKSAhPT0gaXRlbSk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENoaXAgR3JvdXAgJiBwb3J0Zm9saW9cblx0XHRcdGlmICh0aGlzLmNvbmZpZy5oYXNDaGlwR3JvdXAgJiYgdGhpcy5jb25maWcuY2hpcEdyb3VwQ29uZmlnKSB7XG5cdFx0XHRcdHRoaXMuZHJvcGRvd25EYXRhID0gdGhpcy5kcm9wZG93bkRhdGEuZmlsdGVyKChlbDogc3RyaW5nKSA9PiBlbCAhPT0gaXRlbSk7XG5cdFx0XHRcdHRoaXMuZmlsdGVyZWREcm9wZG93bkRhdGEgPSB0aGlzLmZpbHRlcmVkRHJvcGRvd25EYXRhLmZpbHRlcigoZWw6IHN0cmluZykgPT4gZWwgIT09IGl0ZW0pO1xuXHRcdFx0XHR0aGlzLmZpbHRlcmVkRHJvcGRvd25EYXRhID0gdGhpcy5zb3J0RGF0YSh0aGlzLmZpbHRlcmVkRHJvcGRvd25EYXRhKTtcblx0XHRcdH1cblx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtc0NoYW5nZWQuZW1pdCh0aGlzLnNlbGVjdGVkSXRlbXMpO1xuXG5cdFx0XHQvLyBUT0RPIFRyZWUgaW1wbGVtZW50YXRpb25cblxuXHRcdH0gZWxzZSB7IC8vIHNpbmdsZSBzZWxlY3Rcblx0XHRcdHRoaXMuc2VsZWN0ZWRJdGVtcyA9IFt0aGlzLmRhdGEuZmluZCgoZWw6IGFueSkgPT4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKGVsKSA9PT0gaXRlbSldO1xuXHRcdFx0dGhpcy5pc0Ryb3Bkb3duT3BlbiA9IGZhbHNlO1xuXHRcdFx0dGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlZC5lbWl0KHRoaXMuc2VsZWN0ZWRJdGVtcyk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHRvZ2dsZURyb3Bkb3duKGFycm93UHJlc3NlZDogYm9vbGVhbiA9IGZhbHNlLCBldmVudDogTW91c2VFdmVudCA9IHVuZGVmaW5lZCk6IHZvaWQge1xuXHRcdGV2ZW50ICYmIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG5cdFx0aWYgKGFycm93UHJlc3NlZCB8fCAhdGhpcy5jb25maWcuaGFzQ2hpcEdyb3VwIHx8ICh0aGlzLmNvbmZpZy5oYXNDaGlwR3JvdXAgJiYgIXRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGggJiYgIWFycm93UHJlc3NlZCkpIHtcblx0XHRcdHRoaXMuaXNEcm9wZG93bk9wZW4gPSAhdGhpcy5pc0Ryb3Bkb3duT3Blbjtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZ2V0UHJvcGVydHlWYWx1ZShlbGVtZW50OiBhbnkpOiBzdHJpbmcge1xuXHRcdHJldHVybiB0aGlzLmNvbmZpZy5wcm9wZXJ0eUFjY2Vzc0tleVxuXHRcdFx0PyBlbGVtZW50W3RoaXMuY29uZmlnLnByb3BlcnR5QWNjZXNzS2V5XVxuXHRcdFx0OiBlbGVtZW50O1xuXHR9XG5cblx0cHVibGljIGlzSXRlbVNlbGVjdGVkKGl0ZW06IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbXMuZmluZCgoZWw6IGFueSkgPT4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKGVsKSA9PT0gaXRlbSk7XG5cdH1cblxuXHRwdWJsaWMgcmVtb3ZlQ2hpcChpdGVtOiBhbnkpOiB2b2lkIHtcblx0XHR0aGlzLnNlbGVjdGVkSXRlbXMgPSB0aGlzLnNlbGVjdGVkSXRlbXMuZmlsdGVyKChlbDogYW55KSA9PiBlbCAhPT0gaXRlbSk7XG5cblx0XHQvLyByZS1hZGQgY2hpcCB0byBsaXN0IG9ubHkgaWYgaXRzIG5vdCBwb3J0Zm9saW9cblx0XHRpZiAodGhpcy5jb25maWcuaGFzQ2hpcEdyb3VwICYmIHRoaXMuY29uZmlnLmNoaXBHcm91cENvbmZpZykge1xuXHRcdFx0dGhpcy5kcm9wZG93bkRhdGEgPSBbLi4udGhpcy5kcm9wZG93bkRhdGEsIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShpdGVtKV07XG5cdFx0XHR0aGlzLmZpbHRlcmVkRHJvcGRvd25EYXRhID0gWy4uLnRoaXMuZmlsdGVyZWREcm9wZG93bkRhdGEsIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShpdGVtKV07XG5cdFx0XHR0aGlzLmZpbHRlcmVkRHJvcGRvd25EYXRhID0gdGhpcy5zb3J0RGF0YSh0aGlzLmZpbHRlcmVkRHJvcGRvd25EYXRhKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29uY2F0U2VsZWN0ZWRJdGVtcyhpdGVtczogYW55KTogc3RyaW5nIHtcblx0XHRyZXR1cm4gaXRlbXMubWFwKGl0ZW0gPT4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKGl0ZW0pKS5qb2luKCcsICcpO1xuXHR9XG5cblx0cHVibGljIHNlbGVjdEFsbCgpOiB2b2lkIHtcblx0XHR0aGlzLnNlbGVjdGVkSXRlbXMgPSBbLi4udGhpcy5kYXRhXTtcblxuXHRcdGlmICh0aGlzLmNvbmZpZy5oYXNDaGlwR3JvdXApIHtcblx0XHRcdHRoaXMuZHJvcGRvd25EYXRhID0gW107XG5cdFx0XHR0aGlzLmZpbHRlcmVkRHJvcGRvd25EYXRhID0gW107XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5kcm9wZG93bkRhdGEgPSB0aGlzLnNlbGVjdGVkSXRlbXMubWFwKChzZWxlY3RlZEl0ZW06IGFueSkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKHNlbGVjdGVkSXRlbSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgY2xlYXJBbGwoKTogdm9pZCB7XG5cdFx0dGhpcy5zZWxlY3RlZEl0ZW1zID0gW107XG5cblx0XHRpZiAodGhpcy5jb25maWcuaGFzQ2hpcEdyb3VwKSB7XG5cdFx0XHR0aGlzLmRyb3Bkb3duRGF0YSA9IFsuLi50aGlzLmRhdGFdLm1hcCgoZGF0YUVsOiBhbnkpID0+IHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0UHJvcGVydHlWYWx1ZShkYXRhRWwpO1xuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMuZmlsdGVyZWREcm9wZG93bkRhdGEgPSBbLi4udGhpcy5kcm9wZG93bkRhdGFdO1xuXHRcdFx0dGhpcy5maWx0ZXJlZERyb3Bkb3duRGF0YSA9IHRoaXMuc29ydERhdGEodGhpcy5maWx0ZXJlZERyb3Bkb3duRGF0YSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHByb2NlZWRUb1NlbGVjdGlvbihpdGVtOiBzdHJpbmcsIGV2ZW50OiBNb3VzZUV2ZW50ID0gdW5kZWZpbmVkKTogdm9pZCB7XG5cdFx0ZXZlbnQgJiYgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRpZiAoISF0aGlzLnNlbGVjdGVkSXRlbXMuZmluZCgoZWw6IGFueSkgPT4gdGhpcy5nZXRQcm9wZXJ0eVZhbHVlKGVsKSA9PT0gaXRlbSlcblx0XHRcdHx8ICh0aGlzLmNvbmZpZy5tdWx0aUFjdGlvbnMgJiYgdGhpcy5jb25maWcubXVsdGlBY3Rpb25zLnNlbGVjdExpbWl0ICYmIHRoaXMuY29uZmlnLm11bHRpQWN0aW9ucy5zZWxlY3RMaW1pdCA+IHRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGgpXG5cdFx0XHR8fCAodGhpcy5jb25maWcubXVsdGlBY3Rpb25zICYmICF0aGlzLmNvbmZpZy5tdWx0aUFjdGlvbnMuc2VsZWN0TGltaXQpXG5cdFx0XHR8fCAhdGhpcy5jb25maWcubXVsdGlBY3Rpb25zXG5cdFx0KSB7XG5cdFx0XHR0aGlzLnNlbGVjdEl0ZW0oaXRlbSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBzb3J0RGF0YShkYXRhOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gc29ydEJ5KGRhdGEpO1xuXHR9XG5cblx0cHVibGljIGdldERyb3Bkb3duU2l6ZSgpOiBzdHJpbmcge1xuXHRcdHJldHVybiBkcm9wZG93blR5cGVNYXBbdGhpcy5jb25maWcudHlwZV07XG5cdH1cblxuXHRwdWJsaWMgdG90YWxTZWxlY3RlZEl0ZW1zKCk6IHN0cmluZyB7XG5cdFx0aWYgKHRoaXMuY29uZmlnLnRpdGxlQ29uZmlnICYmIHRoaXMuY29uZmlnLnRpdGxlQ29uZmlnLmlzVGl0bGVDb25jYXRlbmF0ZWQpIHtcblx0XHRcdGlmICh0aGlzLmNvbmZpZy5tdWx0aUFjdGlvbnMgJiYgdGhpcy5jb25maWcubXVsdGlBY3Rpb25zLnNlbGVjdExpbWl0KSB7XG5cdFx0XHRcdHJldHVybiBgJHt0aGlzLmdldENvbmNhdFNlbGVjdGVkSXRlbXModGhpcy5zZWxlY3RlZEl0ZW1zKX0gKCR7dGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aH0vJHt0aGlzLmNvbmZpZy5tdWx0aUFjdGlvbnMuc2VsZWN0TGltaXR9KWBcblx0XHRcdH1cblx0XHRcdHJldHVybiBgJHt0aGlzLmdldENvbmNhdFNlbGVjdGVkSXRlbXModGhpcy5zZWxlY3RlZEl0ZW1zKX0gKCR7dGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aH0pYFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAodGhpcy5jb25maWcubXVsdGlBY3Rpb25zICYmIHRoaXMuY29uZmlnLm11bHRpQWN0aW9ucy5zZWxlY3RMaW1pdCkge1xuXHRcdFx0XHRyZXR1cm4gYFRvdGFsIFNlbGVjdGVkICgke3RoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGh9LyR7dGhpcy5jb25maWcubXVsdGlBY3Rpb25zLnNlbGVjdExpbWl0fSlgXG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gYFRvdGFsIFNlbGVjdGVkICgke3RoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGh9KWBcblx0XHR9XG5cdH1cbn1cbiJdfQ==