UNPKG

systelab-components

Version:

systelab-components is a set of components that use wide accepted and adopted standard technologies like Angular and Bootstrap, as well as other popular libraries. Please read the ATTRIBUTION.md file for a complete list of dependencies.

265 lines 36 kB
import { Directive, Input } from '@angular/core'; import { AbstractComboBox } from '../abstract-combobox.component'; import * as i0 from "@angular/core"; import * as i1 from "systelab-preferences"; export class ComboTreeNode { constructor(pNodeData, pLevel) { this.nodeData = pNodeData; this.level = pLevel; } } export class AbstractApiTreeComboBox extends AbstractComboBox { static { this.FAVOURITEID = 'favourite'; } constructor(myRenderer, chref, preferencesService) { super(myRenderer, chref, preferencesService); this.myRenderer = myRenderer; this.chref = chref; this.preferencesService = preferencesService; this.isParentSelectable = false; this.isAllSelectable = true; this.totalItemsLoaded = false; this.isFirstTime = true; this.isTree = true; } ngOnInit() { this.setRowHeight(); this.configGrid(); this.initializeFavouriteList(); } configGrid() { this.columnDefs = [ { colId: 'itemDescription', cellRenderer: (params) => { return this.getLabelForLevel(params.data); } } ]; this.gridOptions = {}; this.gridOptions.columnDefs = this.columnDefs; this.gridOptions.rowHeight = AbstractComboBox.ROW_HEIGHT; this.gridOptions.headerHeight = 0; this.gridOptions.rowSelection = 'single'; } getInstance() { return new ComboTreeNode(); } getDescriptionField() { return ''; } getCodeField() { return ''; } getIdField() { return ''; } getFavouriteText() { return 'Favourites'; } getLabelForLevel(comboTreeNode) { if (comboTreeNode.level === 0) { return comboTreeNode.nodeData[this.getLevelDescriptionField(0)]; } else if (comboTreeNode.level > 0) { return '<span style="padding-left: ' + (20 * comboTreeNode.level) + 'px">' + comboTreeNode.nodeData[this.getLevelDescriptionField(comboTreeNode.level)] + '</span>'; } } // override closeDropDown() { this.isFirstTime = true; super.closeDropDown(); } // override loop() { let result = true; if (this.isDropDownOpen()) { // First time opened we load the table if (this.isFirstTime) { this.getRows(); } if (this.totalItemsLoaded) { this.setDropdownHeight(); this.setDropdownPosition(); this.transferFocusToGrid(); result = false; } } if (result) { setTimeout(() => this.loop(), 10); } else { return; } } // Override setDropdownHeight() { let totalItems = Number(this.gridOptions.api.getDisplayedRowCount()); let calculatedHeight = 0; if (this.emptyElement) { totalItems += 1; } if (totalItems === 0) { calculatedHeight += 6 + AbstractComboBox.ROW_HEIGHT; this.myRenderer.setStyle(this.dropdownElement.nativeElement, 'height', calculatedHeight + 'px'); } else if (totalItems < 10) { calculatedHeight = 6 + AbstractComboBox.ROW_HEIGHT * totalItems; } else { calculatedHeight = AbstractComboBox.ROW_HEIGHT * 10; } this.myRenderer.setStyle(this.dropdownElement.nativeElement, 'height', calculatedHeight + 'px'); } getRows() { this.totalItemsLoaded = false; this.isFirstTime = false; this.getData() .subscribe({ next: (dataVector) => { const nodeVector = []; let previousParent; if (this.emptyElement) { const emptyElement = {}; emptyElement[this.getLevelIdField(0)] = ''; emptyElement[this.getLevelDescriptionField(0)] = ''; const emptyElementNode = new ComboTreeNode(emptyElement, 0); nodeVector.push(emptyElementNode); } if (this.withFavourites) { this.initializeFavouriteList(); if (this.favouriteList.length > 0) { const favouriteElement = {}; favouriteElement[this.getLevelIdField(0)] = AbstractApiTreeComboBox.FAVOURITEID; favouriteElement[this.getLevelDescriptionField(0)] = this.getFavouriteText(); const favouriteComboNode = new ComboTreeNode(favouriteElement, 0); nodeVector.push(favouriteComboNode); const favouriteElements = this.getFavouriteElements(dataVector); favouriteElements.forEach(currentFavouriteElement => { const currentFavouriteNode = new ComboTreeNode(currentFavouriteElement, 1); nodeVector.push(currentFavouriteNode); }); } } if (this.isAllSelectable) { const allElement = {}; allElement[this.getLevelIdField(0)] = this.getAllNodeId(); allElement[this.getLevelDescriptionField(0)] = this.getAllNodeDescription(); const allComboNode = new ComboTreeNode(allElement, 0); nodeVector.push(allComboNode); } dataVector.forEach((element) => { if (!previousParent || element[this.getLevelIdField(0)] !== previousParent) { previousParent = element[this.getLevelIdField(0)]; const parentComboNode = new ComboTreeNode(element, 0); nodeVector.push(parentComboNode); } const comboNode = new ComboTreeNode(element, 1); nodeVector.push(comboNode); }); this.totalItemsLoaded = true; this.gridOptions.api.hideOverlay(); this.gridOptions.api.setRowData(nodeVector); this.gridOptions.api.redrawRows(); }, error: () => { this.gridOptions.api.hideOverlay(); } }); } // Overrides checkIfIsFavourite(id) { const idString = id ? id.toString() : undefined; if (idString && idString.includes(this.getSelectionPrefix(1))) { super.checkIfIsFavourite(idString.substr(1)); } else { super.checkIfIsFavourite(id); } } // Overrides toggleFavourite() { if (this.id.toString() .includes(this.getSelectionPrefix(1))) { this.isFavourite = !this.isFavourite; if (this.isFavourite) { this.favouriteList.push(this.id.toString() .substr(1)); } else { this.favouriteList.splice(this.favouriteList.map(String) .indexOf(this.id.toString() .substr(1)), 1); } this.preferencesService.put(this.getComboPreferencesPrefix() + '.favourites', this.favouriteList.map(String)); } else { super.toggleFavourite(); } } // Overrides onRowSelected(event) { if (event.node.selected) { if (this.isParentSelectable && event.node.data.nodeData[this.getLevelIdField(0)] !== AbstractApiTreeComboBox.FAVOURITEID) { jQuery('#' + this.comboId) .dropdown('toggle'); } else if (this.isAllSelectable && event.node && event.node.data && event.node.data.level === 0) { if (event.node.data.nodeData[this.getLevelIdField(0)] === this.getAllNodeId()) { jQuery('#' + this.comboId) .dropdown('toggle'); } else { event.node.setSelected(false); } } else if (event.node && event.node.data && event.node.data.level > 0) { jQuery('#' + this.comboId) .dropdown('toggle'); } else { if (event.node) { event.node.setSelected(false); } } } } // Overrides onSelectionChanged(event) { const selectedRow = this.getSelectedRow(); if (selectedRow !== null && selectedRow !== undefined) { this.id = selectedRow.nodeData[this.getLevelIdField(selectedRow.level)]; this.description = selectedRow.nodeData[this.getLevelDescriptionField(selectedRow.level)]; this.currentSelected = selectedRow.nodeData; this.level = selectedRow.level; if (selectedRow.level > 0 || (this.isAllSelectable && selectedRow.nodeData[this.getLevelIdField(0)] === this.getAllNodeId()) || this.isParentSelectable) { this.change.emit(selectedRow.nodeData); this.idChange.emit(this.id); this.closeDropDown(); } } } refresh(params) { if (this.gridOptions && this.gridOptions.api) { this.getRows(); return true; } } getFavouriteElements(dataVector) { return dataVector.filter((data) => this.favouriteList.map(String) .includes(data[this.getLevelIdField(1)].toString())); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: AbstractApiTreeComboBox, deps: [{ token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i1.PreferencesService }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.9", type: AbstractApiTreeComboBox, inputs: { isParentSelectable: "isParentSelectable", isAllSelectable: "isAllSelectable" }, usesInheritance: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: AbstractApiTreeComboBox, decorators: [{ type: Directive }], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i1.PreferencesService }], propDecorators: { isParentSelectable: [{ type: Input }], isAllSelectable: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtYXBpLXRyZWUtY29tYm9ib3guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3lzdGVsYWItY29tcG9uZW50cy9zcmMvbGliL2NvbWJvYm94L3RyZWUvYWJzdHJhY3QtYXBpLXRyZWUtY29tYm9ib3guY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFFLEtBQUssRUFBZ0MsTUFBTSxlQUFlLENBQUM7QUFFbEcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7OztBQU1sRSxNQUFNLE9BQU8sYUFBYTtJQUl6QixZQUFZLFNBQWEsRUFBRSxNQUFlO1FBQ3pDLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1FBQzFCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO0lBQ3JCLENBQUM7Q0FDRDtBQUdELE1BQU0sT0FBZ0IsdUJBQTJCLFNBQVEsZ0JBQWtDO2FBRW5FLGdCQUFXLEdBQUcsV0FBVyxBQUFkLENBQWU7SUFTakQsWUFBNEIsVUFBcUIsRUFBUyxLQUF3QixFQUFrQixrQkFBdUM7UUFDMUksS0FBSyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQURsQixlQUFVLEdBQVYsVUFBVSxDQUFXO1FBQVMsVUFBSyxHQUFMLEtBQUssQ0FBbUI7UUFBa0IsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFxQjtRQVAzSCx1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFDM0Isb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFFaEMscUJBQWdCLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ1YsV0FBTSxHQUFHLElBQUksQ0FBQztJQUk5QixDQUFDO0lBRWUsUUFBUTtRQUV2QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsSUFB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QUMsWUFBWSxFQUFFLENBQUM7bUJBQy9GLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtnQkFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQzthQUNyQjtTQUNEO0lBQ0YsQ0FBQztJQUVlLE9BQU8sQ0FBQyxNQUFXO1FBQ2xDLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUM3QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDZixPQUFPLElBQUksQ0FBQztTQUNaO0lBQ0YsQ0FBQztJQUVPLG9CQUFvQixDQUFDLFVBQW9CO1FBQ2hELE9BQU8sVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDO2FBQ2xFLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RCxDQUFDOzhHQXZSb0IsdUJBQXVCO2tHQUF2Qix1QkFBdUI7OzJGQUF2Qix1QkFBdUI7a0JBRDVDLFNBQVM7K0lBS08sa0JBQWtCO3NCQUFqQyxLQUFLO2dCQUNVLGVBQWU7c0JBQTlCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3RvclJlZiwgRGlyZWN0aXZlLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFJlbmRlcmVyMiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWdSZW5kZXJlckNvbXBvbmVudCB9IGZyb20gJ2FnLWdyaWQtYW5ndWxhcic7XG5pbXBvcnQgeyBBYnN0cmFjdENvbWJvQm94IH0gZnJvbSAnLi4vYWJzdHJhY3QtY29tYm9ib3guY29tcG9uZW50JztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFByZWZlcmVuY2VzU2VydmljZSB9IGZyb20gJ3N5c3RlbGFiLXByZWZlcmVuY2VzJztcblxuZGVjbGFyZSB2YXIgalF1ZXJ5OiBhbnk7XG5cbmV4cG9ydCBjbGFzcyBDb21ib1RyZWVOb2RlPFQ+IHtcblx0cHVibGljIG5vZGVEYXRhOiBUO1xuXHRwdWJsaWMgbGV2ZWw6IG51bWJlcjtcblxuXHRjb25zdHJ1Y3RvcihwTm9kZURhdGE/OiBULCBwTGV2ZWw/OiBudW1iZXIpIHtcblx0XHR0aGlzLm5vZGVEYXRhID0gcE5vZGVEYXRhO1xuXHRcdHRoaXMubGV2ZWwgPSBwTGV2ZWw7XG5cdH1cbn1cblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBcGlUcmVlQ29tYm9Cb3g8VD4gZXh0ZW5kcyBBYnN0cmFjdENvbWJvQm94PENvbWJvVHJlZU5vZGU8VD4+IGltcGxlbWVudHMgQWdSZW5kZXJlckNvbXBvbmVudCwgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG5cdHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRkFWT1VSSVRFSUQgPSAnZmF2b3VyaXRlJztcblxuXHRASW5wdXQoKSBwdWJsaWMgaXNQYXJlbnRTZWxlY3RhYmxlID0gZmFsc2U7XG5cdEBJbnB1dCgpIHB1YmxpYyBpc0FsbFNlbGVjdGFibGUgPSB0cnVlO1xuXG5cdHB1YmxpYyB0b3RhbEl0ZW1zTG9hZGVkID0gZmFsc2U7XG5cdHB1YmxpYyBpc0ZpcnN0VGltZSA9IHRydWU7XG5cdHB1YmxpYyBvdmVycmlkZSBpc1RyZWUgPSB0cnVlO1xuXG5cdGNvbnN0cnVjdG9yKHB1YmxpYyBvdmVycmlkZSBteVJlbmRlcmVyOiBSZW5kZXJlcjIsIHB1YmxpYyBjaHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHB1YmxpYyBvdmVycmlkZSBwcmVmZXJlbmNlc1NlcnZpY2U/OiBQcmVmZXJlbmNlc1NlcnZpY2UpIHtcblx0XHRzdXBlcihteVJlbmRlcmVyLCBjaHJlZiwgcHJlZmVyZW5jZXNTZXJ2aWNlKTtcblx0fVxuXG5cdHB1YmxpYyBvdmVycmlkZSBuZ09uSW5pdCgpOiB2b2lkIHtcblxuXHRcdHRoaXMuc2V0Um93SGVpZ2h0KCk7XG5cdFx0dGhpcy5jb25maWdHcmlkKCk7XG5cdFx0dGhpcy5pbml0aWFsaXplRmF2b3VyaXRlTGlzdCgpO1xuXHR9XG5cblx0cHJvdGVjdGVkIG92ZXJyaWRlIGNvbmZpZ0dyaWQoKSB7XG5cdFx0dGhpcy5jb2x1bW5EZWZzID0gW1xuXHRcdFx0e1xuXHRcdFx0XHRjb2xJZDogICAgICAgICdpdGVtRGVzY3JpcHRpb24nLFxuXHRcdFx0XHRjZWxsUmVuZGVyZXI6IChwYXJhbXM6IGFueSkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmdldExhYmVsRm9yTGV2ZWwocGFyYW1zLmRhdGEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XTtcblxuXHRcdHRoaXMuZ3JpZE9wdGlvbnMgPSB7fTtcblxuXHRcdHRoaXMuZ3JpZE9wdGlvbnMuY29sdW1uRGVmcyA9IHRoaXMuY29sdW1uRGVmcztcblxuXHRcdHRoaXMuZ3JpZE9wdGlvbnMucm93SGVpZ2h0ID0gQWJzdHJhY3RDb21ib0JveC5ST1dfSEVJR0hUO1xuXHRcdHRoaXMuZ3JpZE9wdGlvbnMuaGVhZGVySGVpZ2h0ID0gMDtcblx0XHR0aGlzLmdyaWRPcHRpb25zLnJvd1NlbGVjdGlvbiA9ICdzaW5nbGUnO1xuXHR9XG5cblx0Z2V0SW5zdGFuY2UoKTogQ29tYm9UcmVlTm9kZTxUPiB7XG5cdFx0cmV0dXJuIG5ldyBDb21ib1RyZWVOb2RlPFQ+KCk7XG5cdH1cblxuXHRnZXREZXNjcmlwdGlvbkZpZWxkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuICcnO1xuXHR9XG5cblx0Z2V0Q29kZUZpZWxkKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuICcnO1xuXHR9XG5cblx0Z2V0SWRGaWVsZCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiAnJztcblx0fVxuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXREYXRhKCk6IE9ic2VydmFibGU8QXJyYXk8VD4+O1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRUb3RhbEl0ZW1zKCk6IG51bWJlcjtcblxuXHRwdWJsaWMgYWJzdHJhY3QgZ2V0TGV2ZWxEZXNjcmlwdGlvbkZpZWxkKGxldmVsOiBudW1iZXIpOiBzdHJpbmc7XG5cblx0cHVibGljIGFic3RyYWN0IGdldExldmVsSWRGaWVsZChsZXZlbDogbnVtYmVyKTogc3RyaW5nO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRBbGxOb2RlSWQoKTogc3RyaW5nIHwgbnVtYmVyO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRBbGxOb2RlRGVzY3JpcHRpb24oKTogc3RyaW5nO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRTZWxlY3Rpb25QcmVmaXgobGV2ZWw6IG51bWJlcik6IHN0cmluZztcblxuXHRwcm90ZWN0ZWQgZ2V0RmF2b3VyaXRlVGV4dCgpOiBzdHJpbmcge1xuXHRcdHJldHVybiAnRmF2b3VyaXRlcyc7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TGFiZWxGb3JMZXZlbChjb21ib1RyZWVOb2RlOiBDb21ib1RyZWVOb2RlPFQ+KTogc3RyaW5nIHtcblx0XHRpZiAoY29tYm9UcmVlTm9kZS5sZXZlbCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIGNvbWJvVHJlZU5vZGUubm9kZURhdGFbdGhpcy5nZXRMZXZlbERlc2NyaXB0aW9uRmllbGQoMCldO1xuXHRcdH0gZWxzZSBpZiAoY29tYm9UcmVlTm9kZS5sZXZlbCA+IDApIHtcblx0XHRcdHJldHVybiAnPHNwYW4gc3R5bGU9XCJwYWRkaW5nLWxlZnQ6ICcgKyAoMjAgKiBjb21ib1RyZWVOb2RlLmxldmVsKSArICdweFwiPidcblx0XHRcdFx0KyBjb21ib1RyZWVOb2RlLm5vZGVEYXRhW3RoaXMuZ2V0TGV2ZWxEZXNjcmlwdGlvbkZpZWxkKGNvbWJvVHJlZU5vZGUubGV2ZWwpXVxuXHRcdFx0XHQrICc8L3NwYW4+Jztcblx0XHR9XG5cdH1cblxuXHQvLyBvdmVycmlkZVxuXHRwdWJsaWMgb3ZlcnJpZGUgY2xvc2VEcm9wRG93bigpIHtcblx0XHR0aGlzLmlzRmlyc3RUaW1lID0gdHJ1ZTtcblx0XHRzdXBlci5jbG9zZURyb3BEb3duKCk7XG5cdH1cblxuXHQvLyBvdmVycmlkZVxuXHRwdWJsaWMgb3ZlcnJpZGUgbG9vcCgpOiB2b2lkIHtcblx0XHRsZXQgcmVzdWx0ID0gdHJ1ZTtcblxuXHRcdGlmICh0aGlzLmlzRHJvcERvd25PcGVuKCkpIHtcblx0XHRcdC8vIEZpcnN0IHRpbWUgb3BlbmVkIHdlIGxvYWQgdGhlIHRhYmxlXG5cdFx0XHRpZiAodGhpcy5pc0ZpcnN0VGltZSkge1xuXHRcdFx0XHR0aGlzLmdldFJvd3MoKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMudG90YWxJdGVtc0xvYWRlZCkge1xuXHRcdFx0XHR0aGlzLnNldERyb3Bkb3duSGVpZ2h0KCk7XG5cdFx0XHRcdHRoaXMuc2V0RHJvcGRvd25Qb3NpdGlvbigpO1xuXHRcdFx0XHR0aGlzLnRyYW5zZmVyRm9jdXNUb0dyaWQoKTtcblx0XHRcdFx0cmVzdWx0ID0gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGlmIChyZXN1bHQpIHtcblx0XHRcdHNldFRpbWVvdXQoKCkgPT4gdGhpcy5sb29wKCksIDEwKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0fVxuXG5cdC8vIE92ZXJyaWRlXG5cdHB1YmxpYyBvdmVycmlkZSBzZXREcm9wZG93bkhlaWdodCgpIHtcblx0XHRsZXQgdG90YWxJdGVtcyA9IE51bWJlcih0aGlzLmdyaWRPcHRpb25zLmFwaS5nZXREaXNwbGF5ZWRSb3dDb3VudCgpKTtcblx0XHRsZXQgY2FsY3VsYXRlZEhlaWdodCA9IDA7XG5cblx0XHRpZiAodGhpcy5lbXB0eUVsZW1lbnQpIHtcblx0XHRcdHRvdGFsSXRlbXMgKz0gMTtcblx0XHR9XG5cblx0XHRpZiAodG90YWxJdGVtcyA9PT0gMCkge1xuXHRcdFx0Y2FsY3VsYXRlZEhlaWdodCArPSA2ICsgQWJzdHJhY3RDb21ib0JveC5ST1dfSEVJR0hUO1xuXHRcdFx0dGhpcy5teVJlbmRlcmVyLnNldFN0eWxlKHRoaXMuZHJvcGRvd25FbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICdoZWlnaHQnLCBjYWxjdWxhdGVkSGVpZ2h0ICsgJ3B4Jyk7XG5cdFx0fSBlbHNlIGlmICh0b3RhbEl0ZW1zIDwgMTApIHtcblx0XHRcdGNhbGN1bGF0ZWRIZWlnaHQgPSA2ICsgQWJzdHJhY3RDb21ib0JveC5ST1dfSEVJR0hUICogdG90YWxJdGVtcztcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y2FsY3VsYXRlZEhlaWdodCA9IEFic3RyYWN0Q29tYm9Cb3guUk9XX0hFSUdIVCAqIDEwO1xuXHRcdH1cblx0XHR0aGlzLm15UmVuZGVyZXIuc2V0U3R5bGUodGhpcy5kcm9wZG93bkVsZW1lbnQubmF0aXZlRWxlbWVudCwgJ2hlaWdodCcsIGNhbGN1bGF0ZWRIZWlnaHQgKyAncHgnKTtcblxuXHR9XG5cblx0cHVibGljIGdldFJvd3MoKTogdm9pZCB7XG5cdFx0dGhpcy50b3RhbEl0ZW1zTG9hZGVkID0gZmFsc2U7XG5cdFx0dGhpcy5pc0ZpcnN0VGltZSA9IGZhbHNlO1xuXHRcdHRoaXMuZ2V0RGF0YSgpXG5cdFx0XHQuc3Vic2NyaWJlKHtcblx0XHRcdFx0XHRuZXh0OiAgKGRhdGFWZWN0b3I6IEFycmF5PFQ+KSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBub2RlVmVjdG9yOiBBcnJheTxDb21ib1RyZWVOb2RlPFQ+PiA9IFtdO1xuXHRcdFx0XHRcdFx0bGV0IHByZXZpb3VzUGFyZW50OiBudW1iZXIgfCBzdHJpbmc7XG5cblx0XHRcdFx0XHRcdGlmICh0aGlzLmVtcHR5RWxlbWVudCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBlbXB0eUVsZW1lbnQ6IFQgPSB7fSBhcyBUO1xuXHRcdFx0XHRcdFx0XHRlbXB0eUVsZW1lbnRbdGhpcy5nZXRMZXZlbElkRmllbGQoMCldID0gJyc7XG5cdFx0XHRcdFx0XHRcdGVtcHR5RWxlbWVudFt0aGlzLmdldExldmVsRGVzY3JpcHRpb25GaWVsZCgwKV0gPSAnJztcblx0XHRcdFx0XHRcdFx0Y29uc3QgZW1wdHlFbGVtZW50Tm9kZTogQ29tYm9UcmVlTm9kZTxUPiA9IG5ldyBDb21ib1RyZWVOb2RlPFQ+KGVtcHR5RWxlbWVudCwgMCk7XG5cdFx0XHRcdFx0XHRcdG5vZGVWZWN0b3IucHVzaChlbXB0eUVsZW1lbnROb2RlKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHRoaXMud2l0aEZhdm91cml0ZXMpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5pbml0aWFsaXplRmF2b3VyaXRlTGlzdCgpO1xuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5mYXZvdXJpdGVMaXN0Lmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBmYXZvdXJpdGVFbGVtZW50OiBUID0ge30gYXMgVDtcblx0XHRcdFx0XHRcdFx0XHRmYXZvdXJpdGVFbGVtZW50W3RoaXMuZ2V0TGV2ZWxJZEZpZWxkKDApXSA9IEFic3RyYWN0QXBpVHJlZUNvbWJvQm94LkZBVk9VUklURUlEO1xuXHRcdFx0XHRcdFx0XHRcdGZhdm91cml0ZUVsZW1lbnRbdGhpcy5nZXRMZXZlbERlc2NyaXB0aW9uRmllbGQoMCldID0gdGhpcy5nZXRGYXZvdXJpdGVUZXh0KCk7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgZmF2b3VyaXRlQ29tYm9Ob2RlOiBDb21ib1RyZWVOb2RlPFQ+ID0gbmV3IENvbWJvVHJlZU5vZGU8VD4oZmF2b3VyaXRlRWxlbWVudCwgMCk7XG5cdFx0XHRcdFx0XHRcdFx0bm9kZVZlY3Rvci5wdXNoKGZhdm91cml0ZUNvbWJvTm9kZSk7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgZmF2b3VyaXRlRWxlbWVudHMgPSB0aGlzLmdldEZhdm91cml0ZUVsZW1lbnRzKGRhdGFWZWN0b3IpO1xuXHRcdFx0XHRcdFx0XHRcdGZhdm91cml0ZUVsZW1lbnRzLmZvckVhY2goY3VycmVudEZhdm91cml0ZUVsZW1lbnQgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgY3VycmVudEZhdm91cml0ZU5vZGU6IENvbWJvVHJlZU5vZGU8VD4gPSBuZXcgQ29tYm9UcmVlTm9kZTxUPihjdXJyZW50RmF2b3VyaXRlRWxlbWVudCwgMSk7XG5cdFx0XHRcdFx0XHRcdFx0XHRub2RlVmVjdG9yLnB1c2goY3VycmVudEZhdm91cml0ZU5vZGUpO1xuXHRcdFx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmICh0aGlzLmlzQWxsU2VsZWN0YWJsZSkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBhbGxFbGVtZW50OiBUID0ge30gYXMgVDtcblx0XHRcdFx0XHRcdFx0YWxsRWxlbWVudFt0aGlzLmdldExldmVsSWRGaWVsZCgwKV0gPSB0aGlzLmdldEFsbE5vZGVJZCgpO1xuXHRcdFx0XHRcdFx0XHRhbGxFbGVtZW50W3RoaXMuZ2V0TGV2ZWxEZXNjcmlwdGlvbkZpZWxkKDApXSA9IHRoaXMuZ2V0QWxsTm9kZURlc2NyaXB0aW9uKCk7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGFsbENvbWJvTm9kZTogQ29tYm9UcmVlTm9kZTxUPiA9IG5ldyBDb21ib1RyZWVOb2RlPFQ+KGFsbEVsZW1lbnQsIDApO1xuXHRcdFx0XHRcdFx0XHRub2RlVmVjdG9yLnB1c2goYWxsQ29tYm9Ob2RlKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0ZGF0YVZlY3Rvci5mb3JFYWNoKChlbGVtZW50OiBUKSA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmICghcHJldmlvdXNQYXJlbnQgfHwgZWxlbWVudFt0aGlzLmdldExldmVsSWRGaWVsZCgwKV0gIT09IHByZXZpb3VzUGFyZW50KSB7XG5cdFx0XHRcdFx0XHRcdFx0cHJldmlvdXNQYXJlbnQgPSBlbGVtZW50W3RoaXMuZ2V0TGV2ZWxJZEZpZWxkKDApXTtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBwYXJlbnRDb21ib05vZGU6IENvbWJvVHJlZU5vZGU8VD4gPSBuZXcgQ29tYm9UcmVlTm9kZTxUPihlbGVtZW50LCAwKTtcblx0XHRcdFx0XHRcdFx0XHRub2RlVmVjdG9yLnB1c2gocGFyZW50Q29tYm9Ob2RlKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRjb25zdCBjb21ib05vZGU6IENvbWJvVHJlZU5vZGU8VD4gPSBuZXcgQ29tYm9UcmVlTm9kZTxUPihlbGVtZW50LCAxKTtcblx0XHRcdFx0XHRcdFx0bm9kZVZlY3Rvci5wdXNoKGNvbWJvTm9kZSk7XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRcdHRoaXMudG90YWxJdGVtc0xvYWRlZCA9IHRydWU7XG5cdFx0XHRcdFx0XHR0aGlzLmdyaWRPcHRpb25zLmFwaS5oaWRlT3ZlcmxheSgpO1xuXHRcdFx0XHRcdFx0dGhpcy5ncmlkT3B0aW9ucy5hcGkuc2V0Um93RGF0YShub2RlVmVjdG9yKTtcblx0XHRcdFx0XHRcdHRoaXMuZ3JpZE9wdGlvbnMuYXBpLnJlZHJhd1Jvd3MoKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGVycm9yOiAoKSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLmdyaWRPcHRpb25zLmFwaS5oaWRlT3ZlcmxheSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0KTtcblx0fVxuXG5cdC8vIE92ZXJyaWRlc1xuXHRwcm90ZWN0ZWQgb3ZlcnJpZGUgY2hlY2tJZklzRmF2b3VyaXRlKGlkOiBzdHJpbmcgfCBudW1iZXIpOiB2b2lkIHtcblx0XHRjb25zdCBpZFN0cmluZyA9IGlkID8gaWQudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDtcblx0XHRpZiAoaWRTdHJpbmcgJiYgaWRTdHJpbmcuaW5jbHVkZXModGhpcy5nZXRTZWxlY3Rpb25QcmVmaXgoMSkpKSB7XG5cdFx0XHRzdXBlci5jaGVja0lmSXNGYXZvdXJpdGUoaWRTdHJpbmcuc3Vic3RyKDEpKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3VwZXIuY2hlY2tJZklzRmF2b3VyaXRlKGlkKTtcblx0XHR9XG5cdH1cblxuXHQvLyBPdmVycmlkZXNcblx0cHJvdGVjdGVkIG92ZXJyaWRlIHRvZ2dsZUZhdm91cml0ZSgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5pZC50b1N0cmluZygpXG5cdFx0XHQuaW5jbHVkZXModGhpcy5nZXRTZWxlY3Rpb25QcmVmaXgoMSkpKSB7XG5cdFx0XHR0aGlzLmlzRmF2b3VyaXRlID0gIXRoaXMuaXNGYXZvdXJpdGU7XG5cdFx0XHRpZiAodGhpcy5pc0Zhdm91cml0ZSkge1xuXHRcdFx0XHR0aGlzLmZhdm91cml0ZUxpc3QucHVzaCh0aGlzLmlkLnRvU3RyaW5nKClcblx0XHRcdFx0XHQuc3Vic3RyKDEpKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRoaXMuZmF2b3VyaXRlTGlzdC5zcGxpY2UodGhpcy5mYXZvdXJpdGVMaXN0Lm1hcChTdHJpbmcpXG5cdFx0XHRcdFx0LmluZGV4T2YodGhpcy5pZC50b1N0cmluZygpXG5cdFx0XHRcdFx0XHQuc3Vic3RyKDEpKSwgMSk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnByZWZlcmVuY2VzU2VydmljZS5wdXQodGhpcy5nZXRDb21ib1ByZWZlcmVuY2VzUHJlZml4KCkgKyAnLmZhdm91cml0ZXMnLCB0aGlzLmZhdm91cml0ZUxpc3QubWFwKFN0cmluZykpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRzdXBlci50b2dnbGVGYXZvdXJpdGUoKTtcblx0XHR9XG5cdH1cblxuXHQvLyBPdmVycmlkZXNcblx0cHVibGljIG92ZXJyaWRlIG9uUm93U2VsZWN0ZWQoZXZlbnQ6IGFueSkge1xuXHRcdGlmIChldmVudC5ub2RlLnNlbGVjdGVkKSB7XG5cdFx0XHRpZiAodGhpcy5pc1BhcmVudFNlbGVjdGFibGUgJiYgZXZlbnQubm9kZS5kYXRhLm5vZGVEYXRhW3RoaXMuZ2V0TGV2ZWxJZEZpZWxkKDApXSAhPT0gQWJzdHJhY3RBcGlUcmVlQ29tYm9Cb3guRkFWT1VSSVRFSUQpIHtcblx0XHRcdFx0alF1ZXJ5KCcjJyArIHRoaXMuY29tYm9JZClcblx0XHRcdFx0XHQuZHJvcGRvd24oJ3RvZ2dsZScpO1xuXHRcdFx0fSBlbHNlIGlmICh0aGlzLmlzQWxsU2VsZWN0YWJsZSAmJiBldmVudC5ub2RlICYmIGV2ZW50Lm5vZGUuZGF0YSAmJiBldmVudC5ub2RlLmRhdGEubGV2ZWwgPT09IDApIHtcblx0XHRcdFx0aWYgKGV2ZW50Lm5vZGUuZGF0YS5ub2RlRGF0YVt0aGlzLmdldExldmVsSWRGaWVsZCgwKV0gPT09IHRoaXMuZ2V0QWxsTm9kZUlkKCkpIHtcblx0XHRcdFx0XHRqUXVlcnkoJyMnICsgdGhpcy5jb21ib0lkKVxuXHRcdFx0XHRcdFx0LmRyb3Bkb3duKCd0b2dnbGUnKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRldmVudC5ub2RlLnNldFNlbGVjdGVkKGZhbHNlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIGlmIChldmVudC5ub2RlICYmIGV2ZW50Lm5vZGUuZGF0YSAmJiBldmVudC5ub2RlLmRhdGEubGV2ZWwgPiAwKSB7XG5cdFx0XHRcdGpRdWVyeSgnIycgKyB0aGlzLmNvbWJvSWQpXG5cdFx0XHRcdFx0LmRyb3Bkb3duKCd0b2dnbGUnKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChldmVudC5ub2RlKSB7XG5cdFx0XHRcdFx0ZXZlbnQubm9kZS5zZXRTZWxlY3RlZChmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBPdmVycmlkZXNcblx0cHVibGljIG92ZXJyaWRlIG9uU2VsZWN0aW9uQ2hhbmdlZChldmVudDogYW55KSB7XG5cdFx0Y29uc3Qgc2VsZWN0ZWRSb3cgPSB0aGlzLmdldFNlbGVjdGVkUm93KCk7XG5cdFx0aWYgKHNlbGVjdGVkUm93ICE9PSBudWxsICYmIHNlbGVjdGVkUm93ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuaWQgPSBzZWxlY3RlZFJvdy5ub2RlRGF0YVt0aGlzLmdldExldmVsSWRGaWVsZChzZWxlY3RlZFJvdy5sZXZlbCldO1xuXHRcdFx0dGhpcy5kZXNjcmlwdGlvbiA9IHNlbGVjdGVkUm93Lm5vZGVEYXRhW3RoaXMuZ2V0TGV2ZWxEZXNjcmlwdGlvbkZpZWxkKHNlbGVjdGVkUm93LmxldmVsKV07XG5cdFx0XHR0aGlzLmN1cnJlbnRTZWxlY3RlZCA9IHNlbGVjdGVkUm93Lm5vZGVEYXRhO1xuXHRcdFx0dGhpcy5sZXZlbCA9IHNlbGVjdGVkUm93LmxldmVsO1xuXHRcdFx0aWYgKHNlbGVjdGVkUm93LmxldmVsID4gMFxuXHRcdFx0XHR8fCAodGhpcy5pc0FsbFNlbGVjdGFibGUgJiYgc2VsZWN0ZWRSb3cubm9kZURhdGFbdGhpcy5nZXRMZXZlbElkRmllbGQoMCldID09PSB0aGlzLmdldEFsbE5vZGVJZCgpKVxuXHRcdFx0XHR8fCB0aGlzLmlzUGFyZW50U2VsZWN0YWJsZSkge1xuXHRcdFx0XHR0aGlzLmNoYW5nZS5lbWl0KHNlbGVjdGVkUm93Lm5vZGVEYXRhKTtcblx0XHRcdFx0dGhpcy5pZENoYW5nZS5lbWl0KHRoaXMuaWQpO1xuXHRcdFx0XHR0aGlzLmNsb3NlRHJvcERvd24oKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgb3ZlcnJpZGUgcmVmcmVzaChwYXJhbXM6IGFueSk6IGJvb2xlYW4ge1xuXHRcdGlmICh0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXBpKSB7XG5cdFx0XHR0aGlzLmdldFJvd3MoKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0RmF2b3VyaXRlRWxlbWVudHMoZGF0YVZlY3RvcjogQXJyYXk8VD4pOiBBcnJheTxUPiB7XG5cdFx0cmV0dXJuIGRhdGFWZWN0b3IuZmlsdGVyKChkYXRhOiBUKSA9PiB0aGlzLmZhdm91cml0ZUxpc3QubWFwKFN0cmluZylcblx0XHRcdC5pbmNsdWRlcyhkYXRhW3RoaXMuZ2V0TGV2ZWxJZEZpZWxkKDEpXS50b1N0cmluZygpKSk7XG5cdH1cbn1cbiJdfQ==