{"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 {\r\n    AfterContentInit,\r\n    Component,\r\n    ElementRef,\r\n    EventEmitter,\r\n    HostListener,\r\n    Input,\r\n    OnDestroy,\r\n    OnInit,\r\n    Output,\r\n    ViewChild,\r\n    inject,\r\n} from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { DomSanitizer } from '@angular/platform-browser';\r\n\r\nimport { TranslateService, TranslatePipe } from '@ngx-translate/core';\r\nimport { DEPRECATED_CONFIG } from '@seniorsistemas/angular-components/common/deprecated-selector';\r\nimport { DeprecatedSelectorDirective } from '@seniorsistemas/angular-components/common/deprecated-selector';\r\nimport { Breakpoints, isNullOrUndefined } from '@seniorsistemas/angular-components/utils';\r\nimport moment from 'moment';\r\nimport { Subject } from 'rxjs';\r\n\r\nimport { FilePickerService } from './file-picker.service';\r\nimport { FileDto } from './models/file-dto';\r\nimport { ALL_PERMISSIONS, FilePickerPermissions } from './models/file-picker-permissions';\r\nimport { ListBlobMetadataResponse } from './models/list-blob-metadata';\r\nimport { UploadError } from './models/uploadError';\r\nimport { ButtonComponent } from '@seniorsistemas/angular-components/button';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { ProgressBarComponent } from '@seniorsistemas/angular-components/progressbar';\r\nimport { TooltipDirective } from '@seniorsistemas/angular-components/tooltip';\r\n\r\n/**\r\n * @description Componente de upload de arquivos com suporte a seleção múltipla,\r\n * validação de tipo/tamanho, controle de permissões (adicionar, ler, remover),\r\n * download e cancelamento de uploads em andamento.\r\n *\r\n * @example\r\n * ```html\r\n * <s-file-picker\r\n *   [multiple]=\"true\"\r\n *   accept=\"application/pdf\"\r\n *   [maxFileSize]=\"5242880\"\r\n *   [files]=\"arquivos\"\r\n *   (uploadHandler)=\"onUpload($event)\"\r\n *   (removeFile)=\"onRemove($event)\" />\r\n * ```\r\n *\r\n * @category Inputs\r\n */\r\n@Component({\r\n    selector: 's-file-picker, s-file-upload',\r\n    templateUrl: './file-picker.component.html',\r\n    styleUrls: ['./file-picker.component.scss'],\r\n    hostDirectives: [DeprecatedSelectorDirective],\r\n    providers: [\r\n        {\r\n            provide: DEPRECATED_CONFIG,\r\n            useValue: {\r\n                oldSelector: 's-file-upload',\r\n                newSelector: 's-file-picker',\r\n                removalVersion: '20.0.0',\r\n            },\r\n        },\r\n    ],\r\n    standalone: true,\r\n    imports: [ButtonComponent, NgTemplateOutlet, ProgressBarComponent, TooltipDirective, TranslatePipe],\r\n})\r\nexport class FilePickerComponent implements OnInit, OnDestroy, AfterContentInit {\r\n    private readonly sanitizer = inject(DomSanitizer);\r\n    private readonly filePickerService = inject(FilePickerService);\r\n    private readonly translate = inject(TranslateService);\r\n\r\n    public static nextId = 0;\r\n\r\n    public ADD_PERMISSION: FilePickerPermissions = 'add';\r\n    public READ_PERMISSION: FilePickerPermissions = 'read';\r\n    public REMOVE_PERMISSION: FilePickerPermissions = 'remove';\r\n\r\n    @ViewChild('inputUpload', { static: false })\r\n    private readonly inputUpload: ElementRef | null = null;\r\n\r\n    @ViewChild('anchor', { static: false })\r\n    private readonly anchor: ElementRef | null = null;\r\n\r\n    /** @description Identificador do componente no DOM. Gerado automaticamente se não informado. */\r\n    @Input()\r\n    public id = `s-file-picker-${FilePickerComponent.nextId++}`;\r\n\r\n    /** @description Rótulo do botão de seleção de arquivo. */\r\n    @Input()\r\n    public chooseLabel?: string;\r\n\r\n    /** @description Rótulo do botão de remoção de arquivo. */\r\n    @Input()\r\n    public removeLabel?: string;\r\n\r\n    /** @description Rótulo do botão de cancelamento de upload. */\r\n    @Input()\r\n    public cancelLabel?: string;\r\n\r\n    /** @description Texto do tooltip exibido após upload bem-sucedido. */\r\n    @Input()\r\n    public successTooltip?: string;\r\n\r\n    /** @description Permite selecionar múltiplos arquivos ao mesmo tempo. */\r\n    @Input()\r\n    public multiple?: boolean;\r\n\r\n    /** @description Tipos MIME aceitos pelo seletor de arquivo (ex.: `'application/pdf,image/*'`). */\r\n    @Input()\r\n    public accept?: string;\r\n\r\n    /** @description Lista de extensões de arquivo aceitas para validação (ex.: `['.pdf', '.docx']`). @default [] */\r\n    @Input()\r\n    public supportedExtensions: string[] = [];\r\n\r\n    /** @description Label ARIA para o nome do arquivo, para leitores de tela. */\r\n    @Input()\r\n    public ariaLabelFileName?: string;\r\n\r\n    /** @description Tamanho máximo por arquivo em bytes. */\r\n    @Input()\r\n    public maxFileSize?: number;\r\n\r\n    /** @description Tamanho máximo combinado de todos os arquivos em bytes. */\r\n    @Input()\r\n    public maxCombinedFileSize?: number;\r\n\r\n    /** @description Número máximo de arquivos que podem ser selecionados. */\r\n    @Input()\r\n    public fileLimit?: number;\r\n\r\n    /** @description Label ARIA para a barra de progresso do upload. */\r\n    @Input()\r\n    public ariaLabelProgress?: string;\r\n\r\n    /** @description Label ARIA para o ícone de sucesso. */\r\n    @Input()\r\n    public ariaLabelSuccess?: string;\r\n\r\n    /** @description Label ARIA para mensagens de erro de validação. */\r\n    @Input()\r\n    public ariaLabelError?: string;\r\n\r\n    /** @description Label ARIA para o botão de remoção de arquivo. */\r\n    @Input()\r\n    public ariaLabelRemove?: string;\r\n\r\n    /** @description FormControl externo vinculado ao componente para controle de estado. */\r\n    @Input()\r\n    public formControl?: FormControl;\r\n\r\n    /** @description Desabilita todas as interações do componente. @default false */\r\n    @Input()\r\n    public disabled = false;\r\n\r\n    /** @description Exibe a data de upload de cada arquivo. @default false */\r\n    @Input()\r\n    public showFileUploadDate: boolean = false;\r\n\r\n    /** @description Lista de permissões habilitadas no componente: `'add'`, `'read'`, `'remove'`. @default ALL_PERMISSIONS */\r\n    @Input()\r\n    public permissions: FilePickerPermissions[] = ALL_PERMISSIONS;\r\n\r\n    /**\r\n     * @description Lista de arquivos já enviados a serem exibidos no componente.\r\n     * Ao atribuir, os arquivos são processados e suas URLs são geradas para preview.\r\n     */\r\n    @Input()\r\n    public set files(files: FileDto[]) {\r\n        if (!files || files?.length === 0) {\r\n            this._files = [];\r\n            return;\r\n        }\r\n        if (this.showFileUploadDate && files[0]?.objectId) {\r\n            this.getUploadDate(files);\r\n        }\r\n        this._files = files.map((file) => {\r\n            file.objectURL = this.sanitizer.bypassSecurityTrustUrl(window.URL.createObjectURL(file));\r\n            return file;\r\n        });\r\n    }\r\n\r\n    /** @description Emitido quando o usuário seleciona arquivos válidos para upload. */\r\n    @Output()\r\n    public uploadHandler: EventEmitter<{ files: FileDto[] }> = new EventEmitter();\r\n\r\n    /** @description Emitido quando o usuário remove um arquivo da lista. */\r\n    @Output()\r\n    public removeFile: EventEmitter<{ file: File }> = new EventEmitter();\r\n\r\n    /** @description Emitido quando o usuário cancela um upload em andamento. Emite o índice do arquivo cancelado. */\r\n    @Output()\r\n    public cancelUpload: EventEmitter<number> = new EventEmitter();\r\n\r\n    /** @description Emitido quando o usuário clica para baixar um arquivo. */\r\n    @Output()\r\n    public downloadFile: EventEmitter<{ index: number; anchor: ElementRef }> = new EventEmitter();\r\n\r\n    /** @description Emitido quando um arquivo não passa na validação de tipo, tamanho ou limite. */\r\n    @Output()\r\n    public validateErrors: EventEmitter<UploadError> = new EventEmitter();\r\n\r\n    private _files: FileDto[] = [];\r\n    private readonly ngUsubscribe: Subject<void> = new Subject();\r\n    public isSmallDevice = false;\r\n    public inputValue = '';\r\n    public modifiedDate?: string;\r\n\r\n    public ngOnInit(): void {\r\n        this.supportedExtensions = this.supportedExtensions.map((extension) =>\r\n            extension.replace('.', '').toLowerCase(),\r\n        );\r\n    }\r\n\r\n    public ngOnDestroy() {\r\n        this.ngUsubscribe.next();\r\n        this.ngUsubscribe.complete();\r\n    }\r\n\r\n    public ngAfterContentInit() {\r\n        this.update();\r\n    }\r\n\r\n    @HostListener('window:resize')\r\n    public onResize() {\r\n        this.update();\r\n    }\r\n\r\n    public _onInputFileSelect($event: Event): void {\r\n        const eventTargetFiles = ($event.target as HTMLInputElement)?.files as FileList;\r\n        const dataTransferFiles = ($event as DragEvent).dataTransfer?.files as FileList;\r\n        const files: FileDto[] = Array.from(dataTransferFiles ? dataTransferFiles : eventTargetFiles);\r\n        this.onFileSelect(files);\r\n    }\r\n\r\n    public onFileSelect(files: FileDto[]): void {\r\n        const newFiles: FileDto[] = [];\r\n\r\n        if (!this.multiple) {\r\n            this.files = [];\r\n        }\r\n\r\n        if (this.isFileLimitExceeded(files)) {\r\n            this.validateErrors.emit({\r\n                files,\r\n                validation: 'maxFileLimit',\r\n            });\r\n            this.clearFileInput();\r\n            return;\r\n        }\r\n\r\n        if (this.isFileCombinedSizeExceeded(files)) {\r\n            this.validateErrors.emit({\r\n                files: files,\r\n                validation: 'maxCombinedFileSize',\r\n            });\r\n            this.clearFileInput();\r\n            return;\r\n        }\r\n\r\n        for (const file of files) {\r\n            if (this.isUnsupportedFileExtension(file)) {\r\n                this.validateErrors.emit({\r\n                    files: [file],\r\n                    validation: 'unsupportedExtension',\r\n                });\r\n                continue;\r\n            }\r\n\r\n            if (this.isFileSizeExceeded(file)) {\r\n                this.validateErrors.emit({\r\n                    files: [file],\r\n                    validation: 'maxFileSize',\r\n                });\r\n                continue;\r\n            }\r\n\r\n            newFiles.push(file);\r\n        }\r\n\r\n        if (newFiles.length) {\r\n            this.files = this.files.concat(newFiles);\r\n            this.uploadHandler.emit({\r\n                files: newFiles,\r\n            });\r\n        }\r\n\r\n        this.clearFileInput();\r\n    }\r\n\r\n    public onRemoveFile(file: FileDto): void {\r\n        const fileIndex = this.files.indexOf(file);\r\n        const removedFiles = this.files.splice(fileIndex, 1);\r\n\r\n        if (removedFiles.length) {\r\n            this.removeFile.emit({ file });\r\n        }\r\n    }\r\n\r\n    public onCancelUpload(index: number) {\r\n        const removedFiles = this.files.splice(index, 1);\r\n\r\n        if (removedFiles.length) {\r\n            this.cancelUpload.emit(index);\r\n        }\r\n\r\n        this.clearFileInput();\r\n    }\r\n\r\n    public onDowloadFile(index: number) {\r\n        if (isNullOrUndefined(this.anchor)) return;\r\n\r\n        this.downloadFile.emit({\r\n            index,\r\n            anchor: this.anchor,\r\n        });\r\n    }\r\n\r\n    public get files(): FileDto[] {\r\n        return this._files;\r\n    }\r\n\r\n    public formatFileSize(size: number): string {\r\n        if (size === 0) {\r\n            return '0 Bytes';\r\n        }\r\n        const k = 1024;\r\n        const sizes = ['bytes', 'KB', 'MB', 'GB', 'TB'];\r\n        const i = Math.floor(Math.log(size) / Math.log(k));\r\n        return parseFloat((size / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];\r\n    }\r\n\r\n    private update() {\r\n        const windowWidth = window.innerWidth;\r\n        this.isSmallDevice = windowWidth <= Breakpoints.SM_MAX;\r\n    }\r\n\r\n    private isFileLimitExceeded(files: FileDto[]) {\r\n        if (!this.fileLimit) {\r\n            return false;\r\n        }\r\n        return this.files.length + files.length > this.fileLimit;\r\n    }\r\n\r\n    private isFileCombinedSizeExceeded(files: File[]): boolean {\r\n        if (!this.maxCombinedFileSize) {\r\n            return false;\r\n        }\r\n\r\n        const filesList = [...files, ...this.files];\r\n\r\n        const combinedSize = filesList.reduce((combinedSize, file) => combinedSize + file.size, 0);\r\n\r\n        return combinedSize > this.maxCombinedFileSize;\r\n    }\r\n\r\n    private isFileSizeExceeded(file: File): boolean {\r\n        if (!this.maxFileSize) {\r\n            return false;\r\n        }\r\n        return file.size > this.maxFileSize;\r\n    }\r\n\r\n    private isUnsupportedFileExtension(file: File) {\r\n        if (this.supportedExtensions?.length) {\r\n            const extension = file.name.split('.').pop()?.toLowerCase() ?? '';\r\n\r\n            return !this.supportedExtensions.includes(extension);\r\n        }\r\n        return false;\r\n    }\r\n\r\n    private clearFileInput() {\r\n        if (isNullOrUndefined(this.inputUpload?.nativeElement)) return;\r\n\r\n        this.inputUpload.nativeElement.value = null;\r\n    }\r\n\r\n    private getUploadDate(blobFile: FileDto[]): void {\r\n        if (!blobFile) {\r\n            return;\r\n        }\r\n\r\n        this.filePickerService\r\n            .getMetadataCustomField({ objectId: blobFile[0].objectId ?? '' })\r\n            .then((metadata) => this.setModifiedDate(metadata));\r\n    }\r\n\r\n    private setModifiedDate(metadata: ListBlobMetadataResponse): void {\r\n        const hour = moment(metadata.modified).format('HH');\r\n        const minutes = moment(metadata.modified).format('mm');\r\n        const day = moment(metadata.modified).format('DD');\r\n        const month = moment(metadata.modified).format('MM');\r\n        const fullYear = moment(metadata.modified).format('YYYY');\r\n\r\n        this.modifiedDate = this.translate.instant('platform.angular_components.date_modified_custom_blob', {\r\n            hour,\r\n            minutes,\r\n            day,\r\n            month,\r\n            fullYear,\r\n        });\r\n    }\r\n}\r\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                                [sTooltip]=\"\n                                    successTooltip || 'platform.angular_components.file_attached_successfully'\n                                        | translate\n                                \"\n                                tooltipPosition=\"top\"\n                                [showDelay]=\"500\"\n                                [escape]=\"true\"\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                                [sTooltip]=\"file.error?.message\"\n                                tooltipPosition=\"top\"\n                                [showDelay]=\"500\"\n                                [escape]=\"true\"\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 { NgModule } from '@angular/core';\r\n\r\nimport { FilePickerComponent } from './file-picker.component';\r\nimport { FilePickerService } from './file-picker.service';\r\n\r\n@NgModule({\r\n    imports: [FilePickerComponent],\r\n    providers: [FilePickerService],\r\n    exports: [FilePickerComponent],\r\n})\r\nexport class FilePickerModule {}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}