UNPKG

@junte/ui

Version:

Quality Angular UI components kit

136 lines 17 kB
var ImageUploaderComponent_1; import { __decorate, __metadata } from "tslib"; import { Component, ContentChild, forwardRef, HostBinding, HostListener, Input, TemplateRef } from '@angular/core'; import { ControlValueAccessor, FormBuilder, NG_VALUE_ACCESSOR } from '@angular/forms'; import { DomSanitizer, SafeUrl } from '@angular/platform-browser'; import { NGXLogger } from 'ngx-logger'; import { finalize, tap } from 'rxjs/operators'; import { PropertyApi } from '../../core/decorators/api'; import { Shape } from '../../core/enums/shape'; import { UI } from '../../core/enums/ui'; var Pages; (function (Pages) { Pages[Pages["view"] = 1] = "view"; Pages[Pages["crop"] = 2] = "crop"; })(Pages || (Pages = {})); let ImageUploaderComponent = ImageUploaderComponent_1 = class ImageUploaderComponent { constructor(fb, logger, sanitizer) { this.fb = fb; this.logger = logger; this.sanitizer = sanitizer; this.ui = UI; this.pages = Pages; this.host = 'jnt-image-uploader-host'; this.progress = { uploading: false }; this.page = Pages.view; this.form = this.fb.group({ cropping: [] }); this.shape = UI.shape.square; this.width = 200; this.height = 200; this.onChange = () => this.logger.error('value accessor is not registered'); this.onTouched = () => this.logger.error('value accessor is not registered'); this.registerOnChange = fn => this.onChange = fn; this.registerOnTouched = fn => this.onTouched = fn; this.onBlur = () => this.onTouched(); } writeValue(image) { this.logger.debug('write value ', image); this.image = image; } crop({ target }) { this.file = target.files[0]; let fr = new FileReader(); fr.onload = ({ target: { result } }) => { this.sketch = this.sanitizer.bypassSecurityTrustUrl(result.toString()); this.page = Pages.crop; }; fr.readAsDataURL(this.file); } upload() { let fd = new FormData(); fd.append('file', this.file, this.file.name); const { cropping } = this.form.getRawValue(); this.progress.uploading = true; this.uploader(Object.assign(Object.assign({}, cropping), { width: this.width, height: this.height, file: this.file })).pipe(finalize(() => this.progress.uploading = false), tap(image => this.logger.debug('image uploaded ', image))).subscribe(image => { this.image = image; this.onChange(image); this.page = Pages.view; }); } cancel() { this.page = Pages.view; } }; ImageUploaderComponent.ctorParameters = () => [ { type: FormBuilder }, { type: NGXLogger }, { type: DomSanitizer } ]; __decorate([ HostBinding('attr.host'), __metadata("design:type", Object) ], ImageUploaderComponent.prototype, "host", void 0); __decorate([ PropertyApi({ description: 'Upload function', type: 'Function' }), Input(), __metadata("design:type", Function) ], ImageUploaderComponent.prototype, "uploader", void 0); __decorate([ PropertyApi({ description: 'Avatar shape', path: 'ui.shape', default: Shape.circle, options: [Shape.circle, Shape.square] }), Input(), __metadata("design:type", Object) ], ImageUploaderComponent.prototype, "shape", void 0); __decorate([ PropertyApi({ description: 'Width of uploader', type: 'number', default: 200 }), Input(), __metadata("design:type", Object) ], ImageUploaderComponent.prototype, "width", void 0); __decorate([ PropertyApi({ description: 'Width of uploader', type: 'number', default: 200 }), Input(), __metadata("design:type", Object) ], ImageUploaderComponent.prototype, "height", void 0); __decorate([ ContentChild('imageTemplate'), __metadata("design:type", TemplateRef) ], ImageUploaderComponent.prototype, "imageTemplate", void 0); __decorate([ HostListener('blur'), __metadata("design:type", Object) ], ImageUploaderComponent.prototype, "onBlur", void 0); ImageUploaderComponent = ImageUploaderComponent_1 = __decorate([ Component({ selector: 'jnt-image-uploader', template: "<ng-template #defaultImageTemplate let-image=\"image\">\n <jnt-picture child-of=\"jnt-image-uploader-host\" [src]=\"image\"\n [fit]=\"ui.fit.width\"\n width=\"{{width}}px\"\n height=\"{{height}}px\"></jnt-picture>\n</ng-template>\n\n<ng-container [ngSwitch]=\"page\">\n <ng-container *ngSwitchCase=\"pages.view\">\n <input child-of=\"jnt-image-uploader-host\" data-select-file type=\"file\" (change)=\"crop($event)\" />\n <ng-container *ngTemplateOutlet=\"imageTemplate\n || defaultImageTemplate;context: {image: image}\">\n </ng-container>\n </ng-container>\n <ng-container *ngSwitchCase=\"pages.crop\">\n <jnt-form child-of=\"jnt-image-uploader-host\" [formGroup]=\"form\" data-cropper\n [state]=\"progress.uploading ? ui.state.loading : null\">\n <jnt-form-item child-of=\"jnt-image-uploader-host\" >\n <jnt-form-control child-of=\"jnt-image-uploader-host\" name=\"cropping\">\n <jnt-image-cropper child-of=\"jnt-image-uploader-host\" formControlName=\"cropping\" [shape]=\"shape\"\n [url]=\"sketch\"></jnt-image-cropper>\n </jnt-form-control>\n </jnt-form-item>\n <ng-template #formFooterTemplate>\n <jnt-stack child-of=\"jnt-image-uploader-host\" [orientation]=\"ui.orientation.horizontal\"\n [justify]=\"ui.justify.between\">\n <jnt-button child-of=\"jnt-image-uploader-host\" text=\"\u041E\u0442\u043C\u0435\u043D\u0430\"\n [icon]=\"ui.icons.cancel\"\n [scheme]=\"ui.scheme.secondary\"\n (click)=\"cancel()\"></jnt-button>\n <jnt-button child-of=\"jnt-image-uploader-host\" text=\"\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044C\"\n [icon]=\"ui.icons.save\"\n (click)=\"upload()\"></jnt-button>\n </jnt-stack>\n </ng-template>\n </jnt-form>\n </ng-container>\n</ng-container>", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ImageUploaderComponent_1), multi: true } ] }), __metadata("design:paramtypes", [FormBuilder, NGXLogger, DomSanitizer]) ], ImageUploaderComponent); export { ImageUploaderComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtdXBsb2FkZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGp1bnRlL3VpLyIsInNvdXJjZXMiOlsibGliL2Zvcm1zL2ltYWdlLXVwbG9hZGVyL2ltYWdlLXVwbG9hZGVyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkgsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUV2QyxPQUFPLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0MsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBWXpDLElBQUssS0FHSjtBQUhELFdBQUssS0FBSztJQUNSLGlDQUFRLENBQUE7SUFDUixpQ0FBUSxDQUFBO0FBQ1YsQ0FBQyxFQUhJLEtBQUssS0FBTCxLQUFLLFFBR1Q7QUFhRCxJQUFhLHNCQUFzQiw4QkFBbkMsTUFBYSxzQkFBc0I7SUEyRGpDLFlBQW9CLEVBQWUsRUFDZixNQUFpQixFQUNqQixTQUF1QjtRQUZ2QixPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNqQixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBM0QzQyxPQUFFLEdBQUcsRUFBRSxDQUFDO1FBQ1Is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WUFBWSxDQUFDLE1BQU0sQ0FBQzs7c0RBQWlDO0FBekQzQyxzQkFBc0I7SUFYbEMsU0FBUyxDQUFDO1FBQ1QsUUFBUSxFQUFFLG9CQUFvQjtRQUM5Qiw4cEVBQWlEO1FBQ2pELFNBQVMsRUFBRTtZQUNUO2dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7Z0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsd0JBQXNCLENBQUM7Z0JBQ3JELEtBQUssRUFBRSxJQUFJO2FBQ1o7U0FDRjtLQUNGLENBQUM7cUNBNER3QixXQUFXO1FBQ1AsU0FBUztRQUNOLFlBQVk7R0E3RGhDLHNCQUFzQixDQXdHbEM7U0F4R1ksc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIGZvcndhcmRSZWYsIEhvc3RCaW5kaW5nLCBIb3N0TGlzdGVuZXIsIElucHV0LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1CdWlsZGVyLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgTkdYTG9nZ2VyIH0gZnJvbSAnbmd4LWxvZ2dlcic7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaW5hbGl6ZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgUHJvcGVydHlBcGkgfSBmcm9tICcuLi8uLi9jb3JlL2RlY29yYXRvcnMvYXBpJztcbmltcG9ydCB7IFNoYXBlIH0gZnJvbSAnLi4vLi4vY29yZS9lbnVtcy9zaGFwZSc7XG5pbXBvcnQgeyBVSSB9IGZyb20gJy4uLy4uL2NvcmUvZW51bXMvdWknO1xuXG5leHBvcnQgdHlwZSBVcGxvYWRJbWFnZURhdGEgPSB7XG4gIGxlZnQ6IG51bWJlcjtcbiAgdG9wOiBudW1iZXI7XG4gIHNjYWxlOiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xuICBmaWxlOiBGaWxlO1xufVxuXG5cbmVudW0gUGFnZXMge1xuICB2aWV3ID0gMSxcbiAgY3JvcCA9IDJcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnam50LWltYWdlLXVwbG9hZGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ltYWdlLXVwbG9hZGVyLmVuY2Fwc3VsYXRlZC5odG1sJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJbWFnZVVwbG9hZGVyQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEltYWdlVXBsb2FkZXJDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgdWkgPSBVSTtcbiAgcGFnZXMgPSBQYWdlcztcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmhvc3QnKSByZWFkb25seSBob3N0ID0gJ2pudC1pbWFnZS11cGxvYWRlci1ob3N0JztcblxuICBwcml2YXRlIGZpbGU6IEZpbGU7XG5cbiAgcHJvZ3Jlc3MgPSB7dXBsb2FkaW5nOiBmYWxzZX07XG4gIHBhZ2UgPSBQYWdlcy52aWV3O1xuXG4gIGltYWdlOiBzdHJpbmc7XG4gIHNrZXRjaDogU2FmZVVybDtcblxuICBmb3JtID0gdGhpcy5mYi5ncm91cCh7XG4gICAgY3JvcHBpbmc6IFtdXG4gIH0pO1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdVcGxvYWQgZnVuY3Rpb24nLFxuICAgIHR5cGU6ICdGdW5jdGlvbidcbiAgfSlcbiAgQElucHV0KClcbiAgdXBsb2FkZXI6IChkYXRhOiBVcGxvYWRJbWFnZURhdGEpID0+IE9ic2VydmFibGU8c3RyaW5nPjtcblxuICBAUHJvcGVydHlBcGkoe1xuICAgIGRlc2NyaXB0aW9uOiAnQXZhdGFyIHNoYXBlJyxcbiAgICBwYXRoOiAndWkuc2hhcGUnLFxuICAgIGRlZmF1bHQ6IFNoYXBlLmNpcmNsZSxcbiAgICBvcHRpb25zOiBbU2hhcGUuY2lyY2xlLCBTaGFwZS5zcXVhcmVdXG4gIH0pXG4gIEBJbnB1dCgpXG4gIHNoYXBlID0gVUkuc2hhcGUuc3F1YXJlO1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdXaWR0aCBvZiB1cGxvYWRlcicsXG4gICAgdHlwZTogJ251bWJlcicsXG4gICAgZGVmYXVsdDogMjAwXG4gIH0pXG4gIEBJbnB1dCgpXG4gIHdpZHRoID0gMjAwO1xuXG4gIEBQcm9wZXJ0eUFwaSh7XG4gICAgZGVzY3JpcHRpb246ICdXaWR0aCBvZiB1cGxvYWRlcicsXG4gICAgdHlwZTogJ251bWJlcicsXG4gICAgZGVmYXVsdDogMjAwXG4gIH0pXG4gIEBJbnB1dCgpXG4gIGhlaWdodCA9IDIwMDtcblxuICBAQ29udGVudENoaWxkKCdpbWFnZVRlbXBsYXRlJylcbiAgaW1hZ2VUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcblxuICBvbkNoYW5nZTogKGltYWdlOiBzdHJpbmcpID0+IHZvaWQgPSAoKSA9PiB0aGlzLmxvZ2dlci5lcnJvcigndmFsdWUgYWNjZXNzb3IgaXMgbm90IHJlZ2lzdGVyZWQnKTtcbiAgb25Ub3VjaGVkOiAoKSA9PiB2b2lkID0gKCkgPT4gdGhpcy5sb2dnZXIuZXJyb3IoJ3ZhbHVlIGFjY2Vzc29yIGlzIG5vdCByZWdpc3RlcmVkJyk7XG4gIHJlZ2lzdGVyT25DaGFuZ2UgPSBmbiA9PiB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIHJlZ2lzdGVyT25Ub3VjaGVkID0gZm4gPT4gdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgQEhvc3RMaXN0ZW5lcignYmx1cicpIG9uQmx1ciA9ICgpID0+IHRoaXMub25Ub3VjaGVkKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgbG9nZ2VyOiBOR1hMb2dnZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHtcbiAgfVxuXG4gIHdyaXRlVmFsdWUoaW1hZ2U6IHN0cmluZykge1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKCd3cml0ZSB2YWx1ZSAnLCBpbWFnZSk7XG4gICAgdGhpcy5pbWFnZSA9IGltYWdlO1xuXG4gIH1cblxuICBjcm9wKHt0YXJnZXR9OiB7IHRhcmdldDogSFRNTElucHV0RWxlbWVudCB9KSB7XG4gICAgdGhpcy5maWxlID0gdGFyZ2V0LmZpbGVzWzBdO1xuICAgIGxldCBmciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgZnIub25sb2FkID0gKHt0YXJnZXQ6IHtyZXN1bHR9fTogUHJvZ3Jlc3NFdmVudDxGaWxlUmVhZGVyPikgPT4ge1xuICAgICAgdGhpcy5za2V0Y2ggPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0VXJsKHJlc3VsdC50b1N0cmluZygpKTtcbiAgICAgIHRoaXMucGFnZSA9IFBhZ2VzLmNyb3A7XG4gICAgfTtcbiAgICBmci5yZWFkQXNEYXRhVVJMKHRoaXMuZmlsZSk7XG4gIH1cblxuICB1cGxvYWQoKSB7XG4gICAgbGV0IGZkID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgZmQuYXBwZW5kKCdmaWxlJywgdGhpcy5maWxlLCB0aGlzLmZpbGUubmFtZSk7XG4gICAgY29uc3Qge2Nyb3BwaW5nfSA9IHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpO1xuICAgIHRoaXMucHJvZ3Jlc3MudXBsb2FkaW5nID0gdHJ1ZTtcbiAgICB0aGlzLnVwbG9hZGVyKHtcbiAgICAgIC4uLmNyb3BwaW5nLFxuICAgICAgd2lkdGg6IHRoaXMud2lkdGgsXG4gICAgICBoZWlnaHQ6IHRoaXMuaGVpZ2h0LFxuICAgICAgZmlsZTogdGhpcy5maWxlXG4gICAgfSBhcyBVcGxvYWRJbWFnZURhdGEpLnBpcGUoXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLnByb2dyZXNzLnVwbG9hZGluZyA9IGZhbHNlKSxcbiAgICAgIHRhcChpbWFnZSA9PiB0aGlzLmxvZ2dlci5kZWJ1ZygnaW1hZ2UgdXBsb2FkZWQgJywgaW1hZ2UpKVxuICAgICkuc3Vic2NyaWJlKGltYWdlID0+IHtcbiAgICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTtcbiAgICAgIHRoaXMub25DaGFuZ2UoaW1hZ2UpO1xuICAgICAgdGhpcy5wYWdlID0gUGFnZXMudmlldztcbiAgICB9KTtcbiAgfVxuXG4gIGNhbmNlbCgpIHtcbiAgICB0aGlzLnBhZ2UgPSBQYWdlcy52aWV3O1xuICB9XG5cbn1cbiJdfQ==