UNPKG

xui

Version:

xUI Components for Angular

131 lines 16.7 kB
import { __decorate, __metadata } from "tslib"; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, HostListener, Input, Optional, Self, ViewChild } from '@angular/core'; import { Dialog } from '@angular/cdk/dialog'; import { NgControl } from '@angular/forms'; import { InputBoolean, InputNumber } from '../utils'; import { ImageUploadCropperComponent } from './image-upload-cropper'; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/dialog"; import * as i2 from "@angular/forms"; import * as i3 from "@angular/common"; import * as i4 from "../icon/icon.component"; import * as i5 from "@ngx-translate/core"; export class ImageUploadComponent { get classes() { const ret = { 'x-image-upload': true, 'x-image-upload-disabled': this.disabled, 'x-image-upload-square': this.type === 'square' }; return ret; } get styles() { return { 'border-radius.%': this.borderRadius, 'aspect-ratio': this.aspectRatio, 'background-image': this.backgroundImage }; } get backgroundImage() { return this._backgroundImage ? `url(${this._backgroundImage})` : null; } get borderRadius() { return this.type === 'round' ? 50 : 4; } constructor(cdr, dialog, control) { this.cdr = cdr; this.dialog = dialog; this.control = control; this._backgroundImage = null; this.croppedImage = null; this.hoverLabel = 'xui.image_upload.change_image'; this.type = 'square'; this.aspectRatio = 1; this.disabled = false; this.imageCropped = (event) => { this.croppedImage = event.base64 ?? null; }; this.save = () => { this.onChange?.(this.croppedImage); this._backgroundImage = this.croppedImage; this.dialogRef?.close(); this.cdr.markForCheck(); }; if (this.control) { this.control.valueAccessor = this; } } ngOnInit() { this.control?.statusChanges?.subscribe(() => this.cdr.markForCheck()); } handleFileInput(event) { this.dialogRef = this.dialog.open(ImageUploadCropperComponent, { data: { type: this.type, aspectRatio: this.aspectRatio, save: this.save, imageChangedEvent: event, imageCropped: this.imageCropped } }); } _keyPress(event) { event?.preventDefault(); this.inputElm.nativeElement.click(); } writeValue(source) { this.croppedImage = source; this._backgroundImage = source; } registerOnChange(onChange) { this.onChange = onChange; } registerOnTouched(onTouched) { this.onTouched = onTouched; } setDisabledState(isDisabled) { this.disabled = isDisabled; } _focusOut() { this.onTouched?.(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.1", ngImport: i0, type: ImageUploadComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i1.Dialog }, { token: i2.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.1", type: ImageUploadComponent, selector: "xui-image-upload", inputs: { hoverLabel: "hoverLabel", type: "type", aspectRatio: "aspectRatio", disabled: "disabled" }, host: { listeners: { "keydown.enter": "_keyPress($event)", "keydown.space": "_keyPress($event)", "focusout": "_focusOut()" } }, viewQueries: [{ propertyName: "inputElm", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div [ngClass]=\"classes\" [ngStyle]=\"styles\" tabindex=\"0\">\n <input #input type=\"file\" [disabled]=\"disabled\" (change)=\"handleFileInput($event)\" accept=\"image/*\" tabindex=\"-1\" />\n <div class=\"x-image-upload-hover\" [style.border-radius.%]=\"borderRadius\">{{ hoverLabel | translate }}</div>\n <div *ngIf=\"!backgroundImage\" class=\"x-image-upload-no-image\">{{ 'xui.image_upload.no_image' | translate }}</div>\n\n <div class=\"x-image-upload-icon\">\n <xui-icon>image-plus-outline</xui-icon>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i4.IconComponent, selector: "xui-icon" }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } __decorate([ InputNumber(), __metadata("design:type", Object) ], ImageUploadComponent.prototype, "aspectRatio", void 0); __decorate([ InputBoolean(), __metadata("design:type", Object) ], ImageUploadComponent.prototype, "disabled", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.1", ngImport: i0, type: ImageUploadComponent, decorators: [{ type: Component, args: [{ selector: 'xui-image-upload', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [ngClass]=\"classes\" [ngStyle]=\"styles\" tabindex=\"0\">\n <input #input type=\"file\" [disabled]=\"disabled\" (change)=\"handleFileInput($event)\" accept=\"image/*\" tabindex=\"-1\" />\n <div class=\"x-image-upload-hover\" [style.border-radius.%]=\"borderRadius\">{{ hoverLabel | translate }}</div>\n <div *ngIf=\"!backgroundImage\" class=\"x-image-upload-no-image\">{{ 'xui.image_upload.no_image' | translate }}</div>\n\n <div class=\"x-image-upload-icon\">\n <xui-icon>image-plus-outline</xui-icon>\n </div>\n</div>\n" }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i1.Dialog }, { type: i2.NgControl, decorators: [{ type: Self }, { type: Optional }] }]; }, propDecorators: { hoverLabel: [{ type: Input }], type: [{ type: Input }], aspectRatio: [{ type: Input }], disabled: [{ type: Input }], inputElm: [{ type: ViewChild, args: ['input'] }], _keyPress: [{ type: HostListener, args: ['keydown.enter', ['$event']] }, { type: HostListener, args: ['keydown.space', ['$event']] }], _focusOut: [{ type: HostListener, args: ['focusout'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtdXBsb2FkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMveHVpL3NyYy9pbWFnZS11cGxvYWQvaW1hZ2UtdXBsb2FkLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMveHVpL3NyYy9pbWFnZS11cGxvYWQvaW1hZ2UtdXBsb2FkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixLQUFLLEVBRUwsUUFBUSxFQUNSLElBQUksRUFDSixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLE1BQU0sRUFBYSxNQUFNLHFCQUFxQixDQUFDO0FBQ3hELE9BQU8sRUFBd0IsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakUsT0FBTyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDckQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7Ozs7Ozs7QUFTckUsTUFBTSxPQUFPLG9CQUFvQjtJQWUvQixJQUFJLE9BQU87UUFDVCxNQUFNLEdBQUcsR0FBaUM7WUFDeEMsZ0JBQWdCLEVBQUUsSUFBSTtZQUN0Qix5QkFBeUIsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN4Qyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVE7U0FDaEQsQ0FBQztRQUVGLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELElBQUksTUFBTTtRQUNSLE9BQU87WUFDTCxpQkFBaUIsRUFBRSxJQUFJLENBQUMsWUFBWTtZQUNwQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDaEMsa0JBQWtCLEVBQUUsSUFBSSxDQUFDLGVBQWU7U0FDekMsQ0FBQztJQUNKLENBQUM7SUFF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RUFBRSxFQUFFLENBQUM7SUFDckIsQ0FBQzs4R0FyR1Usb0JBQW9CO2tHQUFwQixvQkFBb0IsaVlDekJqQyx5aEJBU0E7O0FEMkIwQjtJQUFkLFdBQVcsRUFBRTs7eURBQWlCO0FBQ2Y7SUFBZixZQUFZLEVBQUU7O3NEQUFrQjsyRkFaL0Isb0JBQW9CO2tCQUxoQyxTQUFTOytCQUNFLGtCQUFrQixtQkFDWCx1QkFBdUIsQ0FBQyxNQUFNOzswQkE0Q3NCLElBQUk7OzBCQUFJLFFBQVE7NENBaEM1RSxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDa0IsV0FBVztzQkFBbEMsS0FBSztnQkFDbUIsUUFBUTtzQkFBaEMsS0FBSztnQkFDYyxRQUFRO3NCQUEzQixTQUFTO3VCQUFDLE9BQU87Z0JBb0RWLFNBQVM7c0JBRmhCLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDOztzQkFDeEMsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBbUNqQyxTQUFTO3NCQURoQixZQUFZO3VCQUFDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPcHRpb25hbCxcbiAgU2VsZixcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW1hZ2VDcm9wcGVkRXZlbnQgfSBmcm9tICduZ3gtaW1hZ2UtY3JvcHBlcic7XG5pbXBvcnQgeyBEaWFsb2csIERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kaWFsb2cnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5nQ29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IElucHV0Qm9vbGVhbiwgSW5wdXROdW1iZXIgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQgeyBJbWFnZVVwbG9hZENyb3BwZXJDb21wb25lbnQgfSBmcm9tICcuL2ltYWdlLXVwbG9hZC1jcm9wcGVyJztcbmltcG9ydCB7IEltYWdlVXBsb2FkVHlwZSB9IGZyb20gJy4vaW1hZ2UtdXBsb2FkLnR5cGVzJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3h1aS1pbWFnZS11cGxvYWQnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgdGVtcGxhdGVVcmw6ICcuL2ltYWdlLXVwbG9hZC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgSW1hZ2VVcGxvYWRDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0IHtcbiAgc3RhdGljIG5nQWNjZXB0SW5wdXRUeXBlX2Rpc2FibGVkOiBCb29sZWFuSW5wdXQ7XG5cbiAgcHJpdmF0ZSBvbkNoYW5nZT86IChzb3VyY2U6IHN0cmluZyB8IG51bGwpID0+IHZvaWQ7XG4gIHByaXZhdGUgb25Ub3VjaGVkPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBfYmFja2dyb3VuZEltYWdlOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkaWFsb2dSZWY/OiBEaWFsb2dSZWY8dW5rbm93biwgSW1hZ2VVcGxvYWRDcm9wcGVyQ29tcG9uZW50PjtcbiAgcHJpdmF0ZSBjcm9wcGVkSW1hZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGhvdmVyTGFiZWwgPSAneHVpLmltYWdlX3VwbG9hZC5jaGFuZ2VfaW1hZ2UnO1xuICBASW5wdXQoKSB0eXBlOiBJbWFnZVVwbG9hZFR5cGUgPSAnc3F1YXJlJztcbiAgQElucHV0KCkgQElucHV0TnVtYmVyKCkgYXNwZWN0UmF0aW8gPSAxO1xuICBASW5wdXQoKSBASW5wdXRCb29sZWFuKCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgQFZpZXdDaGlsZCgnaW5wdXQnKSBpbnB1dEVsbSE6IEVsZW1lbnRSZWY7XG5cbiAgZ2V0IGNsYXNzZXMoKSB7XG4gICAgY29uc3QgcmV0OiB7IFtrbGFzczogc3RyaW5nXTogYm9vbGVhbiB9ID0ge1xuICAgICAgJ3gtaW1hZ2UtdXBsb2FkJzogdHJ1ZSxcbiAgICAgICd4LWltYWdlLXVwbG9hZC1kaXNhYmxlZCc6IHRoaXMuZGlzYWJsZWQsXG4gICAgICAneC1pbWFnZS11cGxvYWQtc3F1YXJlJzogdGhpcy50eXBlID09PSAnc3F1YXJlJ1xuICAgIH07XG5cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgZ2V0IHN0eWxlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ2JvcmRlci1yYWRpdXMuJSc6IHRoaXMuYm9yZGVyUmFkaXVzLFxuICAgICAgJ2FzcGVjdC1yYXRpbyc6IHRoaXMuYXNwZWN0UmF0aW8sXG4gICAgICAnYmFja2dyb3VuZC1pbWFnZSc6IHRoaXMuYmFja2dyb3VuZEltYWdlXG4gICAgfTtcbiAgfVxuXG4gIGdldCBiYWNrZ3JvdW5kSW1hZ2UoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2JhY2tncm91bmRJbWFnZSA/IGB1cmwoJHt0aGlzLl9iYWNrZ3JvdW5kSW1hZ2V9KWAgOiBudWxsO1xuICB9XG5cbiAgZ2V0IGJvcmRlclJhZGl1cygpIHtcbiAgICByZXR1cm4gdGhpcy50eXBlID09PSAncm91bmQnID8gNTAgOiA0O1xuICB9XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGRpYWxvZzogRGlhbG9nLCBAU2VsZigpIEBPcHRpb25hbCgpIHB1YmxpYyBjb250cm9sPzogTmdDb250cm9sKSB7XG4gICAgaWYgKHRoaXMuY29udHJvbCkge1xuICAgICAgdGhpcy5jb250cm9sLnZhbHVlQWNjZXNzb3IgPSB0aGlzO1xuICAgIH1cbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRoaXMuY29udHJvbD8uc3RhdHVzQ2hhbmdlcz8uc3Vic2NyaWJlKCgpID0+IHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpKTtcbiAgfVxuXG4gIGhhbmRsZUZpbGVJbnB1dChldmVudDogdW5rbm93bikge1xuICAgIHRoaXMuZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihJbWFnZVVwbG9hZENyb3BwZXJDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICBhc3BlY3RSYXRpbzogdGhpcy5hc3BlY3RSYXRpbyxcbiAgICAgICAgc2F2ZTogdGhpcy5zYXZlLFxuICAgICAgICBpbWFnZUNoYW5nZWRFdmVudDogZXZlbnQsXG4gICAgICAgIGltYWdlQ3JvcHBlZDogdGhpcy5pbWFnZUNyb3BwZWRcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uZW50ZXInLCBbJyRldmVudCddKVxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duLnNwYWNlJywgWyckZXZlbnQnXSlcbiAgcHJpdmF0ZSBfa2V5UHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICB0aGlzLmlucHV0RWxtLm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcbiAgfVxuXG4gIGltYWdlQ3JvcHBlZCA9IChldmVudDogSW1hZ2VDcm9wcGVkRXZlbnQpID0+IHtcbiAgICB0aGlzLmNyb3BwZWRJbWFnZSA9IGV2ZW50LmJhc2U2NCA/PyBudWxsO1xuICB9O1xuXG4gIHNhdmUgPSAoKSA9PiB7XG4gICAgdGhpcy5vbkNoYW5nZT8uKHRoaXMuY3JvcHBlZEltYWdlKTtcbiAgICB0aGlzLl9iYWNrZ3JvdW5kSW1hZ2UgPSB0aGlzLmNyb3BwZWRJbWFnZTtcbiAgICB0aGlzLmRpYWxvZ1JlZj8uY2xvc2UoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfTtcblxuICB3cml0ZVZhbHVlKHNvdXJjZTogc3RyaW5nKSB7XG4gICAgdGhpcy5jcm9wcGVkSW1hZ2UgPSBzb3VyY2U7XG4gICAgdGhpcy5fYmFja2dyb3VuZEltYWdlID0gc291cmNlO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogKHNvdXJjZTogc3RyaW5nIHwgbnVsbCkgPT4gdm9pZCkge1xuICAgIHRoaXMub25DaGFuZ2UgPSBvbkNoYW5nZTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogKCkgPT4gdm9pZCkge1xuICAgIHRoaXMub25Ub3VjaGVkID0gb25Ub3VjaGVkO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdmb2N1c291dCcpXG4gIHByaXZhdGUgX2ZvY3VzT3V0KCkge1xuICAgIHRoaXMub25Ub3VjaGVkPy4oKTtcbiAgfVxufVxuIiwiPGRpdiBbbmdDbGFzc109XCJjbGFzc2VzXCIgW25nU3R5bGVdPVwic3R5bGVzXCIgdGFiaW5kZXg9XCIwXCI+XG4gIDxpbnB1dCAjaW5wdXQgdHlwZT1cImZpbGVcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAoY2hhbmdlKT1cImhhbmRsZUZpbGVJbnB1dCgkZXZlbnQpXCIgYWNjZXB0PVwiaW1hZ2UvKlwiIHRhYmluZGV4PVwiLTFcIiAvPlxuICA8ZGl2IGNsYXNzPVwieC1pbWFnZS11cGxvYWQtaG92ZXJcIiBbc3R5bGUuYm9yZGVyLXJhZGl1cy4lXT1cImJvcmRlclJhZGl1c1wiPnt7IGhvdmVyTGFiZWwgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgPGRpdiAqbmdJZj1cIiFiYWNrZ3JvdW5kSW1hZ2VcIiBjbGFzcz1cIngtaW1hZ2UtdXBsb2FkLW5vLWltYWdlXCI+e3sgJ3h1aS5pbWFnZV91cGxvYWQubm9faW1hZ2UnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cIngtaW1hZ2UtdXBsb2FkLWljb25cIj5cbiAgICA8eHVpLWljb24+aW1hZ2UtcGx1cy1vdXRsaW5lPC94dWktaWNvbj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==