UNPKG

@nghacks/uploader

Version:

Image and file uploader for angular

153 lines 15.8 kB
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