@ng-prime-extensions/px-uploader
Version:
PrimeNG uploader extension
1 lines • 48.4 kB
Source Map (JSON)
{"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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"}