projects/rebirth-ng/src/lib/draggable/droppable.directive.ts
selector | [reDroppable] |
Methods |
|
Inputs |
Outputs |
HostListeners |
acceptDrop
|
Type: |
dropEffect
|
Type:
Default value: |
reDroppable
|
Type: |
onDragEnter
|
$event type: EventEmitter<any>
|
onDragLeave
|
$event type: EventEmitter<any>
|
onDragOver
|
$event type: EventEmitter<any>
|
onDrop
|
$event type: EventEmitter<any>
|
dragenter |
Arguments : '$event'
|
dragenter($event: )
|
dragleave |
Arguments : '$event'
|
dragleave($event: )
|
dragover |
Arguments : '$event'
|
dragover($event: )
|
drop |
Arguments : '$event'
|
drop($event: )
|
Private isDropGroup | ||||
isDropGroup($event: )
|
||||
Parameters :
Returns :
boolean
|
Private startDrop | ||||
startDrop($event: )
|
||||
Parameters :
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);
}
}