ng2-tree
Version:
angular2 component for visualizing data that can be naturally represented as a tree
118 lines • 16.8 kB
JavaScript
import { Directive, ElementRef, Inject, Input, Renderer2 } from '@angular/core';
import { NodeDraggableService } from './node-draggable.service';
import { CapturedNode } from './captured-node';
import * as i0 from "@angular/core";
import * as i1 from "./node-draggable.service";
export class NodeDraggableDirective {
element;
nodeDraggableService;
renderer;
static DATA_TRANSFER_STUB_DATA = 'some browsers enable drag-n-drop only when dataTransfer has data';
nodeDraggable;
tree;
nodeNativeElement;
disposersForDragListeners = [];
constructor(element, nodeDraggableService, renderer) {
this.element = element;
this.nodeDraggableService = nodeDraggableService;
this.renderer = renderer;
this.nodeNativeElement = element.nativeElement;
}
ngOnInit() {
if (!this.tree.isStatic()) {
this.renderer.setAttribute(this.nodeNativeElement, 'draggable', 'true');
this.disposersForDragListeners.push(this.renderer.listen(this.nodeNativeElement, 'dragenter', this.handleDragEnter.bind(this)));
this.disposersForDragListeners.push(this.renderer.listen(this.nodeNativeElement, 'dragover', this.handleDragOver.bind(this)));
this.disposersForDragListeners.push(this.renderer.listen(this.nodeNativeElement, 'dragstart', this.handleDragStart.bind(this)));
this.disposersForDragListeners.push(this.renderer.listen(this.nodeNativeElement, 'dragleave', this.handleDragLeave.bind(this)));
this.disposersForDragListeners.push(this.renderer.listen(this.nodeNativeElement, 'drop', this.handleDrop.bind(this)));
this.disposersForDragListeners.push(this.renderer.listen(this.nodeNativeElement, 'dragend', this.handleDragEnd.bind(this)));
}
}
ngOnDestroy() {
/* tslint:disable:typedef */
this.disposersForDragListeners.forEach(dispose => dispose());
/* tslint:enable:typedef */
}
handleDragStart(e) {
if (e.stopPropagation) {
e.stopPropagation();
}
this.nodeDraggableService.captureNode(new CapturedNode(this.nodeDraggable, this.tree));
e.dataTransfer.setData('text', NodeDraggableDirective.DATA_TRANSFER_STUB_DATA);
e.dataTransfer.effectAllowed = 'move';
}
handleDragOver(e) {
e.preventDefault();
e.dataTransfer.dropEffect = 'move';
}
handleDragEnter(e) {
e.preventDefault();
if (this.containsElementAt(e)) {
this.addClass('over-drop-target');
}
}
handleDragLeave(e) {
if (!this.containsElementAt(e)) {
this.removeClass('over-drop-target');
}
}
handleDrop(e) {
e.preventDefault();
if (e.stopPropagation) {
e.stopPropagation();
}
this.removeClass('over-drop-target');
if (!this.isDropPossible(e)) {
return false;
}
if (this.nodeDraggableService.getCapturedNode()) {
return this.notifyThatNodeWasDropped();
}
}
isDropPossible(e) {
const capturedNode = this.nodeDraggableService.getCapturedNode();
return capturedNode && capturedNode.canBeDroppedAt(this.nodeDraggable) && this.containsElementAt(e);
}
handleDragEnd(e) {
this.removeClass('over-drop-target');
this.nodeDraggableService.releaseCapturedNode();
}
containsElementAt(e) {
const { x = e.clientX, y = e.clientY } = e;
return this.nodeNativeElement.contains(document.elementFromPoint(x, y));
}
addClass(className) {
const classList = this.nodeNativeElement.classList;
classList.add(className);
}
removeClass(className) {
const classList = this.nodeNativeElement.classList;
classList.remove(className);
}
notifyThatNodeWasDropped() {
this.nodeDraggableService.fireNodeDragged(this.nodeDraggableService.getCapturedNode(), this.nodeDraggable);
}
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NodeDraggableDirective, deps: [{ token: ElementRef }, { token: NodeDraggableService }, { token: Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: NodeDraggableDirective, selector: "[nodeDraggable]", inputs: { nodeDraggable: "nodeDraggable", tree: "tree" }, ngImport: i0 });
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NodeDraggableDirective, decorators: [{
type: Directive,
args: [{
selector: '[nodeDraggable]'
}]
}], ctorParameters: function () { return [{ type: i0.ElementRef, decorators: [{
type: Inject,
args: [ElementRef]
}] }, { type: i1.NodeDraggableService, decorators: [{
type: Inject,
args: [NodeDraggableService]
}] }, { type: i0.Renderer2, decorators: [{
type: Inject,
args: [Renderer2]
}] }]; }, propDecorators: { nodeDraggable: [{
type: Input
}], tree: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1kcmFnZ2FibGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2RyYWdnYWJsZS9ub2RlLWRyYWdnYWJsZS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBcUIsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25HLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7O0FBTS9DLE1BQU0sT0FBTyxzQkFBc0I7SUFXSjtJQUNXO0lBQ1g7SUFadEIsTUFBTSxDQUFDLHVCQUF1QixHQUFHLGtFQUFrRSxDQUFDO0lBRTNGLGFBQWEsQ0FBYTtJQUUxQixJQUFJLENBQU87SUFFbkIsaUJBQWlCLENBQWM7SUFDL0IseUJBQXlCLEdBQW1CLEVBQUUsQ0FBQztJQUV2RCxZQUM2QixPQUFtQixFQUNSLG9CQUEwQyxFQUNyRCxRQUFtQjtRQUZuQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ1IseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQUNyRCxhQUFRLEdBQVIsUUFBUSxDQUFXO1FBRTlDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxPQUFPLENBQUMsYUFBYSxDQUFDO0lBQ2pELENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDekIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN4RSxJQUFJLENBQUMseUJBQXlCLENBQUMsSUFBSSxDQUNqQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVB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Q0FBQztJQUVPLFdBQVcsQ0FBQyxTQUFpQjtRQUNuQyxNQUFNLFNBQVMsR0FBaUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQztRQUNqRSxTQUFTLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTyx3QkFBd0I7UUFDOUIsSUFBSSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZSxFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzdHLENBQUM7d0dBekhVLHNCQUFzQixrQkFXdkIsVUFBVSxhQUNWLG9CQUFvQixhQUNwQixTQUFTOzRGQWJSLHNCQUFzQjs7NEZBQXRCLHNCQUFzQjtrQkFIbEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsaUJBQWlCO2lCQUM1Qjs7MEJBWUksTUFBTTsyQkFBQyxVQUFVOzswQkFDakIsTUFBTTsyQkFBQyxvQkFBb0I7OzBCQUMzQixNQUFNOzJCQUFDLFNBQVM7NENBVkgsYUFBYTtzQkFBNUIsS0FBSztnQkFFVSxJQUFJO3NCQUFuQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBJbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgUmVuZGVyZXIyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOb2RlRHJhZ2dhYmxlU2VydmljZSB9IGZyb20gJy4vbm9kZS1kcmFnZ2FibGUuc2VydmljZSc7XG5pbXBvcnQgeyBDYXB0dXJlZE5vZGUgfSBmcm9tICcuL2NhcHR1cmVkLW5vZGUnO1xuaW1wb3J0IHsgVHJlZSB9IGZyb20gJy4uL3RyZWUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbm9kZURyYWdnYWJsZV0nXG59KVxuZXhwb3J0IGNsYXNzIE5vZGVEcmFnZ2FibGVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkRlc3Ryb3ksIE9uSW5pdCB7XG4gIHB1YmxpYyBzdGF0aWMgREFUQV9UUkFOU0ZFUl9TVFVCX0RBVEEgPSAnc29tZSBicm93c2VycyBlbmFibGUgZHJhZy1uLWRyb3Agb25seSB3aGVuIGRhdGFUcmFuc2ZlciBoYXMgZGF0YSc7XG5cbiAgQElucHV0KCkgcHVibGljIG5vZGVEcmFnZ2FibGU6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KCkgcHVibGljIHRyZWU6IFRyZWU7XG5cbiAgcHJpdmF0ZSBub2RlTmF0aXZlRWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gIHByaXZhdGUgZGlzcG9zZXJzRm9yRHJhZ0xpc3RlbmVyczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChFbGVtZW50UmVmKSBwdWJsaWMgZWxlbWVudDogRWxlbWVudFJlZixcbiAgICBASW5qZWN0KE5vZGVEcmFnZ2FibGVTZXJ2aWNlKSBwcml2YXRlIG5vZGVEcmFnZ2FibGVTZXJ2aWNlOiBOb2RlRHJhZ2dhYmxlU2VydmljZSxcbiAgICBASW5qZWN0KFJlbmRlcmVyMikgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyXG4gICkge1xuICAgIHRoaXMubm9kZU5hdGl2ZUVsZW1lbnQgPSBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRyZWUuaXNTdGF0aWMoKSkge1xuICAgICAgdGhpcy5yZW5kZXJlci5zZXRBdHRyaWJ1dGUodGhpcy5ub2RlTmF0aXZlRWxlbWVudCwgJ2RyYWdnYWJsZScsICd0cnVlJyk7XG4gICAgICB0aGlzLmRpc3Bvc2Vyc0ZvckRyYWdMaXN0ZW5lcnMucHVzaChcbiAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5ub2RlTmF0aXZlRWxlbWVudCwgJ2RyYWdlbnRlcicsIHRoaXMuaGFuZGxlRHJhZ0VudGVyLmJpbmQodGhpcykpXG4gICAgICApO1xuICAgICAgdGhpcy5kaXNwb3NlcnNGb3JEcmFnTGlzdGVuZXJzLnB1c2goXG4gICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMubm9kZU5hdGl2ZUVsZW1lbnQsICdkcmFnb3ZlcicsIHRoaXMuaGFuZGxlRHJhZ092ZXIuYmluZCh0aGlzKSlcbiAgICAgICk7XG4gICAgICB0aGlzLmRpc3Bvc2Vyc0ZvckRyYWdMaXN0ZW5lcnMucHVzaChcbiAgICAgICAgdGhpcy5yZW5kZXJlci5saXN0ZW4odGhpcy5ub2RlTmF0aXZlRWxlbWVudCwgJ2RyYWdzdGFydCcsIHRoaXMuaGFuZGxlRHJhZ1N0YXJ0LmJpbmQodGhpcykpXG4gICAgICApO1xuICAgICAgdGhpcy5kaXNwb3NlcnNGb3JEcmFnTGlzdGVuZXJzLnB1c2goXG4gICAgICAgIHRoaXMucmVuZGVyZXIubGlzdGVuKHRoaXMubm9kZU5hdGl2ZUVsZW1lbnQsICdkcmFnbGVhdmUnLCB0aGlzLmhhbmRsZURyYWdMZWF2ZS5iaW5kKHRoaXMpKVxuICAgICAgKTtcbiAgICAgIHRoaXMuZGlzcG9zZXJzRm9yRHJhZ0xpc3RlbmVycy5wdXNoKFxuICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLm5vZGVOYXRpdmVFbGVtZW50LCAnZHJvcCcsIHRoaXMuaGFuZGxlRHJvcC5iaW5kKHRoaXMpKVxuICAgICAgKTtcbiAgICAgIHRoaXMuZGlzcG9zZXJzRm9yRHJhZ0xpc3RlbmVycy5wdXNoKFxuICAgICAgICB0aGlzLnJlbmRlcmVyLmxpc3Rlbih0aGlzLm5vZGVOYXRpdmVFbGVtZW50LCAnZHJhZ2VuZCcsIHRoaXMuaGFuZGxlRHJhZ0VuZC5iaW5kKHRoaXMpKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgLyogdHNsaW50OmRpc2FibGU6dHlwZWRlZiAqL1xuICAgIHRoaXMuZGlzcG9zZXJzRm9yRHJhZ0xpc3RlbmVycy5mb3JFYWNoKGRpc3Bvc2UgPT4gZGlzcG9zZSgpKTtcbiAgICAvKiB0c2xpbnQ6ZW5hYmxlOnR5cGVkZWYgKi9cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRHJhZ1N0YXJ0KGU6IERyYWdFdmVudCk6IGFueSB7XG4gICAgaWYgKGUuc3RvcFByb3BhZ2F0aW9uKSB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH1cblxuICAgIHRoaXMubm9kZURyYWdnYWJsZVNlcnZpY2UuY2FwdHVyZU5vZGUobmV3IENhcHR1cmVkTm9kZSh0aGlzLm5vZGVEcmFnZ2FibGUsIHRoaXMudHJlZSkpO1xuXG4gICAgZS5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dCcsIE5vZGVEcmFnZ2FibGVEaXJlY3RpdmUuREFUQV9UUkFOU0ZFUl9TVFVCX0RBVEEpO1xuICAgIGUuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQgPSAnbW92ZSc7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURyYWdPdmVyKGU6IERyYWdFdmVudCk6IGFueSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3QgPSAnbW92ZSc7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZURyYWdFbnRlcihlOiBEcmFnRXZlbnQpOiBhbnkge1xuICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICBpZiAodGhpcy5jb250YWluc0VsZW1lbnRBdChlKSkge1xuICAgICAgdGhpcy5hZGRDbGFzcygnb3Zlci1kcm9wLXRhcmdldCcpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRHJhZ0xlYXZlKGU6IERyYWdFdmVudCk6IGFueSB7XG4gICAgaWYgKCF0aGlzLmNvbnRhaW5zRWxlbWVudEF0KGUpKSB7XG4gICAgICB0aGlzLnJlbW92ZUNsYXNzKCdvdmVyLWRyb3AtdGFyZ2V0Jyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVEcm9wKGU6IERyYWdFdmVudCk6IGFueSB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGlmIChlLnN0b3BQcm9wYWdhdGlvbikge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbW92ZUNsYXNzKCdvdmVyLWRyb3AtdGFyZ2V0Jyk7XG5cbiAgICBpZiAoIXRoaXMuaXNEcm9wUG9zc2libGUoZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5ub2RlRHJhZ2dhYmxlU2VydmljZS5nZXRDYXB0dXJlZE5vZGUoKSkge1xuICAgICAgcmV0dXJuIHRoaXMubm90aWZ5VGhhdE5vZGVXYXNEcm9wcGVkKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpc0Ryb3BQb3NzaWJsZShlOiBEcmFnRXZlbnQpOiBib29sZWFuIHtcbiAgICBjb25zdCBjYXB0dXJlZE5vZGUgPSB0aGlzLm5vZGVEcmFnZ2FibGVTZXJ2aWNlLmdldENhcHR1cmVkTm9kZSgpO1xuICAgIHJldHVybiBjYXB0dXJlZE5vZGUgJiYgY2FwdHVyZWROb2RlLmNhbkJlRHJvcHBlZEF0KHRoaXMubm9kZURyYWdnYWJsZSkgJiYgdGhpcy5jb250YWluc0VsZW1lbnRBdChlKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRHJhZ0VuZChlOiBEcmFnRXZlbnQpOiBhbnkge1xuICAgIHRoaXMucmVtb3ZlQ2xhc3MoJ292ZXItZHJvcC10YXJnZXQnKTtcbiAgICB0aGlzLm5vZGVEcmFnZ2FibGVTZXJ2aWNlLnJlbGVhc2VDYXB0dXJlZE5vZGUoKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udGFpbnNFbGVtZW50QXQoZTogRHJhZ0V2ZW50KTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyB4ID0gZS5jbGllbnRYLCB5ID0gZS5jbGllbnRZIH0gPSBlO1xuICAgIHJldHVybiB0aGlzLm5vZGVOYXRpdmVFbGVtZW50LmNvbnRhaW5zKGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDbGFzcyhjbGFzc05hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNsYXNzTGlzdDogRE9NVG9rZW5MaXN0ID0gdGhpcy5ub2RlTmF0aXZlRWxlbWVudC5jbGFzc0xpc3Q7XG4gICAgY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVDbGFzcyhjbGFzc05hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGNsYXNzTGlzdDogRE9NVG9rZW5MaXN0ID0gdGhpcy5ub2RlTmF0aXZlRWxlbWVudC5jbGFzc0xpc3Q7XG4gICAgY2xhc3NMaXN0LnJlbW92ZShjbGFzc05hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlUaGF0Tm9kZVdhc0Ryb3BwZWQoKTogdm9pZCB7XG4gICAgdGhpcy5ub2RlRHJhZ2dhYmxlU2VydmljZS5maXJlTm9kZURyYWdnZWQodGhpcy5ub2RlRHJhZ2dhYmxlU2VydmljZS5nZXRDYXB0dXJlZE5vZGUoKSwgdGhpcy5ub2RlRHJhZ2dhYmxlKTtcbiAgfVxufVxuIl19