{"version":3,"file":"asoftwareworld-form-builder-pro-image-drawing.mjs","sources":["../../src/components/image-drawing/image-drawing.ts","../../src/components/image-drawing/image-drawing.html","../../src/components/image-drawing/image-drawing.module.ts","../../src/components/image-drawing/public_api.ts","../../src/components/image-drawing/asoftwareworld-form-builder-pro-image-drawing.ts"],"sourcesContent":["/**\n * @license\n * Copyright ASW (A Software World) All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file\n */\nimport { Component, EventEmitter, Inject, Input, OnChanges, OnInit, Output, SimpleChanges, TemplateRef } from '@angular/core';\nimport { NgForm } from '@angular/forms';\nimport { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';\nimport { Constants, Icons } from '@asoftwareworld/form-builder-pro/common';\nimport { fabric } from 'fabric';\n\n@Component({\n    selector: 'asw-image-drawing',\n    styleUrls: ['./image-drawing.scss'],\n    templateUrl: './image-drawing.html'\n})\nexport class AswImageDrawing implements OnInit, OnChanges {\n    @Input() public src?: string;\n    @Input() public width = 680;\n    @Input() public height = 250;\n\n    @Input() public forceSizeCanvas = true;\n    @Input() public forceSizeExport = true;\n    @Input() public enableRemoveImage = true;\n    @Input() public enableLoadAnotherImage = true;\n    @Input() public enableTooltip = true;\n    @Input() public showCancelButton = true;\n\n    /* @deprecated Use i18n.saveBtn */\n    @Input() public saveBtnText = 'Save';\n    /* @deprecated Use i18n.cancelBtn */\n    @Input() public cancelBtnText = 'Cancel';\n    /* @deprecated Use i18n.loading */\n    @Input() public loadingText = 'Loading…';\n\n    @Input() public loadingTemplate?: TemplateRef<any>;\n    @Input() public errorTemplate?: TemplateRef<any>;\n\n    @Input() public outputMimeType = 'image/jpeg';\n    @Input() public outputQuality = 0.8;\n\n    @Output() public save: EventEmitter<Blob> = new EventEmitter<Blob>();\n    @Output() public cancel: EventEmitter<void> = new EventEmitter<void>();\n\n    constant = Constants;\n    icons = Icons;\n    public currentTool = 'brush';\n    public currentSize = 3;\n    public currentColor = '#000105';\n\n    public canUndo = false;\n    public canRedo = false;\n\n    public isLoading = false;\n    public hasError = false;\n    public errorMessage = '';\n\n    private canvas!: fabric.Canvas;\n    private stack: fabric.Object[] = [];\n\n    public colorsName: string[] = [];\n\n    private imageUsed?: fabric.Image;\n\n    constructor(\n        public dialogRef: MatDialogRef<AswImageDrawing>,\n        @Inject(MAT_DIALOG_DATA) public control: any\n    ) {}\n\n    public ngOnInit(): void {\n        if (this.control.controlType === 'signature') {\n            this.enableLoadAnotherImage = false;\n        }\n        this.src = this.control.imageUrl;\n        this.colorsName = Object.keys(this.constant.colors);\n        this.canvas = new fabric.Canvas('aswCanvas', {\n            hoverCursor: 'pointer',\n            isDrawingMode: true\n        });\n        this.canvas.backgroundColor = 'white';\n\n        if (this.src) {\n            this.importPhotoFromSrc(this.src);\n        } else {\n            if (!this.width || !this.height) {\n                throw new Error('No width or hight given !');\n            }\n\n            this.canvas.setWidth(this.width);\n            this.canvas.setHeight(this.height);\n        }\n\n        this.canvas.on('path:created', () => {\n            this.stack = [];\n            this.setUndoRedo();\n        });\n\n        this.selectTool(this.currentTool);\n        this.selectColor(this.currentColor);\n        this.selectDrawingSize(this.currentSize);\n    }\n\n    // Tools\n    public selectTool(tool: string): void {\n        this.currentTool = tool;\n    }\n\n    public selectDrawingSize(size: number): void {\n        this.currentSize = size;\n        if (this.canvas) {\n            this.canvas.freeDrawingBrush.width = size;\n        }\n    }\n\n    public selectColor(color: string): void {\n        this.currentColor = color;\n        if (this.canvas) {\n            this.canvas.freeDrawingBrush.color = color;\n        }\n    }\n\n    /**\n     * Change color from input\n     */\n    public changeColorManual(color: string): void {\n        const isValid = /(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(color);\n\n        if (isValid) {\n            this.currentColor = color;\n            this.selectColor(this.currentColor);\n        }\n    }\n\n    // Actions\n\n    public undo(): void {\n        if (this.canUndo) {\n            const lastId = this.canvas.getObjects().length - 1;\n            const lastObj = this.canvas.getObjects()[lastId];\n            this.stack.push(lastObj);\n            this.canvas.remove(lastObj);\n            this.setUndoRedo();\n        }\n    }\n\n    public redo(): void {\n        if (this.canRedo) {\n            const firstInStack = this.stack.splice(-1, 1)[0];\n            if (firstInStack) {\n                this.canvas.insertAt(firstInStack, this.canvas.getObjects().length - 1, false);\n            }\n            this.setUndoRedo();\n        }\n    }\n\n    public clearCanvas(): void {\n        if (this.canvas) {\n            this.canvas.remove(...this.canvas.getObjects());\n            this.setUndoRedo();\n        }\n    }\n\n    public saveImage(): void {\n        this.canvas.getElement().toBlob(\n            (data: any) => {\n                const reader = new FileReader();\n                reader.readAsDataURL(data);\n                reader.onloadend = () => {\n                    const base64data = reader.result;\n                    this.control.imageUrl = base64data;\n                };\n            },\n            this.outputMimeType,\n            this.outputQuality\n        );\n    }\n\n    private setUndoRedo(): void {\n        this.canUndo = this.canvas.getObjects().length > 0;\n        this.canRedo = this.stack.length > 0;\n        // this.canvas.renderAll();\n    }\n\n    public importPhotoFromFile(event: Event | any): void {\n        if (event.target.files && event.target.files.length > 0) {\n            const file = event.target.files[0];\n            if (file.type.match('image.*')) {\n                this.importPhotoFromBlob(file);\n            } else {\n                throw new Error('Not an image !');\n            }\n        }\n    }\n\n    public removeImage(): void {\n        if (this.imageUsed) {\n            this.imageUsed.dispose();\n            this.imageUsed = null as any;\n        }\n        this.canvas.backgroundImage = null as any;\n\n        if (this.width && this.height) {\n            this.canvas.setWidth(this.width);\n            this.canvas.setHeight(this.height);\n        }\n\n        this.canvas.renderAll();\n    }\n\n    public get hasImage(): boolean {\n        return !!this.canvas.backgroundImage;\n    }\n\n    private importPhotoFromSrc(src: string): void {\n        this.isLoading = true;\n        let isFirstTry = true;\n        const imgEl = new Image();\n        imgEl.setAttribute('crossOrigin', 'anonymous');\n        imgEl.src = src;\n        imgEl.onerror = () => {\n            // Retry with cors proxy\n            if (isFirstTry) {\n                imgEl.src = 'https://cors-anywhere.herokuapp.com/' + this.src;\n                isFirstTry = false;\n            } else {\n                this.isLoading = false;\n                this.hasError = true;\n                // this.errorMessage = this.getTextTranslated('loadError').replace('%@', this.src as string);\n            }\n        };\n        imgEl.onload = () => {\n            this.isLoading = false;\n            this.imageUsed = new fabric.Image(imgEl);\n\n            this.imageUsed.cloneAsImage((image: any) => {\n                let width = imgEl.width;\n                let height = imgEl.height;\n                const ratio = 640 / width < 480 / height ? 640 / width : 480 / width;\n                width = width * ratio;\n                height = height * ratio;\n\n                image.scaleToWidth(width, false);\n                image.scaleToHeight(height, false);\n\n                this.canvas.setBackgroundImage(\n                    image,\n                    (img: HTMLImageElement) => {\n                        if (img) {\n                            if (this.forceSizeCanvas) {\n                                this.canvas.setWidth(width);\n                                this.canvas.setHeight(height);\n                            } else {\n                                this.canvas.setWidth(image.getScaledWidth());\n                                this.canvas.setHeight(image.getScaledHeight());\n                            }\n                        }\n                    },\n                    {\n                        crossOrigin: 'anonymous',\n                        originX: 'left',\n                        originY: 'top'\n                    }\n                );\n            });\n        };\n    }\n\n    private importPhotoFromBlob(file: Blob | File): void {\n        const reader = new FileReader();\n        reader.readAsDataURL(file);\n        reader.onload = (evtReader: any) => {\n            if (evtReader.target.readyState === FileReader.DONE) {\n                this.importPhotoFromSrc(evtReader.target.result);\n            }\n        };\n    }\n\n    ngOnChanges(changes: SimpleChanges): void {\n        if (changes.src && !changes.src.firstChange && changes.src.currentValue) {\n            if (typeof changes.src.currentValue === 'string') {\n                this.importPhotoFromSrc(changes.src.currentValue);\n            } else if (changes.src.currentValue instanceof Blob) {\n                this.importPhotoFromBlob(changes.src.currentValue);\n            }\n        }\n    }\n\n    onNoClick(): void {\n        this.dialogRef.close();\n    }\n\n    onSubmit(aswEditPropertyForm: NgForm): void {\n        if (aswEditPropertyForm.invalid) {\n            return;\n        }\n        this.saveImage();\n        this.dialogRef.close(this.control);\n    }\n}\n","<div class=\"asw-dialog-header\">\r\n    <div class=\"asw-edit-row-dialog\">\r\n        <div class=\"asw-dialog-header clearfix\">\r\n            <div class=\"asw-dialog-about\">\r\n                <h1 mat-dialog-title class=\"asw-m-0\">{{'FormControl.Edit' | aswTranslate}} {{control.label | aswTranslate}}</h1>\r\n            </div>\r\n        </div>\r\n    </div>\r\n    <button mat-icon-button (click)=\"onNoClick()\" aria-label=\"Close dialog\" class=\"asw-mt-2 asw-me-2\">\r\n        <div [innerHTML]=\"icons.close | aswSafeHtml\"></div>\r\n    </button>\r\n</div>\r\n<form #aswEditPropertyForm=\"ngForm\" (ngSubmit)=\"onSubmit(aswEditPropertyForm)\" novalidate>\r\n    <mat-dialog-content class=\"mat-typography\">\r\n        <div class=\"asw-row asw-p-2\">\r\n            <div class=\"asw-col-md-9\">\r\n                <mat-card>\r\n                    <mat-card-content>\r\n                        <div class=\"loading\" *ngIf=\"isLoading\">\r\n                            <ng-container *ngTemplateOutlet=\"loadingTemplate ? loadingTemplate : defaultLoading\"></ng-container>\r\n                        </div>\r\n                        <div class=\"error\" *ngIf=\"hasError\">\r\n                            <ng-container *ngTemplateOutlet=\"errorTemplate ? errorTemplate : defaultError\"></ng-container>\r\n                        </div>                        \r\n                        <ng-template #defaultLoading><p>{{ loadingText }}</p></ng-template>\r\n                        <ng-template #defaultError> <p>{{ errorMessage }}</p> </ng-template>\r\n                        <canvas #aswCanvas id=\"aswCanvas\" class=\"asw-drawing-canvas\"></canvas>\r\n                    </mat-card-content>\r\n                </mat-card>\r\n            </div>\r\n            <div class=\"asw-col-md-3\" *ngIf=\"!isLoading\">\r\n                <div class=\"asw-sticky-top\">\r\n                    <mat-card>\r\n                        <mat-card-content>\r\n                            <h6 class=\"asw-fs-6 asw-my-2\">{{'FormControl.Options' | aswTranslate}}:</h6>\r\n                            <div class=\"asw-row\">\r\n                                <div class=\"asw-col-md-12 asw-d-grid\">\r\n                                    <button class=\"asw-button asw-button-primary\" type=\"button\"\r\n                                        *ngIf=\"enableLoadAnotherImage && !hasImage\" \r\n                                        (click)=\"fileInput.click();\"\r\n                                        matTooltip=\"{{'FormControl.LoadImage' | aswTranslate}}\">\r\n                                        <input style=\"display: none\" \r\n                                            type=\"file\" \r\n                                            #fileInput \r\n                                            (change)=\"importPhotoFromFile($event)\"\r\n                                            accept=\"image/*\"/>\r\n                                        {{'FormControl.LoadImage' | aswTranslate}}\r\n                                    </button>\r\n                                    <button class=\"asw-button asw-button-primary\" type=\"button\"\r\n                                        *ngIf=\"enableRemoveImage && hasImage\" \r\n                                        (click)=\"removeImage()\"\r\n                                        matTooltip=\"{{'FormControl.RemoveImage' | aswTranslate}}\">\r\n                                        {{'FormControl.RemoveImage' | aswTranslate}}\r\n                                    </button>\r\n                                </div>\r\n                                <h6 class=\"asw-fs-6 asw-my-2\">{{'FormControl.BrushSize' | aswTranslate}}:</h6>\r\n                                <ul class=\"asw-options\">\r\n                                    <li class=\"option tool\" style=\"display: none\"\r\n                                        [class.selected]=\"currentTool == 'brush'\" \r\n                                        (click)=\"selectTool('brush')\"\r\n                                        id=\"brush\">\r\n                                        <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14.445\" height=\"14.462\" viewBox=\"0 0 14.445 14.462\">\r\n                                            <path id=\"Path_153\" data-name=\"Path 153\" d=\"M8.319,8.378l6.014-6.535a.4.4,0,0,0-.024-.577L13.155.111a.4.4,0,0,0-.553,0L6.066,6.125a.4.4,0,0,0,0,.577L7.742,8.378a.4.4,0,0,0,.577,0Zm-3.44-.89,2.093,2.1a.8.8,0,0,1,.249.457v.393a3.208,3.208,0,0,1-.938,2.277,6.223,6.223,0,0,1-4.739,1.732,2.326,2.326,0,0,1-1.427-.481.4.4,0,0,1-.048-.505,4.772,4.772,0,0,0,.714-2.609A3.626,3.626,0,0,1,1.744,8.17a3.208,3.208,0,0,1,2.269-.938,3.134,3.134,0,0,1,.393,0A.874.874,0,0,1,4.879,7.488Z\" fill=\"#5a6168\" fill-rule=\"evenodd\"/>\r\n                                        </svg>\r\n                                        <span>{{'FormControl.Brush' | aswTranslate}}</span>\r\n                                    </li>\r\n                                    <li class=\"option\">\r\n                                        <input type=\"range\" \r\n                                            [(ngModel)]=\"currentSize\"\r\n                                            #input=\"ngModel\"\r\n                                            name=\"sliders\"\r\n                                            id=\"size-slider\"\r\n                                            (change)=\"selectDrawingSize(currentSize)\"\r\n                                            max=\"30\">\r\n                                    </li>\r\n                                </ul>\r\n                            </div>\r\n                            <br>\r\n                            <div class=\"asw-pb-2\">\r\n                                <mat-button-toggle-group class=\"asw-width-100\">\r\n                                    <mat-button-toggle matTooltip=\"{{'editor.Undo' | aswTranslate}}\"\r\n                                            [disabled]=\"!canUndo\"\r\n                                            class=\"asw-width-100\"\r\n                                            (change)=\"undo()\">\r\n                                            <span [ngClass]=\"{'asw-icon-disabled': !canUndo }\" [innerHTML]=\"icons.undo | aswSafeHtml\"></span>\r\n                                        {{'editor.Undo' | aswTranslate}}\r\n                                    </mat-button-toggle>\r\n                                    <mat-button-toggle matTooltip=\"{{'editor.Redo' | aswTranslate}}\"\r\n                                            [disabled]=\"!canRedo\"\r\n                                            class=\"asw-width-100\"\r\n                                            (change)=\"redo()\">\r\n                                            <span [ngClass]=\"{'asw-icon-disabled': !canRedo }\" [innerHTML]=\"icons.redo | aswSafeHtml\"></span>\r\n                                        {{'editor.Redo' | aswTranslate}}\r\n                                    </mat-button-toggle>\r\n                                </mat-button-toggle-group>\r\n                            </div>\r\n                            <mat-divider></mat-divider>\r\n                            <h6 class=\"asw-fs-6 asw-my-2\">{{'FormControl.Colors' | aswTranslate}}:</h6>\r\n                            <div class=\"asw-color-picker\">\r\n                                <div class=\"opened\">\r\n                                    <div class=\"colors\">\r\n                                        <div [ngClass]=\"colorName\" \r\n                                            [class.selected]=\"currentColor == constant.colors[colorName]\"\r\n                                            (click)=\"selectColor(constant.colors[colorName])\" \r\n                                            *ngFor=\"let colorName of colorsName\" \r\n                                            class=\"circle\"\r\n                                            [style.background]=\"constant.colors[colorName]\">\r\n                                        </div>\r\n                                    </div>\r\n                                    <div class=\"asw-hex-code\">\r\n                                        <p>Hex Code</p>\r\n                                        <div class=\"asw-input\">\r\n                                        <input type=\"text\" maxlength=\"7\" [value]=\"currentColor\"\r\n                                                (keyup)=\"changeColorManual(paintInput.value)\"\r\n                                                #paintInput/>\r\n                                        </div>\r\n                                    </div>\r\n                                </div>\r\n                            </div>\r\n                            <mat-divider></mat-divider>\r\n                            <div class=\"asw-row asw-pt-2\">\r\n                                <div class=\"asw-col-md-12  asw-d-grid\">\r\n                                    <button class=\"asw-button asw-button-outline-secondary\" \r\n                                        type=\"button\"\r\n                                        matTooltip=\"{{'FormControl.ClearCanvas' | aswTranslate}}\"\r\n                                        (click)=\"clearCanvas()\">\r\n                                        {{'FormControl.ClearCanvas' | aswTranslate}}\r\n                                    </button>\r\n                                </div>\r\n                            </div>\r\n                        </mat-card-content>\r\n                    </mat-card>\r\n                </div>\r\n            </div>\r\n        </div>\r\n    </mat-dialog-content>\r\n    <mat-dialog-actions align=\"end\">\r\n        <button type=\"button\"\r\n                class=\"asw-button asw-button-danger asw-me-2 asw-mb-1\"\r\n                (click)=\"onNoClick()\">\r\n            No\r\n        </button>\r\n        <button type=\"submit\"\r\n                class=\"asw-button asw-button-primary asw-mb-1\"\r\n                cdkFocusInitial>\r\n            Yes\r\n        </button>\r\n    </mat-dialog-actions>\r\n</form>\r\n","/**\n * @license\n * Copyright ASW (A Software World) All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file\n */\nimport { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { AswPipeModule, MaterialModule } from '@asoftwareworld/form-builder-pro/common';\nimport { AswTranslateModule } from '@asoftwareworld/form-builder-pro/core';\nimport { AswImageDrawing } from './image-drawing';\n\n@NgModule({\n    declarations: [AswImageDrawing],\n    exports: [AswImageDrawing],\n    imports: [CommonModule, FormsModule, MaterialModule, AswTranslateModule, AswPipeModule]\n})\nexport class AswImageDrawingModule {}\n","/**\n * @license\n * Copyright ASW (A Software World) All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file\n */\n\nexport * from './image-drawing.module';\nexport * from './image-drawing';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}