projects/rebirth-ng/src/lib/draggable/draggable.directive.ts
        
| selector | [reDraggable] | 
                    
                        Properties | 
                
                        Inputs | 
                
                        Outputs | 
                
                        HostListeners | 
                
                        
                        disabled
                     | 
                    
                         
                            Default value:   | 
                
                        
                        dragData
                     | 
                    
                             
                            Type:      | 
                
                        
                        dragEffect
                     | 
                    
                             
                            Type:     
                            Default value:   | 
                
                        
                        reDraggable
                     | 
                    
                             
                            Type:      | 
                
                        
                        onDragEnd
                     | 
                    
                        $event type:    EventEmitter<any>
                     | 
                
                        
                        onDragging
                     | 
                    
                        $event type:    EventEmitter<any>
                     | 
                
                        
                        onDragStart
                     | 
                    
                        $event type:    EventEmitter<any>
                     | 
                
| drag | 
                            Arguments : '$event' 
                         | 
                    
drag($event: )
                     | 
                
| dragend | 
                            Arguments : '$event' 
                         | 
                    
dragend($event: )
                     | 
                
| dragstart | 
                            Arguments : '$event' 
                         | 
                    
dragstart($event: )
                     | 
                
| mouseleave | 
                            Arguments : '$event' 
                         | 
                    
mouseleave(event: )
                     | 
                
| mouseover | 
                            Arguments : '$event' 
                         | 
                    
mouseover(event: )
                     | 
                
| Static DRAGGABLE_DATA_KEY | 
                        DRAGGABLE_DATA_KEY:     
                     | 
                
                            Type :     string
                         | 
                    
                            Default value : 'text'
                         | 
                    
| draggableHandle | 
                        draggableHandle:     
                     | 
                
                            Type :     DraggableHandleDirective
                         | 
                    
                            Decorators : ContentChild
                         | 
                    
| handle | 
                        handle:     
                     | 
                
                            Type :     any
                         | 
                    
import { HostListener, EventEmitter, Output, Input, Directive, ContentChild, ElementRef } from '@angular/core';
@Directive({
  selector: '[reDraggableHandle]'
})
export class DraggableHandleDirective {
  constructor(public elementRef: ElementRef) {
  }
}
@Directive({
  selector: '[reDraggable]',
  host: {
    '[draggable]': '!disabled'
  }
})
export class DraggableDirective {
  static DRAGGABLE_DATA_KEY = 'text';
  @Input() disabled = false;
  @Input('reDraggable') group: string;
  @Input() dragData: any;
  // https://developer.mozilla.org/zh-CN/docs/Web/API/DataTransfer/effectAllowed
  @Input() dragEffect: 'none' | 'copy' | 'copyLink' | 'copyMove' | 'link' | 'linkMove' | 'move'
    | 'all' | 'uninitialized' = 'copy';
  @Output() onDragStart: EventEmitter<any> = new EventEmitter();
  @Output() onDragEnd: EventEmitter<any> = new EventEmitter();
  @Output() onDragging: EventEmitter<any> = new EventEmitter();
  handle: any;
  @ContentChild(DraggableHandleDirective) draggableHandle: DraggableHandleDirective;
  @HostListener('dragstart', ['$event'])
  dragStart($event) {
    if (!this.draggableHandle || this.draggableHandle.elementRef.nativeElement === this.handle) {
      $event.stopPropagation();
      $event.dataTransfer.effectAllowed = this.dragEffect;
      $event.dataTransfer.setData(DraggableDirective.DRAGGABLE_DATA_KEY, JSON.stringify({
        group: this.group,
        data: this.dragData
      }));
      this.onDragStart.emit($event);
      return;
    }
    $event.preventDefault();
  }
  @HostListener('drag', ['$event'])
  drag($event) {
    this.onDragging.emit($event);
  }
  @HostListener('dragend', ['$event'])
  dragEnd($event) {
    this.onDragEnd.emit($event);
  }
  @HostListener('mouseover', ['$event'])
  mouseover(event) {
    this.handle = event.target;
  }
  @HostListener('mouseleave', ['$event'])
  mouseleave(event) {
    this.handle = null;
  }
}