Files
ng2-file-upload/libs/ng2-file-upload/file-upload/file-drop.directive.ts
SvetlanaMuravlova be27edbe13 chore(bump): updated versions (#1177)
* feat(upgrade): updated up to angular 11 tests are failed

* chore(bump): updated versions

* chore(bump): updated package

* fix(style): delete extra rule

* disabled ivy build, added prod config, changed demo serve script

* feat(bump): added strict mode, doesn't build in dist, should be resolved

* feat(core): added nx

* feat(core): updated dependencies list

* feat(github actions): check gh actions

* feat(gh actions): try gh actions

* feat(gh actions): try gh actions

* feat(gh actions): try gh actions

* feat(gh actions): try gh actions

* feat(gh actions): try gh actions

* feat(github actions): delete codecov

* feat(firebase): try firebase actions

* feat(firebase): try firebase actions

* feat(firebase): try firebase actions

* feat(firebase): try firebase actions

* feat(firebase): try firebase actions

* feat(strict): added strict mode

* feat(github actions): updated yml file

* fix(lint): fixed linting errors

* fix(lint): fixed linting errors

* fix(lint): fixed lint errors

* Delete hosting.ZGlzdC9hcHBzL2RlbW8.cache

* feat(github actions): added publish action

* fix(firebase): test extra folder https

Co-authored-by: Mishchenko Dmitriy <ripatrip@gmail.com>
Co-authored-by: Dmitriy Shekhovtsov <valorkin@gmail.com>
2021-09-03 13:44:45 +03:00

90 lines
2.2 KiB
TypeScript

import { Directive, EventEmitter, ElementRef, HostListener, Input, Output } from '@angular/core';
import { FileUploader, FileUploaderOptions } from './file-uploader.class';
@Directive({ selector: '[ng2FileDrop]' })
export class FileDropDirective {
@Input() uploader?: FileUploader;
@Output() fileOver: EventEmitter<any> = new EventEmitter();
// eslint-disable-next-line @angular-eslint/no-output-on-prefix
@Output() onFileDrop: EventEmitter<File[]> = new EventEmitter<File[]>();
protected element: ElementRef;
constructor(element: ElementRef) {
this.element = element;
}
getOptions(): FileUploaderOptions | void {
return this.uploader?.options;
}
getFilters(): string {
return '';
}
@HostListener('drop', [ '$event' ])
onDrop(event: MouseEvent): void {
const transfer = this._getTransfer(event);
if (!transfer) {
return;
}
const options = this.getOptions();
const filters = this.getFilters();
this._preventAndStop(event);
if (options) {
this.uploader?.addToQueue(transfer.files, options, filters);
}
this.fileOver.emit(false);
this.onFileDrop.emit(transfer.files);
}
@HostListener('dragover', [ '$event' ])
onDragOver(event: MouseEvent): void {
const transfer = this._getTransfer(event);
if (!this._haveFiles(transfer.types)) {
return;
}
transfer.dropEffect = 'copy';
this._preventAndStop(event);
this.fileOver.emit(true);
}
@HostListener('dragleave', [ '$event' ])
onDragLeave(event: MouseEvent): void {
if ((this as any).element) {
if (event.currentTarget === (this as any).element[ 0 ]) {
return;
}
}
this._preventAndStop(event);
this.fileOver.emit(false);
}
protected _getTransfer(event: any): any {
return event.dataTransfer ? event.dataTransfer : event.originalEvent.dataTransfer; // jQuery fix;
}
protected _preventAndStop(event: MouseEvent): void {
event.preventDefault();
event.stopPropagation();
}
protected _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;
}
}
}