{"version":3,"file":"seniorsistemas-angular-components-image-cropper.mjs","sources":["../../projects/angular-components/image-cropper/src/lib/image-cropper/image-cropper.component.ts","../../projects/angular-components/image-cropper/src/lib/image-cropper/image-cropper.component.html","../../projects/angular-components/image-cropper/src/lib/image-cropper/image-cropper.module.ts","../../projects/angular-components/image-cropper/src/lib/image-cropper/image-cropper.service.ts","../../projects/angular-components/image-cropper/src/seniorsistemas-angular-components-image-cropper.ts"],"sourcesContent":["import {\n    Component,\n    ContentChild,\n    ElementRef,\n    EventEmitter,\n    inject,\n    Input,\n    OnChanges,\n    OnInit,\n    Output,\n    SimpleChanges,\n    ViewChild,\n    ViewEncapsulation,\n} from '@angular/core';\nimport Cropper from 'cropperjs';\nimport { FooterComponent, HeaderComponent } from '@seniorsistemas/angular-components/structure';\nimport { isNullOrUndefined } from '@seniorsistemas/angular-components/utils';\nimport { ActiveDialog } from '@seniorsistemas/angular-components/dialog';\n\n/**\n * @description Componente de recorte de imagem que integra a biblioteca `cropperjs`.\n * Exibe um dialog com uma área interativa para selecionar, recortar e remover imagens,\n * suportando razão de aspecto configurável, formato circular e templates de cabeçalho/rodapé.\n *\n * @example\n * ```html\n * <s-image-cropper\n *   [(visible)]=\"dialogAberto\"\n *   [imageSource]=\"urlDaImagem\"\n *   [aspectRatio]=\"1\"\n *   (croppedImage)=\"onCroppedImage($event)\" />\n * ```\n *\n * @category Inputs\n */\n@Component({\n    selector: 's-image-cropper',\n    templateUrl: './image-cropper.component.html',\n    styleUrls: ['./image-cropper.component.scss'],\n    encapsulation: ViewEncapsulation.None,\n})\nexport class ImageCropperComponent implements OnInit, OnChanges {\n    activeDialog = inject(ActiveDialog, { optional: true });\n    public static nextId = 0;\n\n    /** @description Identificador único do componente no DOM. Gerado automaticamente se não informado. */\n    @Input()\n    public id = `s-image-cropper-${ImageCropperComponent.nextId++}`;\n\n    /** @description Controla a visibilidade do dialog de corte. @default false */\n    @Input()\n    public visible = false;\n\n    /** @description Título exibido no cabeçalho do dialog. @default 'Recortar imagem' */\n    @Input()\n    public header = 'Recortar imagem';\n\n    /** @description Rótulo do botão de confirmar o corte. @default 'Recortar' */\n    @Input()\n    public cropLabel = 'Recortar';\n\n    /** @description Rótulo do botão de trocar a imagem. @default 'Trocar' */\n    @Input()\n    public selectAnotherLabel = 'Trocar';\n\n    /** @description Rótulo do botão de remover a imagem. @default 'Remover' */\n    @Input()\n    public removeLabel = 'Remover';\n\n    /** @description Rótulo do botão de cancelar. @default 'Cancelar' */\n    @Input()\n    public cancelLabel = 'Cancelar';\n\n    /** @description Título do empty state quando nenhuma imagem foi selecionada. */\n    @Input()\n    public emptyStateTitle = 'Selecione uma foto, em seguida você poderá ajustá-la';\n\n    /** @description Rótulo do botão de ação do empty state. @default 'Escolher imagem' */\n    @Input()\n    public emptyStateActionLabel = 'Escolher imagem';\n\n    /** @description Classe do ícone exibido no empty state. @default 'fa fa-picture-o' */\n    @Input()\n    public emptyStateIconClass = 'fa fa-picture-o';\n\n    /** @description Razão de aspecto para o recorte (ex.: `1` para quadrado, `16/9`). @default NaN (livre) */\n    @Input()\n    public aspectRatio = NaN;\n\n    /** @description Quando `true`, exibe a área de recorte no formato circular. @default false */\n    @Input()\n    public rounded = false;\n\n    /** @description Exibe o botão para trocar a imagem selecionada. @default true */\n    @Input()\n    public allowSelectAnother = true;\n\n    /** @description Exibe o botão para remover a imagem. @default true */\n    @Input()\n    public allowRemove = true;\n\n    /** @description Exibe o botão para cancelar o recorte. @default true */\n    @Input()\n    public allowCancel = true;\n\n    /** @description URL ou base64 da imagem a ser carregada no cropper. */\n    @Input()\n    public imageSource?: string;\n\n    /** @description Emitido quando o valor de `visible` muda, habilitando two-way binding com `[(visible)]`. */\n    @Output()\n    public visibleChange = new EventEmitter<boolean>();\n\n    /** @description Emitido quando o usuário troca a imagem selecionada. */\n    @Output()\n    public changeImage = new EventEmitter();\n\n    /** @description Emitido com a imagem recortada em formato base64 string. */\n    @Output()\n    public croppedImage = new EventEmitter<string>();\n\n    /** @description Emitido com o `HTMLCanvasElement` resultante do recorte. */\n    @Output()\n    public croppedCanvas = new EventEmitter<HTMLCanvasElement>();\n\n    /** @description Emitido quando o usuário confirma a remoção da imagem. */\n    @Output()\n    public removedImage = new EventEmitter();\n\n    /** @description Emitido quando o usuário cancela o recorte. */\n    @Output()\n    // eslint-disable-next-line @angular-eslint/no-output-native\n    public cancel = new EventEmitter();\n\n    @ViewChild('image', { static: true })\n    public image: ElementRef<HTMLImageElement> | null = null;\n\n    @ContentChild(HeaderComponent, { static: true })\n    public headerSection: HeaderComponent | null = null;\n\n    @ContentChild(FooterComponent, { static: true })\n    public footerSection: FooterComponent | null = null;\n\n    public cropper: Cropper | null = null;\n\n    public ngOnInit() {\n        if (this.imageSource) this.initCropper();\n    }\n\n    public ngOnChanges(changes: SimpleChanges) {\n        if (changes['imageSource'] && changes['imageSource'].currentValue) {\n            this.initCropper();\n        }\n    }\n\n    private initCropper() {\n        if (isNullOrUndefined(this.image)) {\n            return;\n        }\n        if (this.cropper) {\n            this.cropper.destroy();\n        }\n        this.image.nativeElement.src = this.imageSource as string;\n        this.cropper = new Cropper(this.image.nativeElement, {\n            aspectRatio: this.rounded ? 1 : this.aspectRatio,\n            guides: false,\n            dragMode: 'move' as Cropper.DragMode,\n            minCropBoxHeight: 2,\n            minCropBoxWidth: 2,\n            toggleDragModeOnDblclick: false,\n        });\n    }\n\n    public getRoundedCanvas(sourceCanvas: HTMLCanvasElement): HTMLCanvasElement | null {\n        const canvas = document.createElement('canvas');\n        const context = canvas.getContext('2d');\n\n        if (isNullOrUndefined(context)) return null;\n\n        const width = sourceCanvas.width;\n        const height = sourceCanvas.height;\n\n        canvas.width = width;\n        canvas.height = height;\n\n        context.imageSmoothingEnabled = true;\n        context.drawImage(sourceCanvas, 0, 0, width, height);\n        context.globalCompositeOperation = 'destination-in';\n        context.beginPath();\n        context.arc(width / 2, height / 2, Math.min(width, height) / 2, 0, 2 * Math.PI, true);\n        context.fill();\n\n        return canvas;\n    }\n\n    public onCropImage() {\n        if (!this.imageSource) {\n            this.croppedImage.emit();\n            this.croppedCanvas.emit();\n        } else {\n            const cropperCanvas = this.cropper?.getCroppedCanvas();\n            if (cropperCanvas) {\n                const canvas = this.rounded ? this.getRoundedCanvas(cropperCanvas) : cropperCanvas;\n                if (canvas) {\n                    this.croppedCanvas.emit(canvas);\n                    this.croppedImage.emit(canvas.toDataURL());\n                }\n            }\n        }\n        this.visible = false;\n        this.visibleChange.emit(false);\n    }\n\n    public onChangeImage() {\n        this.changeImage.emit();\n    }\n\n    public onRemoveImage() {\n        this.imageSource = undefined;\n        this.removedImage.emit();\n    }\n\n    public onCancel() {\n        this.visible = false;\n        this.visibleChange.emit(false);\n        this.cancel.emit();\n    }\n\n    public onModalVisibleChange(visible: boolean) {\n        if (!visible) this.onCancel();\n        this.visibleChange.emit(visible);\n    }\n}\n\n","<div [id]=\"id\">\n    @let roundedClass = rounded ? 's-image-cropper--rounded' : '';\n    <s-dialog\n        size=\"lg\"\n        [contentClassName]=\"'s-image-cropper ' + roundedClass\"\n        [header]=\"headerSection ? '' : header\"\n        [(visible)]=\"visible\"\n        (visibleChange)=\"onModalVisibleChange($event!)\"\n        [draggable]=\"false\"\n    >\n        @if (headerSection) {\n            <ng-template sTemplate=\"header\">\n                <ng-content select=\"s-header\"></ng-content>\n            </ng-template>\n        }\n        @if (!imageSource) {\n            <s-empty-state\n                [id]=\"id + '-empty-state'\"\n                [title]=\"emptyStateTitle\"\n                [iconClass]=\"emptyStateIconClass\"\n                [primaryActionLabel]=\"emptyStateActionLabel\"\n                (primaryAction)=\"onChangeImage()\"\n            >\n            </s-empty-state>\n        }\n        <div\n            [attr.data-hidden]=\"!imageSource\"\n            class=\"image-container\"\n        >\n            <img\n                [id]=\"id + '-cropper'\"\n                #image\n                [src]=\"imageSource || ''\"\n                alt=\"cropped image\"\n            />\n        </div>\n        <ng-template sTemplate=\"footer\">\n            @if (!footerSection) {\n                <div class=\"button-container\">\n                    @if (allowCancel) {\n                        <s-button\n                            [id]=\"id + '-cancel-button'\"\n                            type=\"button\"\n                            priority=\"link\"\n                            [label]=\"cancelLabel\"\n                            (clicked)=\"onCancel()\"\n                        >\n                        </s-button>\n                    }\n\n                    <div>\n                        @if (imageSource && allowRemove) {\n                            <s-button\n                                [id]=\"id + '-remove-button'\"\n                                type=\"button\"\n                                priority=\"secondary\"\n                                [label]=\"removeLabel\"\n                                (clicked)=\"onRemoveImage()\"\n                            >\n                            </s-button>\n                        }\n                        @if (imageSource && allowSelectAnother) {\n                            <s-button\n                                [id]=\"id + '-select-another-button'\"\n                                type=\"button\"\n                                priority=\"secondary\"\n                                [label]=\"selectAnotherLabel\"\n                                (clicked)=\"onChangeImage()\"\n                            >\n                            </s-button>\n                        }\n                        <s-button\n                            [id]=\"id + '-crop-button'\"\n                            type=\"button\"\n                            [label]=\"cropLabel\"\n                            (clicked)=\"onCropImage()\"\n                        >\n                        </s-button>\n                    </div>\n                </div>\n            }\n            @if (footerSection) {\n                <ng-content select=\"s-footer\"> </ng-content>\n            }\n        </ng-template>\n    </s-dialog>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\n\nimport { ImageCropperComponent } from './image-cropper.component';\nimport { ButtonModule } from '@seniorsistemas/angular-components/button';\nimport { StructureModule } from '@seniorsistemas/angular-components/structure';\nimport { EmptyStateModule } from '@seniorsistemas/angular-components/empty-state';\nimport { DialogComponent } from '@seniorsistemas/angular-components/dialog';\nimport { TemplateDirective, TemplateModule } from '@seniorsistemas/angular-components/template';\n\n@NgModule({\n    imports: [CommonModule, ButtonModule, EmptyStateModule, StructureModule, DialogComponent, TemplateModule],\n    declarations: [ImageCropperComponent],\n    exports: [ImageCropperComponent, StructureModule],\n})\nexport class ImageCropperModule { }\n","import { ApplicationRef, ComponentFactoryResolver, ComponentRef, EmbeddedViewRef, Injectable, Injector, inject } from '@angular/core';\n\nimport { Subject } from 'rxjs';\nimport { delay, takeUntil } from 'rxjs/operators';\n\nimport { ImageCropperComponent } from './image-cropper.component';\nimport { isNullOrUndefined } from '@seniorsistemas/angular-components/utils';\nimport { toObservable } from '@angular/core/rxjs-interop';\n\n@Injectable()\nexport class ImageCropperService {\n    private readonly _componentFactoryResolver = inject(ComponentFactoryResolver);\n    private readonly _appRef = inject(ApplicationRef);\n    private readonly _injector = inject(Injector);\n\n    public activeCropper?: ActiveCropper;\n\n    public show(config?: ImageCropperConfig): void {\n        if (this.activeCropper) this._destroy(this.activeCropper);\n\n        const activeCropper: ActiveCropper = {\n            componentRef: this._componentFactoryResolver\n                .resolveComponentFactory(ImageCropperComponent)\n                .create(this._injector),\n            ngUnsubscribe: new Subject<void>(),\n        };\n\n        this.activeCropper = activeCropper;\n\n        if (isNullOrUndefined(activeCropper.componentRef)) return;\n\n        this._appRef.attachView(activeCropper.componentRef.hostView);\n        const domElem = (activeCropper.componentRef.hostView as EmbeddedViewRef<any>).rootNodes[0] as HTMLElement;\n        document.body.appendChild(domElem);\n\n        this._configureInstance(activeCropper, config);\n        activeCropper.componentRef.instance.visible = true;\n\n        activeCropper.componentRef.instance.visibleChange\n            .pipe(takeUntil(this.activeCropper.ngUnsubscribe!), delay(1000))\n            .subscribe((visible) => {\n                if (!visible) this._destroy(activeCropper);\n            });\n    }\n\n    private _configureInstance(activeCropper: ActiveCropper, config?: ImageCropperConfig): void {\n        const instance: any = activeCropper.componentRef?.instance;\n\n        if (config) {\n            Object.keys(config).forEach((key) => {\n                const value = (config as any)[key];\n                if (typeof value !== 'function') instance[key] = value;\n                else if (typeof value === 'function') {\n                    instance[key]\n                        .pipe(takeUntil(activeCropper.ngUnsubscribe!))\n                        .subscribe((...param: any[]) => (config as any)[key](...param));\n                }\n            });\n        }\n\n        instance.visibleChange\n            .pipe(takeUntil(activeCropper.ngUnsubscribe!))\n            .subscribe((visible: any) => (instance.visible = visible));\n    }\n\n    private _destroy(activeCropper: ActiveCropper): void {\n        activeCropper.ngUnsubscribe!.next();\n        activeCropper.ngUnsubscribe!.complete();\n\n        if (isNullOrUndefined(activeCropper.componentRef)) return;\n\n        this._appRef.detachView(activeCropper.componentRef.hostView);\n        activeCropper.componentRef.destroy();\n    }\n}\n\nexport interface ActiveCropper {\n    componentRef?: ComponentRef<ImageCropperComponent>;\n    ngUnsubscribe?: Subject<void>;\n}\n\nexport interface ImageCropperConfig {\n    id?: any;\n    header?: string;\n    cropLabel?: string;\n    selectAnotherLabel?: string;\n    removeLabel?: string;\n    cancelLabel?: string;\n    emptyStateTitle?: string;\n    emptyStateActionLabel?: string;\n    emptyStateIconClass?: string;\n    aspectRatio?: number;\n    rounded?: boolean;\n    allowSelectAnother?: boolean;\n    allowRemove?: boolean;\n    allowCancel?: boolean;\n    imageSource?: string;\n\n    cancel?: () => any;\n    changeImage?: () => any;\n    removedImage?: () => any;\n    croppedImage?: (imageSource: string) => any;\n    croppedCanvas?: (imageSource: HTMLCanvasElement) => any;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}