Headless CMS and Content Managment Hub
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

79 lines
1.8 KiB

/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Sebastian Stehle. All rights reserved
*/
import { Directive, EventEmitter, HostListener, Output } from '@angular/core';
@Directive({
selector: '[sqxFileDrop]'
})
export class FileDropDirective {
@Output('sqxFileDrop')
public drop = new EventEmitter<File[]>();
@HostListener('dragenter', ['$event'])
public onDragEnter(event: DragDropEvent) {
this.tryStopEvent(event);
}
@HostListener('dragover', ['$event'])
public onDragOver(event: DragDropEvent) {
this.tryStopEvent(event);
}
@HostListener('drop', ['$event'])
public onDrop(event: DragDropEvent) {
const files: File[] = [];
// tslint:disable-next-line:prefer-for-of
for (let i = 0; i < event.dataTransfer.files.length; i++) {
const file = event.dataTransfer.files[i];
files.push(file);
}
this.drop.emit(files);
this.stopEvent(event);
}
private stopEvent(event: Event) {
event.preventDefault();
event.stopPropagation();
}
private tryStopEvent(event: DragDropEvent) {
const hasFiles = this.hasFiles(event.dataTransfer.types);
if (!hasFiles) {
return;
}
this.stopEvent(event);
}
private hasFiles(types: any): boolean {
if (!types) {
return false;
}
if (isFunction(types.indexOf)) {
return types.indexOf('Files') !== -1;
} else if (isFunction(types.contains)) {
return types.contains('Files');
} else {
return false;
}
}
}
function isFunction(obj: any): boolean {
return !!(obj && obj.constructor && obj.call && obj.apply);
};
interface DragDropEvent extends MouseEvent {
readonly dataTransfer: DataTransfer;
}