@nghacks/uploader
Version:
Image and file uploader for angular
153 lines • 15.8 kB
JavaScript
import { __awaiter } from "tslib";
import { Input, Output, EventEmitter, Component, HostListener } from '@angular/core';
import { FormControl } from '@angular/forms';
import { UploaderService } from '../../services/uploader.service';
export class BaseUploaderComponent {
constructor(_uploaderService) {
this._uploaderService = _uploaderService;
this.fileInputChange = new EventEmitter();
this.formCtrl = new FormControl();
/**
* @description maximum file size in kb (kilobyte)
* @default 5000 (5mb)
*/
this.maxSize = 5000;
/**
* @description min-height of the picker
* @default 48 (in pixel)
*/
this.minHeight = 48;
}
// Dragover listener
onDragOver(evt) {
evt.preventDefault();
evt.stopPropagation();
this.dragover = true;
}
// Dragleave listener
onDragLeave(evt) {
evt.preventDefault();
evt.stopPropagation();
this.dragover = false;
}
// Drop listener
ondrop(evt) {
evt.preventDefault();
evt.stopPropagation();
if (evt.dataTransfer.files && evt.dataTransfer.files[0]) {
this.addFile(evt.dataTransfer.files[0]);
}
this.dragover = false;
}
// Choose listener
inputChange(event) {
return __awaiter(this, void 0, void 0, function* () {
if (event.target.files && event.target.files[0]) {
this.addFile(event.target.files[0]);
}
});
}
addFile(file) {
return __awaiter(this, void 0, void 0, function* () {
if (!file) {
return;
}
if (this.formCtrl.disabled) {
return;
}
const errors = this.validate(file);
const fileName = file.name;
const base64Image = yield this._uploaderService.getBase64(file);
this.fileInputChangeStore = {
hasFile: true,
fileName,
errors,
base64Image
};
this.fileInputChange.emit(this.fileInputChangeStore);
this.formCtrl.setValue(base64Image);
});
}
validate(file) {
let isSizeValid = true;
if ((file.size / 1000) > this.maxSize) {
isSizeValid = false;
}
let isTypeValid = false;
for (const type of this.accept) {
if (type.split('.')[1] === file.type.split('/')[1]) {
isTypeValid = true;
}
}
return this.getError(isSizeValid, isTypeValid);
}
getError(size, type) {
let errors;
if (size && type) {
errors = {
maxSizeExceeded: null,
wrongFileType: null
};
}
else if (!size && type) {
errors = {
maxSizeExceeded: true,
wrongFileType: null
};
}
else if (size && !type) {
errors = {
maxSizeExceeded: null,
wrongFileType: true
};
}
else {
errors = {
wrongFileType: true,
maxSizeExceeded: true
};
}
return errors;
}
getImageHeightWidth(base64Image) {
return new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
const image = new Image();
image.src = base64Image;
image.onload = () => {
return resolve({
height: image.height,
width: image.width
});
};
}));
}
removeFile() {
this.fileInputChangeStore = {
hasFile: false,
fileName: null,
errors: null,
base64Image: null
};
this.fileInputChange.emit(this.fileInputChangeStore);
this.formCtrl.setValue('');
}
}
BaseUploaderComponent.decorators = [
{ type: Component, args: [{ template: '' },] }
];
BaseUploaderComponent.ctorParameters = () => [
{ type: UploaderService }
];
BaseUploaderComponent.propDecorators = {
fileInputChange: [{ type: Output }],
pickerLabel: [{ type: Input }],
hint: [{ type: Input }],
accept: [{ type: Input }],
maxSize: [{ type: Input }],
disabled: [{ type: Input }],
minHeight: [{ type: Input }],
onDragOver: [{ type: HostListener, args: ['dragover', ['$event'],] }],
onDragLeave: [{ type: HostListener, args: ['dragleave', ['$event'],] }],
ondrop: [{ type: HostListener, args: ['drop', ['$event'],] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBsb2FkZXIuYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VwbG9hZGVyL3NyYy9saWIvY29tcG9uZW50cy9iYXNlL3VwbG9hZGVyLmJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFNbEUsTUFBTSxPQUFPLHFCQUFxQjtJQWdEaEMsWUFDVSxnQkFBaUM7UUFBakMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQjtRQTlDakMsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUVoRSxhQUFRLEdBQWdCLElBQUksV0FBVyxFQUFFLENBQUM7UUF3QjFDOzs7V0FHRztRQUNNLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFPeEI7OztXQUdHO1FBQ00sY0FBUyxHQUFHLEVBQUUsQ0FBQztJQU1wQixDQUFDO0lBRUwsb0JBQW9CO0lBRVosVUFBVSxDQUFDLEdBQUc7UUFDcEIsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3JCLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQztJQUN2QixDQUFDO0lBRUQscUJBQXFCO0lBRWIsV0FBVyxDQUFDLEdBQUc7UUFDckIsR0FBRyxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3JCLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBRUQsZ0JBQWdCO0lBRVIsTUFBTSxDQUFDLEdBQUc7UUFDaEIsR0FBRyxD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MEJBUW5DLFlBQVksU0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUM7cUJBUXBDLFlBQVksU0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbnB1dCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIENvbXBvbmVudCwgSG9zdExpc3RlbmVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IFVwbG9hZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3VwbG9hZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsZUlucHV0Q2hhbmdlLCBVcGxvYWRlckVycm9yIH0gZnJvbSAnLi4vdHlwZXMvZmlsZS1jaGFuZ2UuaW50ZXJmYWNlJztcblxuXG5cbkBDb21wb25lbnQoeyB0ZW1wbGF0ZTogJycgfSlcbmV4cG9ydCBjbGFzcyBCYXNlVXBsb2FkZXJDb21wb25lbnQge1xuXG4gIGZpbGVJbnB1dENoYW5nZVN0b3JlOiBGaWxlSW5wdXRDaGFuZ2U7XG4gIEBPdXRwdXQoKSBmaWxlSW5wdXRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEZpbGVJbnB1dENoYW5nZT4oKTtcblxuICBmb3JtQ3RybDogRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFBpY2tlciBsYWJlbFxuICAgKiBAZGVmYXVsdCAnRHJhZyBpbWFnZSwgb3IgQ2hvb3NlJyBmb3IgaW1hZ2UgdXBsb2FkZXJcbiAgICogQGRlZmF1bHQgJ0RyYWcgZmlsZSwgb3IgQ2hvb3NlJyBmb3IgZmlsZSB1cGxvYWRlclxuICAgKiBAZXhhbXBsZSAnRHJhZyB5b3VyIGZ1bm55IHZpZGVvLCBvciBDaG9vc2UnXG4gICAqL1xuICBASW5wdXQoKSBwaWNrZXJMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSGludCBpcyB1c2VkIHRvIGd1aWRlIHVzZXJcbiAgICogQGV4YW1wbGUgJ01heCBmaWxlIHNpemU6IDVtYidcbiAgICovXG4gIEBJbnB1dCgpIGhpbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIGFjY2VwdGFibGUgZmlsZSB0eXBlc1xuICAgKiBAZGVmYXVsdCBbJy5qcGcnLCAnLnBuZycsICcuanBlZyddIGZvciBpbWFnZSB1cGxvYWRlclxuICAgKiBAZGVmYXVsdCBbJy5wZGYnLCAnLmNzdicsICcuZG9jJywgJy5kb2N4JywnLmRvY3gnLCAnLnhsc3gnLCAnLmNlciddIGZvciBmaWxlIHVwbG9hZGVyXG4gICAqIEBleGFtcGxlIFsnLmdpZiddIGZvciBvbmx5IGdpZiBmaWxlc1xuICAgKi9cbiAgQElucHV0KCkgYWNjZXB0OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIG1heGltdW0gZmlsZSBzaXplIGluIGtiIChraWxvYnl0ZSlcbiAgICogQGRlZmF1bHQgNTAwMCAoNW1iKVxuICAgKi9cbiAgQElucHV0KCkgbWF4U2l6ZSA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBkaXNhYmxlcyB0aGUgcGlja2VyXG4gICAqL1xuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIG1pbi1oZWlnaHQgb2YgdGhlIHBpY2tlclxuICAgKiBAZGVmYXVsdCA0OCAoaW4gcGl4ZWwpXG4gICAqL1xuICBASW5wdXQoKSBtaW5IZWlnaHQgPSA0ODtcblxuICBkcmFnb3ZlcjogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF91cGxvYWRlclNlcnZpY2U6IFVwbG9hZGVyU2VydmljZVxuICApIHsgfVxuXG4gIC8vIERyYWdvdmVyIGxpc3RlbmVyXG4gIEBIb3N0TGlzdGVuZXIoJ2RyYWdvdmVyJywgWyckZXZlbnQnXSlcbiAgcHJpdmF0ZSBvbkRyYWdPdmVyKGV2dCk6IHZvaWQge1xuICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmRyYWdvdmVyID0gdHJ1ZTtcbiAgfVxuXG4gIC8vIERyYWdsZWF2ZSBsaXN0ZW5lclxuICBASG9zdExpc3RlbmVyKCdkcmFnbGVhdmUnLCBbJyRldmVudCddKVxuICBwcml2YXRlIG9uRHJhZ0xlYXZlKGV2dCk6IHZvaWQge1xuICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2dC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmRyYWdvdmVyID0gZmFsc2U7XG4gIH1cblxuICAvLyBEcm9wIGxpc3RlbmVyXG4gIEBIb3N0TGlzdGVuZXIoJ2Ryb3AnLCBbJyRldmVudCddKVxuICBwcml2YXRlIG9uZHJvcChldnQpOiB2b2lkIHtcbiAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBpZiAoZXZ0LmRhdGFUcmFuc2Zlci5maWxlcyAmJiBldnQuZGF0YVRyYW5zZmVyLmZpbGVzWzBdKSB7XG4gICAgICB0aGlzLmFkZEZpbGUoZXZ0LmRhdGFUcmFuc2Zlci5maWxlc1swXSk7XG4gICAgfVxuICAgIHRoaXMuZHJhZ292ZXIgPSBmYWxzZTtcbiAgfVxuXG4gIC8vIENob29zZSBsaXN0ZW5lclxuICBwdWJsaWMgYXN5bmMgaW5wdXRDaGFuZ2UoZXZlbnQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0LmZpbGVzICYmIGV2ZW50LnRhcmdldC5maWxlc1swXSkge1xuICAgICAgdGhpcy5hZGRGaWxlKGV2ZW50LnRhcmdldC5maWxlc1swXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBhZGRGaWxlKGZpbGU6IGFueSk6IFByb21pc2U8dm9pZD4ge1xuXG4gICAgaWYgKCFmaWxlKSB7IHJldHVybjsgfVxuICAgIGlmICh0aGlzLmZvcm1DdHJsLmRpc2FibGVkKSB7IHJldHVybjsgfVxuXG4gICAgY29uc3QgZXJyb3JzID0gdGhpcy52YWxpZGF0ZShmaWxlKTtcblxuICAgIGNvbnN0IGZpbGVOYW1lID0gZmlsZS5uYW1lIGFzIHN0cmluZztcbiAgICBjb25zdCBiYXNlNjRJbWFnZSA9IGF3YWl0IHRoaXMuX3VwbG9hZGVyU2VydmljZS5nZXRCYXNlNjQoZmlsZSk7XG5cbiAgICB0aGlzLmZpbGVJbnB1dENoYW5nZVN0b3JlID0ge1xuICAgICAgaGFzRmlsZTogdHJ1ZSxcbiAgICAgIGZpbGVOYW1lLFxuICAgICAgZXJyb3JzLFxuICAgICAgYmFzZTY0SW1hZ2VcbiAgICB9O1xuXG4gICAgdGhpcy5maWxlSW5wdXRDaGFuZ2UuZW1pdCh0aGlzLmZpbGVJbnB1dENoYW5nZVN0b3JlKTtcbiAgICB0aGlzLmZvcm1DdHJsLnNldFZhbHVlKGJhc2U2NEltYWdlKTtcblxuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZShmaWxlOiBhbnkpOiBVcGxvYWRlckVycm9yIHtcblxuICAgIGxldCBpc1NpemVWYWxpZCA9IHRydWU7XG4gICAgaWYgKChmaWxlLnNpemUgLyAxMDAwKSA+IHRoaXMubWF4U2l6ZSkge1xuICAgICAgaXNTaXplVmFsaWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgaXNUeXBlVmFsaWQgPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgdHlwZSBvZiB0aGlzLmFjY2VwdCkge1xuICAgICAgaWYgKHR5cGUuc3BsaXQoJy4nKVsxXSA9PT0gZmlsZS50eXBlLnNwbGl0KCcvJylbMV0pIHtcbiAgICAgICAgaXNUeXBlVmFsaWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmdldEVycm9yKGlzU2l6ZVZhbGlkLCBpc1R5cGVWYWxpZCk7XG4gIH1cblxuICBwcml2YXRlIGdldEVycm9yKHNpemU6IGJvb2xlYW4sIHR5cGU6IGJvb2xlYW4pOiBVcGxvYWRlckVycm9yIHtcblxuICAgIGxldCBlcnJvcnM6IFVwbG9hZGVyRXJyb3I7XG5cbiAgICBpZiAoc2l6ZSAmJiB0eXBlKSB7XG4gICAgICBlcnJvcnMgPSB7XG4gICAgICAgIG1heFNpemVFeGNlZWRlZDogbnVsbCxcbiAgICAgICAgd3JvbmdGaWxlVHlwZTogbnVsbFxuICAgICAgfTtcbiAgICB9XG4gICAgZWxzZSBpZiAoIXNpemUgJiYgdHlwZSkge1xuICAgICAgZXJyb3JzID0ge1xuICAgICAgICBtYXhTaXplRXhjZWVkZWQ6IHRydWUsXG4gICAgICAgIHdyb25nRmlsZVR5cGU6IG51bGxcbiAgICAgIH07XG4gICAgfVxuICAgIGVsc2UgaWYgKHNpemUgJiYgIXR5cGUpIHtcbiAgICAgIGVycm9ycyA9IHtcbiAgICAgICAgbWF4U2l6ZUV4Y2VlZGVkOiBudWxsLFxuICAgICAgICB3cm9uZ0ZpbGVUeXBlOiB0cnVlXG4gICAgICB9O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGVycm9ycyA9IHtcbiAgICAgICAgd3JvbmdGaWxlVHlwZTogdHJ1ZSxcbiAgICAgICAgbWF4U2l6ZUV4Y2VlZGVkOiB0cnVlXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cblxuICBwcml2YXRlIGdldEltYWdlSGVpZ2h0V2lkdGgoYmFzZTY0SW1hZ2U6IGFueSk6IFByb21pc2U8eyBoZWlnaHQ6IG51bWJlciwgd2lkdGg6IG51bWJlciB9PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKGFzeW5jIHJlc29sdmUgPT4ge1xuICAgICAgY29uc3QgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgICAgIGltYWdlLnNyYyA9IGJhc2U2NEltYWdlO1xuICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4ge1xuICAgICAgICByZXR1cm4gcmVzb2x2ZSh7XG4gICAgICAgICAgaGVpZ2h0OiBpbWFnZS5oZWlnaHQsXG4gICAgICAgICAgd2lkdGg6IGltYWdlLndpZHRoXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVGaWxlKCk6IHZvaWQge1xuICAgIHRoaXMuZmlsZUlucHV0Q2hhbmdlU3RvcmUgPSB7XG4gICAgICBoYXNGaWxlOiBmYWxzZSxcbiAgICAgIGZpbGVOYW1lOiBudWxsLFxuICAgICAgZXJyb3JzOiBudWxsLFxuICAgICAgYmFzZTY0SW1hZ2U6IG51bGxcbiAgICB9O1xuICAgIHRoaXMuZmlsZUlucHV0Q2hhbmdlLmVtaXQodGhpcy5maWxlSW5wdXRDaGFuZ2VTdG9yZSk7XG4gICAgdGhpcy5mb3JtQ3RybC5zZXRWYWx1ZSgnJyk7XG4gIH1cblxufVxuIl19