File

projects/rebirth-ng/src/lib/draggable/droppable.directive.ts

Metadata

selector [reDroppable]

Index

Methods
Inputs
Outputs
HostListeners

Inputs

acceptDrop

Type: function

dropEffect

Type: "copy" | "move" | "link" | "none"

Default value: 'move'

reDroppable

Type: string

Outputs

onDragEnter $event type: EventEmitter<any>
onDragLeave $event type: EventEmitter<any>
onDragOver $event type: EventEmitter<any>
onDrop $event type: EventEmitter<any>

HostListeners

dragenter
Arguments : '$event'
dragenter($event: )
dragleave
Arguments : '$event'
dragleave($event: )
dragover
Arguments : '$event'
dragover($event: )
drop
Arguments : '$event'
drop($event: )

Methods

Private isDropGroup
isDropGroup($event: )
Parameters :
Name Optional
$event no
Returns : boolean
Private startDrop
startDrop($event: )
Parameters :
Name Optional
$event no
Returns : void
import { HostListener, EventEmitter, Output, Input, Directive } from '@angular/core';
import { DraggableDirective } from './draggable.directive';

@Directive({
  selector: '[reDroppable]',
})
export class DroppableDirective {

  @Input('reDroppable') group: string;
  @Input() acceptDrop: ($event) => boolean;

  // https://developer.mozilla.org/zh-CN/docs/Web/API/DataTransfer/dropEffect
  @Input() dropEffect: 'copy' | 'move' | 'link' | 'none' = 'move';

  @Output() onDragEnter: EventEmitter<any> = new EventEmitter();

  @Output() onDragLeave: EventEmitter<any> = new EventEmitter();

  @Output() onDrop: EventEmitter<any> = new EventEmitter();

  @Output() onDragOver: EventEmitter<any> = new EventEmitter();


  @HostListener('drop', ['$event'])
  drop($event) {
    if ((!this.group || this.isDropGroup($event)) && (!this.acceptDrop || this.acceptDrop($event))) {
      this.startDrop($event);
    }
  }

  @HostListener('dragenter', ['$event'])
  dragEnter($event) {
    $event.preventDefault();
    if (this.dropEffect) {
      $event.dataTransfer.dropEffect = this.dropEffect;
    }

    this.onDragEnter.emit($event);
  }

  @HostListener('dragleave', ['$event'])
  dragLeave($event) {
    $event.preventDefault();
    this.onDragLeave.emit($event);
  }

  @HostListener('dragover', ['$event'])
  dragOver($event) {
    $event.preventDefault();
    this.onDragOver.emit($event);
  }

  private isDropGroup($event): boolean {
    const contextData = $event.dataTransfer.getData(DraggableDirective.DRAGGABLE_DATA_KEY);
    if (contextData) {
      const draggableData = JSON.parse(contextData);
      return this.group === draggableData.group;
    }
  }

  private startDrop($event) {
    $event.preventDefault();
    $event.stopPropagation();
    this.onDrop.emit($event);
  }
}

results matching ""

    No results matching ""