UNPKG

@asi-ngtools/lib

Version:

This project is a little components library, simple to use, which will help you to simplify your project.

226 lines (225 loc) 15.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc */ import { AsiFileService } from './../../services/asi-file.service'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { DefaultControlValueAccessor } from './../common/default-control-value-accessor'; import { Component, Input, EventEmitter, Output, forwardRef, ViewChild, Renderer2, ElementRef } from '@angular/core'; export class AsiImageChooserComponent extends DefaultControlValueAccessor { /** * @param {?} fileService * @param {?} renderer * @param {?} elementRef */ constructor(fileService, renderer, elementRef) { super(); this.fileService = fileService; this.renderer = renderer; this.elementRef = elementRef; /** * Label position */ this.labelPosition = 'top'; /** * Icon to display when empty */ this.icon = 'far fa-image'; /** * Event emitted when an image is selected */ this.onImageSelected = new EventEmitter(); this.dragging = false; this.loaded = false; this.imageLoaded = false; this.init = false; } /** * @return {?} */ ngOnInit() { this.renderer.addClass(this.elementRef.nativeElement, 'label-' + this.labelPosition); } /** * @return {?} */ ngAfterViewInit() { if (this.imageSrc != null) { this.fileService.getBlobImage(this.imageSrc).subscribe(blob => { this.fileService.blobToBase64(blob, true).subscribe((base64) => { this.image64 = base64; }); /** @type {?} */ const imageName = this.imageSrc.split('/').pop(); this.value = new Blob([blob], { type: blob.type }); this.value.name = imageName; this.init = true; }); } else { this.init = true; } } /** * @return {?} */ openFileInput() { this.fileInput.nativeElement.click(); } /** * @return {?} */ handleDragEnter() { this.dragging = true; } /** * @return {?} */ handleDragLeave() { this.dragging = false; } /** * @param {?} e * @return {?} */ handleDrop(e) { e.preventDefault(); this.dragging = false; this.handleInputChange(e); } /** * @return {?} */ handleImageLoad() { this.imageLoaded = true; } /** * @param {?} event * @return {?} */ handleInputChange(event) { /** @type {?} */ const imageFile = event.dataTransfer ? event.dataTransfer.files[0] : event.target.files[0]; /** @type {?} */ const reader = new FileReader(); this.loaded = false; this.imageFile = imageFile; reader.onload = this._handleReaderLoaded.bind(this); reader.readAsDataURL(imageFile); } /** * @param {?} event * @return {?} */ _handleReaderLoaded(event) { /** @type {?} */ const reader = event.target; this.image64 = reader.result; this.onImageSelected.emit(this.imageFile); this.loaded = true; this.value = this.imageFile; } /** * @param {?} value * @return {?} */ writeValue(value) { this._value = value; if (value == null && this.init) { this.imageSrc = null; this.image64 = null; } } } AsiImageChooserComponent.decorators = [ { type: Component, args: [{ selector: 'asi-image-chooser', host: { 'class': 'asi-component asi-image-chooser' }, template: "<label class=\"input-label\" *ngIf=\"label != null\">{{label | translate}}</label>\n\n<label class=\"asi-image-chooser-container\" ondragover=\"return false;\" [class.loaded]=\"loaded\" (dragenter)=\"handleDragEnter()\" (dragleave)=\"handleDragLeave()\"\n (drop)=\"handleDrop($event)\">\n <img *ngIf=\"image64 != null\" [src]=\"image64\" (load)=\"handleImageLoad()\" [class.loaded]=\"imageLoaded\" />\n <input #asiFileInput type=\"file\" [disabled]=\"disabled\" [attr.id]=\"id\" [attr.name]=\"name\" accept=\"image/*\" (change)=\"handleInputChange($event)\">\n <asi-fa-icon *ngIf=\"image64 == null\" (onClick)=\"openFileInput()\" class=\"asi-focus-error\" [icon]=\"icon\" size=\"2x\"></asi-fa-icon>\n</label>\n", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => AsiImageChooserComponent), multi: true } ] }] } ]; /** @nocollapse */ AsiImageChooserComponent.ctorParameters = () => [ { type: AsiFileService }, { type: Renderer2 }, { type: ElementRef } ]; AsiImageChooserComponent.propDecorators = { id: [{ type: Input }], name: [{ type: Input }], label: [{ type: Input }], labelPosition: [{ type: Input }], imageSrc: [{ type: Input }], image64: [{ type: Input }], icon: [{ type: Input }], onImageSelected: [{ type: Output }], fileInput: [{ type: ViewChild, args: ['asiFileInput',] }] }; if (false) { /** * html id * @type {?} */ AsiImageChooserComponent.prototype.id; /** * html name * @type {?} */ AsiImageChooserComponent.prototype.name; /** * Label to display (is translated) * @type {?} */ AsiImageChooserComponent.prototype.label; /** * Label position * @type {?} */ AsiImageChooserComponent.prototype.labelPosition; /** * Init the image chooser with an url * @type {?} */ AsiImageChooserComponent.prototype.imageSrc; /** * Init the image chooser with a base64 * @type {?} */ AsiImageChooserComponent.prototype.image64; /** * Icon to display when empty * @type {?} */ AsiImageChooserComponent.prototype.icon; /** * Event emitted when an image is selected * @type {?} */ AsiImageChooserComponent.prototype.onImageSelected; /** @type {?} */ AsiImageChooserComponent.prototype.fileInput; /** @type {?} */ AsiImageChooserComponent.prototype.dragging; /** @type {?} */ AsiImageChooserComponent.prototype.loaded; /** @type {?} */ AsiImageChooserComponent.prototype.imageLoaded; /** @type {?} */ AsiImageChooserComponent.prototype.imageFile; /** @type {?} */ AsiImageChooserComponent.prototype.init; /** @type {?} */ AsiImageChooserComponent.prototype.fileService; /** @type {?} */ AsiImageChooserComponent.prototype.renderer; /** @type {?} */ AsiImageChooserComponent.prototype.elementRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpLWltYWdlLWNob29zZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGFzaS1uZ3Rvb2xzL2xpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2FzaS1pbWFnZS1jaG9vc2VyL2FzaS1pbWFnZS1jaG9vc2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3pGLE9BQU8sRUFDTCxTQUFTLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBaUIsTUFBTSxFQUNyRCxVQUFVLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBRSxVQUFVLEVBQ3JELE1BQU0sZUFBZSxDQUFDO0FBY3ZCLE1BQU0sK0JBQWdDLFNBQVEsMkJBQTJCOzs7Ozs7SUFnQ3ZFLFlBQW9CLFdBQTJCLEVBQVUsUUFBbUIsRUFDbEU7UUFDUixLQUFLLEVBQUUsQ0FBQztRQUZVLGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVc7UUFDbEUsZUFBVSxHQUFWLFVBQVU7Ozs7NkJBdkIyRSxLQUFLOzs7O29CQVFwRixjQUFjOzs7OytCQUdGLElBQUksWUFBWSxFQUFRO3dCQUl6QyxLQUFLO3NCQUNQLEtBQUs7MkJBQ0EsS0FBSztvQkFHWixLQUFLO0tBS1g7Ozs7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztLQUN0Rjs7OztJQUVELGVBQWU7UUFDYixFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxDQUFDLENB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QUksQ0FBQztZQUNyQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztTQUNyQjtLQUNGOzs7WUFwSEYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxtQkFBbUI7Z0JBQzdCLElBQUksRUFBRSxFQUFFLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRTtnQkFDcEQsOHRCQUFpRDtnQkFDakQsU0FBUyxFQUFFO29CQUNUO3dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7d0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUM7d0JBQ3ZELEtBQUssRUFBRSxJQUFJO3FCQUNaO2lCQUNGO2FBQ0Y7Ozs7WUFuQlEsY0FBYztZQUtVLFNBQVM7WUFBRSxVQUFVOzs7aUJBa0JuRCxLQUFLO21CQUVMLEtBQUs7b0JBR0wsS0FBSzs0QkFFTCxLQUFLO3VCQUdMLEtBQUs7c0JBRUwsS0FBSzttQkFHTCxLQUFLOzhCQUdMLE1BQU07d0JBRU4sU0FBUyxTQUFDLGNBQWMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc2lGaWxlU2VydmljZSB9IGZyb20gJy4vLi4vLi4vc2VydmljZXMvYXNpLWZpbGUuc2VydmljZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERlZmF1bHRDb250cm9sVmFsdWVBY2Nlc3NvciB9IGZyb20gJy4vLi4vY29tbW9uL2RlZmF1bHQtY29udHJvbC12YWx1ZS1hY2Nlc3Nvcic7XG5pbXBvcnQge1xuICBDb21wb25lbnQsIElucHV0LCBFdmVudEVtaXR0ZXIsIEFmdGVyVmlld0luaXQsIE91dHB1dCxcbiAgZm9yd2FyZFJlZiwgVmlld0NoaWxkLCBPbkluaXQsIFJlbmRlcmVyMiwgRWxlbWVudFJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXNpLWltYWdlLWNob29zZXInLFxuICBob3N0OiB7ICdjbGFzcyc6ICdhc2ktY29tcG9uZW50IGFzaS1pbWFnZS1jaG9vc2VyJyB9LFxuICB0ZW1wbGF0ZVVybDogJy4vYXNpLWltYWdlLWNob29zZXIuY29tcG9uZW50Lmh0bWwnLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEFzaUltYWdlQ2hvb3NlckNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBBc2lJbWFnZUNob29zZXJDb21wb25lbnQgZXh0ZW5kcyBEZWZhdWx0Q29udHJvbFZhbHVlQWNjZXNzb3IgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkluaXQge1xuXG4gIC8qKiBodG1sIGlkICovXG4gIEBJbnB1dCgpIGlkOiBzdHJpbmc7XG4gIC8qKiBodG1sIG5hbWUgKi9cbiAgQElucHV0KCkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKiBMYWJlbCB0byBkaXNwbGF5IChpcyB0cmFuc2xhdGVkKSAqL1xuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nO1xuICAvKiogTGFiZWwgcG9zaXRpb24gKi9cbiAgQElucHV0KCkgbGFiZWxQb3NpdGlvbjogJ3RvcCcgfCAnbGVmdCcgfCAncmlnaHQnIHwgJ2JvdHRvbScgfCAnYm90dG9tLWNlbnRlcicgfCAndG9wLWNlbnRlcicgPSAndG9wJztcblxuICAvKiogSW5pdCB0aGUgaW1hZ2UgY2hvb3NlciB3aXRoIGFuIHVybCAqL1xuICBASW5wdXQoKSBpbWFnZVNyYzogc3RyaW5nO1xuICAvKiogSW5pdCB0aGUgaW1hZ2UgY2hvb3NlciB3aXRoIGEgYmFzZTY0ICovXG4gIEBJbnB1dCgpIGltYWdlNjQ6IHN0cmluZztcblxuICAvKiogSWNvbiB0byBkaXNwbGF5IHdoZW4gZW1wdHkgKi9cbiAgQElucHV0KCkgaWNvbiA9ICdmYXIgZmEtaW1hZ2UnO1xuXG4gIC8qKiBFdmVudCBlbWl0dGVkIHdoZW4gYW4gaW1hZ2UgaXMgc2VsZWN0ZWQgKi9cbiAgQE91dHB1dCgpIG9uSW1hZ2VTZWxlY3RlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RmlsZT4oKTtcblxuICBAVmlld0NoaWxkKCdhc2lGaWxlSW5wdXQnKSBmaWxlSW5wdXQ6IGFueTtcblxuICBkcmFnZ2luZyA9IGZhbHNlO1xuICBsb2FkZWQgPSBmYWxzZTtcbiAgaW1hZ2VMb2FkZWQgPSBmYWxzZTtcbiAgaW1hZ2VGaWxlOiBGaWxlO1xuXG4gIGluaXQgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZpbGVTZXJ2aWNlOiBBc2lGaWxlU2VydmljZSwgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnbGFiZWwtJyArIHRoaXMubGFiZWxQb3NpdGlvbik7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKHRoaXMuaW1hZ2VTcmMgIT0gbnVsbCkge1xuICAgICAgdGhpcy5maWxlU2VydmljZS5nZXRCbG9iSW1hZ2UodGhpcy5pbWFnZVNyYykuc3Vic2NyaWJlKGJsb2IgPT4ge1xuICAgICAgICB0aGlzLmZpbGVTZXJ2aWNlLmJsb2JUb0Jhc2U2NChibG9iLCB0cnVlKS5zdWJzY3JpYmUoKGJhc2U2NCkgPT4ge1xuICAgICAgICAgIHRoaXMuaW1hZ2U2NCA9IGJhc2U2NDtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGltYWdlTmFtZSA9IHRoaXMuaW1hZ2VTcmMuc3BsaXQoJy8nKS5wb3AoKTtcbiAgICAgICAgdGhpcy52YWx1ZSA9IG5ldyBCbG9iKFtibG9iXSwgeyB0eXBlOiBibG9iLnR5cGUgfSk7XG4gICAgICAgIHRoaXMudmFsdWUubmFtZSA9IGltYWdlTmFtZTtcbiAgICAgICAgdGhpcy5pbml0ID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmluaXQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIG9wZW5GaWxlSW5wdXQoKSB7XG4gICAgdGhpcy5maWxlSW5wdXQubmF0aXZlRWxlbWVudC5jbGljaygpO1xuICB9XG5cbiAgaGFuZGxlRHJhZ0VudGVyKCk6IHZvaWQge1xuICAgIHRoaXMuZHJhZ2dpbmcgPSB0cnVlO1xuICB9XG5cbiAgaGFuZGxlRHJhZ0xlYXZlKCk6IHZvaWQge1xuICAgIHRoaXMuZHJhZ2dpbmcgPSBmYWxzZTtcbiAgfVxuXG4gIGhhbmRsZURyb3AoZTogRXZlbnQpOiB2b2lkIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5kcmFnZ2luZyA9IGZhbHNlO1xuICAgIHRoaXMuaGFuZGxlSW5wdXRDaGFuZ2UoZSk7XG4gIH1cblxuICBoYW5kbGVJbWFnZUxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5pbWFnZUxvYWRlZCA9IHRydWU7XG4gIH1cblxuICBoYW5kbGVJbnB1dENoYW5nZShldmVudDogYW55KSB7XG4gICAgY29uc3QgaW1hZ2VGaWxlID0gZXZlbnQuZGF0YVRyYW5zZmVyID8gZXZlbnQuZGF0YVRyYW5zZmVyLmZpbGVzWzBdIDogZXZlbnQudGFyZ2V0LmZpbGVzWzBdO1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMuaW1hZ2VGaWxlID0gaW1hZ2VGaWxlO1xuICAgIHJlYWRlci5vbmxvYWQgPSB0aGlzLl9oYW5kbGVSZWFkZXJMb2FkZWQuYmluZCh0aGlzKTtcbiAgICByZWFkZXIucmVhZEFzRGF0YVVSTChpbWFnZUZpbGUpO1xuICB9XG5cbiAgX2hhbmRsZVJlYWRlckxvYWRlZChldmVudDogYW55KSB7XG4gICAgY29uc3QgcmVhZGVyID0gZXZlbnQudGFyZ2V0O1xuICAgIHRoaXMuaW1hZ2U2NCA9IHJlYWRlci5yZXN1bHQ7XG4gICAgdGhpcy5vbkltYWdlU2VsZWN0ZWQuZW1pdCh0aGlzLmltYWdlRmlsZSk7XG4gICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuXG4gICAgdGhpcy52YWx1ZSA9IHRoaXMuaW1hZ2VGaWxlO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiB0aGlzLmluaXQpIHtcbiAgICAgIHRoaXMuaW1hZ2VTcmMgPSBudWxsO1xuICAgICAgdGhpcy5pbWFnZTY0ID0gbnVsbDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==