@ng-dnd/sortable
Version:
Sortable for Angular DnD
179 lines • 20.5 kB
JavaScript
import { ChangeDetectorRef, Directive, ElementRef, Input, } from '@angular/core';
import { DndService } from '@ng-dnd/core';
import { BehaviorSubject, Subscription } from 'rxjs';
import { isEmpty } from '../isEmpty';
import { HoverTrigger } from '../types';
import * as i0 from "@angular/core";
import * as i1 from "@ng-dnd/core";
export class DndSortable {
/** @ignore */
constructor(dnd, el, cdr) {
this.dnd = dnd;
this.el = el;
this.cdr = cdr;
this.listId = Math.random().toString();
this.horizontal = false;
/**
* Possible values:
*
* - 'halfway' (default): triggers a reorder when you drag halfway over a neighbour
* - 'fixed': triggers as soon as you move over a neighbouring element. Does not work with variable size elements. */
this.hoverTrigger = HoverTrigger.halfway;
/** @ignore */
this.childrenSubject$ = new BehaviorSubject([]);
/** A handy way to subscribe to spec.getList(). */
this.children$ = this.childrenSubject$;
/** @ignore */
this.subs = new Subscription();
/** @ignore */
this.listSubs = new Subscription();
this.target = this.dnd.dropTarget(null, {
canDrop: monitor => {
if (!this.acceptsType(monitor.getItemType())) {
return false;
}
const item = monitor.getItem();
if (!item) {
return false;
}
return this.getCanDrop(item, monitor);
},
drop: monitor => {
const item = monitor.getItem();
if (item && this.getCanDrop(item, monitor)) {
this.spec.drop?.(item, monitor);
}
return {};
},
hover: monitor => {
const item = monitor.getItem();
if (this.children && isEmpty(this.children) && item) {
const canDrop = this.getCanDrop(item, monitor);
if (canDrop && monitor.isOver({ shallow: true })) {
this.callHover(item, monitor, {
listId: this.listId,
index: 0,
});
}
}
},
}, this.subs);
}
contextFor(data, index) {
return {
data,
index,
listId: this.listId,
spec: this.spec,
horizontal: this.horizontal,
hoverTrigger: this.hoverTrigger,
};
}
/** @ignore */
updateSubscription() {
if (this.listId != null && this.spec) {
if (this.listSubs) {
this.subs.remove(this.listSubs);
this.listSubs.unsubscribe();
}
if (this.spec.getList) {
const cs$ = this.spec.getList(this.listId);
this.listSubs = cs$?.subscribe(l => {
if (l) {
this.childrenSubject$.next(l);
this.children = l;
this.cdr.markForCheck();
}
});
this.subs.add(this.listSubs);
}
}
}
/** @ignore */
getCanDrop(item, monitor, _default = true) {
if (this.spec.canDrop) {
return this.spec.canDrop(item, monitor);
}
return _default;
}
/** @ignore */
callHover(item, monitor, newHover) {
if (newHover) {
// mutate the object
item.hover = newHover;
// but also shallow clone so distinct from previous,
// useful if you rely on that for ngrx
item = { ...item };
}
this.spec.hover?.(item, monitor);
}
/** @ignore */
ngOnInit() {
this.updateSubscription();
this.target.setTypes(this.getTargetType());
}
getTargetType() {
if (Array.isArray(this.spec.accepts)) {
return this.spec.accepts;
}
else {
return this.spec.accepts || this.spec.type;
}
}
acceptsType(ty) {
if (ty == null)
return false;
if (Array.isArray(this.spec.accepts)) {
const arr = this.spec.accepts;
return arr.indexOf(ty) !== -1;
}
else {
const acc = this.getTargetType();
return ty == acc;
}
}
/** @ignore */
ngOnChanges({ spec, listId }) {
if (listId) {
this.updateSubscription();
}
if (spec) {
this.updateSubscription();
}
this.target.setTypes(this.getTargetType());
}
/** @ignore */
ngAfterViewInit() {
if (this.el) {
this.target.connectDropTarget(this.el.nativeElement);
}
else {
throw new Error('dndSortable directive must have ElementRef');
}
}
/** @ignore */
ngOnDestroy() {
this.subs.unsubscribe();
}
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DndSortable, deps: [{ token: i1.DndService }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Directive }); }
/** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.5", type: DndSortable, isStandalone: true, selector: "[dndSortable]", inputs: { listId: "listId", horizontal: "horizontal", spec: "spec", children: "children", hoverTrigger: "hoverTrigger" }, exportAs: ["dndSortable"], usesOnChanges: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DndSortable, decorators: [{
type: Directive,
args: [{
selector: '[dndSortable]',
exportAs: 'dndSortable',
standalone: true,
}]
}], ctorParameters: () => [{ type: i1.DndService }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }], propDecorators: { listId: [{
type: Input
}], horizontal: [{
type: Input
}], spec: [{
type: Input
}], children: [{
type: Input
}], hoverTrigger: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvZGlyZWN0aXZlcy9zb3J0YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxHQUtOLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxVQUFVLEVBQWlDLE1BQU0sY0FBYyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxlQUFlLEVBQWMsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDckMsT0FBTyxFQUFlLFlBQVksRUFBK0IsTUFBTSxVQUFVLENBQUM7OztBQU9sRixNQUFNLE9BQU8sV0FBVztJQTZCdEIsY0FBYztJQUNkLFlBQ1ksR0FBZSxFQUNmLEVBQTJCLEVBQzNCLEdBQXNCO1FBRnRCLFFBQUcsR0FBSCxHQUFHLENBQVk7UUFDZixPQUFFLEdBQUYsRUFBRSxDQUF5QjtRQUMzQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQWhDekIsV0FBTSxHQUFRLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN2QyxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBRzVCOzs7OzZIQUlxSDtRQUM1RyxpQkFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUM7UUFFN0MsY0FBYztRQUNOLHFCQUFnQixHQUFHLElBQUksZUFBZSxDQUFpQixFQUFFLENBQUMsQ0FBQztRQUNuRSxrREFBa0Q7UUFDbEQsY0FBUyxHQUErQixJQUFJLENBQUMsZ0JBQWdCLENBQUM7UUFFOUQsY0FBYztRQUNkLFNBQUksR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFCLGNBQWM7UUFDZCxhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQWU1QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FB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QyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7SUFDSCxDQUFDO0lBRUQsY0FBYztJQUNkLFdBQVc7UUFDVCxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzFCLENBQUM7aUlBdExVLFdBQVc7cUhBQVgsV0FBVzs7MkZBQVgsV0FBVztrQkFMdkIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsZUFBZTtvQkFDekIsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjt3SUFFVSxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFNRyxZQUFZO3NCQUFwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIFNpbXBsZUNoYW5nZXMsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRG5kU2VydmljZSwgRHJvcFRhcmdldCwgRHJvcFRhcmdldE1vbml0b3IgfSBmcm9tICdAbmctZG5kL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tICcuLi9pc0VtcHR5JztcbmltcG9ydCB7IERyYWdnZWRJdGVtLCBIb3ZlclRyaWdnZXIsIFJlbmRlckNvbnRleHQsIFNvcnRhYmxlU3BlYyB9IGZyb20gJy4uL3R5cGVzJztcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2RuZFNvcnRhYmxlXScsXG4gIGV4cG9ydEFzOiAnZG5kU29ydGFibGUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBEbmRTb3J0YWJsZTxEYXRhPiBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBsaXN0SWQ6IGFueSA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoKTtcbiAgQElucHV0KCkgaG9yaXpvbnRhbCA9IGZhbHNlO1xuICBASW5wdXQoKSBzcGVjITogU29ydGFibGVTcGVjPERhdGE+O1xuICBASW5wdXQoKSBjaGlsZHJlbj86IEl0ZXJhYmxlPERhdGE+O1xuICAvKipcbiAgICogUG9zc2libGUgdmFsdWVzOlxuICAgKlxuICAgKiAtICdoYWxmd2F5JyAoZGVmYXVsdCk6IHRyaWdnZXJzIGEgcmVvcmRlciB3aGVuIHlvdSBkcmFnIGhhbGZ3YXkgb3ZlciBhIG5laWdoYm91clxuICAgKiAtICdmaXhlZCc6IHRyaWdnZXJzIGFzIHNvb24gYXMgeW91IG1vdmUgb3ZlciBhIG5laWdoYm91cmluZyBlbGVtZW50LiBEb2VzIG5vdCB3b3JrIHdpdGggdmFyaWFibGUgc2l6ZSBlbGVtZW50cy4gKi9cbiAgQElucHV0KCkgaG92ZXJUcmlnZ2VyID0gSG92ZXJUcmlnZ2VyLmhhbGZ3YXk7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBjaGlsZHJlblN1YmplY3QkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJdGVyYWJsZTxEYXRhPj4oW10pO1xuICAvKiogQSBoYW5keSB3YXkgdG8gc3Vic2NyaWJlIHRvIHNwZWMuZ2V0TGlzdCgpLiAqL1xuICBjaGlsZHJlbiQ6IE9ic2VydmFibGU8SXRlcmFibGU8RGF0YT4+ID0gdGhpcy5jaGlsZHJlblN1YmplY3QkO1xuXG4gIC8qKiBAaWdub3JlICovXG4gIHN1YnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIC8qKiBAaWdub3JlICovXG4gIGxpc3RTdWJzID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIC8qKlxuICAgKiBUaGlzIERyb3BUYXJnZXQgaXMgYXR0YWNoZWQgdG8gdGhlIHdob2xlIGxpc3QuXG4gICAqXG4gICAqIFlvdSBtYXkgbW9uaXRvciBpdCBmb3IgaW5mb3JtYXRpb24gbGlrZSAnaXMgYW4gaXRlbSBob3ZlcmluZyBvdmVyIHRoaXMgZW50aXJlIGxpc3Qgc29tZXdoZXJlPydcbiAgICovXG4gIHRhcmdldDogRHJvcFRhcmdldDxEcmFnZ2VkSXRlbTxEYXRhPj47XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIGRuZDogRG5kU2VydmljZSxcbiAgICBwcm90ZWN0ZWQgZWw6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByb3RlY3RlZCBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkge1xuICAgIHRoaXMudGFyZ2V0ID0gdGhpcy5kbmQuZHJvcFRhcmdldDxEcmFnZ2VkSXRlbTxEYXRhPj4oXG4gICAgICBudWxsLFxuICAgICAge1xuICAgICAgICBjYW5Ecm9wOiBtb25pdG9yID0+IHtcbiAgICAgICAgICBpZiAoIXRoaXMuYWNjZXB0c1R5cGUobW9uaXRvci5nZXRJdGVtVHlwZSgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBpdGVtID0gbW9uaXRvci5nZXRJdGVtKCk7XG4gICAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLmdldENhbkRyb3AoaXRlbSwgbW9uaXRvcik7XG4gICAgICAgIH0sXG4gICAgICAgIGRyb3A6IG1vbml0b3IgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW0gPSBtb25pdG9yLmdldEl0ZW0oKTtcbiAgICAgICAgICBpZiAoaXRlbSAmJiB0aGlzLmdldENhbkRyb3AoaXRlbSwgbW9uaXRvcikpIHtcbiAgICAgICAgICAgIHRoaXMuc3BlYy5kcm9wPy4oaXRlbSwgbW9uaXRvcik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfSxcbiAgICAgICAgaG92ZXI6IG1vbml0b3IgPT4ge1xuICAgICAgICAgIGNvbnN0IGl0ZW0gPSBtb25pdG9yLmdldEl0ZW0oKTtcbiAgICAgICAgICBpZiAodGhpcy5jaGlsZHJlbiAmJiBpc0VtcHR5KHRoaXMuY2hpbGRyZW4pICYmIGl0ZW0pIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbkRyb3AgPSB0aGlzLmdldENhbkRyb3AoaXRlbSwgbW9uaXRvcik7XG4gICAgICAgICAgICBpZiAoY2FuRHJvcCAmJiBtb25pdG9yLmlzT3Zlcih7IHNoYWxsb3c6IHRydWUgfSkpIHtcbiAgICAgICAgICAgICAgdGhpcy5jYWxsSG92ZXIoaXRlbSwgbW9uaXRvciwge1xuICAgICAgICAgICAgICAgIGxpc3RJZDogdGhpcy5saXN0SWQsXG4gICAgICAgICAgICAgICAgaW5kZXg6IDAsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0aGlzLnN1YnNcbiAgICApO1xuICB9XG5cbiAgY29udGV4dEZvcihkYXRhOiBEYXRhLCBpbmRleDogbnVtYmVyKTogUmVuZGVyQ29udGV4dDxEYXRhPiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGEsXG4gICAgICBpbmRleCxcbiAgICAgIGxpc3RJZDogdGhpcy5saXN0SWQsXG4gICAgICBzcGVjOiB0aGlzLnNwZWMsXG4gICAgICBob3Jpem9udGFsOiB0aGlzLmhvcml6b250YWwsXG4gICAgICBob3ZlclRyaWdnZXI6IHRoaXMuaG92ZXJUcmlnZ2VyLFxuICAgIH07XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIHVwZGF0ZVN1YnNjcmlwdGlvbigpIHtcbiAgICBpZiAodGhpcy5saXN0SWQgIT0gbnVsbCAmJiB0aGlzLnNwZWMpIHtcbiAgICAgIGlmICh0aGlzLmxpc3RTdWJzKSB7XG4gICAgICAgIHRoaXMuc3Vicy5yZW1vdmUodGhpcy5saXN0U3Vicyk7XG4gICAgICAgIHRoaXMubGlzdFN1YnMudW5zdWJzY3JpYmUoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc3BlYy5nZXRMaXN0KSB7XG4gICAgICAgIGNvbnN0IGNzJCA9IHRoaXMuc3BlYy5nZXRMaXN0KHRoaXMubGlzdElkKTtcbiAgICAgICAgdGhpcy5saXN0U3VicyA9IGNzJD8uc3Vic2NyaWJlKGwgPT4ge1xuICAgICAgICAgIGlmIChsKSB7XG4gICAgICAgICAgICB0aGlzLmNoaWxkcmVuU3ViamVjdCQubmV4dChsKTtcbiAgICAgICAgICAgIHRoaXMuY2hpbGRyZW4gPSBsO1xuICAgICAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLnN1YnMuYWRkKHRoaXMubGlzdFN1YnMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgZ2V0Q2FuRHJvcChcbiAgICBpdGVtOiBEcmFnZ2VkSXRlbTxEYXRhPixcbiAgICBtb25pdG9yOiBEcm9wVGFyZ2V0TW9uaXRvcjxEcmFnZ2VkSXRlbTxEYXRhPj4sXG4gICAgX2RlZmF1bHQgPSB0cnVlXG4gICkge1xuICAgIGlmICh0aGlzLnNwZWMuY2FuRHJvcCkge1xuICAgICAgcmV0dXJuIHRoaXMuc3BlYy5jYW5Ecm9wKGl0ZW0sIG1vbml0b3IpO1xuICAgIH1cbiAgICByZXR1cm4gX2RlZmF1bHQ7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIGNhbGxIb3ZlcihcbiAgICBpdGVtOiBEcmFnZ2VkSXRlbTxEYXRhPixcbiAgICBtb25pdG9yOiBEcm9wVGFyZ2V0TW9uaXRvcjxEcmFnZ2VkSXRlbTxEYXRhPj4sXG4gICAgbmV3SG92ZXI/OiB7IGxpc3RJZDogYW55OyBpbmRleDogbnVtYmVyIH1cbiAgKSB7XG4gICAgaWYgKG5ld0hvdmVyKSB7XG4gICAgICAvLyBtdXRhdGUgdGhlIG9iamVjdFxuICAgICAgaXRlbS5ob3ZlciA9IG5ld0hvdmVyO1xuICAgICAgLy8gYnV0IGFsc28gc2hhbGxvdyBjbG9uZSBzbyBkaXN0aW5jdCBmcm9tIHByZXZpb3VzLFxuICAgICAgLy8gdXNlZnVsIGlmIHlvdSByZWx5IG9uIHRoYXQgZm9yIG5ncnhcbiAgICAgIGl0ZW0gPSB7IC4uLml0ZW0gfTtcbiAgICB9XG4gICAgdGhpcy5zcGVjLmhvdmVyPy4oaXRlbSwgbW9uaXRvcik7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnVwZGF0ZVN1YnNjcmlwdGlvbigpO1xuICAgIHRoaXMudGFyZ2V0LnNldFR5cGVzKHRoaXMuZ2V0VGFyZ2V0VHlwZSgpKTtcbiAgfVxuXG4gIGdldFRhcmdldFR5cGUoKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5zcGVjLmFjY2VwdHMpKSB7XG4gICAgICByZXR1cm4gdGhpcy5zcGVjLmFjY2VwdHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnNwZWMuYWNjZXB0cyB8fCB0aGlzLnNwZWMudHlwZTtcbiAgICB9XG4gIH1cblxuICBhY2NlcHRzVHlwZSh0eTogc3RyaW5nIHwgc3ltYm9sIHwgbnVsbCkge1xuICAgIGlmICh0eSA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5zcGVjLmFjY2VwdHMpKSB7XG4gICAgICBjb25zdCBhcnIgPSB0aGlzLnNwZWMuYWNjZXB0cztcbiAgICAgIHJldHVybiBhcnIuaW5kZXhPZih0eSkgIT09IC0xO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhY2MgPSB0aGlzLmdldFRhcmdldFR5cGUoKTtcbiAgICAgIHJldHVybiB0eSA9PSBhY2M7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgbmdPbkNoYW5nZXMoeyBzcGVjLCBsaXN0SWQgfTogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChsaXN0SWQpIHtcbiAgICAgIHRoaXMudXBkYXRlU3Vic2NyaXB0aW9uKCk7XG4gICAgfVxuICAgIGlmIChzcGVjKSB7XG4gICAgICB0aGlzLnVwZGF0ZVN1YnNjcmlwdGlvbigpO1xuICAgIH1cbiAgICB0aGlzLnRhcmdldC5zZXRUeXBlcyh0aGlzLmdldFRhcmdldFR5cGUoKSk7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKHRoaXMuZWwpIHtcbiAgICAgIHRoaXMudGFyZ2V0LmNvbm5lY3REcm9wVGFyZ2V0KHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZG5kU29ydGFibGUgZGlyZWN0aXZlIG11c3QgaGF2ZSBFbGVtZW50UmVmJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5zdWJzLnVuc3Vic2NyaWJlKCk7XG4gIH1cbn1cbiJdfQ==