{"version":3,"file":"seniorsistemas-angular-components-file-picker.mjs","sources":["../../projects/angular-components/file-picker/src/lib/file-picker/file-picker.service.ts","../../projects/angular-components/file-picker/src/lib/file-picker/models/file-picker-permissions.ts","../../projects/angular-components/file-picker/src/lib/file-picker/file-picker.component.ts","../../projects/angular-components/file-picker/src/lib/file-picker/file-picker.component.html","../../projects/angular-components/file-picker/src/lib/file-picker/file-picker.module.ts","../../projects/angular-components/file-picker/src/seniorsistemas-angular-components-file-picker.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\nimport { CustomHttpClient } from '@seniorsistemas/angular-components/common';\n\nimport { ListBlobMetadataRequest, ListBlobMetadataResponse } from './models/list-blob-metadata';\n\n@Injectable()\nexport class FilePickerService {\n    private BASE_URL_FIELD_CUSTOMIZATION = 'platform/field_customization';\n    private TOKEN = new AbortController();\n\n    public async getMetadataCustomField<T>(request: ListBlobMetadataRequest): Promise<ListBlobMetadataResponse> {\n        return CustomHttpClient.post(`${this.BASE_URL_FIELD_CUSTOMIZATION}/queries/getFileMetadata`, request, {\n            signal: this.TOKEN.signal,\n        });\n    }\n}\n","export type FilePickerPermissions = 'add' | 'read' | 'remove';\n\nexport const ALL_PERMISSIONS: FilePickerPermissions[] = ['add', 'read', 'remove'];\n","import { AfterContentInit, Component, ElementRef, EventEmitter, HostListener, Input, OnDestroy, OnInit, Output, ViewChild, inject } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { DomSanitizer } from '@angular/platform-browser';\n\nimport { TranslateService } from '@ngx-translate/core';\nimport { DEPRECATED_CONFIG } from '@seniorsistemas/angular-components/common/deprecated-selector';\nimport { DeprecatedSelectorDirective } from '@seniorsistemas/angular-components/common/deprecated-selector';\nimport { Breakpoints, isNullOrUndefined } from '@seniorsistemas/angular-components/utils';\nimport moment from 'moment';\nimport { Subject } from 'rxjs';\n\nimport { FilePickerService } from './file-picker.service';\nimport { FileDto } from './models/file-dto';\nimport { ALL_PERMISSIONS, FilePickerPermissions } from './models/file-picker-permissions';\nimport { ListBlobMetadataResponse } from './models/list-blob-metadata';\nimport { UploadError } from './models/uploadError';\n\n/**\n * @description Componente de upload de arquivos com suporte a seleção múltipla,\n * validação de tipo/tamanho, controle de permissões (adicionar, ler, remover),\n * download e cancelamento de uploads em andamento.\n *\n * @example\n * ```html\n * <s-file-picker\n *   [multiple]=\"true\"\n *   accept=\"application/pdf\"\n *   [maxFileSize]=\"5242880\"\n *   [files]=\"arquivos\"\n *   (uploadHandler)=\"onUpload($event)\"\n *   (removeFile)=\"onRemove($event)\" />\n * ```\n *\n * @category Inputs\n */\n@Component({\n    selector: 's-file-picker, s-file-upload',\n    templateUrl: './file-picker.component.html',\n    styleUrls: ['./file-picker.component.scss'],\n    hostDirectives: [DeprecatedSelectorDirective],\n    providers: [\n        {\n            provide: DEPRECATED_CONFIG,\n            useValue: {\n                oldSelector: 's-file-upload',\n                newSelector: 's-file-picker',\n                removalVersion: '20.0.0',\n            },\n        },\n    ],\n})\nexport class FilePickerComponent implements OnInit, OnDestroy, AfterContentInit {\n    private readonly sanitizer = inject(DomSanitizer);\n    private readonly filePickerService = inject(FilePickerService);\n    private readonly translate = inject(TranslateService);\n\n    public static nextId = 0;\n\n    public ADD_PERMISSION: FilePickerPermissions = 'add';\n    public READ_PERMISSION: FilePickerPermissions = 'read';\n    public REMOVE_PERMISSION: FilePickerPermissions = 'remove';\n\n    @ViewChild('inputUpload', { static: false })\n    private readonly inputUpload: ElementRef | null = null;\n\n    @ViewChild('anchor', { static: false })\n    private readonly anchor: ElementRef | null = null;\n\n    /** @description Identificador do componente no DOM. Gerado automaticamente se não informado. */\n    @Input()\n    public id = `s-file-picker-${FilePickerComponent.nextId++}`;\n\n    /** @description Rótulo do botão de seleção de arquivo. */\n    @Input()\n    public chooseLabel?: string;\n\n    /** @description Rótulo do botão de remoção de arquivo. */\n    @Input()\n    public removeLabel?: string;\n\n    /** @description Rótulo do botão de cancelamento de upload. */\n    @Input()\n    public cancelLabel?: string;\n\n    /** @description Texto do tooltip exibido após upload bem-sucedido. */\n    @Input()\n    public successTooltip?: string;\n\n    /** @description Permite selecionar múltiplos arquivos ao mesmo tempo. */\n    @Input()\n    public multiple?: boolean;\n\n    /** @description Tipos MIME aceitos pelo seletor de arquivo (ex.: `'application/pdf,image/*'`). */\n    @Input()\n    public accept?: string;\n\n    /** @description Lista de extensões de arquivo aceitas para validação (ex.: `['.pdf', '.docx']`). @default [] */\n    @Input()\n    public supportedExtensions: string[] = [];\n\n    /** @description Label ARIA para o nome do arquivo, para leitores de tela. */\n    @Input()\n    public ariaLabelFileName?: string;\n\n    /** @description Tamanho máximo por arquivo em bytes. */\n    @Input()\n    public maxFileSize?: number;\n\n    /** @description Tamanho máximo combinado de todos os arquivos em bytes. */\n    @Input()\n    public maxCombinedFileSize?: number;\n\n    /** @description Número máximo de arquivos que podem ser selecionados. */\n    @Input()\n    public fileLimit?: number;\n\n    /** @description Label ARIA para a barra de progresso do upload. */\n    @Input()\n    public ariaLabelProgress?: string;\n\n    /** @description Label ARIA para o ícone de sucesso. */\n    @Input()\n    public ariaLabelSuccess?: string;\n\n    /** @description Label ARIA para mensagens de erro de validação. */\n    @Input()\n    public ariaLabelError?: string;\n\n    /** @description Label ARIA para o botão de remoção de arquivo. */\n    @Input()\n    public ariaLabelRemove?: string;\n\n    /** @description FormControl externo vinculado ao componente para controle de estado. */\n    @Input()\n    public formControl?: FormControl;\n\n    /** @description Desabilita todas as interações do componente. @default false */\n    @Input()\n    public disabled = false;\n\n    /** @description Exibe a data de upload de cada arquivo. @default false */\n    @Input()\n    public showFileUploadDate: boolean = false;\n\n    /** @description Lista de permissões habilitadas no componente: `'add'`, `'read'`, `'remove'`. @default ALL_PERMISSIONS */\n    @Input()\n    public permissions: FilePickerPermissions[] = ALL_PERMISSIONS;\n\n    /**\n     * @description Lista de arquivos já enviados a serem exibidos no componente.\n     * Ao atribuir, os arquivos são processados e suas URLs são geradas para preview.\n     */\n    @Input()\n    public set files(files: FileDto[]) {\n        if (!files || files?.length === 0) {\n            this._files = [];\n            return;\n        }\n        if (this.showFileUploadDate && files[0]?.objectId) {\n            this.getUploadDate(files);\n        }\n        this._files = files.map((file) => {\n            file.objectURL = this.sanitizer.bypassSecurityTrustUrl(window.URL.createObjectURL(file));\n            return file;\n        });\n    }\n\n    /** @description Emitido quando o usuário seleciona arquivos válidos para upload. */\n    @Output()\n    public uploadHandler: EventEmitter<{ files: FileDto[] }> = new EventEmitter();\n\n    /** @description Emitido quando o usuário remove um arquivo da lista. */\n    @Output()\n    public removeFile: EventEmitter<{ file: File }> = new EventEmitter();\n\n    /** @description Emitido quando o usuário cancela um upload em andamento. Emite o índice do arquivo cancelado. */\n    @Output()\n    public cancelUpload: EventEmitter<number> = new EventEmitter();\n\n    /** @description Emitido quando o usuário clica para baixar um arquivo. */\n    @Output()\n    public downloadFile: EventEmitter<{ index: number; anchor: ElementRef }> = new EventEmitter();\n\n    /** @description Emitido quando um arquivo não passa na validação de tipo, tamanho ou limite. */\n    @Output()\n    public validateErrors: EventEmitter<UploadError> = new EventEmitter();\n\n    private _files: FileDto[] = [];\n    private readonly ngUsubscribe: Subject<void> = new Subject();\n    public isSmallDevice = false;\n    public inputValue = '';\n    public modifiedDate?: string;\n\n    public ngOnInit(): void {\n        this.supportedExtensions = this.supportedExtensions.map((extension) =>\n            extension.replace('.', '').toLowerCase(),\n        );\n    }\n\n    public ngOnDestroy() {\n        this.ngUsubscribe.next();\n        this.ngUsubscribe.complete();\n    }\n\n    public ngAfterContentInit() {\n        this.update();\n    }\n\n    @HostListener('window:resize')\n    public onResize() {\n        this.update();\n    }\n\n    public _onInputFileSelect($event: Event): void {\n        const eventTargetFiles = ($event.target as HTMLInputElement)?.files as FileList;\n        const dataTransferFiles = ($event as DragEvent).dataTransfer?.files as FileList;\n        const files: FileDto[] = Array.from(dataTransferFiles ? dataTransferFiles : eventTargetFiles);\n        this.onFileSelect(files);\n    }\n\n    public onFileSelect(files: FileDto[]): void {\n        const newFiles: FileDto[] = [];\n\n        if (!this.multiple) {\n            this.files = [];\n        }\n\n        if (this.isFileLimitExceeded(files)) {\n            this.validateErrors.emit({\n                files,\n                validation: 'maxFileLimit',\n            });\n            this.clearFileInput();\n            return;\n        }\n\n        if (this.isFileCombinedSizeExceeded(files)) {\n            this.validateErrors.emit({\n                files: files,\n                validation: 'maxCombinedFileSize',\n            });\n            this.clearFileInput();\n            return;\n        }\n\n        for (const file of files) {\n            if (this.isUnsupportedFileExtension(file)) {\n                this.validateErrors.emit({\n                    files: [file],\n                    validation: 'unsupportedExtension',\n                });\n                continue;\n            }\n\n            if (this.isFileSizeExceeded(file)) {\n                this.validateErrors.emit({\n                    files: [file],\n                    validation: 'maxFileSize',\n                });\n                continue;\n            }\n\n            newFiles.push(file);\n        }\n\n        if (newFiles.length) {\n            this.files = this.files.concat(newFiles);\n            this.uploadHandler.emit({\n                files: newFiles,\n            });\n        }\n\n        this.clearFileInput();\n    }\n\n    public onRemoveFile(file: FileDto): void {\n        const fileIndex = this.files.indexOf(file);\n        const removedFiles = this.files.splice(fileIndex, 1);\n\n        if (removedFiles.length) {\n            this.removeFile.emit({ file });\n        }\n    }\n\n    public onCancelUpload(index: number) {\n        const removedFiles = this.files.splice(index, 1);\n\n        if (removedFiles.length) {\n            this.cancelUpload.emit(index);\n        }\n\n        this.clearFileInput();\n    }\n\n    public onDowloadFile(index: number) {\n        if (isNullOrUndefined(this.anchor)) return;\n\n        this.downloadFile.emit({\n            index,\n            anchor: this.anchor,\n        });\n    }\n\n    public get files(): FileDto[] {\n        return this._files;\n    }\n\n    public formatFileSize(size: number): string {\n        if (size === 0) {\n            return '0 Bytes';\n        }\n        const k = 1024;\n        const sizes = ['bytes', 'KB', 'MB', 'GB', 'TB'];\n        const i = Math.floor(Math.log(size) / Math.log(k));\n        return parseFloat((size / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\n    }\n\n    private update() {\n        const windowWidth = window.innerWidth;\n        this.isSmallDevice = windowWidth <= Breakpoints.SM_MAX;\n    }\n\n    private isFileLimitExceeded(files: FileDto[]) {\n        if (!this.fileLimit) {\n            return false;\n        }\n        return this.files.length + files.length > this.fileLimit;\n    }\n\n    private isFileCombinedSizeExceeded(files: File[]): boolean {\n        if (!this.maxCombinedFileSize) {\n            return false;\n        }\n\n        const filesList = [...files, ...this.files];\n\n        const combinedSize = filesList.reduce((combinedSize, file) => combinedSize + file.size, 0);\n\n        return combinedSize > this.maxCombinedFileSize;\n    }\n\n    private isFileSizeExceeded(file: File): boolean {\n        if (!this.maxFileSize) {\n            return false;\n        }\n        return file.size > this.maxFileSize;\n    }\n\n    private isUnsupportedFileExtension(file: File) {\n        if (this.supportedExtensions?.length) {\n            const extension = file.name.split('.').pop()?.toLowerCase() ?? '';\n\n            return !this.supportedExtensions.includes(extension);\n        }\n        return false;\n    }\n\n    private clearFileInput() {\n        if (isNullOrUndefined(this.inputUpload?.nativeElement)) return;\n\n        this.inputUpload.nativeElement.value = null;\n    }\n\n    private getUploadDate(blobFile: FileDto[]): void {\n        if (!blobFile) {\n            return;\n        }\n\n        this.filePickerService\n            .getMetadataCustomField({ objectId: blobFile[0].objectId ?? '' })\n            .then((metadata) => this.setModifiedDate(metadata));\n    }\n\n    private setModifiedDate(metadata: ListBlobMetadataResponse): void {\n        const hour = moment(metadata.modified).format('HH');\n        const minutes = moment(metadata.modified).format('mm');\n        const day = moment(metadata.modified).format('DD');\n        const month = moment(metadata.modified).format('MM');\n        const fullYear = moment(metadata.modified).format('YYYY');\n\n        this.modifiedDate = this.translate.instant('platform.angular_components.date_modified_custom_blob', {\n            hour,\n            minutes,\n            day,\n            month,\n            fullYear,\n        });\n    }\n}\n\n","<div\n    [id]=\"id\"\n    class=\"file-picker\"\n>\n    <div class=\"file-picker-choose\">\n        <input\n            #inputUpload\n            [id]=\"id + 'input-upload'\"\n            type=\"file\"\n            name=\"file\"\n            [accept]=\"accept\"\n            [multiple]=\"multiple\"\n            (change)=\"_onInputFileSelect($event)\"\n        />\n        @if (permissions.includes(ADD_PERMISSION)) {\n            <s-button\n                [id]=\"id + 'upload-button'\"\n                [label]=\"chooseLabel || 'platform.angular_components.attach_files' | translate\"\n                (clicked)=\"inputUpload.click()\"\n                priority=\"primary\"\n                [disabled]=\"disabled || !!formControl?.disabled || fileLimit === files.length\"\n                [auxiliary]=\"false\"\n            >\n            </s-button>\n        }\n    </div>\n\n    @if (files.length) {\n        <section\n            [id]=\"id + 'fileupload-list'\"\n            class=\"file-picker-list\"\n            role=\"grid\"\n        >\n            @for (file of files; track file; let i = $index) {\n                <div\n                    class=\"file-picker-list-file\"\n                    role=\"row\"\n                >\n                    <div\n                        [id]=\"id + '-file-' + i + '-name'\"\n                        class=\"flex flex-grow items-center justify-between overflow-hidden text-ellipsis text-nowrap\"\n                        role=\"gridcell\"\n                    >\n                        <ng-container\n                            *ngTemplateOutlet=\"\n                                (permissions.includes(READ_PERMISSION) && file.savedFile) || file.progress === 100\n                                    ? descriptionUrl\n                                    : description;\n                                context: {\n                                    $implicit: file,\n                                    index: i,\n                                }\n                            \"\n                        >\n                        </ng-container>\n\n                        <span>{{ formatFileSize(file.size) }}</span>\n\n                        @if (modifiedDate) {\n                            <span class=\"file-picker-list-file-name-date\">{{ modifiedDate }}</span>\n                        }\n                    </div>\n                    <div\n                        class=\"file-picker-list-file-status\"\n                        role=\"gridcell\"\n                    >\n                        @if (file.isUploading && !isSmallDevice) {\n                            <div class=\"w-64\">\n                                <s-progressbar\n                                    [value]=\"file.progress ?? 0\"\n                                    [showValue]=\"false\"\n                                    activeColor=\"blue\"\n                                ></s-progressbar>\n                            </div>\n                        }\n\n                        @if (file.isUploading && isSmallDevice) {\n                            <span\n                                [id]=\"id + '-file-' + i + '-spin'\"\n                                class=\"fas fa-circle-notch fa-spin\"\n                                [attr.aria-label]=\"\n                                    ariaLabelProgress || 'platform.angular_components.loading_file' | translate\n                                \"\n                            >\n                            </span>\n                        }\n\n                        @if (!file.isUploading && !file.error && file.progress === 100) {\n                            <span\n                                [id]=\"id + '-file-' + i + '-check'\"\n                                class=\"fas fa-check\"\n                                role=\"alert\"\n                                [attr.aria-label]=\"\n                                    ariaLabelSuccess ||\n                                        successTooltip ||\n                                        'platform.angular_components.file_attached_successfully' | translate\n                                \"\n                                [pTooltip]=\"\n                                    successTooltip || 'platform.angular_components.file_attached_successfully'\n                                        | translate\n                                \"\n                                tooltipPosition=\"top\"\n                                showDelay=\"500\"\n                                [appendTo]=\"'body'\"\n                            >\n                            </span>\n                        }\n\n                        @if (file.error?.message) {\n                            <span\n                                [id]=\"id + '-file-' + i + '-error'\"\n                                class=\"fas fa-times\"\n                                role=\"alert\"\n                                [pTooltip]=\"file.error?.message\"\n                                tooltipPosition=\"top\"\n                                showDelay=\"500\"\n                                [appendTo]=\"'body'\"\n                            >\n                            </span>\n                        }\n                    </div>\n                    <div\n                        class=\"file-picker-list-file-actions\"\n                        role=\"gridcell\"\n                    >\n                        @if (file.isUploading) {\n                            <a\n                                [id]=\"id + '-file-' + i + '-cancel'\"\n                                class=\"file-picker-list-file-actions-action\"\n                                (click)=\"onCancelUpload(i)\"\n                            >\n                                {{ cancelLabel || 'platform.angular_components.cancel' | translate }}\n                            </a>\n                        }\n\n                        @if (\n                            permissions.includes(REMOVE_PERMISSION) &&\n                            !file.isUploading &&\n                            !(disabled || !!formControl?.disabled)\n                        ) {\n                            <a\n                                role=\"button\"\n                                tabindex=\"0\"\n                                [id]=\"id + '-file-' + i + '-remove'\"\n                                class=\"file-picker-list-file-actions-action\"\n                                (click)=\"onRemoveFile(file)\"\n                                [attr.aria-label]=\"\n                                    ariaLabelRemove || removeLabel || 'platform.angular_components.remove' | translate\n                                \"\n                            >\n                                {{ removeLabel || 'platform.angular_components.remove' | translate }}\n                            </a>\n                        }\n                    </div>\n                </div>\n            }\n        </section>\n    }\n</div>\n\n<ng-template\n    #descriptionUrl\n    let-file\n    let-i=\"index\"\n>\n    <div class=\"flex justify-between\">\n        <div>\n            <a\n                [id]=\"id + '-file-' + i + '-name-link'\"\n                tabindex=\"0\"\n                (click)=\"onDowloadFile(i)\"\n                [attr.aria-label]=\"ariaLabelFileName || file.name\"\n                class=\"break-words\"\n                >{{ file.name }}\n            </a>\n            <a\n                style=\"display: none\"\n                [href]=\"file.objectURL\"\n                target=\"_blank\"\n                download\n                #anchor\n            >\n            </a>\n        </div>\n    </div>\n</ng-template>\n\n<ng-template\n    #description\n    let-file\n>\n    <div class=\"flex justify-between\">\n        <span\n            tabindex=\"0\"\n            [attr.aria-label]=\"ariaLabelFileName || file.name\"\n        >\n            {{ file.name }}\n        </span>\n    </div>\n</ng-template>\n\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { TranslateModule } from '@ngx-translate/core';\nimport { ButtonModule } from '@seniorsistemas/angular-components/button';\nimport { LocaleModule } from '@seniorsistemas/angular-components/locale';\nimport { ProgressBarModule } from '@seniorsistemas/angular-components/progressbar';\nimport { TooltipModule } from 'primeng/tooltip';\n\nimport { FilePickerComponent } from './file-picker.component';\nimport { FilePickerService } from './file-picker.service';\n\n@NgModule({\n    declarations: [FilePickerComponent],\n    imports: [CommonModule, ButtonModule, TooltipModule, ProgressBarModule, TranslateModule, LocaleModule],\n    providers: [FilePickerService],\n    exports: [FilePickerComponent],\n})\nexport class FilePickerModule {}\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}