{"version":3,"file":"kif-lib-upload-files.mjs","sources":["../../../projects/kif-lib/upload-files/components/upload-files-file/upload-files-file.component.ts","../../../projects/kif-lib/upload-files/components/upload-files-file/upload-files-file.component.html","../../../projects/kif-lib/upload-files/utils/upload-files-size.utils.ts","../../../projects/kif-lib/upload-files/upload-files.component.ts","../../../projects/kif-lib/upload-files/upload-files.component.html","../../../projects/kif-lib/upload-files/upload-files.module.ts","../../../projects/kif-lib/upload-files/public-api.ts","../../../projects/kif-lib/upload-files/kif-lib-upload-files.ts"],"sourcesContent":["import { Component, EventEmitter, Input, Output } from '@angular/core';\nimport { FileUpload } from '../../interface/file-upload.interface';\nimport { CircleCheckBig, Download, LucideAngularModule, Save, X } from 'lucide-angular';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { NgClass } from '@angular/common';\n\n@Component({\n    selector: 'kit-upload-files-file',\n    templateUrl: './upload-files-file.component.html',\n    imports: [\n        LucideAngularModule,\n        MatProgressBarModule,\n        NgClass\n    ]\n})\nexport class UploadFilesFileComponent{\n    iconCircle = CircleCheckBig; \n    iconX = X; \n    iconDownload = Download;\n    iconSave = Save;\n    @Output() public removeFile: EventEmitter<void> = new EventEmitter();\n    @Output() public validFile: EventEmitter<void> = new EventEmitter();\n    /**\n     * Acción opcional \"Guardar como plantilla\" (CLVDKIF-1758). ADITIVA: solo se\n     * emite cuando el consumidor enciende `showSaveAsTemplate`. Entrega el\n     * archivo cargado para que el consumidor decida qué hacer con él.\n     */\n    @Output() public saveAsTemplate: EventEmitter<FileUpload> = new EventEmitter();\n\n    /**\n     * Muestra/oculta la acción \"Guardar como plantilla\" en la card.\n     * Default false → consumidores actuales NO ven el botón (retrocompatible).\n     */\n    @Input() public showSaveAsTemplate: boolean = false;\n\n    /**\n     * Texto del botón de descarga. Configurable de forma aditiva; el default\n     * conserva el texto actual para no alterar a los consumidores existentes.\n     */\n    @Input() public downloadLabel: string = 'Descargar documento';\n\n    public progressBar:number = 0;\n    private _fileUpload!: FileUpload;\n\n    constructor(){}\n\n    public onSaveAsTemplate(): void {\n        this.saveAsTemplate.emit(this.fileUpload);\n    }\n\n    @Input() public set fileUpload(file: FileUpload){\n        this._fileUpload = file;\n        this.uploadFile()\n    }\n\n    public get fileUpload(){\n        return this._fileUpload\n    }\n\n    public onRemoveFile(){\n        this.removeFile.emit()\n    }\n\n    public getFileSize(size: number | null){\n        if (size === null) {\n            return '';\n        }\n        return `${(size / 1024).toFixed(2)} KB`;\n    }\n\n    /** Nombre a mostrar: de la referencia precargada o, si no, del binario. */\n    public get displayName(): string {\n        return this._fileUpload?.preloaded?.name ?? this._fileUpload?.file?.name ?? '';\n    }\n\n    /**\n     * Tamaño a mostrar (bytes) o `null` si se desconoce. Precargado → `sizeBytes` si\n     * el back lo expone, si no `null` (la card oculta la línea de tamaño e ignora el\n     * placeholder). Subida normal → tamaño real del blob.\n     */\n    public get displaySize(): number | null {\n        if (this._fileUpload?.preloaded) {\n            return this._fileUpload.preloaded.sizeBytes ?? null;\n        }\n        return this._fileUpload?.file?.size ?? null;\n    }\n\n    public uploadFile(): void {\n        // ADITIVO — Archivo PRECARGADO (referencia sin binario real): se marca cargado\n        // (100%) sin leer el blob placeholder. Retrocompatible: solo aplica con `preloaded`.\n        if (this._fileUpload?.preloaded) {\n            this.progressBar = 100;\n            this.validFile.emit();\n            return;\n        }\n\n        const file = this._fileUpload?.file;\n        if (!file) {\n            return;\n        }\n\n        // Archivo marcado inválido: no se lee el binario (puede pesar más del límite\n        // permitido). Se avisa el fin igual que tras la lectura —async, como el\n        // FileReader— y el padre decide si sigue inválido.\n        if (this._fileUpload.valid === false) {\n            Promise.resolve().then(() => {\n                this.progressBar = 100;\n                this.validFile.emit();\n            });\n            return;\n        }\n\n        const reader = new FileReader();\n\n        reader.onloadstart = () => {\n            this.progressBar = 0;\n        };\n\n        reader.onprogress = (event) => {\n            if (event.lengthComputable) {\n                this.progressBar = Math.round((event.loaded / event.total) * 100);\n            }\n        };\n\n        reader.onload = () => {\n            this.validFile.emit();\n            this.progressBar = 100;\n        };\n\n        reader.onerror = () => {\n            console.error('File upload failed');\n        };\n\n        reader.readAsArrayBuffer(file);\n    }\n\n    public downloadFile(): void {\n        // ADITIVO — Archivo PRECARGADO: descarga por URL directa (p. ej. storageLocation)\n        // en vez del blob placeholder. Solo aplica cuando hay `preloaded`.\n        if (this.fileUpload.preloaded) {\n            const url = this.fileUpload.preloaded.downloadUrl;\n            if (!url) {\n                console.error('No hay una URL de descarga para el archivo precargado');\n                return;\n            }\n            const link = document.createElement('a');\n            link.href = url;\n            link.target = '_blank';\n            link.rel = 'noopener';\n            link.download = this.fileUpload.preloaded.name ?? '';\n            document.body.appendChild(link);\n            link.click();\n            document.body.removeChild(link);\n            return;\n        }\n\n        const file = this.fileUpload.file;\n\n        // Verificamos que el archivo existe\n        if (!file) {\n            console.error('No hay un archivo disponible para descargar');\n            return;\n        }\n\n        const fileURL = URL.createObjectURL(file);\n\n        const downloadLink = document.createElement('a');\n        downloadLink.href = fileURL;\n\n        downloadLink.download = file.name;\n\n\n        document.body.appendChild(downloadLink);\n\n        downloadLink.click();\n\n\n        document.body.removeChild(downloadLink);\n\n\n        setTimeout(() => {\n            URL.revokeObjectURL(fileURL);\n        }, 100);\n    }\n\n\n}","\n<div class=\"p-2 mb-4 border-dashed rounded d-flex flex-column gap-2\">\n\n    <div class=\"d-flex justify-content-end w-100\">\n\n            @if (!fileUpload.validating) {\n                <lucide-angular [size]=\"20\" [color]=\"'#343F4B'\" [img]=\"iconX\" (click)=\"onRemoveFile()\" class=\"cursor-pointer\"></lucide-angular>\n            }\n\n    </div>\n\n    <div class=\"d-flex flex-column align-items-center text-center gap-2\">\n\n        <div class=\"mb-0\">\n        @if (progressBar === 100 && !fileUpload.validating) {\n            <lucide-angular [size]=\"32\" [color]=\"'#2DC579'\" [img]=\"iconCircle\"></lucide-angular>\n        } @else {\n            <span class=\"loader-dots\">\n            <div class=\"dot\"></div>\n            <div class=\"dot\"></div>\n            <div class=\"dot\"></div>\n            </span>\n        }\n        </div>\n        \n\n        <p class=\"mb-0 title-dowloand\">{{displayName}}</p>\n        \n\n        <div class=\"progress-container d-flex align-items-center mb-0\">\n        <div class=\"flex-grow-1 me-2\">\n            <mat-progress-bar\n            [ngClass]=\"{'completed-progress': progressBar === 100 && !fileUpload.validating}\"\n            color=\"primary\"\n            [mode]=\"(progressBar === 100 && fileUpload.validating) ? 'indeterminate' : 'determinate'\"\n            [value]=\"fileUpload.validating ? undefined : progressBar\">\n            </mat-progress-bar>\n        </div>\n        <span class=\"progress-text\">\n            @if (progressBar === 100 && fileUpload.validating) {\n                Cargando...\n            } @else {\n                {{progressBar}}%\n            }\n        </span>\n        </div>\n        \n\n        @if (displaySize !== null) {\n            <div class=\"file-size\">{{getFileSize(displaySize)}}</div>\n        }\n        <div class=\"d-flex align-items-center justify-content-center gap-3 flex-wrap\">\n            <button\n            type=\"button\"\n            class=\"d-flex align-items-center gap-4-px  download-link upload-action-btn border-0 bg-transparent p-0\"\n            (click)=\"downloadFile()\"\n            [attr.aria-label]=\"downloadLabel\">\n            <lucide-angular [size]=\"16\" [color]=\"'#5B62DA'\" [img]=\"iconDownload\"></lucide-angular>\n            <span class=\"upload-action-text\">{{downloadLabel}}</span>\n        </button>\n        @if (showSaveAsTemplate) {\n            <button\n            type=\"button\"\n            class=\"d-flex align-items-center gap-4-px download-link upload-action-btn border-0 bg-transparent p-0\"\n            (click)=\"onSaveAsTemplate()\"\n            aria-label=\"Guardar como plantilla\">\n            <lucide-angular [size]=\"16\" [color]=\"'#5B62DA'\" [img]=\"iconSave\"></lucide-angular>\n            <span class=\"upload-action-text\">Guardar como plantilla</span>\n        </button>\n        }\n        </div>\n    </div>\n</div>","export class UploadFilesSizeUtils {\n    public static readonly DEFAULT_MAX_FILE_SIZE_BYTES = 10 * 1024 * 1024;\n\n    public static readonly DEFAULT_SIZE_FILE_LABEL = '10 MB';\n\n    private static readonly SIZE_FILE_PATTERN = /^(\\d+)\\s?(B|KB|MB)$/i;\n\n    private static readonly UNIT_MULTIPLIERS_BYTES: Record<string, number> = {\n        B: 1,\n        KB: 1024,\n        MB: 1024 * 1024\n    };\n\n    // sizeFile con formato inválido, unidad no soportada, o no definido: se usa el default de 10 MB sin lanzar error.\n    public static parseSizeFileToBytes(sizeFile: string | null | undefined): number {\n        const match = UploadFilesSizeUtils.matchSizeFile(sizeFile);\n        if (!match) {\n            return UploadFilesSizeUtils.DEFAULT_MAX_FILE_SIZE_BYTES;\n        }\n\n        const [, amount, unit] = match;\n        return Number(amount) * UploadFilesSizeUtils.UNIT_MULTIPLIERS_BYTES[unit.toUpperCase()];\n    }\n\n    // Texto a mostrar del límite: el mismo criterio que parseSizeFileToBytes, para no mostrar un valor que no se aplica.\n    // Se normaliza a \"<cantidad> <UNIDAD>\" (\"5mb\" -> \"5 MB\").\n    public static getSizeFileLabel(sizeFile: string | null | undefined): string {\n        const match = UploadFilesSizeUtils.matchSizeFile(sizeFile);\n        if (!match) {\n            return UploadFilesSizeUtils.DEFAULT_SIZE_FILE_LABEL;\n        }\n\n        const [, amount, unit] = match;\n        return `${Number(amount)} ${unit.toUpperCase()}`;\n    }\n\n    private static matchSizeFile(sizeFile: string | null | undefined): RegExpExecArray | null {\n        if (typeof sizeFile !== 'string') {\n            return null;\n        }\n        return UploadFilesSizeUtils.SIZE_FILE_PATTERN.exec(sizeFile.trim());\n    }\n}\n","import { Component, ElementRef, EventEmitter, Input, Output, ViewChild } from '@angular/core';\nimport { FileUpload } from './interface/file-upload.interface';\nimport { OctagonAlert, Upload, X } from 'lucide-angular';\nimport { LucideAngularModule } from 'lucide-angular';\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\nimport { MatDialogModule } from '@angular/material/dialog';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatCardModule } from '@angular/material/card';\nimport { UploadFilesFileComponent } from './components/upload-files-file/upload-files-file.component';\nimport { NgClass } from '@angular/common';\nimport { UploadFilesSizeUtils } from './utils/upload-files-size.utils';\n@Component({\n    selector: 'kit-upload-files',\n    templateUrl: './upload-files.component.html',\n    imports:[\n        MatDialogModule,\n        MatIconModule,\n        MatCardModule,\n        LucideAngularModule,\n        MatProgressBarModule,\n        UploadFilesFileComponent,\n        NgClass\n    ]\n\n})\nexport class UploadFilesComponent {\n    iconUpload = Upload;\n    iconOctagon = OctagonAlert;\n    iconX =  X;\n    public message: string = 'El archivo no pudo ser cargado'\n    @ViewChild('inputFile') public inputFile!: ElementRef;\n    @Input() public filesSelected!: File[];\n    @Input() public allowedFormats: string[] = [];\n    @Input() public multipleFiles: boolean = false;\n    @Input() public description:string = 'Haz click para cargar documento';\n    @Input() public files:FileUpload[]=[];\n    @Input() sizeFile: string = '10 MB';\n    @Input() invalidFileView: boolean = false;\n    /**\n     * Renderiza las cards de archivos cargados también en modo multi-archivo\n     */\n    @Input() public showLoadedFiles: boolean = false;\n    /**\n     * Propaga la acción opcional \"Guardar como plantilla\" a cada card.\n     */\n    @Input() public showSaveAsTemplate: boolean = false;\n    /** Texto del botón de descarga de cada card (aditivo, default conservado). */\n    @Input() public downloadLabel: string = 'Descargar documento';\n    // OUTPUT TO NOTIFY CHANGES\n    \n    @Output() public filesUpload: EventEmitter<FileUpload[]> = new EventEmitter();\n    @Output() public invalidFile: EventEmitter<void> = new EventEmitter();\n    @Output() public fileRemoved: EventEmitter<void> = new EventEmitter();\n    /** Reemite la acción \"Guardar como plantilla\" de una card (CLVDKIF-1758). */\n    @Output() public saveAsTemplate: EventEmitter<FileUpload> = new EventEmitter();\n    public fileNameInvalid: string = ''\n    public DIALOG_TITLE:string = ''\n    public DIALOG_INFO!:string;\n    // public files:FileUpload[]=[]\n    public dragOverActive: boolean = false;\n    constructor(){}\n\n    public get disableAddFile(){\n        return !this.multipleFiles && this.files.length === 1\n    }\n\n    public getAllowedFormats():string {\n        return this.allowedFormats.map(e =>`.${e}`).join(', ');\n    }\n\n    private get maxFileSizeBytes(): number {\n        return UploadFilesSizeUtils.parseSizeFileToBytes(this.sizeFile);\n    }\n\n    // Límite que realmente se aplica: si sizeFile es inválido se muestra el default, no lo ingresado.\n    public get sizeFileLabel(): string {\n        return UploadFilesSizeUtils.getSizeFileLabel(this.sizeFile);\n    }\n\n    // Deja el mensaje y el nombre del archivo rechazado; lo comparten carga simple y múltiple\n    private setInvalidFile(file: File, reason: 'format' | 'size'): void {\n        this.message = reason === 'format'\n            ? 'El formato del archivo no es el correcto'\n            : 'El archivo supera el tamaño máximo permitido';\n        this.fileNameInvalid = file.name ?? '';\n    }\n\n    public handleUploadFile(event: any): void {\n        // Copia ANTES de limpiar el input: resetear `value` vacía esa misma FileList\n        // (no crea otra), y la selección llegaría vacía.\n        const files: File[] = Array.from(event.target['files'] ?? []);\n\n        event.target['value'] = '';\n\n        this.processSelection(files);\n    } \n      \n\n    public handleDrop(event: DragEvent): void {\n        event.preventDefault();\n        event.stopPropagation();\n        this.dragOverActive = false;\n        \n        if (event.dataTransfer && event.dataTransfer.files.length > 0) {\n            this.processSelection(event.dataTransfer.files);\n        }\n    }\n\n    /**\n     * Entrada única de selector y drag & drop. En multi procesa TODOS los archivos\n     * (el selector tomaba solo el primero aunque el input tenga `multiple`) y emite\n     * una sola vez, con `invalidFile` después de `filesUpload`, igual que el drop.\n     */\n    private processSelection(files: FileList | File[] | null | undefined): void {\n        if (!files || files.length === 0) {\n            return;\n        }\n\n        if (!this.multipleFiles) {\n            this.processFile(files[0]);\n            return;\n        }\n\n        let hasInvalidFiles = false;\n        for (let i = 0; i < files.length; i++) {\n            if (!this.processMultipleFiles(files[i])) {\n                hasInvalidFiles = true;\n            }\n        }\n\n        // Emitir solo una vez al final\n        this.emitFilesUpload();\n\n        // Emitir invalidFile solo si hay archivos inválidos\n        if (hasInvalidFiles) {\n            this.invalidFile.emit();\n        }\n    }\n\n    /** Motivo por el que se rechaza el archivo, o `null` si cumple formato y tamaño. */\n    private getRejectReason(file: File): 'format' | 'size' | null {\n        const fileExtension = file.name.split('.').pop()?.toLowerCase();\n        if (!fileExtension || !this.allowedFormats.includes(fileExtension)) {\n            return 'format';\n        }\n        return file.size > this.maxFileSizeBytes ? 'size' : null;\n    }\n\n    private processMultipleFiles(file: File): boolean {\n        if (!this.files) {\n            this.files = [];\n        }\n\n        const reason = this.getRejectReason(file);\n        if (reason) {\n            this.setInvalidFile(file, reason);\n            this.files.push({ file, valid: false });\n            return false; // Archivo inválido\n        }\n\n        this.files.push({ file, valid: true });\n        return true; // Archivo válido\n    }\n        \n\n    // Solo modo simple: un archivo rechazado no entra a `files`, solo se avisa.\n    private processFile(file: File): void {\n        if (!this.files) {\n            this.files = [];\n        }\n\n        const reason = this.getRejectReason(file);\n        if (reason) {\n            this.setInvalidFile(file, reason);\n            this.invalidFile.emit();\n            return;\n        }\n\n        this.files.push({ file, valid: true });\n        this.emitFilesUpload();\n    }\n      \n    /**\n     * La card avisa que terminó de leer el archivo. Eso no lo vuelve válido: un\n     * archivo que el kit RECHAZÓ (`valid:false` y no cumple formato o tamaño) sigue\n     * inválido. Antes se marcaba válido sin condición y, en multi con\n     * `showLoadedFiles`, un .html de más de 10 MB llegaba al consumidor como bueno.\n     *\n     * El resto conserva el comportamiento histórico (`valid = true`): precargados,\n     * archivos que el consumidor pasa por `[files]` y los ya válidos.\n     */\n    public handleValidFile(index: number) {\n        const upload = this.files[index];\n        if (!upload) {\n            return;\n        }\n        const rejected = upload.valid === false\n            && !upload.preloaded\n            && this.getRejectReason(upload.file) !== null;\n        upload.valid = !rejected;\n        this.emitFilesUpload();\n    }\n    \n    public onRemoveFile(index: number) {\n        this.files.splice(index, 1);\n        this.emitFilesUpload();\n    }\n    public onSaveAsTemplate(file: FileUpload) {\n        this.saveAsTemplate.emit(file);\n    }\n    public onRemoveInvalidFile(){\n        if (this.invalidFileView) {\n            this.fileRemoved.emit();\n        }\n    }\n    private emitFilesUpload() {\n        this.filesUpload.emit(this.files);\n    }\n\n}","@if(files && files.length > 0 && (!multipleFiles || showLoadedFiles)){\n    @for (file of files; track file; let idx = $index) {\n        <kit-upload-files-file\n            class=\"\"\n            [fileUpload]=\"file\"\n            [showSaveAsTemplate]=\"showSaveAsTemplate\"\n            [downloadLabel]=\"downloadLabel\"\n            (validFile)=\"handleValidFile(idx)\"\n            (removeFile)=\"onRemoveFile(idx)\"\n            (saveAsTemplate)=\"onSaveAsTemplate(file)\"></kit-upload-files-file>                                \n    }  \n} @else {\n    @if (!invalidFileView || multipleFiles) {\n        <div \n            class=\"p-2 mb-4 border-dashed rounded d-flex flex-column justify-content-center align-items-center gap-2\"\n            (click)=\"inputFile.click()\"\n            (keydown.enter)=\"inputFile.click()\"\n            (keydown.space)=\"$event.preventDefault(); inputFile.click()\"\n            (dragover)=\"$event.preventDefault(); $event.stopPropagation(); dragOverActive=true\"\n            (dragleave)=\"$event.preventDefault(); $event.stopPropagation(); dragOverActive=false\"\n            (drop)=\"handleDrop($event)\"\n            [ngClass]=\"{'bg-light-hover': dragOverActive}\"\n            tabindex=\"0\"\n            role=\"button\"\n            aria-label=\"Subir archivo\"\n            style=\"cursor: pointer; transition: all 0.3s ease;\">\n            <lucide-angular [size]=\"24\" [color]=\"dragOverActive ? '#3048DA' : '#5B62DA'\" [img]=\"iconUpload\"></lucide-angular>\n            <div [innerHTML]=\"description\"></div>\n            <p class=\"subtitle-download mb-0\">{{sizeFileLabel}} tamaño máximo del archivo Soporta archivos tipo: {{getAllowedFormats()}}</p>\n            <!-- Input file con atributo multiple explícito -->\n            <input \n                (change)=\"handleUploadFile($event)\"\n                type=\"file\"\n                hidden\n                #inputFile\n                [accept]=\"getAllowedFormats()\"\n                [multiple]=\"multipleFiles\" />\n        </div>\n    } @else {\n        <div \n            class=\"p-2 mb-4 border-dashed rounded d-flex flex-column align-items-center gap-2\" \n            [class.error]=\"invalidFileView\">\n            <div class=\"d-flex justify-content-end w-100\">\n                <lucide-angular \n                    [size]=\"20\" \n                    [color]=\"'#2A323C'\" \n                    [img]=\"iconX\" \n                    (click)=\"onRemoveInvalidFile()\">\n                </lucide-angular>\n            </div>\n            <lucide-angular [size]=\"32\" [color]=\"'#B4271F'\" [img]=\"iconOctagon\"></lucide-angular>\n            <div>{{fileNameInvalid}}</div>\n            <p class=\"mb-0 subtitle-download--error\" >{{message}}</p>\n            <p class=\"subtitle-download--error mb-0 fw-bold\">Reintente nuevamente</p>\n        </div>\n    }\n}","import { NgModule } from '@angular/core';\nimport { UploadFilesComponent } from './upload-files.component';\nimport { UploadFilesFileComponent } from './components/upload-files-file/upload-files-file.component';\n\n\n@NgModule({\n    imports: [\n        UploadFilesComponent,\n        UploadFilesFileComponent\n    ],\n    exports: [\n        UploadFilesComponent\n    ],\n    providers: []\n})\nexport class KifUploadFilesModule { }\n","/*\n * Public API Surface of kif-lib-file\n */\n\nexport * from './upload-files.component';\nexport * from './upload-files.module';\nexport * from './interface';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}