UNPKG

angular-weblineindia-swipe

Version:

An AngularJS based Swipe List component which provides swipe effects in your Angular application. It also allows you to change button options like you can place delete / edit / info buttons as per your requirements.

287 lines 29 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ElementRef, EventEmitter, HostListener, Input, Output, TemplateRef, ViewChild, ViewContainerRef } from '@angular/core'; import { SwipeServiceService } from '../swipe-service.service'; export class ItemListComponent { /** * @param {?} elRef * @param {?} swService */ constructor(elRef, swService) { this.swService = swService; this.alive = true; this.selfElement = null; this.idElement = null; this.disabledMark = false; this.showMark = false; this.itemClass = ''; this.callback = new EventEmitter(); this.swClick = new EventEmitter(); this.random = (/** * @return {?} */ () => { /** @type {?} */ const d = new Date(); return d.getTime(); }); this.swipeleft = (/** * @param {?} res * @return {?} */ (res) => { this.swService.closeAll(this.selfElement.id); if (!this.disabledMark) { this.result = (res.deltaX < 0); } }); this.clickItem = (/** * @param {?} a * @return {?} */ (a) => this.swClick.emit(a)); this.action = (/** * @param {?=} opt * @return {?} */ (opt = '') => { try { this.result = false; const { id } = this.inside; if (opt === 'edit') { this.callback.emit({ action: 'edit', value: id }); } else if (opt === 'trash') { this.callback.emit({ action: 'trash', value: id }); } } catch (e) { console.error('Debes definir ID de edit, y trash'); } }); this.render = (/** * @return {?} */ () => { console.log('INIT'); /** * Template MARK **/ if (this.showMark) { if (this.inside.mark && !this.markTemplate) { /** @type {?} */ const viewMark = this.defaultMark.createEmbeddedView(null); this.viewContainerMark.insert(viewMark); } else if (this.inside.mark && this.markTemplate) { /** @type {?} */ const viewMark = this.markTemplate.createEmbeddedView(null); this.viewContainerMark.insert(viewMark); } if (!this.inside.mark && !this.notMarkTemplate) { /** @type {?} */ const viewMark = this.defaultNotMark.createEmbeddedView(null); this.viewContainerMark.insert(viewMark); } else if (!this.inside.mark && this.notMarkTemplate) { /** @type {?} */ const viewMark = this.notMarkTemplate.createEmbeddedView(null); this.viewContainerMark.insert(viewMark); } } /** * Template EDIT **/ if (this.editTemplate) { /** @type {?} */ const viewEdit = this.editTemplate.createEmbeddedView(null); if (this.viewContainerEdit) { this.viewContainerEdit.insert(viewEdit); } } else if (this.editTemplate !== null) { /** @type {?} */ const viewEdit = this.defaultEdit.createEmbeddedView(null); this.viewContainerEdit.insert(viewEdit); } /** * Template TRASH **/ if (this.trashTemplate) { /** @type {?} */ const viewTrash = this.trashTemplate.createEmbeddedView(null); if (this.viewContainerTrash) { this.viewContainerTrash.insert(viewTrash); } } else if (this.trashTemplate !== null) { /** @type {?} */ const viewTrash = this.defaultTrash.createEmbeddedView(null); this.viewContainerTrash.insert(viewTrash); } setTimeout((/** * @return {?} */ () => { if (this.customTemplate) { // Si tiene // Si tiene /** @type {?} */ const dataInside = Object.assign({}, this.inside, { touch: this.selfElement.id }); /** @type {?} */ const viewCustomTemplate = this.customTemplate.createEmbeddedView({ item: dataInside, id: this.selfElement.id }); if (viewCustomTemplate) { this.viewContainerCustom.insert(viewCustomTemplate); } } else { /** @type {?} */ const viewCustomTemplate = this.defaultCustom.createEmbeddedView(null); this.viewContainerCustom.insert(viewCustomTemplate); } }), 10); }); this.selfElement = elRef.nativeElement; this.idElement = `list-swipe-${this.random()}`; this.selfElement.setAttribute('data-id', this.idElement); this.selfElement.id = this.idElement; this.swService.swipeObserver.subscribe((/** * @param {?} a * @return {?} */ a => { if (a !== this.selfElement.id) { this.result = false; } })); } /** * @param {?} event * @return {?} */ clickOut(event) { if (!this.selfElement.contains(event.target)) { this.result = false; } } /** * @return {?} */ ngAfterViewInit() { this.render(); // throw new Error("Method not implemented."); } /** * @return {?} */ ngOnInit() { } } ItemListComponent.decorators = [ { type: Component, args: [{ selector: 'sw-item-list', template: "<div class=\"{{itemClass}}\" (swipeleft)=\"swipeleft($event)\" (swipe)=\"swipeleft($event)\" >\n <ng-template #defaultEdit>\n edit\n </ng-template>\n <ng-template #defaultTrash>\n trash\n </ng-template>\n <ng-template #defaultMark>\n <div class=\"yes-marker\"></div>\n </ng-template>\n <ng-template #defaultNotMark>\n <div class=\"not-marker\"></div>\n </ng-template>\n\n <ng-template #defaultCustom>\n <div data-id=\"{{idElement}}\" class=\"text truncate\">{{inside?.title}}</div>\n <div data-id=\"{{idElement}}\" class=\"small truncate\">{{inside?.subTitle}}</div>\n </ng-template>\n\n\n <div [ngClass]=\"{'active':(result)}\" data-id=\"{{idElement}}\"\n class=\" options-btn swipe-d-flex justify-content-between\">\n <div (click)=\"action('edit')\" class=\"option-list\" *ngIf=\"editTemplate !== null\">\n <ng-template let-show=\"show\" #viewContainerEdit></ng-template>\n </div>\n <div (click)=\"action('trash')\" class=\"option-list\" *ngIf=\"trashTemplate !== null\">\n <ng-template let-show=\"show\" #viewContainerTrash></ng-template>\n </div>\n </div>\n <div [ngClass]=\"{'left-swipe':(result)}\" data-id=\"{{idElement}}\" class=\"list-swipe swipe-d-flex\">\n\n <div *ngIf=\"showMark\" class=\"swipe-w-10\">\n <ng-container #viewContainerMark></ng-container>\n </div>\n\n <div (click)=\"clickItem($event)\" [ngClass]=\"{'swipe-w-90':showMark, 'swipe-w-100':!showMark}\">\n <div *ngIf=\"customTemplate\" data-id=\"{{idElement}}\">\n <ng-template #viewContainerCustom>\n </ng-template>\n </div>\n\n <div *ngIf=\"!customTemplate\">\n <ng-template #viewContainerCustom></ng-template>\n </div>\n\n </div>\n <div class=\"mark\"></div>\n </div>\n</div>\n", styles: [":host{display:block;font-family:Arial,serif}.not-marker{background:red;width:1rem;height:1rem;border-radius:3rem}.yes-marker{background:green;width:1rem;height:1rem;border-radius:3rem}.swipe-d-flex{display:flex}.swipe-w-10{width:10%}.swipe-w-100{width:100%}.swipe-w-90{width:90%}.options-btn.active{display:flex;transform:translate(66vw,0)}.list-swipe{box-shadow:0 5px 7px rgba(181,181,181,.18);border-radius:.25em;padding:.75em;font-weight:500;font-size:16px;line-height:19px;z-index:9;margin:.75rem 0;transition:50ms ease-out}.left-swipe{transform:translate(-29vw,0);transition:50ms ease-out;box-shadow:6px 0 7px rgba(181,181,181,.31)}.options-btn{position:absolute;display:none;transform:translate(100vw,0);padding:.5rem 0;width:28vw}.list-swipe .text{color:#313131}.list-swipe .small{font-weight:500;font-size:16px;line-height:19px;color:#9b9b9b;padding:1rem 0 0}.list-swipe .mark{background:#fff;height:2rem;margin-top:.75rem;margin-right:-.3rem;border-right:.175rem solid #f96060}.option-list{width:100%;min-height:3.75rem;line-height:3.75rem;border-right:1px solid rgba(0,0,0,.1);text-align:center}.option-list:last-child{border-right:0}.truncate{width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}"] }] } ]; /** @nocollapse */ ItemListComponent.ctorParameters = () => [ { type: ElementRef }, { type: SwipeServiceService } ]; ItemListComponent.propDecorators = { inside: [{ type: Input }], disabledMark: [{ type: Input, args: ['disable-mark',] }], showMark: [{ type: Input, args: ['show-mark',] }], itemClass: [{ type: Input, args: ['item-class',] }], defaultEdit: [{ type: ViewChild, args: ['defaultEdit',] }], defaultTrash: [{ type: ViewChild, args: ['defaultTrash',] }], defaultMark: [{ type: ViewChild, args: ['defaultMark',] }], defaultNotMark: [{ type: ViewChild, args: ['defaultNotMark',] }], defaultCustom: [{ type: ViewChild, args: ['defaultCustom',] }], customTemplate: [{ type: Input, args: ['customTemplate',] }], editTemplate: [{ type: Input, args: ['editTemplate',] }], trashTemplate: [{ type: Input, args: ['trashTemplate',] }], markTemplate: [{ type: Input, args: ['markTemplate',] }], notMarkTemplate: [{ type: Input, args: ['notMarkTemplate',] }], callback: [{ type: Output }], swClick: [{ type: Output }], viewContainerEdit: [{ type: ViewChild, args: ['viewContainerEdit', { static: false, read: ViewContainerRef },] }], viewContainerTrash: [{ type: ViewChild, args: ['viewContainerTrash', { static: false, read: ViewContainerRef },] }], viewContainerMark: [{ type: ViewChild, args: ['viewContainerMark', { static: false, read: ViewContainerRef },] }], viewContainerCustom: [{ type: ViewChild, args: ['viewContainerCustom', { static: false, read: ViewContainerRef },] }], clickOut: [{ type: HostListener, args: ['document:click', ['$event'],] }] }; if (false) { /** @type {?} */ ItemListComponent.prototype.alive; /** @type {?} */ ItemListComponent.prototype.result; /** @type {?} */ ItemListComponent.prototype.selfElement; /** @type {?} */ ItemListComponent.prototype.idElement; /** @type {?} */ ItemListComponent.prototype.inside; /** @type {?} */ ItemListComponent.prototype.disabledMark; /** @type {?} */ ItemListComponent.prototype.showMark; /** @type {?} */ ItemListComponent.prototype.itemClass; /** @type {?} */ ItemListComponent.prototype.defaultEdit; /** @type {?} */ ItemListComponent.prototype.defaultTrash; /** @type {?} */ ItemListComponent.prototype.defaultMark; /** @type {?} */ ItemListComponent.prototype.defaultNotMark; /** @type {?} */ ItemListComponent.prototype.defaultCustom; /** @type {?} */ ItemListComponent.prototype.customTemplate; /** @type {?} */ ItemListComponent.prototype.editTemplate; /** @type {?} */ ItemListComponent.prototype.trashTemplate; /** @type {?} */ ItemListComponent.prototype.markTemplate; /** @type {?} */ ItemListComponent.prototype.notMarkTemplate; /** @type {?} */ ItemListComponent.prototype.callback; /** @type {?} */ ItemListComponent.prototype.swClick; /** @type {?} */ ItemListComponent.prototype.viewContainerEdit; /** @type {?} */ ItemListComponent.prototype.viewContainerTrash; /** @type {?} */ ItemListComponent.prototype.viewContainerMark; /** @type {?} */ ItemListComponent.prototype.viewContainerCustom; /** * @type {?} * @private */ ItemListComponent.prototype.random; /** @type {?} */ ItemListComponent.prototype.swipeleft; /** @type {?} */ ItemListComponent.prototype.clickItem; /** @type {?} */ ItemListComponent.prototype.action; /** @type {?} */ ItemListComponent.prototype.render; /** * @type {?} * @private */ ItemListComponent.prototype.swService; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbS1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3N3aXBlLWFuZ3VsYXItbGlzdC8iLCJzb3VyY2VzIjpbImxpYi9pdGVtLWxpc3QvaXRlbS1saXN0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUVMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUNOLFdBQVcsRUFDWCxTQUFTLEVBQUUsZ0JBQWdCLEVBQzVCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBTzdELE1BQU0sT0FBTyxpQkFBaUI7Ozs7O0lBa0U1QixZQUFZLEtBQWlCLEVBQVUsU0FBOEI7UUFBOUIsY0FBUyxHQUFULFNBQVMsQ0FBcUI7UUFqRXJFLFVBQUssR0FBRyxJQUFJLENBQUM7UUFFYixnQkFBVyxHQUFHLElBQUksQ0FBQztRQUNuQixjQUFTLEdBQUcsSUFBSSxDQUFDO1FBUU0saUJBQVksR0FBRyxLQUFLLENBQUM7UUFFeEIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUVoQixjQUFTLEdBQUcsRUFBRSxDQUFDO1FBMEJwQyxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUduQyxZQUFPLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQXFDMUIsV0FBTTs7O1FBQUcsR0FBRyxFQUFFOztrQkFDZCxDQUFDLEdBQUcsSUFBSSxJQUFJLEVBQUU7WUFDcEIsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDckIsQ0FBQyxFQUFDO1FBR0ssY0FBUzs7OztRQUFHLENBQUMsR0FBTyxFQUFFLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN6QyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFB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Q0FDa0M7O0lBRWxDLDhDQUNvQzs7SUFFcEMsK0NBQ3FDOztJQUVyQyw4Q0FDb0M7O0lBRXBDLGdEQUNzQzs7Ozs7SUF5QnRDLG1DQUdFOztJQUdGLHNDQUtDOztJQUVELHNDQUE2Qzs7SUFFN0MsbUNBWUU7O0lBT0YsbUNBZ0VDOzs7OztJQWxIOEIsc0NBQXNDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZCwgVmlld0NvbnRhaW5lclJlZiwgT25Jbml0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtTd2lwZVNlcnZpY2VTZXJ2aWNlfSBmcm9tICcuLi9zd2lwZS1zZXJ2aWNlLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzdy1pdGVtLWxpc3QnLFxuICB0ZW1wbGF0ZVVybDogJy4vaXRlbS1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaXRlbS1saXN0LmNvbXBvbmVudC5jc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBJdGVtTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uSW5pdCAge1xuICBhbGl2ZSA9IHRydWU7XG4gIHJlc3VsdDogYm9vbGVhbjtcbiAgc2VsZkVsZW1lbnQgPSBudWxsO1xuICBpZEVsZW1lbnQgPSBudWxsO1xuICBASW5wdXQoKSBpbnNpZGU6IHtcbiAgICBpZCxcbiAgICB0aXRsZTogJycsXG4gICAgc3ViVGl0bGU6ICcnLFxuICAgIG1hcms6IGZhbHNlLFxuICB9O1xuXG4gIEBJbnB1dCgnZGlzYWJsZS1tYXJrJykgZGlzYWJsZWRNYXJrID0gZmFsc2U7XG5cbiAgQElucHV0KCdzaG93LW1hcmsnKSBzaG93TWFyayA9IGZhbHNlO1xuXG4gIEBJbnB1dCgnaXRlbS1jbGFzcycpIGl0ZW1DbGFzcyA9ICcnO1xuXG4gIC8vIEB0cy1pZ25vcmVcbiAgQFZpZXdDaGlsZCgnZGVmYXVsdEVkaXQnKSBkZWZhdWx0RWRpdDogVGVtcGxhdGVSZWY8YW55PjtcbiAgLy8gQHRzLWlnbm9yZVxuICBAVmlld0NoaWxkKCdkZWZhdWx0VHJhc2gnKSBkZWZhdWx0VHJhc2g6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLy8gQHRzLWlnbm9yZVxuICBAVmlld0NoaWxkKCdkZWZhdWx0TWFyaycpIGRlZmF1bHRNYXJrOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICAvLyBAdHMtaWdub3JlXG4gIEBWaWV3Q2hpbGQoJ2RlZmF1bHROb3RNYXJrJykgZGVmYXVsdE5vdE1hcms6IFRlbXBsYXRlUmVmPGFueT47XG4gIC8vIEB0cy1pZ25vcmVcbiAgQFZpZXdDaGlsZCgnZGVmYXVsdEN1c3RvbScpIGRlZmF1bHRDdXN0b206IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWlucHV0LXJlbmFtZVxuICBASW5wdXQoJ2N1c3RvbVRlbXBsYXRlJykgY3VzdG9tVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbnB1dC1yZW5hbWVcbiAgQElucHV0KCdlZGl0VGVtcGxhdGUnKSBlZGl0VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbnB1dC1yZW5hbWVcbiAgQElucHV0KCd0cmFzaFRlbXBsYXRlJykgdHJhc2hUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWlucHV0LXJlbmFtZVxuICBASW5wdXQoJ21hcmtUZW1wbGF0ZScpIG1hcmtUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWlucHV0LXJlbmFtZVxuICBASW5wdXQoJ25vdE1hcmtUZW1wbGF0ZScpIG5vdE1hcmtUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICBAT3V0cHV0KClcbiAgY2FsbGJhY2sgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBAT3V0cHV0KClcbiAgc3dDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBWaWV3Q2hpbGQoJ3ZpZXdDb250YWluZXJFZGl0Jywge3N0YXRpYzogZmFsc2UsIHJlYWQ6IFZpZXdDb250YWluZXJSZWZ9KVxuICB2aWV3Q29udGFpbmVyRWRpdDogVmlld0NvbnRhaW5lclJlZjtcblxuICBAVmlld0NoaWxkKCd2aWV3Q29udGFpbmVyVHJhc2gnLCB7c3RhdGljOiBmYWxzZSwgcmVhZDogVmlld0NvbnRhaW5lclJlZn0pXG4gIHZpZXdDb250YWluZXJUcmFzaDogVmlld0NvbnRhaW5lclJlZjtcblxuICBAVmlld0NoaWxkKCd2aWV3Q29udGFpbmVyTWFyaycsIHtzdGF0aWM6IGZhbHNlLCByZWFkOiBWaWV3Q29udGFpbmVyUmVmfSlcbiAgdmlld0NvbnRhaW5lck1hcms6IFZpZXdDb250YWluZXJSZWY7XG5cbiAgQFZpZXdDaGlsZCgndmlld0NvbnRhaW5lckN1c3RvbScsIHtzdGF0aWM6IGZhbHNlLCByZWFkOiBWaWV3Q29udGFpbmVyUmVmfSlcbiAgdmlld0NvbnRhaW5lckN1c3RvbTogVmlld0NvbnRhaW5lclJlZjtcblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIGNsaWNrT3V0KGV2ZW50KSB7XG4gICAgaWYgKCF0aGlzLnNlbGZFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoZWxSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgc3dTZXJ2aWNlOiBTd2lwZVNlcnZpY2VTZXJ2aWNlKSB7XG4gICAgdGhpcy5zZWxmRWxlbWVudCA9IGVsUmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdGhpcy5pZEVsZW1lbnQgPSBgbGlzdC1zd2lwZS0ke3RoaXMucmFuZG9tKCl9YDtcbiAgICB0aGlzLnNlbGZFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1pZCcsIHRoaXMuaWRFbGVtZW50KTtcbiAgICB0aGlzLnNlbGZFbGVtZW50LmlkID0gdGhpcy5pZEVsZW1lbnQ7XG4gICAgdGhpcy5zd1NlcnZpY2Uuc3dpcGVPYnNlcnZlci5zdWJzY3JpYmUoYSA9PiB7XG4gICAgICBpZiAoYSAhPT0gdGhpcy5zZWxmRWxlbWVudC5pZCkge1xuICAgICAgICB0aGlzLnJlc3VsdCA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbmRlcigpO1xuICAgIC8vIHRocm93IG5ldyBFcnJvcihcIk1ldGhvZCBub3QgaW1wbGVtZW50ZWQuXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSByYW5kb20gPSAoKSA9PiB7XG4gICAgY29uc3QgZCA9IG5ldyBEYXRlKCk7XG4gICAgcmV0dXJuIGQuZ2V0VGltZSgpO1xuICB9O1xuXG5cbiAgcHVibGljIHN3aXBlbGVmdCA9IChyZXM6YW55KSA9PiB7XG4gICAgdGhpcy5zd1NlcnZpY2UuY2xvc2VBbGwodGhpcy5zZWxmRWxlbWVudC5pZCk7XG4gICAgICAgIGlmICghdGhpcy5kaXNhYmxlZE1hcmspIHtcbiAgICAgICAgICB0aGlzLnJlc3VsdCA9IChyZXMuZGVsdGFYIDwgMCk7XG4gICAgICAgIH1cbiAgfVxuXG4gIGNsaWNrSXRlbSA9IChhOiBhbnkpID0+IHRoaXMuc3dDbGljay5lbWl0KGEpO1xuXG4gIGFjdGlvbiA9IChvcHQgPSAnJykgPT4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLnJlc3VsdCA9IGZhbHNlO1xuICAgICAgY29uc3Qge2lkfSA9IHRoaXMuaW5zaWRlO1xuICAgICAgaWYgKG9wdCA9PT0gJ2VkaXQnKSB7XG4gICAgICAgIHRoaXMuY2FsbGJhY2suZW1pdCh7YWN0aW9uOiAnZWRpdCcsIHZhbHVlOiBpZH0pO1xuICAgICAgfSBlbHNlIGlmIChvcHQgPT09ICd0cmFzaCcpIHtcbiAgICAgICAgdGhpcy5jYWxsYmFjay5lbWl0KHthY3Rpb246ICd0cmFzaCcsIHZhbHVlOiBpZH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0RlYmVzIGRlZmluaXIgSUQgZGUgZWRpdCwgeSB0cmFzaCcpO1xuICAgIH1cbiAgfTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcblxuXG4gIH1cblxuICByZW5kZXIgPSAoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdJTklUJylcbiAgICAvKipcbiAgICAgKiBUZW1wbGF0ZSBNQVJLXG4gICAgICoqL1xuICAgIGlmICh0aGlzLnNob3dNYXJrKSB7XG4gICAgICBpZiAodGhpcy5pbnNpZGUubWFyayAmJiAhdGhpcy5tYXJrVGVtcGxhdGUpIHtcbiAgICAgICAgY29uc3Qgdmlld01hcmsgPSB0aGlzLmRlZmF1bHRNYXJrLmNyZWF0ZUVtYmVkZGVkVmlldyhudWxsKTtcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyTWFyay5pbnNlcnQodmlld01hcmspO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmluc2lkZS5tYXJrICYmIHRoaXMubWFya1RlbXBsYXRlKSB7XG4gICAgICAgIGNvbnN0IHZpZXdNYXJrID0gdGhpcy5tYXJrVGVtcGxhdGUuY3JlYXRlRW1iZWRkZWRWaWV3KG51bGwpO1xuICAgICAgICB0aGlzLnZpZXdDb250YWluZXJNYXJrLmluc2VydCh2aWV3TWFyayk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5pbnNpZGUubWFyayAmJiAhdGhpcy5ub3RNYXJrVGVtcGxhdGUpIHtcbiAgICAgICAgY29uc3Qgdmlld01hcmsgPSB0aGlzLmRlZmF1bHROb3RNYXJrLmNyZWF0ZUVtYmVkZGVkVmlldyhudWxsKTtcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyTWFyay5pbnNlcnQodmlld01hcmspO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5pbnNpZGUubWFyayAmJiB0aGlzLm5vdE1hcmtUZW1wbGF0ZSkge1xuICAgICAgICBjb25zdCB2aWV3TWFyayA9IHRoaXMubm90TWFya1RlbXBsYXRlLmNyZWF0ZUVtYmVkZGVkVmlldyhudWxsKTtcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyTWFyay5pbnNlcnQodmlld01hcmspO1xuICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBUZW1wbGF0ZSBFRElUXG4gICAgICoqL1xuICAgIGlmICh0aGlzLmVkaXRUZW1wbGF0ZSkge1xuICAgICAgY29uc3Qgdmlld0VkaXQgPSB0aGlzLmVkaXRUZW1wbGF0ZS5jcmVhdGVFbWJlZGRlZFZpZXcobnVsbCk7XG4gICAgICBpZiAodGhpcy52aWV3Q29udGFpbmVyRWRpdCkge1xuICAgICAgICB0aGlzLnZpZXdDb250YWluZXJFZGl0Lmluc2VydCh2aWV3RWRpdCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmVkaXRUZW1wbGF0ZSAhPT0gbnVsbCkge1xuICAgICAgY29uc3Qgdmlld0VkaXQgPSB0aGlzLmRlZmF1bHRFZGl0LmNyZWF0ZUVtYmVkZGVkVmlldyhudWxsKTtcbiAgICAgIHRoaXMudmlld0NvbnRhaW5lckVkaXQuaW5zZXJ0KHZpZXdFZGl0KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZW1wbGF0ZSBUUkFTSFxuICAgICAqKi9cblxuICAgIGlmICh0aGlzLnRyYXNoVGVtcGxhdGUpIHtcbiAgICAgIGNvbnN0IHZpZXdUcmFzaCA9IHRoaXMudHJhc2hUZW1wbGF0ZS5jcmVhdGVFbWJlZGRlZFZpZXcobnVsbCk7XG4gICAgICBpZiAodGhpcy52aWV3Q29udGFpbmVyVHJhc2gpIHtcbiAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyVHJhc2guaW5zZXJ0KHZpZXdUcmFzaCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLnRyYXNoVGVtcGxhdGUgIT09IG51bGwpIHtcbiAgICAgIGNvbnN0IHZpZXdUcmFzaCA9IHRoaXMuZGVmYXVsdFRyYXNoLmNyZWF0ZUVtYmVkZGVkVmlldyhudWxsKTtcbiAgICAgIHRoaXMudmlld0NvbnRhaW5lclRyYXNoLmluc2VydCh2aWV3VHJhc2gpO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY3VzdG9tVGVtcGxhdGUpIHsgLy8gU2kgdGllbmVcbiAgICAgICAgY29uc3QgZGF0YUluc2lkZSA9IHsuLi50aGlzLmluc2lkZSwgLi4ue3RvdWNoOiB0aGlzLnNlbGZFbGVtZW50LmlkfX07XG4gICAgICAgIGNvbnN0IHZpZXdDdXN0b21UZW1wbGF0ZSA9IHRoaXMuY3VzdG9tVGVtcGxhdGUuY3JlYXRlRW1iZWRkZWRWaWV3KHtcbiAgICAgICAgICBpdGVtOiBkYXRhSW5zaWRlLFxuICAgICAgICAgIGlkOiB0aGlzLnNlbGZFbGVtZW50LmlkXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodmlld0N1c3RvbVRlbXBsYXRlKSB7XG4gICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyQ3VzdG9tLmluc2VydCh2aWV3Q3VzdG9tVGVtcGxhdGUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB2aWV3Q3VzdG9tVGVtcGxhdGUgPSB0aGlzLmRlZmF1bHRDdXN0b20uY3JlYXRlRW1iZWRkZWRWaWV3KG51bGwpO1xuICAgICAgICB0aGlzLnZpZXdDb250YWluZXJDdXN0b20uaW5zZXJ0KHZpZXdDdXN0b21UZW1wbGF0ZSk7XG4gICAgICB9XG4gICAgfSwgMTApO1xuICB9XG5cbn1cbiJdfQ==