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