src/directives/dropzone.directive.ts
Transforms a node into a drag and drop zone.
selector | [ngxDragAndDrop] |
ngxDragAndDrop
|
constructor(el: any, renderer: Renderer2, injector: Injector, logger: NgxUploadLogger, dropOptions: DropTargetOptions, strategy: UploadService, ngForm: NgForm, formGroupDirective: FormGroupDirective)
|
onDragLeave |
onDragLeave(event: DragEvent)
|
Returns:
void
|
dropEvent |
dropEvent(event: Event)
|
Returns:
void
|
onDragOver |
onDragOver(event: DragEvent)
|
Returns:
void
|
uploader |
uploader: |
import {
Directive,
ElementRef,
EventEmitter,
HostListener,
Input,
OnInit,
Output,
Renderer2,
Inject, Injector, Optional
} from '@angular/core';
import { FormGroup, FormGroupDirective, NgForm } from '@angular/forms';
import {
DropTargetOptions, NGX_DROP_TARGET_OPTIONS, NGX_UPLOAD_STRATEGY, UploadService
} from '../utils/configuration.model';
import { NgxUploadLogger } from '../utils/logger.model';
import { AbstractUploadService } from '../services/abstractUpload.service';
/**
* Transforms a node into a drag and drop zone.
*/
@Directive({
selector: '[ngxDragAndDrop]',
exportAs: 'ngxDragAndDrop'
})
export class NgxDragAndDropDirective implements OnInit {
uploader: AbstractUploadService;
@Input()
set ngxDragAndDrop(dropOptions: DropTargetOptions) {
if (dropOptions) {
this.logger.debug(JSON.stringify(dropOptions));
this.dropOptions = dropOptions;
}
}
private formGroup: FormGroup | null;
constructor(private el: ElementRef,
private renderer: Renderer2,
private injector: Injector,
private logger: NgxUploadLogger,
@Inject(NGX_DROP_TARGET_OPTIONS) private dropOptions: DropTargetOptions,
@Inject(NGX_UPLOAD_STRATEGY) private strategy: UploadService,
@Optional() private ngForm: NgForm, @Optional() private formGroupDirective: FormGroupDirective) {
if (this.ngForm) {
this.formGroup = ngForm.form;
} else if (this.formGroupDirective) {
this.formGroup = formGroupDirective.form;
} else {
this.formGroup = null;
}
}
ngOnInit(): void {
this.renderer.addClass(this.el.nativeElement, this.dropOptions.color);
this.logger.info('strategy : ' + this.strategy!.toString());
this.uploader = this.injector.get(this.strategy);
}
@HostListener('dragleave', ['$event']) onDragLeave(event: DragEvent) {
this.logger.debug('dragleave event');
this.renderer.removeClass(this.el.nativeElement, this.dropOptions.colorDrag);
this.renderer.removeClass(this.el.nativeElement, this.dropOptions.colorDrop);
this.renderer.addClass(this.el.nativeElement, this.dropOptions.color);
this.stopAndPrevent(event);
}
@HostListener('drop', ['$event']) dropEvent(event: Event) {
this.logger.debug('drop event');
this.renderer.removeClass(this.el.nativeElement, this.dropOptions.color);
this.renderer.removeClass(this.el.nativeElement, this.dropOptions.colorDrag);
this.renderer.addClass(this.el.nativeElement, this.dropOptions.colorDrop);
const transfer = this.getTransfer(event);
if (!transfer) {
return;
}
transfer.dropEffect = 'copy';
this.stopAndPrevent(event);
this.uploader.addToQueue(transfer.files, this.formGroup, this.dropOptions);
}
@HostListener('dragover', ['$event'])
onDragOver(event: DragEvent) {
this.logger.debug('dragover event');
this.renderer.removeClass(this.el.nativeElement, this.dropOptions.color);
this.renderer.removeClass(this.el.nativeElement, this.dropOptions.colorDrop);
this.renderer.addClass(this.el.nativeElement, this.dropOptions.colorDrag);
const transfer = this.getTransfer(event);
if (!this.haveFiles(transfer.types)) {
return;
}
this.stopAndPrevent(event);
}
private stopAndPrevent(event: Event): void {
event.stopPropagation();
event.preventDefault();
}
private getTransfer(event): DataTransfer {
return event.dataTransfer ? event.dataTransfer : event.originalEvent.dataTransfer;
}
private haveFiles(types: any): boolean {
if (!types) {
return false;
}
if (types.indexOf) {
return types.indexOf('Files') !== -1;
} else if (types.contains) {
return types.contains('Files');
} else {
return false;
}
}
}