Browse Source

Improved feedback for non-image files.

pull/414/head
Sebastian Stehle 6 years ago
parent
commit
f8a08a2d16
  1. 5
      src/Squidex/app/features/settings/pages/more/more-page.component.html
  2. 118
      src/Squidex/app/framework/angular/forms/file-drop.directive.ts

5
src/Squidex/app/features/settings/pages/more/more-page.component.html

@ -47,10 +47,9 @@
<div class="card-body">
<div class="row">
<div class="col-auto">
<div class="app-image"
<div class="app-image" noDrop="true" onlyImages="true"
(sqxDropFile)="uploadImage($event)"
[sqxDropDisabled]="uploading || !isImageEditable"
[noDrop]="true">
[sqxDropDisabled]="uploading || !isImageEditable">
<div class="app-progress" *ngIf="uploading; else notUploading">
<sqx-progress-bar mode="Circle" [value]="uploadProgress"></sqx-progress-bar>
</div>

118
src/Squidex/app/framework/angular/forms/file-drop.directive.ts

@ -51,20 +51,10 @@ export class FileDropDirective {
return;
}
const result: File[] = [];
const files = this.getAllowedFiles(event.clipboardData);
if (event.clipboardData) {
for (let i = 0; i < event.clipboardData.items.length; i++) {
const file = event.clipboardData.items[i].getAsFile();
if (this.isAllowedFile(file)) {
result.push(file!);
}
}
}
if (result.length > 0 && !this.disabled) {
this.drop.emit(result);
if (files && !this.disabled) {
this.drop.emit(files);
}
this.stopEvent(event);
@ -73,48 +63,38 @@ export class FileDropDirective {
@HostListener('dragend', ['$event'])
@HostListener('dragleave', ['$event'])
public onDragEnd(event: DragDropEvent) {
const hasFiles = this.hasFiles(event.dataTransfer.types);
const hasFile = this.hasAllowedFile(event.dataTransfer);
if (hasFiles) {
if (hasFile) {
this.dragEnd();
}
}
@HostListener('dragenter', ['$event'])
public onDragEnter(event: DragDropEvent) {
const hasFiles = this.hasFiles(event.dataTransfer.types);
const hasFile = this.hasAllowedFile(event.dataTransfer);
if (hasFiles) {
if (hasFile) {
this.dragStart();
}
}
@HostListener('dragover', ['$event'])
public onDragOver(event: DragDropEvent) {
const hasFiles = this.hasFiles(event.dataTransfer.types);
const isFiles = hasFiles(event.dataTransfer);
if (hasFiles) {
if (isFiles) {
this.stopEvent(event);
}
}
@HostListener('drop', ['$event'])
public onDrop(event: DragDropEvent) {
const hasFiles = this.hasFiles(event.dataTransfer.types);
if (hasFiles) {
const result: File[] = [];
if (hasFiles(event.dataTransfer)) {
const files = this.getAllowedFiles(event.dataTransfer);
for (let i = 0; i < event.dataTransfer.files.length; i++) {
const file = event.dataTransfer.files.item(i);
if (this.isAllowedFile(file)) {
result.push(file!);
}
}
if (result.length > 0) {
this.drop.emit(result);
if (files && !this.disabled) {
this.drop.emit(files);
}
this.dragEnd(0);
@ -143,15 +123,78 @@ export class FileDropDirective {
}
}
private isAllowedFile(file: File | null) {
return file && (!this.allowedFiles || this.allowedFiles.indexOf(file.type) >= 0) && (!this.onlyImages || ImageTypes.indexOf(file.type) >= 0);
private getAllowedFiles(dataTransfer: DataTransfer | null) {
if (!dataTransfer || !hasFiles(dataTransfer)) {
return null;
}
let files: File[] = [];
for (let i = 0; i < dataTransfer.files.length; i++) {
const file = dataTransfer.files.item(i);
if (file && this.isAllowedFile(file)) {
files.push(file);
}
}
if (files.length === 0) {
for (let i = 0; i < dataTransfer.items.length; i++) {
const file = dataTransfer.items[i].getAsFile();
if (file && this.isAllowedFile(file)) {
files.push(file);
}
}
}
return files.length > 0 ? files : null;
}
private hasFiles(types: any): boolean {
if (!types) {
private hasAllowedFile(dataTransfer: DataTransfer | null) {
if (!dataTransfer || !hasFiles(dataTransfer)) {
return null;
}
for (let i = 0; i < dataTransfer.files.length; i++) {
const file = dataTransfer.files.item(i);
if (file && this.isAllowedFile(file)) {
return true;
}
}
for (let i = 0; i < dataTransfer.items.length; i++) {
const file = dataTransfer.items[i];
if (file && this.isAllowedFile(file)) {
return true;
}
}
return false;
}
private isAllowedFile(file: { type: string }) {
return this.isAllowed(file) && this.isImage(file);
}
private isAllowed(file: { type: string }) {
return !this.allowedFiles || this.allowedFiles.indexOf(file.type) >= 0;
}
private isImage(file: { type: string }) {
return !this.onlyImages || ImageTypes.indexOf(file.type) >= 0;
}
}
function hasFiles(dataTransfer: DataTransfer): boolean {
if (!dataTransfer || !dataTransfer.types) {
return false;
}
const types: any = dataTransfer.types;
if (Types.isFunction(types.indexOf)) {
return types.indexOf('Files') !== -1;
} else if (Types.isFunction(types.contains)) {
@ -160,7 +203,6 @@ export class FileDropDirective {
return false;
}
}
}
interface DragDropEvent extends MouseEvent {
readonly dataTransfer: DataTransfer;

Loading…
Cancel
Save