UNPKG

primeng

Version:

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![npm version](https://badge.fury.io/js/primeng.svg)](https://badge.fury.io/js/primeng) [![Discord](https://img.shields.io/discord/557940238991753

231 lines (227 loc) 7.39 kB
import { EventEmitter, Directive, ElementRef, NgZone, Input, Output, HostListener, NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { DomHandler } from 'primeng/dom'; class Draggable { constructor(el, zone) { this.el = el; this.zone = zone; this.onDragStart = new EventEmitter(); this.onDragEnd = new EventEmitter(); this.onDrag = new EventEmitter(); } get pDraggableDisabled() { return this._pDraggableDisabled; } set pDraggableDisabled(_pDraggableDisabled) { this._pDraggableDisabled = _pDraggableDisabled; if (this._pDraggableDisabled) { this.unbindMouseListeners(); } else { this.el.nativeElement.draggable = true; this.bindMouseListeners(); } } ngAfterViewInit() { if (!this.pDraggableDisabled) { this.el.nativeElement.draggable = true; this.bindMouseListeners(); } } bindDragListener() { if (!this.dragListener) { this.zone.runOutsideAngular(() => { this.dragListener = this.drag.bind(this); this.el.nativeElement.addEventListener('drag', this.dragListener); }); } } unbindDragListener() { if (this.dragListener) { this.zone.runOutsideAngular(() => { this.el.nativeElement.removeEventListener('drag', this.dragListener); this.dragListener = null; }); } } bindMouseListeners() { if (!this.mouseDownListener && !this.mouseUpListener) { this.zone.runOutsideAngular(() => { this.mouseDownListener = this.mousedown.bind(this); this.mouseUpListener = this.mouseup.bind(this); this.el.nativeElement.addEventListener('mousedown', this.mouseDownListener); this.el.nativeElement.addEventListener('mouseup', this.mouseUpListener); }); } } unbindMouseListeners() { if (this.mouseDownListener && this.mouseUpListener) { this.zone.runOutsideAngular(() => { this.el.nativeElement.removeEventListener('mousedown', this.mouseDownListener); this.el.nativeElement.removeEventListener('mouseup', this.mouseUpListener); this.mouseDownListener = null; this.mouseUpListener = null; }); } } drag(event) { this.onDrag.emit(event); } dragStart(event) { if (this.allowDrag() && !this.pDraggableDisabled) { if (this.dragEffect) { event.dataTransfer.effectAllowed = this.dragEffect; } event.dataTransfer.setData('text', this.scope); this.onDragStart.emit(event); this.bindDragListener(); } else { event.preventDefault(); } } dragEnd(event) { this.onDragEnd.emit(event); this.unbindDragListener(); } mousedown(event) { this.handle = event.target; } mouseup(event) { this.handle = null; } allowDrag() { if (this.dragHandle && this.handle) return DomHandler.matches(this.handle, this.dragHandle); else return true; } ngOnDestroy() { this.unbindDragListener(); this.unbindMouseListeners(); } } Draggable.decorators = [ { type: Directive, args: [{ selector: '[pDraggable]' },] } ]; Draggable.ctorParameters = () => [ { type: ElementRef }, { type: NgZone } ]; Draggable.propDecorators = { scope: [{ type: Input, args: ['pDraggable',] }], dragEffect: [{ type: Input }], dragHandle: [{ type: Input }], onDragStart: [{ type: Output }], onDragEnd: [{ type: Output }], onDrag: [{ type: Output }], pDraggableDisabled: [{ type: Input }], dragStart: [{ type: HostListener, args: ['dragstart', ['$event'],] }], dragEnd: [{ type: HostListener, args: ['dragend', ['$event'],] }] }; class Droppable { constructor(el, zone) { this.el = el; this.zone = zone; this.onDragEnter = new EventEmitter(); this.onDragLeave = new EventEmitter(); this.onDrop = new EventEmitter(); } ngAfterViewInit() { if (!this.pDroppableDisabled) { this.bindDragOverListener(); } } bindDragOverListener() { if (!this.dragOverListener) { this.zone.runOutsideAngular(() => { this.dragOverListener = this.dragOver.bind(this); this.el.nativeElement.addEventListener('dragover', this.dragOverListener); }); } } unbindDragOverListener() { if (this.dragOverListener) { this.zone.runOutsideAngular(() => { this.el.nativeElement.removeEventListener('dragover', this.dragOverListener); this.dragOverListener = null; }); } } dragOver(event) { event.preventDefault(); } drop(event) { if (this.allowDrop(event)) { DomHandler.removeClass(this.el.nativeElement, 'p-draggable-enter'); event.preventDefault(); this.onDrop.emit(event); } } dragEnter(event) { event.preventDefault(); if (this.dropEffect) { event.dataTransfer.dropEffect = this.dropEffect; } DomHandler.addClass(this.el.nativeElement, 'p-draggable-enter'); this.onDragEnter.emit(event); } dragLeave(event) { event.preventDefault(); DomHandler.removeClass(this.el.nativeElement, 'p-draggable-enter'); this.onDragLeave.emit(event); } allowDrop(event) { let dragScope = event.dataTransfer.getData('text'); if (typeof (this.scope) == "string" && dragScope == this.scope) { return true; } else if (this.scope instanceof Array) { for (let j = 0; j < this.scope.length; j++) { if (dragScope == this.scope[j]) { return true; } } } return false; } ngOnDestroy() { this.unbindDragOverListener(); } } Droppable.decorators = [ { type: Directive, args: [{ selector: '[pDroppable]' },] } ]; Droppable.ctorParameters = () => [ { type: ElementRef }, { type: NgZone } ]; Droppable.propDecorators = { scope: [{ type: Input, args: ['pDroppable',] }], pDroppableDisabled: [{ type: Input }], dropEffect: [{ type: Input }], onDragEnter: [{ type: Output }], onDragLeave: [{ type: Output }], onDrop: [{ type: Output }], drop: [{ type: HostListener, args: ['drop', ['$event'],] }], dragEnter: [{ type: HostListener, args: ['dragenter', ['$event'],] }], dragLeave: [{ type: HostListener, args: ['dragleave', ['$event'],] }] }; class DragDropModule { } DragDropModule.decorators = [ { type: NgModule, args: [{ imports: [CommonModule], exports: [Draggable, Droppable], declarations: [Draggable, Droppable] },] } ]; /** * Generated bundle index. Do not edit. */ export { DragDropModule, Draggable, Droppable }; //# sourceMappingURL=primeng-dragdrop.js.map