@doku-dev/doku-fragment
Version:
A new Angular UI library that moving away from Bootstrap and built from scratch.
237 lines • 28.3 kB
JavaScript
import { DOCUMENT } from '@angular/common';
import { Directive, Inject, Input, TemplateRef, } from '@angular/core';
import { arrow, autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom';
import { ReplaySubject, fromEvent, takeUntil } from 'rxjs';
import * as i0 from "@angular/core";
let nextId = 1;
export class DokuPopover {
constructor(document, renderer, ngZone, elementRef, appRef) {
this.document = document;
this.renderer = renderer;
this.ngZone = ngZone;
this.elementRef = elementRef;
this.appRef = appRef;
this.id = `d-popover-uniqueId-${nextId++}`;
/**
* Content of the popover.
* It can be a string or a template for more customization.
*
* @default ''
*/
this.content = '';
/**
* The color of the popover.
* Either `dark` or `light`.
* @default 'dark'
*/
this.color = 'dark';
/**
* The placement of the popover.
* @default 'top'
*/
this.placement = 'top';
/**
* Actions that will close the popover.
*
* - `manual`, only manual action that will close the popover like using `hide` method.
* - `clickOutside`, close the popover when clicking outside its element.
*
* The top list has higher priority.
*/
this.closeBy = ['clickOutside'];
/**
* Whether to disable the popover.
* Disabled popover can't be opened.
* @default false
*/
this.disabled = false;
this.isShown = false;
this.destroy$ = new ReplaySubject();
}
get classes() {
return ['d-popover', 'd-text-body-s', `d-popover-${this.color}`];
}
ngOnInit() {
this.handleOnClick();
this.popoverElement = this.createPopoverElement();
}
ngOnDestroy() {
this.destroy$.next(1);
this.destroy$.complete();
this.hide();
this.popoverElement = undefined;
this.popoverContentElement = undefined;
this.popoverArrowElement = undefined;
}
/**
* Show popover programmatically.
*/
show() {
if (this.disabled)
return;
if (this.isShown || !this.popoverElement)
return;
this.isShown = true;
this.setPopoverContent(this.content);
this.renderer.appendChild(this.document.body, this.popoverElement);
this.doAutoUpdatePosition();
}
/**
* Hide popover programmatically.
*/
hide() {
if (!this.isShown || !this.popoverElement)
return;
this.isShown = false;
this.popoverElement.remove();
this.cleanup?.();
this.viewRef?.destroy();
}
/**
* Toggle popover programmatically.
*/
toggle() {
this.isShown ? this.hide() : this.show();
}
/**
* Update the content of the popover with new one.
*/
updateContent(content) {
this.setPopoverContent(content);
}
createPopoverElement() {
const element = this.renderer.createElement('div');
element.className = this.classes.join(' ');
this.popoverContentElement = this.createPopoverContentElement();
element.appendChild(this.popoverContentElement);
this.popoverArrowElement = this.createArrowElement();
element.appendChild(this.popoverArrowElement);
return element;
}
createPopoverContentElement() {
return this.renderer.createElement('div');
}
createArrowElement() {
const element = this.renderer.createElement('div');
element.className = 'd-popover-arrow';
return element;
}
setPopoverContent(content) {
if (!this.popoverContentElement)
return;
this.popoverContentElement.replaceChildren();
if (content instanceof TemplateRef) {
this.viewRef?.destroy();
this.viewRef = content.createEmbeddedView({ hide: this.hide.bind(this) });
this.appRef.attachView(this.viewRef);
this.viewRef.rootNodes.forEach((node) => {
this.renderer.appendChild(this.popoverContentElement, node);
});
this.viewRef.detectChanges();
}
if (typeof content === 'string') {
this.renderer.appendChild(this.popoverContentElement, this.renderer.createText(content));
}
}
updatePosition() {
if (!this.elementRef.nativeElement || !this.popoverElement || !this.popoverArrowElement)
return;
computePosition(this.elementRef.nativeElement, this.popoverElement, {
placement: this.placement,
middleware: [
offset(6),
flip(),
shift({ padding: 8 }),
arrow({ element: this.popoverArrowElement }),
],
}).then(({ x, y, placement, middlewareData }) => {
if (!this.popoverElement)
return;
Object.assign(this.popoverElement.style, { top: `${y}px`, left: `${x}px` });
// Positioning the arrow element
if (middlewareData.arrow && this.popoverArrowElement) {
const { x: arrowX, y: arrowY } = middlewareData.arrow;
const staticSide = {
top: 'bottom',
right: 'left',
bottom: 'top',
left: 'right',
}[placement.split('-')[0]];
Object.assign(this.popoverArrowElement.style, {
left: arrowX != null || arrowX != undefined ? `${arrowX}px` : '',
top: arrowY != null || arrowY != undefined ? `${arrowY}px` : '',
right: '',
bottom: '',
[staticSide]: '-4px',
});
}
});
}
doAutoUpdatePosition() {
this.ngZone.runOutsideAngular(() => {
if (!this.elementRef.nativeElement || !this.popoverElement)
return;
this.cleanup = autoUpdate(this.elementRef.nativeElement, this.popoverElement, () => {
this.updatePosition();
});
});
}
handleOnClick() {
this.ngZone.runOutsideAngular(() => {
fromEvent(this.document, 'click')
.pipe(takeUntil(this.destroy$))
.subscribe((event) => {
const target = event.target;
const toggler = this.elementRef.nativeElement;
const togglerClick = toggler.contains(target);
const popoverClick = this.popoverElement?.contains(target);
const outsidePopoverClick = !popoverClick;
if (this.isShown) {
// Don't hide the popover, supposed to use method `hide`.
if (this.closeBy.includes('manual'))
return;
// Close popover on toggler click if it has been opened
if (togglerClick)
return this.hide();
// Close popover on click outside its element.
if (outsidePopoverClick)
return this.hide();
}
if (!this.isShown) {
// Open popover on toggler click
if (togglerClick)
return this.show();
}
});
});
}
}
DokuPopover.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuPopover, deps: [{ token: DOCUMENT }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i0.ElementRef }, { token: i0.ApplicationRef }], target: i0.ɵɵFactoryTarget.Directive });
DokuPopover.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.9", type: DokuPopover, isStandalone: true, selector: "[doku-popover]", inputs: { content: ["doku-popover", "content"], color: ["popoverColor", "color"], placement: ["popoverPlacement", "placement"], closeBy: ["popoverCloseBy", "closeBy"], disabled: ["popoverDisabled", "disabled"] }, exportAs: ["dokuPopover"], ngImport: i0 });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuPopover, decorators: [{
type: Directive,
args: [{
selector: '[doku-popover]',
exportAs: 'dokuPopover',
standalone: true,
}]
}], ctorParameters: function () { return [{ type: Document, decorators: [{
type: Inject,
args: [DOCUMENT]
}] }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i0.ElementRef }, { type: i0.ApplicationRef }]; }, propDecorators: { content: [{
type: Input,
args: ['doku-popover']
}], color: [{
type: Input,
args: ['popoverColor']
}], placement: [{
type: Input,
args: ['popoverPlacement']
}], closeBy: [{
type: Input,
args: ['popoverCloseBy']
}], disabled: [{
type: Input,
args: ['popoverDisabled']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9wb3Zlci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb2t1LWZyYWdtZW50L3NyYy9saWIvcG9wb3Zlci9wb3BvdmVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUVMLFNBQVMsRUFHVCxNQUFNLEVBQ04sS0FBSyxFQUtMLFdBQVcsR0FDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7O0FBRzNELElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztBQU9mLE1BQU0sT0FBTyxXQUFXO0lBbUR0QixZQUM0QixRQUFrQixFQUNwQyxRQUFtQixFQUNuQixNQUFjLEVBQ2QsVUFBc0IsRUFDdEIsTUFBc0I7UUFKSixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ3BDLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbkIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUF2RHZCLE9BQUUsR0FBRyxzQkFBc0IsTUFBTSxFQUFFLEVBQUUsQ0FBQztRQUUvQzs7Ozs7V0FLRztRQUNvQixZQUFPLEdBQWtDLEVBQUUsQ0FBQztRQUVuRTs7OztXQUlHO1FBQ29CLFVBQUssR0FBcUIsTUFBTSxDQUFDO1FBRXhEOzs7V0FHRztRQUN3QixjQUFTLEdBQXlCLEtBQUssQ0FBQztRQUVuRTs7Ozs7OztXQU9HO1FBQ3NCLFlBQU8sR0FBNEIsQ0FBQyxjQUFjLENB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OzswQkFxREksTUFBTTsyQkFBQyxRQUFROytJQTNDSyxPQUFPO3NCQUE3QixLQUFLO3VCQUFDLGNBQWM7Z0JBT0UsS0FBSztzQkFBM0IsS0FBSzt1QkFBQyxjQUFjO2dCQU1NLFNBQVM7c0JBQW5DLEtBQUs7dUJBQUMsa0JBQWtCO2dCQVVBLE9BQU87c0JBQS9CLEtBQUs7dUJBQUMsZ0JBQWdCO2dCQU9HLFFBQVE7c0JBQWpDLEtBQUs7dUJBQUMsaUJBQWlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQXBwbGljYXRpb25SZWYsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRW1iZWRkZWRWaWV3UmVmLFxuICBJbmplY3QsXG4gIElucHV0LFxuICBOZ1pvbmUsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBSZW5kZXJlcjIsXG4gIFRlbXBsYXRlUmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGFycm93LCBhdXRvVXBkYXRlLCBjb21wdXRlUG9zaXRpb24sIGZsaXAsIG9mZnNldCwgc2hpZnQgfSBmcm9tICdAZmxvYXRpbmctdWkvZG9tJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIGZyb21FdmVudCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEb2t1UG9wb3ZlckNsb3NlQnlLZXksIERva3VQb3BvdmVyUGxhY2VtZW50IH0gZnJvbSAnLi9wb3BvdmVyLmludGVyZmFjZSc7XG5cbmxldCBuZXh0SWQgPSAxO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZG9rdS1wb3BvdmVyXScsXG4gIGV4cG9ydEFzOiAnZG9rdVBvcG92ZXInLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBEb2t1UG9wb3ZlciBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcmVhZG9ubHkgaWQgPSBgZC1wb3BvdmVyLXVuaXF1ZUlkLSR7bmV4dElkKyt9YDtcblxuICAvKipcbiAgICogQ29udGVudCBvZiB0aGUgcG9wb3Zlci5cbiAgICogSXQgY2FuIGJlIGEgc3RyaW5nIG9yIGEgdGVtcGxhdGUgZm9yIG1vcmUgY3VzdG9taXphdGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgJydcbiAgICovXG4gIEBJbnB1dCgnZG9rdS1wb3BvdmVyJykgY29udGVudDogc3RyaW5nIHwgVGVtcGxhdGVSZWY8dW5rbm93bj4gPSAnJztcblxuICAvKipcbiAgICogVGhlIGNvbG9yIG9mIHRoZSBwb3BvdmVyLlxuICAgKiBFaXRoZXIgYGRhcmtgIG9yIGBsaWdodGAuXG4gICAqIEBkZWZhdWx0ICdkYXJrJ1xuICAgKi9cbiAgQElucHV0KCdwb3BvdmVyQ29sb3InKSBjb2xvcjogJ2RhcmsnIHwgJ2xpZ2h0JyA9ICdkYXJrJztcblxuICAvKipcbiAgICogVGhlIHBsYWNlbWVudCBvZiB0aGUgcG9wb3Zlci5cbiAgICogQGRlZmF1bHQgJ3RvcCdcbiAgICovXG4gIEBJbnB1dCgncG9wb3ZlclBsYWNlbWVudCcpIHBsYWNlbWVudDogRG9rdVBvcG92ZXJQbGFjZW1lbnQgPSAndG9wJztcblxuICAvKipcbiAgICogQWN0aW9ucyB0aGF0IHdpbGwgY2xvc2UgdGhlIHBvcG92ZXIuXG4gICAqXG4gICAqIC0gYG1hbnVhbGAsIG9ubHkgbWFudWFsIGFjdGlvbiB0aGF0IHdpbGwgY2xvc2UgdGhlIHBvcG92ZXIgbGlrZSB1c2luZyBgaGlkZWAgbWV0aG9kLlxuICAgKiAtIGBjbGlja091dHNpZGVgLCBjbG9zZSB0aGUgcG9wb3ZlciB3aGVuIGNsaWNraW5nIG91dHNpZGUgaXRzIGVsZW1lbnQuXG4gICAqXG4gICAqIFRoZSB0b3AgbGlzdCBoYXMgaGlnaGVyIHByaW9yaXR5LlxuICAgKi9cbiAgQElucHV0KCdwb3BvdmVyQ2xvc2VCeScpIGNsb3NlQnk6IERva3VQb3BvdmVyQ2xvc2VCeUtleVtdID0gWydjbGlja091dHNpZGUnXTtcblxuICAvKipcbiAgICogV2hldGhlciB0byBkaXNhYmxlIHRoZSBwb3BvdmVyLlxuICAgKiBEaXNhYmxlZCBwb3BvdmVyIGNhbid0IGJlIG9wZW5lZC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgncG9wb3ZlckRpc2FibGVkJykgZGlzYWJsZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIGlzU2hvd24gPSBmYWxzZTtcblxuICBwcml2YXRlIHBvcG92ZXJFbGVtZW50PzogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcG9wb3ZlckNvbnRlbnRFbGVtZW50PzogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgcG9wb3ZlckFycm93RWxlbWVudD86IEhUTUxFbGVtZW50O1xuICBwcml2YXRlIHZpZXdSZWY/OiBFbWJlZGRlZFZpZXdSZWY8dW5rbm93bj47XG5cbiAgcHJpdmF0ZSBjbGVhbnVwPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBSZXBsYXlTdWJqZWN0KCk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgYXBwUmVmOiBBcHBsaWNhdGlvblJlZlxuICApIHt9XG5cbiAgcHJvdGVjdGVkIGdldCBjbGFzc2VzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gWydkLXBvcG92ZXInLCAnZC10ZXh0LWJvZHktcycsIGBkLXBvcG92ZXItJHt0aGlzLmNvbG9yfWBdO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5oYW5kbGVPbkNsaWNrKCk7XG5cbiAgICB0aGlzLnBvcG92ZXJFbGVtZW50ID0gdGhpcy5jcmVhdGVQb3BvdmVyRWxlbWVudCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KDEpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgICB0aGlzLmhpZGUoKTtcbiAgICB0aGlzLnBvcG92ZXJFbGVtZW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucG9wb3ZlckNvbnRlbnRFbGVtZW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucG9wb3ZlckFycm93RWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93IHBvcG92ZXIgcHJvZ3JhbW1hdGljYWxseS5cbiAgICovXG4gIHNob3coKSB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHJldHVybjtcbiAgICBpZiAodGhpcy5pc1Nob3duIHx8ICF0aGlzLnBvcG92ZXJFbGVtZW50KSByZXR1cm47XG4gICAgdGhpcy5pc1Nob3duID0gdHJ1ZTtcbiAgICB0aGlzLnNldFBvcG92ZXJDb250ZW50KHRoaXMuY29udGVudCk7XG4gICAgdGhpcy5yZW5kZXJlci5hcHBlbmRDaGlsZCh0aGlzLmRvY3VtZW50LmJvZHksIHRoaXMucG9wb3ZlckVsZW1lbnQpO1xuICAgIHRoaXMuZG9BdXRvVXBkYXRlUG9zaXRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIaWRlIHBvcG92ZXIgcHJvZ3JhbW1hdGljYWxseS5cbiAgICovXG4gIGhpZGUoKSB7XG4gICAgaWYgKCF0aGlzLmlzU2hvd24gfHwgIXRoaXMucG9wb3ZlckVsZW1lbnQpIHJldHVybjtcbiAgICB0aGlzLmlzU2hvd24gPSBmYWxzZTtcbiAgICB0aGlzLnBvcG92ZXJFbGVtZW50LnJlbW92ZSgpO1xuICAgIHRoaXMuY2xlYW51cD8uKCk7XG4gICAgdGhpcy52aWV3UmVmPy5kZXN0cm95KCk7XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIHBvcG92ZXIgcHJvZ3JhbW1hdGljYWxseS5cbiAgICovXG4gIHRvZ2dsZSgpIHtcbiAgICB0aGlzLmlzU2hvd24gPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgY29udGVudCBvZiB0aGUgcG9wb3ZlciB3aXRoIG5ldyBvbmUuXG4gICAqL1xuICB1cGRhdGVDb250ZW50KGNvbnRlbnQ6IHN0cmluZyB8IFRlbXBsYXRlUmVmPHVua25vd24+KSB7XG4gICAgdGhpcy5zZXRQb3BvdmVyQ29udGVudChjb250ZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlUG9wb3ZlckVsZW1lbnQoKSB7XG4gICAgY29uc3QgZWxlbWVudDogSFRNTERpdkVsZW1lbnQgPSB0aGlzLnJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gdGhpcy5jbGFzc2VzLmpvaW4oJyAnKTtcblxuICAgIHRoaXMucG9wb3ZlckNvbnRlbnRFbGVtZW50ID0gdGhpcy5jcmVhdGVQb3BvdmVyQ29udGVudEVsZW1lbnQoKTtcbiAgICBlbGVtZW50LmFwcGVuZENoaWxkKHRoaXMucG9wb3ZlckNvbnRlbnRFbGVtZW50KTtcblxuICAgIHRoaXMucG9wb3ZlckFycm93RWxlbWVudCA9IHRoaXMuY3JlYXRlQXJyb3dFbGVtZW50KCk7XG4gICAgZWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLnBvcG92ZXJBcnJvd0VsZW1lbnQpO1xuXG4gICAgcmV0dXJuIGVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVBvcG92ZXJDb250ZW50RWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKSBhcyBIVE1MRGl2RWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQXJyb3dFbGVtZW50KCkge1xuICAgIGNvbnN0IGVsZW1lbnQ6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5yZW5kZXJlci5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBlbGVtZW50LmNsYXNzTmFtZSA9ICdkLXBvcG92ZXItYXJyb3cnO1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQb3BvdmVyQ29udGVudChjb250ZW50OiBzdHJpbmcgfCBUZW1wbGF0ZVJlZjx1bmtub3duPikge1xuICAgIGlmICghdGhpcy5wb3BvdmVyQ29udGVudEVsZW1lbnQpIHJldHVybjtcbiAgICB0aGlzLnBvcG92ZXJDb250ZW50RWxlbWVudC5yZXBsYWNlQ2hpbGRyZW4oKTtcblxuICAgIGlmIChjb250ZW50IGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpIHtcbiAgICAgIHRoaXMudmlld1JlZj8uZGVzdHJveSgpO1xuICAgICAgdGhpcy52aWV3UmVmID0gY29udGVudC5jcmVhdGVFbWJlZGRlZFZpZXcoeyBoaWRlOiB0aGlzLmhpZGUuYmluZCh0aGlzKSB9KTtcbiAgICAgIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcodGhpcy52aWV3UmVmKTtcbiAgICAgIHRoaXMudmlld1JlZi5yb290Tm9kZXMuZm9yRWFjaCgobm9kZSkgPT4ge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMucG9wb3ZlckNvbnRlbnRFbGVtZW50LCBub2RlKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy52aWV3UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFwcGVuZENoaWxkKHRoaXMucG9wb3ZlckNvbnRlbnRFbGVtZW50LCB0aGlzLnJlbmRlcmVyLmNyZWF0ZVRleHQoY29udGVudCkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUG9zaXRpb24oKSB7XG4gICAgaWYgKCF0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCB8fCAhdGhpcy5wb3BvdmVyRWxlbWVudCB8fCAhdGhpcy5wb3BvdmVyQXJyb3dFbGVtZW50KSByZXR1cm47XG4gICAgY29tcHV0ZVBvc2l0aW9uKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLnBvcG92ZXJFbGVtZW50LCB7XG4gICAgICBwbGFjZW1lbnQ6IHRoaXMucGxhY2VtZW50LFxuICAgICAgbWlkZGxld2FyZTogW1xuICAgICAgICBvZmZzZXQoNiksXG4gICAgICAgIGZsaXAoKSxcbiAgICAgICAgc2hpZnQoeyBwYWRkaW5nOiA4IH0pLFxuICAgICAgICBhcnJvdyh7IGVsZW1lbnQ6IHRoaXMucG9wb3ZlckFycm93RWxlbWVudCB9KSxcbiAgICAgIF0sXG4gICAgfSkudGhlbigoeyB4LCB5LCBwbGFjZW1lbnQsIG1pZGRsZXdhcmVEYXRhIH0pID0+IHtcbiAgICAgIGlmICghdGhpcy5wb3BvdmVyRWxlbWVudCkgcmV0dXJuO1xuICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnBvcG92ZXJFbGVtZW50LnN0eWxlLCB7IHRvcDogYCR7eX1weGAsIGxlZnQ6IGAke3h9cHhgIH0pO1xuXG4gICAgICAvLyBQb3NpdGlvbmluZyB0aGUgYXJyb3cgZWxlbWVudFxuICAgICAgaWYgKG1pZGRsZXdhcmVEYXRhLmFycm93ICYmIHRoaXMucG9wb3ZlckFycm93RWxlbWVudCkge1xuICAgICAgICBjb25zdCB7IHg6IGFycm93WCwgeTogYXJyb3dZIH0gPSBtaWRkbGV3YXJlRGF0YS5hcnJvdztcbiAgICAgICAgY29uc3Qgc3RhdGljU2lkZSA9IHtcbiAgICAgICAgICB0b3A6ICdib3R0b20nLFxuICAgICAgICAgIHJpZ2h0OiAnbGVmdCcsXG4gICAgICAgICAgYm90dG9tOiAndG9wJyxcbiAgICAgICAgICBsZWZ0OiAncmlnaHQnLFxuICAgICAgICB9W3BsYWNlbWVudC5zcGxpdCgnLScpWzBdXSBhcyBzdHJpbmc7XG5cbiAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLnBvcG92ZXJBcnJvd0VsZW1lbnQuc3R5bGUsIHtcbiAgICAgICAgICBsZWZ0OiBhcnJvd1ggIT0gbnVsbCB8fCBhcnJvd1ggIT0gdW5kZWZpbmVkID8gYCR7YXJyb3dYfXB4YCA6ICcnLFxuICAgICAgICAgIHRvcDogYXJyb3dZICE9IG51bGwgfHwgYXJyb3dZICE9IHVuZGVmaW5lZCA/IGAke2Fycm93WX1weGAgOiAnJyxcbiAgICAgICAgICByaWdodDogJycsXG4gICAgICAgICAgYm90dG9tOiAnJyxcbiAgICAgICAgICBbc3RhdGljU2lkZV06ICctNHB4JyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGRvQXV0b1VwZGF0ZVBvc2l0aW9uKCkge1xuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgIGlmICghdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgfHwgIXRoaXMucG9wb3ZlckVsZW1lbnQpIHJldHVybjtcbiAgICAgIHRoaXMuY2xlYW51cCA9IGF1dG9VcGRhdGUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMucG9wb3ZlckVsZW1lbnQsICgpID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbigpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU9uQ2xpY2soKSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgZnJvbUV2ZW50KHRoaXMuZG9jdW1lbnQsICdjbGljaycpXG4gICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcbiAgICAgICAgLnN1YnNjcmliZSgoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgIGNvbnN0IHRvZ2dsZXIgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAgIGNvbnN0IHRvZ2dsZXJDbGljayA9IHRvZ2dsZXIuY29udGFpbnModGFyZ2V0KTtcbiAgICAgICAgICBjb25zdCBwb3BvdmVyQ2xpY2sgPSB0aGlzLnBvcG92ZXJFbGVtZW50Py5jb250YWlucyh0YXJnZXQpO1xuICAgICAgICAgIGNvbnN0IG91dHNpZGVQb3BvdmVyQ2xpY2sgPSAhcG9wb3ZlckNsaWNrO1xuXG4gICAgICAgICAgaWYgKHRoaXMuaXNTaG93bikge1xuICAgICAgICAgICAgLy8gRG9uJ3QgaGlkZSB0aGUgcG9wb3Zlciwgc3VwcG9zZWQgdG8gdXNlIG1ldGhvZCBgaGlkZWAuXG4gICAgICAgICAgICBpZiAodGhpcy5jbG9zZUJ5LmluY2x1ZGVzKCdtYW51YWwnKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBDbG9zZSBwb3BvdmVyIG9uIHRvZ2dsZXIgY2xpY2sgaWYgaXQgaGFzIGJlZW4gb3BlbmVkXG4gICAgICAgICAgICBpZiAodG9nZ2xlckNsaWNrKSByZXR1cm4gdGhpcy5oaWRlKCk7XG5cbiAgICAgICAgICAgIC8vIENsb3NlIHBvcG92ZXIgb24gY2xpY2sgb3V0c2lkZSBpdHMgZWxlbWVudC5cbiAgICAgICAgICAgIGlmIChvdXRzaWRlUG9wb3ZlckNsaWNrKSByZXR1cm4gdGhpcy5oaWRlKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCF0aGlzLmlzU2hvd24pIHtcbiAgICAgICAgICAgIC8vIE9wZW4gcG9wb3ZlciBvbiB0b2dnbGVyIGNsaWNrXG4gICAgICAgICAgICBpZiAodG9nZ2xlckNsaWNrKSByZXR1cm4gdGhpcy5zaG93KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIl19