{"version":3,"file":"seniorsistemas-angular-components-profile-picture-picker.mjs","sources":["../../projects/angular-components/profile-picture-picker/src/lib/profile-picture-picker/profile-picture-picker.component.ts","../../projects/angular-components/profile-picture-picker/src/lib/profile-picture-picker/profile-picture-picker.component.html","../../projects/angular-components/profile-picture-picker/src/lib/profile-picture-picker/profile-picture-picker.module.ts","../../projects/angular-components/profile-picture-picker/src/lib/profile-picture-picker/validators/validators.ts","../../projects/angular-components/profile-picture-picker/src/seniorsistemas-angular-components-profile-picture-picker.ts"],"sourcesContent":["import { Component, ElementRef, EventEmitter, forwardRef, HostListener, Input, OnInit, Output, ViewChild, inject } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { TranslateService } from '@ngx-translate/core';\nimport { ConfirmationService } from 'primeng/api';\nimport { ConfirmationTexts, CropperLabelsConfig, FileValidationErrors, ProfilePicturePickerData } from './models/index';\nimport { isNullOrUndefined } from '@seniorsistemas/angular-components/utils';\nimport { ImageCropperService } from '@seniorsistemas/angular-components/image-cropper';\n\n/**\n * @description Componente para seleção, edição e remoção de foto de perfil do usuário.\n * Permite ao usuário fazer upload de uma imagem, recortá-la com o {@link ImageCropperService}\n * e confirmar ou remover a foto atual. Implementa {@link ControlValueAccessor} para uso\n * em formulários reativos e template-driven do Angular.\n *\n * @example\n * ```html\n * <s-profile-picture-picker\n *   formControlName=\"avatar\"\n *   subtitle=\"Formatos aceitos: JPG e PNG\"\n *   [maxFileSize]=\"2097152\"\n *   accept=\"image/jpeg,image/png\"\n *   (imageChange)=\"onImageChange($event)\"\n *   (removedImage)=\"onImageRemoved()\" />\n * ```\n *\n * @category Inputs\n */\n@Component({\n    selector: 's-profile-picture-picker',\n    templateUrl: 'profile-picture-picker.component.html',\n    styleUrls: ['profile-picture-picker.component.scss'],\n    providers: [\n        {\n            provide: NG_VALUE_ACCESSOR,\n            useExisting: forwardRef(() => ProfilePicturePickerComponent),\n            multi: true,\n        },\n    ],\n})\nexport class ProfilePicturePickerComponent implements OnInit, ControlValueAccessor {\n    private readonly imageCropperService = inject(ImageCropperService);\n    private readonly confirmationService = inject(ConfirmationService);\n    private readonly translateService = inject(TranslateService);\n\n    /**\n     * @description Título simples exibido quando nenhuma imagem está selecionada.\n     */\n    @Input()\n    public simpleTitle!: string;\n\n    /**\n     * @description Título de ação exibido como label principal do botão de upload.\n     */\n    @Input()\n    public actionTitle!: string;\n\n    /**\n     * @description Legenda exibida abaixo do título, descrevendo formatos suportados\n     * ou outras orientações para o usuário. Campo obrigatório.\n     */\n    @Input({ required: true })\n    public subtitle!: string;\n\n    /**\n     * @description Proporção (aspect ratio) do recorte da imagem.\n     * Por exemplo, `1` para quadrado, `16/9` para widescreen.\n     *\n     * @default 1\n     */\n    @Input()\n    public aspectRatio = 1;\n\n    /**\n     * @description Configurações de rótulos exibidos no componente de recorte de imagem (cropper).\n     * Permite sobrescrever os textos padrão dos botões e instruções do cropper.\n     */\n    @Input()\n    public cropperLabelsConfig?: CropperLabelsConfig;\n\n    /**\n     * @description Texto do botão de remoção da foto atual.\n     * Se não informado, utiliza o label padrão de remoção.\n     */\n    @Input()\n    public removeButtonLabel?: string;\n\n    /**\n     * @description Texto do botão de troca da foto atual.\n     * Se não informado, utiliza o label padrão de alteração.\n     */\n    @Input()\n    public changeButtonLabel?: string;\n\n    /**\n     * @description Textos personalizados exibidos no diálogo de confirmação\n     * ao remover ou substituir a foto. Permite sobrescrever título, mensagem e botões.\n     */\n    @Input()\n    public confirmationTexts?: ConfirmationTexts;\n\n    /**\n     * @description Tamanho máximo permitido para o arquivo de imagem, em bytes.\n     * Quando o arquivo excede esse limite, o output `invalidFile` é emitido.\n     */\n    @Input()\n    public maxFileSize?: number;\n\n    /**\n     * @description Tipos MIME aceitos pelo input de arquivo.\n     * Exemplo: `\"image/jpeg,image/png\"`.\n     */\n    @Input()\n    public accept?: string;\n\n    /**\n     * @description Lista de extensões de arquivo aceitas para validação.\n     * Exemplo: `['.jpg', '.jpeg', '.png']`.\n     *\n     * @default []\n     */\n    @Input()\n    public supportedExtensions: string[] = [];\n\n    /**\n     * @description Imagem atual do componente. Pode ser uma string base64, um objeto\n     * {@link ProfilePicturePickerData} com metadados, ou `null` para sem imagem.\n     *\n     * @default null\n     */\n    @Input()\n    public image: string | ProfilePicturePickerData | null = null;\n\n    @ViewChild('uploadPicture')\n    public uploadPicture: ElementRef | null = null;\n\n    @ViewChild('info')\n    public info: ElementRef | null = null;\n\n    @ViewChild('thumbnail', { read: ElementRef })\n    public thumbnail: ElementRef | null = null;\n\n    @ViewChild('fileInput', { read: ElementRef })\n    public fileInput: ElementRef | null = null;\n\n    /**\n     * @deprecated Use `imageChange` em vez deste output.\n     * @description Emitido ao selecionar ou recortar uma nova imagem. Emite a string base64 da imagem.\n     */\n    @Output()\n    public changedImage: EventEmitter<string> = new EventEmitter();\n\n    /**\n     * @description Emitido ao selecionar, recortar ou alterar a imagem.\n     * Emite a string base64 ou um objeto {@link ProfilePicturePickerData} com os dados da imagem.\n     */\n    @Output()\n    public imageChange = new EventEmitter<string | ProfilePicturePickerData>();\n\n    /**\n     * @description Emitido quando o usuário confirma a remoção da foto atual.\n     */\n    @Output()\n    public removedImage = new EventEmitter();\n\n    /**\n     * @description Emitido quando o arquivo selecionado não passa na validação.\n     * Emite um objeto {@link FileValidationErrors} descrevendo os erros encontrados\n     * (ex.: tamanho excedido, extensão inválida).\n     */\n    @Output()\n    public invalidFile: EventEmitter<FileValidationErrors> = new EventEmitter();\n\n    public get imageBase64(): string {\n        return typeof this.image === 'string' ? this.image : (this.image?.base64 ?? '');\n    }\n\n    private _onChange?: (value: string | ProfilePicturePickerData) => void;\n    private _onTouched?: () => void;\n\n    public writeValue(value: string | ProfilePicturePickerData): void {\n        this.image = value;\n    }\n\n    public registerOnChange(onChange: (value: string | ProfilePicturePickerData) => void): void {\n        this._onChange = onChange;\n    }\n\n    public registerOnTouched(onTouched: () => void): void {\n        this._onTouched = onTouched;\n    }\n\n    public ngOnInit(): void {\n        this._normalizeSuportedExtensions();\n    }\n\n    @HostListener('dragover', ['$event'])\n    public onDragOver(event: DragEvent) {\n        event.preventDefault();\n        event.stopPropagation();\n    }\n\n    @HostListener('dragleave', ['$event'])\n    public onDragLeave(event: DragEvent): void {\n        event.preventDefault();\n        event.stopPropagation();\n    }\n\n    @HostListener('drop', ['$event'])\n    public onDrop(event: DragEvent): void {\n        event.preventDefault();\n        event.stopPropagation();\n\n        this._onTouched?.();\n\n        const files: File[] = [];\n        const dataTransferFiles = event.dataTransfer?.files;\n\n        if (!isNullOrUndefined(dataTransferFiles)) {\n            for (let i = 0; i < dataTransferFiles?.length; i++) {\n                const item = dataTransferFiles.item(i);\n                if (!isNullOrUndefined(item)) {\n                    files.push(item);\n                }\n            }\n        }\n\n        this._showImageCropper(files);\n    }\n\n    // Verificando o redimensionamento para ajustar o design para ficar responsivo.\n    @HostListener('window:resize')\n    public onResize(): void {\n        if (this.uploadPicture && this.info && this.thumbnail) {\n            const uploadPictureWidth = this._getWidthElement(this.uploadPicture);\n            const infoWidth = this._getWidthElement(this.info);\n            const thumbnailWidth = this._getWidthElement(this.thumbnail);\n\n            if (thumbnailWidth + infoWidth > uploadPictureWidth) {\n                this.uploadPicture.nativeElement.classList.add('upload-picture--small');\n            } else {\n                this.uploadPicture.nativeElement.classList.remove('upload-picture--small');\n            }\n        }\n    }\n\n    public selectPhoto(): void {\n        const fileInputElement = this.fileInput?.nativeElement;\n        fileInputElement.value = '';\n        fileInputElement.click();\n\n        this._onTouched?.();\n    }\n\n    public removePhoto(): void {\n        this.confirmationService.confirm({\n            message:\n                this.confirmationTexts?.removalMessage ??\n                this.translateService.instant('platform.angular_components.confirmation_remove_image'),\n            acceptLabel:\n                this.confirmationTexts?.removalAcceptLabel ??\n                this.translateService.instant('platform.angular_components.remove'),\n            rejectLabel:\n                this.confirmationTexts?.removalRejectLabel ??\n                this.translateService.instant('platform.angular_components.cancel'),\n            header:\n                this.confirmationTexts?.removalHeader ??\n                this.translateService.instant('platform.angular_components.remove_image'),\n            rejectButtonStyleClass: 'ui-button-secondary',\n            accept: () => {\n                const fileInputElement = this.fileInput?.nativeElement;\n                fileInputElement.value = '';\n                this.image = null;\n                this.removedImage.emit();\n            },\n        });\n    }\n\n    public photoSelected(event: any): void {\n        this._showImageCropper(event.srcElement.files);\n    }\n\n    private _showImageCropper(files: File[]): void {\n        if (!this._validateData(files)) {\n            return;\n        }\n\n        const file = files[0];\n\n        const fileReader = new FileReader();\n        fileReader.readAsDataURL(file);\n        fileReader.onloadend = (fileEvent: any) => {\n            this.imageCropperService.show({\n                imageSource: fileEvent.target.result,\n                croppedImage: (image) => {\n                    this.changedImage.emit(image);\n\n                    const data: ProfilePicturePickerData = { source: file, base64: image };\n\n                    // Se o tipo do image for string eu preciso atualizar e mandar para o imageChange uma string.\n                    // Se for ProfilePicturePickerData eu preciso mandar o data completo.\n                    if (typeof this.image === 'string') {\n                        this.image = image;\n                        this.imageChange.emit(image);\n                    } else {\n                        this.image = data;\n                        this.imageChange.emit(data);\n                    }\n\n                    this._onChange?.(this.image);\n                },\n                changeImage: () => this.selectPhoto(),\n                allowSelectAnother: false,\n                aspectRatio: this.aspectRatio,\n                ...this.cropperLabelsConfig,\n            });\n        };\n    }\n\n    private _normalizeSuportedExtensions(): void {\n        this.supportedExtensions = this.supportedExtensions?.map((extension) =>\n            extension.replace('.', '').toLocaleLowerCase(),\n        );\n    }\n\n    private _validateData(files: File[]): boolean {\n        if (!files.length) {\n            return false;\n        }\n\n        if (files.length > 1) {\n            this.invalidFile.emit({ file: null, validation: 'maxFileLimit' });\n            return false;\n        }\n\n        const file = files[0];\n\n        if (!file.type.includes('image')) {\n            this.invalidFile.emit({ file, validation: 'typeInvalid' });\n            return false;\n        }\n\n        if (!this._validateFileExtension(file)) {\n            this.invalidFile.emit({ file, validation: 'unsupportedExtension' });\n            return false;\n        }\n\n        if (!this._validateFileSize(file)) {\n            this.invalidFile.emit({ file, validation: 'maxFileSize' });\n            return false;\n        }\n\n        return true;\n    }\n\n    private _validateFileExtension(file: File): boolean {\n        if (this.supportedExtensions?.length) {\n            const extension = file.name.split('.').pop()?.toLowerCase() ?? '';\n            return this.supportedExtensions.includes(extension);\n        }\n        return true;\n    }\n\n    private _validateFileSize(file: File): boolean {\n        if (this.maxFileSize) {\n            return file.size <= this.maxFileSize;\n        }\n        return true;\n    }\n\n    private _getWidthElement(element: ElementRef): number {\n        const { left, right } = element.nativeElement.getBoundingClientRect();\n        return right - left;\n    }\n}\n\n","<p-confirmDialog></p-confirmDialog>\n\n<input\n    #fileInput\n    [accept]=\"accept\"\n    class=\"file-input\"\n    type=\"file\"\n    (change)=\"photoSelected($event)\"\n/>\n<div\n    #uploadPicture\n    class=\"upload-picture\"\n>\n    <s-thumbnail\n        #thumbnail\n        iconClass=\"far fa-user\"\n        [imageSource]=\"imageBase64\"\n        [hasAction]=\"!image\"\n        (click)=\"selectPhoto()\"\n    >\n    </s-thumbnail>\n    <div\n        #info\n        class=\"info\"\n    >\n        @if (image) {\n            <div class=\"buttons\">\n                <s-button\n                    [label]=\"changeButtonLabel || 'platform.angular_components.change_photo' | translate\"\n                    priority=\"primary\"\n                    (clicked)=\"selectPhoto()\"\n                >\n                </s-button>\n                <s-button\n                    [label]=\"removeButtonLabel || 'platform.angular_components.remove' | translate\"\n                    priority=\"secondary\"\n                    (clicked)=\"removePhoto()\"\n                >\n                </s-button>\n            </div>\n        } @else {\n            <p class=\"title\">\n                {{ simpleTitle || 'platform.angular_components.drag_your_photo_or' | translate }}\n                <span\n                    class=\"action-title\"\n                    (click)=\"selectPhoto()\"\n                >\n                    {{ actionTitle || 'platform.angular_components.select_a_file' | translate }}\n                </span>\n            </p>\n        }\n        <p class=\"subtitle\">{{ subtitle }}</p>\n    </div>\n</div>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ConfirmationService } from 'primeng/api';\nimport { ConfirmDialogModule } from 'primeng/confirmdialog';\n\nimport { ThumbnailModule } from '@seniorsistemas/angular-components/thumbnail';\n\nimport { ButtonModule } from '@seniorsistemas/angular-components/button';\nimport { ProfilePicturePickerComponent } from './profile-picture-picker.component';\nimport { ImageCropperModule, ImageCropperService } from '@seniorsistemas/angular-components/image-cropper';\n\n@NgModule({\n    imports: [CommonModule, TranslateModule, ButtonModule, ThumbnailModule, ImageCropperModule, ConfirmDialogModule],\n    declarations: [ProfilePicturePickerComponent],\n    exports: [ProfilePicturePickerComponent],\n    providers: [ImageCropperService, ConfirmationService],\n})\nexport class ProfilePicturePickerModule { }\n","import { AbstractControl, ValidatorFn } from \"@angular/forms\";\n\nconst maxFileSize = (size: number): ValidatorFn => {\n    return (control: AbstractControl) => {\n        if (control.value?.source?.size > size) {\n            return {\n                maxFileSize: true,\n            };\n        }\n\n        return null;\n    };\n};\n\nconst fileExtension = (extensions: string[]) => {\n    return (control: AbstractControl) => {\n        if (extensions.length) {\n            const extension = control.value?.source?.name?.split(\".\").pop().toLowerCase();\n            if (extension?.includes(extension)) {\n                return {\n                    fileExtension: true,\n                };\n            }\n        }\n        return null;\n    };\n};\n\nexport const Validators = {\n    maxFileSize,\n    fileExtension,\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}