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
JavaScript
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==