@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
JavaScript
/**
* @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==