{"version":3,"file":"ng-prime-extensions-px-uploader.mjs","sources":["../../../projects/px-uploader/src/lib/px-uploader.ts","../../../projects/px-uploader/src/lib/px-uploader-file-size.pipe.ts","../../../projects/px-uploader/src/lib/px-uploader.component.ts","../../../projects/px-uploader/src/lib/px-uploader.component.html","../../../projects/px-uploader/src/public-api.ts","../../../projects/px-uploader/src/ng-prime-extensions-px-uploader.ts"],"sourcesContent":["import { HttpHeaders } from \"@angular/common/http\";\nimport {InjectionToken, TemplateRef} from \"@angular/core\";\nimport {Subscription} from \"rxjs\";\n\nexport interface PxEndpointConfig {\n    url: string;\n    requestMethod?: string;\n    headers?: HttpHeaders | { [p: string]: string | string[] } | Promise<HttpHeaders | {[p: string]: string | string[]}>;\n}\n\nexport interface PxFile<T = any> {\n    name: string;\n    /**\n     * bytes\n     */\n    size?: number;\n    /**\n     * A string containing the file's MIME type, or an empty string if the type could not be determined.\n     */\n    type?: string;\n    imagePreviewUrl?: string;\n    /**\n     * Always set if the uploaded file is an image\n     */\n    imageSize?: {height: number; width: number};\n    /**\n     * Custom data attached to this file(by default the response body from the save endpoint).\n     */\n    metaData?: T;\n    /**\n     * Allow/Disallow the deletion of this file after upload\n     */\n    allowDelete?: boolean;\n    /**\n     * Used internally\n     */\n    _internal?: {\n        /**\n         * Determines if this file has a recoverable error (temporary loss of connection, server down temporarily, etc.)\n         */\n        canRetryUpload?: boolean;\n        isUploading?: boolean;\n        /**\n         * File to be uploaded\n         */\n        uploadedFile?: File;\n        uploadError?: string;\n        httpSubscription?: Subscription;\n        uploadProgress?: number;\n    }\n}\n\nexport interface PxImageSize {\n    width?: number;\n    height?: number;\n    /**\n     * Whether the image should have these exact sizes\n     */\n    strict?: boolean;\n}\n\nexport enum PxUploaderIntl {\n    NO_FILES_MSG,\n    UNKNOWN_ERROR,\n    INVALID_EXTENSION,\n    MAX_SIZE_EXCEEDED,\n    ALLOWED_EXTENSIONS,\n    MAX_FILE_SIZE,\n    IMAGE_SIZE_CHECK_FAILED,\n    IMAGE_SIZE_CHECK_TEXT\n}\n\nexport const PX_UPLOADER_INTL = new InjectionToken<Record<PxUploaderIntl, string>>('px-uploader i18n strings');\n\nexport interface PxUploaderIcons {\n    retryUploadButton?: string;\n    removeFileButton?: string;\n    uploadButton?: string;\n    fileStatusIconUploading?: string;\n    fileStatusIconError?: string;\n    fileStatusIconQueued?: string;\n}\n\nexport interface PxUploaderButtons {\n    uploadButton?: TemplateRef<any>,\n    removeFileButton?: TemplateRef<any>,\n    retryUploadButton?: TemplateRef<any>\n}\n","import {inject, Pipe, PipeTransform} from '@angular/core';\nimport {PrimeNG} from \"primeng/config\";\n\n@Pipe({\n    standalone: true,\n    name: 'pxFileSize'\n})\nexport class PxFileSizePipe implements PipeTransform {\n    private readonly units: string[];\n    constructor() {\n        this.units = inject(PrimeNG).translation.fileSizeTypes || ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n    }\n\n    /**\n     * Converts bytes to a human-readable string\n     * @param bytes\n     * @param threshold Threshold after which the unit is increased. e.g. 1024B -> 1KB\n     * @param digits The number of fraction digits shown. E.g. 2.25MB\n     */\n    transform(bytes: number, threshold = 1024, digits = 2): string {\n        const units = this.units;\n        if (Math.abs(bytes) < threshold) {\n            return bytes + '' + units[0];\n        }\n\n        const maxUnits = units.length - 1;\n        let unit = 0;\n        const ra = 10 ** 1;\n\n        do {\n            bytes /= threshold;\n            ++unit;\n        } while (Math.round(Math.abs(bytes) * ra) / ra >= threshold && unit < maxUnits);\n\n        return bytes.toFixed(digits) + ' ' + units[unit];\n    }\n}\n","import {\n    AfterViewInit,\n    ChangeDetectorRef,\n    Component,\n    ElementRef,\n    EventEmitter,\n    Inject,\n    Input,\n    OnChanges,\n    OnDestroy,\n    Optional,\n    Output,\n    SimpleChanges,\n    ViewChild\n} from '@angular/core';\nimport {\n    PX_UPLOADER_INTL,\n    PxEndpointConfig,\n    PxFile,\n    PxImageSize,\n    PxUploaderButtons,\n    PxUploaderIcons,\n    PxUploaderIntl\n} from \"./px-uploader\";\nimport {catchError, of} from \"rxjs\";\nimport {HttpClient, HttpEventType} from \"@angular/common/http\";\nimport {ControlValueAccessor, NG_VALUE_ACCESSOR} from \"@angular/forms\";\nimport {PxFileSizePipe} from \"./px-uploader-file-size.pipe\";\nimport {NgClass, NgTemplateOutlet} from \"@angular/common\";\nimport {ProgressBar} from \"primeng/progressbar\";\nimport {Button} from \"primeng/button\";\nimport {PrimeNG} from \"primeng/config\";\n\n@Component({\n    selector: 'px-uploader',\n    templateUrl: './px-uploader.component.html',\n    styleUrl: './px-uploader.component.scss',\n    imports: [\n        NgClass,\n        ProgressBar,\n        Button,\n        NgTemplateOutlet,\n        PxFileSizePipe\n    ],\n    providers: [\n        {\n            provide: NG_VALUE_ACCESSOR,\n            multi: true,\n            useExisting: PxUploaderComponent\n        }\n    ]\n})\nexport class PxUploaderComponent implements ControlValueAccessor, OnChanges, AfterViewInit, OnDestroy\n{\n    /**\n     * Endpoint that handles the upload.\n     */\n    @Input({required: true}) saveEndpoint!: PxEndpointConfig;\n    /**\n     * Endpoint that handles file removal.\n     */\n    @Input() deleteEndpoint!: PxEndpointConfig;\n    /**\n     * Uploader label.\n     */\n    @Input() label: string = '';\n    /**\n     * Allow multiple files?\n     */\n    @Input() multiple = false;\n    /**\n     * Determines how the added files are rendered.\n     */\n    @Input() displayAs: 'list' | 'grid' = 'list';\n    /**\n     * A list of allowed file extensions(lowercase), if empty the extension check is skipped.\n     * Example: ['txt', 'xlsx', ...]\n     */\n    @Input() allowedExtensions: string[] = [];\n    /**\n     * Maximum file size in bytes. Default: 5MB.\n     */\n    @Input() maxFileSize = 5 * 1024 * 1024;\n    /**\n     * How many files should we upload in parallel?\n     */\n    @Input() maxParallelUploads = 5;\n    /**\n     * Whether to show a preview when the uploaded file is an image.\n     */\n    @Input() showImagePreview = true;\n    /**\n     * Limits the maximum width and/or height of uploaded images.\n     * For example, you can check if the uploaded image has a width of exactly 100\n     * by passing [maxImageSize]=\"{width: 100, strict: true}\" or just limit the maximum by removing the 'strict' property.\n     */\n    @Input() maxImageSize?: PxImageSize;\n    /**\n     * Overwrite the default icons used.\n     */\n    @Input() icons?: PxUploaderIcons;\n    /**\n     * Overwrite the default buttons used.\n     */\n    @Input() buttons?: PxUploaderButtons;\n    /**\n     * Additional message to be displayed to the user.\n     */\n    @Input() infoMessage?: string;\n    /**\n     * Displays the file name\n     */\n    @Input() showFileName = true;\n    /**\n     * Displays the file size in human-readable form\n     */\n    @Input() showFileSize = true;\n    /**\n     * If the file is an image, displays the image height and width\n     */\n    @Input() showImageSize = true;\n    /**\n     * Event triggered when all the files in the upload queue are uploaded.\n     */\n    @Output() uploadFinished = new EventEmitter<null | PxFile | PxFile[]>();\n\n    protected _value: PxFile[] = [];\n    protected filesQueue: PxFile[] = [];\n    protected maxImageSizeText: string = '';\n    protected allowedExtensionsText: string = '';\n    protected hasFiles = false;\n    protected dragoverEventActive = false;\n    protected readonly intl: Record<PxUploaderIntl, string>;\n    protected readonly PxUploaderIntl = PxUploaderIntl;\n    protected _disabled: boolean = false;\n\n    @ViewChild('fileInput')\n    private readonly fileInput!: ElementRef;\n    private onChange = (value: any) => value;\n    private onTouched = () => {};\n    private isTouched = false;\n    private isAngularFormValue = false;\n    private uploadingFilesCount = 0;\n    private processingUploadQueue = false;\n    private viewInit = false;\n\n    constructor(\n        private readonly http: HttpClient,\n        private readonly changeDetector: ChangeDetectorRef,\n        protected primeNGConfig: PrimeNG,\n        @Optional() @Inject(PX_UPLOADER_INTL) intl?: Record<PxUploaderIntl, string>,\n    )\n    {\n        this.intl = Object.assign({\n            [PxUploaderIntl.NO_FILES_MSG]: 'Drag & drop your files or click to browse',\n            [PxUploaderIntl.UNKNOWN_ERROR]: 'Upload Failed!',\n            [PxUploaderIntl.INVALID_EXTENSION]: 'Invalid file extension!',\n            [PxUploaderIntl.MAX_SIZE_EXCEEDED]: 'File size is too big!',\n            [PxUploaderIntl.ALLOWED_EXTENSIONS]: 'Allowed Extensions',\n            [PxUploaderIntl.MAX_FILE_SIZE]: 'Maximum file size',\n            [PxUploaderIntl.IMAGE_SIZE_CHECK_FAILED]: 'Maximum image width or height exceeded.',\n            [PxUploaderIntl.IMAGE_SIZE_CHECK_TEXT]: 'Allowed image dimensions (HxW)',\n        }, intl || {});\n    }\n\n    ngOnChanges(changes: SimpleChanges)\n    {\n        if (changes['allowedExtensions'])\n        {\n            this.allowedExtensionsText = this.allowedExtensions.join(', ');\n            !changes['allowedExtensions'].firstChange && this.changeDetector.detectChanges();\n        }\n\n        if (changes['maxImageSize'])\n        {\n            const maxImageSize = this.maxImageSize;\n            this.maxImageSizeText = (maxImageSize?.height || '') + 'x' + (maxImageSize?.width || '');\n            !changes['maxImageSize'].firstChange && this.changeDetector.detectChanges();\n        }\n\n        if (\n            (changes['multiple'] && !changes['multiple'].firstChange)\n            || (changes['buttons'] && !changes['buttons'].firstChange)\n        )\n        {\n            this.changeDetector.detectChanges();\n        }\n    }\n\n    ngAfterViewInit()\n    {\n        this.viewInit = true;\n    }\n\n    /**\n     * Opens the file input dialog.\n     */\n    openFilesInput()\n    {\n        this.getOpenFilesInputFn()();\n    }\n\n    /**\n     * Will always be null if there are no files (regardless of multiple attribute)\n     */\n    get value(): null | PxFile | PxFile[]\n    {\n        if (this.multiple)\n        {\n            return this._value.length ? this._value : null;\n        }\n\n        return this._value[0] || null;\n    }\n\n    @Input()\n    set value(value: PxFile[] | PxFile | null)\n    {\n        if (value === null)\n        {\n            this._value = [];\n            value = [];\n        }\n        else\n        {\n            if (!Array.isArray(value))\n            {\n                value = [value];\n            }\n            else if (!this.multiple && value.length)\n            {\n                value = [value[0]];\n            }\n\n            this._value = value;\n        }\n\n        this.hasFiles = value.length > 0;\n        if (!this.isAngularFormValue)\n        {\n            this.onChange(this.value);\n            this.onTouched();\n        }\n        this.changeDetector.detectChanges();\n    }\n\n    get disabled(): boolean\n    {\n        return this._disabled;\n    }\n\n    @Input()\n    set disabled(state: boolean)\n    {\n        this._disabled = state;\n        if(this.viewInit)\n        {\n            this.changeDetector.detectChanges();\n        }\n    }\n\n    setDisabledState(isDisabled: boolean)\n    {\n        this.disabled = isDisabled;\n    }\n\n    writeValue(value: any)\n    {\n        if (!value)\n        {\n            return;\n        }\n        this.isAngularFormValue = true;\n        this.value = value;\n        this.isAngularFormValue = false;\n    }\n\n    registerOnChange(onChange: any)\n    {\n        this.onChange = onChange;\n    }\n\n    registerOnTouched(onTouched: any)\n    {\n        this.onTouched = () => !this.isTouched && onTouched;\n    }\n\n    protected onFilesAdded(addedFiles: FileList)\n    {\n        if (!(addedFiles && addedFiles.length))\n        {\n            return;\n        }\n\n        if (!this.multiple)\n        {\n            this.filesQueue[0]?._internal!.httpSubscription?.unsubscribe();\n            this.filesQueue = [];\n            this._value = [];\n            this.changeDetector.detectChanges();\n        }\n\n        const files = this.multiple ? addedFiles : [addedFiles[0]];\n        for (let i = files.length; i--;)\n        {\n            const file: File = files[i];\n\n            this.checkFile(file).then(pxFile =>\n            {\n                this.filesQueue.push(pxFile);\n                this.processUploadQueue().then();\n                this.changeDetector.detectChanges();\n            });\n        }\n\n        this.fileInput.nativeElement.value = '';\n    }\n\n    protected async processUploadQueue()\n    {\n        if (this.processingUploadQueue || this.uploadingFilesCount === this.maxParallelUploads)\n        {\n            return;\n        }\n\n        this.processingUploadQueue = true;\n\n        const queuedFiles = this.filesQueue;\n        const queueLength = queuedFiles.length;\n        let nextUploadFile: PxFile | null = null;\n        let fileUploadInProgress = false;\n\n        for (let i = 0; i < queueLength; ++i)\n        {\n            const queuedFile = queuedFiles[i];\n\n            if (queuedFile._internal!.uploadError)\n            {\n                continue;\n            }\n\n            if (queuedFile._internal!.isUploading)\n            {\n                fileUploadInProgress = true;\n                continue;\n            }\n\n            nextUploadFile = queuedFile;\n            break;\n        }\n\n        this.processingUploadQueue = false;\n\n        if (nextUploadFile)\n        {\n            this.uploadFile(nextUploadFile).then((sub) =>\n            {\n                nextUploadFile._internal!.httpSubscription = sub;\n                if (this.uploadingFilesCount < this.maxParallelUploads)\n                {\n                    this.processUploadQueue().then();\n                }\n            });\n        }\n        else if (!fileUploadInProgress)\n        {\n            this.uploadFinished.emit(this.value);\n        }\n    }\n\n    protected async uploadFile(queuedPxFile: PxFile)\n    {\n        ++this.uploadingFilesCount;\n        const formData = new FormData();\n        const file = queuedPxFile._internal!.uploadedFile as File;\n        const saveEndpoint = this.saveEndpoint;\n        const headers = saveEndpoint.headers;\n        queuedPxFile._internal!.isUploading = true;\n\n        formData.append(\"file\", file);\n\n        const requestHeaders = headers instanceof Promise ? await headers : headers;\n\n        return this.http.request(saveEndpoint.requestMethod || 'POST', saveEndpoint.url, {\n            reportProgress: true,\n            observe: 'events',\n            body: formData,\n            headers: requestHeaders\n        }).pipe(\n            catchError(() =>\n            {\n                queuedPxFile._internal!.uploadError = this.intl[PxUploaderIntl.UNKNOWN_ERROR];\n                queuedPxFile._internal!.isUploading = false;\n                delete queuedPxFile._internal!.uploadProgress;\n                --this.uploadingFilesCount;\n                this.changeDetector.detectChanges();\n                return of({});\n            }),\n        ).subscribe((event: any) =>\n        {\n            switch (event.type)\n            {\n                case HttpEventType.UploadProgress:\n                    let progress = Math.floor(event.loaded / (event.total || 1) * 100);\n                    if(progress > 100)\n                    {\n                        progress = 100;\n                    }\n                    queuedPxFile._internal!.uploadProgress = progress;\n                    this.changeDetector.detectChanges();\n                    break;\n\n                case HttpEventType.Response:\n                    --this.uploadingFilesCount;\n                    if (!this.multiple)\n                    {\n                        this._value = [];\n                    }\n\n                    const uploadedFiles = this._value;\n                    const uploadQueue = this.filesQueue;\n\n                    const uploadedFileQueueIndex = uploadQueue.indexOf(queuedPxFile);\n                    if (uploadedFileQueueIndex > -1)\n                    {\n                        uploadQueue.splice(uploadedFileQueueIndex, 1);\n                    }\n\n                    queuedPxFile.metaData = event.body || {};\n                    delete queuedPxFile._internal;\n                    uploadedFiles.push(queuedPxFile);\n\n                    this.value = uploadedFiles;\n\n                    this.processUploadQueue();\n                    break;\n            }\n        });\n    }\n\n    protected removeFileFromQueue(fileIndex: number)\n    {\n        this.filesQueue.splice(fileIndex, 1);\n    }\n\n    /**\n     * Removes an uploaded file by index\n     * @param fileIndex\n     */\n    protected async removeFile(fileIndex: number)\n    {\n        const file = this._value.splice(fileIndex, 1)[0];\n        this.value = this._value;\n\n        if (this.deleteEndpoint)\n        {\n            const deleteEndpoint = this.deleteEndpoint;\n            const requestHeaders = deleteEndpoint.headers instanceof Promise ? await deleteEndpoint.headers : deleteEndpoint.headers;\n            this.http.request(\n                deleteEndpoint.url,\n                deleteEndpoint.requestMethod || 'DELETE',\n                {\n                    body: [file],\n                    headers: requestHeaders\n                }).subscribe();\n        }\n    }\n\n    protected onDragEnter(evt: DragEvent)\n    {\n        evt.preventDefault();\n        this.dragoverEventActive = true;\n    }\n\n    protected onDragover(evt: DragEvent)\n    {\n        evt.preventDefault();\n        if (!this.dragoverEventActive)\n        {\n            this.dragoverEventActive = true;\n        }\n    }\n\n    protected onDragLeave(evt: DragEvent)\n    {\n        evt.preventDefault();\n        this.dragoverEventActive = false;\n    }\n\n    protected onFilesDropped(evt: DragEvent)\n    {\n        evt.preventDefault();\n\n        const files = evt.dataTransfer?.files;\n        if (files)\n        {\n            this.onFilesAdded(files);\n        }\n\n        this.dragoverEventActive = false;\n    }\n\n    protected getRetryUploadFn(queuedFileIndex: number)\n    {\n        return () =>\n        {\n            const queuedFile = this.filesQueue[queuedFileIndex];\n            if (queuedFile)\n            {\n                delete queuedFile._internal!.uploadError;\n                this.processUploadQueue().then();\n            }\n        };\n    }\n\n    protected getRemoveFileFn(isQueued: boolean, fileIndex: number)\n    {\n        return () =>\n        {\n            isQueued ? this.removeFileFromQueue(fileIndex) : this.removeFile(fileIndex);\n        }\n    }\n\n    protected getOpenFilesInputFn()\n    {\n        return () => this.fileInput.nativeElement.click();\n    }\n\n    private async checkFile(file: File): Promise<PxFile>\n    {\n        const pxFile: PxFile = {\n            name: file.name,\n            size: file.size,\n            type: file.type,\n            _internal: {\n                canRetryUpload: true,\n                isUploading: false,\n                uploadedFile: file,\n                uploadProgress: 0,\n            }\n        };\n\n        if (file.size > this.maxFileSize)\n        {\n            return this.setPxFileError(PxUploaderIntl.MAX_SIZE_EXCEEDED, pxFile);\n        }\n\n        const allowedExtensions = this.allowedExtensions;\n        if (allowedExtensions.length)\n        {\n            const dotIndex = file.name.lastIndexOf('.');\n            // File extension valid?\n            if (!((dotIndex > 0) && (allowedExtensions.indexOf(file.name.substring(dotIndex + 1).toLowerCase()) !== -1)))\n            {\n                return this.setPxFileError(PxUploaderIntl.INVALID_EXTENSION, pxFile);\n            }\n        }\n\n        if (file.type.includes('image'))\n        {\n            const imageDetails = await this.getImageDetails(file);\n            pxFile.imagePreviewUrl = imageDetails.previewUrl;\n            pxFile.imageSize = {\n                width: imageDetails.width,\n                height: imageDetails.height,\n            };\n\n            if(!this.checkImage(pxFile))\n            {\n                return pxFile;\n            }\n        }\n\n        return pxFile;\n    }\n\n    private checkImage(pxFile: PxFile): boolean\n    {\n        if (this.maxImageSize)\n        {\n            const imageHeight = pxFile.imageSize?.height || 0;\n            const imageWidth = pxFile.imageSize?.width || 0;\n            const maxImageSize = this.maxImageSize;\n\n            let imageCheckFail = false;\n\n            if (maxImageSize.width !== undefined && maxImageSize.height !== undefined)\n            {\n                if(maxImageSize.strict)\n                {\n                    imageCheckFail = maxImageSize.height !== imageHeight || maxImageSize.width !== imageWidth;\n                }\n                else\n                {\n                    imageCheckFail = maxImageSize.height > imageHeight || maxImageSize.width > imageWidth;\n                }\n            }\n            else if (maxImageSize.width !== undefined)\n            {\n                if(maxImageSize.strict)\n                {\n                    imageCheckFail = maxImageSize.width !== imageWidth;\n                }\n                else\n                {\n                    imageCheckFail = maxImageSize.width > imageWidth;\n                }\n            }\n            else if(maxImageSize.height !== undefined)\n            {\n                if(maxImageSize.strict)\n                {\n                    imageCheckFail = maxImageSize.height !== imageHeight;\n                }\n                else\n                {\n                    imageCheckFail = maxImageSize.height > imageHeight;\n                }\n            }\n\n            if (imageCheckFail)\n            {\n                this.setPxFileError(PxUploaderIntl.IMAGE_SIZE_CHECK_FAILED, pxFile);\n            }\n        }\n\n        return true;\n    }\n\n    private setPxFileError(errorKey: PxUploaderIntl, pxFile: PxFile)\n    {\n        const internalProps = pxFile._internal;\n        internalProps!.canRetryUpload = false;\n        internalProps!.uploadError = this.intl[errorKey];\n        return pxFile;\n    }\n\n    private getImageDetails(file: File): Promise<{ width: number; height: number; previewUrl: string; }>\n    {\n        return new Promise((resolve) =>\n        {\n            createImageBitmap(file).then(bitmap =>\n            {\n                resolve({\n                    width: bitmap.width,\n                    height: bitmap.height,\n                    previewUrl: URL.createObjectURL(file)\n                });\n            }).catch(() =>\n            {\n                resolve({\n                    width: 0,\n                    height: 0,\n                    previewUrl: ''\n                });\n            });\n        });\n    }\n\n    ngOnDestroy()\n    {\n        this.uploadFinished.complete();\n    }\n}\n","<div\n    [ngClass]=\"{'px-uploader': true, 'dragover': dragoverEventActive, 'no-label': label === '', 'px-uploader-disabled': disabled}\"\n    (dragleave)=\"onDragLeave($event)\"\n    (dragover)=\"onDragover($event)\"\n    (dragenter)=\"onDragEnter($event)\"\n    (drop)=\"onFilesDropped($event)\"\n>\n    <label class=\"px-uploader-label\">{{ label }}</label>\n    <div class=\"px-uploader-info\">\n        <div style=\"display: flex; align-items: center; flex-wrap: wrap;\">\n            @if(buttons?.uploadButton)\n            {\n                <ng-container [ngTemplateOutlet]=\"buttons!.uploadButton!\" [ngTemplateOutletContext]=\"{icon: icons?.uploadButton || 'pi pi-upload', onClick: getOpenFilesInputFn(), disabled: disabled}\"></ng-container>\n            }\n            @else\n            {\n                <p-button class=\"px-uploader-upload-button\" [icon]=\"icons?.uploadButton || 'pi pi-upload'\" [label]=\"primeNGConfig.translation.upload\" [disabled]=\"disabled\" (onClick)=\"openFilesInput()\"></p-button>\n            }\n            <div class=\"px-uploader-info-primary\">\n                <label class=\"px-uploader-msg\">{{ intl[PxUploaderIntl.NO_FILES_MSG] }}</label>\n            </div>\n        </div>\n        <div class=\"px-uploader-info-secondary\">\n            @if(allowedExtensions.length)\n            {\n                <span class=\"px-uploader-info-secondary-msg\">\n                    {{ intl[PxUploaderIntl.ALLOWED_EXTENSIONS] + ': ' + allowedExtensionsText }}\n                </span>\n            }\n\n            <span>{{ intl[PxUploaderIntl.MAX_FILE_SIZE] + ': ' + (maxFileSize | pxFileSize) }}</span>\n\n            @if(maxImageSizeText)\n            {\n                <span class=\"px-uploader-info-secondary-msg\">{{ intl[PxUploaderIntl.IMAGE_SIZE_CHECK_TEXT] + ': ' + maxImageSizeText }}</span>\n            }\n\n            @if(infoMessage)\n            {\n                <span class=\"px-uploader-info-secondary-info-msg\">{{infoMessage}}</span>\n            }\n        </div>\n    </div>\n\n    <div class=\"px-uploader-files\">\n        @for (uploadedFile of _value; track $index)\n        {\n            <ng-container\n                [ngTemplateOutlet]=\"file\"\n                [ngTemplateOutletContext]=\"{file: uploadedFile, isQueuedFile: false, fileIndex: $index}\"></ng-container>\n        }\n\n        @for (queuedFile of filesQueue; track $index)\n        {\n            <ng-container\n                [ngTemplateOutlet]=\"file\"\n                [ngTemplateOutletContext]=\"{file: queuedFile, isQueuedFile: true, fileIndex: $index}\"></ng-container>\n        }\n    </div>\n</div>\n\n<input\n    #fileInput\n    style=\"display: none;\"\n    type=\"file\"\n    [accept]=\"allowedExtensions.length ? '.' + allowedExtensions.join(',.') : null\"\n    [multiple]=\"multiple\"\n    (change)=\"onFilesAdded($any($event.target).files)\">\n\n<ng-template #file let-file=\"file\" let-isQueued=\"isQueuedFile\" let-fileIndex=\"fileIndex\">\n    <div class=\"px-uploader-file\" [ngClass]=\"[displayAs, showImagePreview && file.imagePreviewUrl ? 'preview' : '', file._internal?.uploadError ? 'px-uploader-error' : '', isQueued ? 'queued' : '']\">\n        @if(showImagePreview && file.imagePreviewUrl)\n        {\n            <img\n                class=\"px-uploader-file-preview\"\n                [src]=\"file.imagePreviewUrl\" alt=\"\">\n        }\n        <div class=\"px-uploader-file-header-container\">\n            @if(isQueued && !file._internal?.uploadError)\n            {\n                <p-progressBar\n                    [mode]=\"file._internal.uploadProgress > 0 && file._internal.uploadProgress !== 100 ? 'determinate' : 'indeterminate'\"\n                    [value]=\"file._internal.uploadProgress || 0\"\n                    [style]=\"{ height: '1rem', 'border-bottom-right-radius': 0, 'border-bottom-left-radius': 0 }\"\n                ></p-progressBar>\n            }\n\n            <div class=\"px-uploader-file-header\">\n                <div class=\"px-uploader-file-info\">\n                    @if(isQueued)\n                    {\n                        <i class=\"px-uploader-file-status-icon\" [class]=\"file._internal.isUploading ? icons?.fileStatusIconUploading || 'pi pi-spin pi-spinner' : (file._internal.uploadError !== undefined ? icons?.fileStatusIconError || 'pi pi-times-circle' : icons?.fileStatusIconQueued || 'pi pi-hourglass')\"></i>\n                    }\n\n                    <div class=\"px-uploader-file-info flex-column\">\n                        @if(showFileName)\n                        {\n                            <span class=\"px-uploader-file-info-primary\">{{file.name}}</span>\n                        }\n\n                        @if(showImageSize && file.imageSize)\n                        {\n                            <span class=\"px-uploader-file-info-secondary\">{{file.imageSize.width}}x{{file.imageSize.height}}</span>\n                        }\n\n                        @if(showFileSize)\n                        {\n                            <span class=\"px-uploader-file-info-secondary\">{{(file.size || 0) | pxFileSize}}</span>\n                        }\n                    </div>\n                </div>\n\n                <div class=\"px-uploader-file-info actions\">\n                    <div class=\"px-uploader-file-info\">\n                        <span class=\"px-uploader-file-info-primary\">{{file._internal?.uploadError}}</span>\n                    </div>\n                    @if(isQueued && file._internal.uploadError && file._internal.canRetryUpload)\n                    {\n                        @if(buttons?.retryUploadButton)\n                        {\n                            <ng-container [ngTemplateOutlet]=\"buttons!.retryUploadButton!\" [ngTemplateOutletContext]=\"{icon: icons?.retryUploadButton || 'pi pi-refresh', onClick: getRetryUploadFn(fileIndex), disabled: disabled}\"></ng-container>\n                        }\n                        @else\n                        {\n                            <p-button\n                                class=\"px-uploader-file-info-action-button\"\n                                [icon]=\"icons?.retryUploadButton || 'pi pi-refresh'\"\n                                [disabled]=\"disabled\"\n                                [style]=\"{'pointer-events': 'visible'}\"\n                                (onClick)=\"getRetryUploadFn(fileIndex)()\"\n                            ></p-button>\n                        }\n                    }\n\n                    @if(!file._internal?.isUploading && (file.allowDelete === undefined || file.allowDelete))\n                    {\n                        @if(buttons?.removeFileButton)\n                        {\n                            <ng-container [ngTemplateOutlet]=\"buttons!.removeFileButton!\" [ngTemplateOutletContext]=\"{icon: icons?.removeFileButton || 'pi pi-trash', onClick: getRemoveFileFn(isQueued, fileIndex), disabled: disabled}\"></ng-container>\n                        }\n                        @else\n                        {\n                            <p-button\n                                class=\"px-uploader-file-info-action-button\"\n                                [icon]=\"icons?.removeFileButton || 'pi pi-trash'\"\n                                severity=\"warn\"\n                                [style]=\"{'pointer-events': 'visible'}\"\n                                [disabled]=\"disabled\"\n                                (onClick)=\"getRemoveFileFn(isQueued, fileIndex)()\"\n                            ></p-button>\n                        }\n                    }\n                </div>\n            </div>\n        </div>\n    </div>\n</ng-template>\n","/*\n * Public API Surface of px-uploader\n */\n\nexport * from './lib/px-uploader';\nexport * from './lib/px-uploader-file-size.pipe';\nexport * from './lib/px-uploader.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}