{"version":3,"file":"ng-dominus-dm-uploader.mjs","sources":["../../../projects/dm-uploader/src/lib/dm-uploader.ts","../../../projects/dm-uploader/src/shared/custom-angular-form-control.ts","../../../projects/dm-uploader/src/shared/custom-angular-material-form-control.ts","../../../projects/dm-uploader/src/lib/dm-uploader-file-size.pipe.ts","../../../projects/dm-uploader/src/lib/dm-uploader.component.ts","../../../projects/dm-uploader/src/lib/dm-uploader.component.html","../../../projects/dm-uploader/src/public-api.ts","../../../projects/dm-uploader/src/ng-dominus-dm-uploader.ts"],"sourcesContent":["import {InjectionToken} from \"@angular/core\";\n\nexport interface DominusFile {\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     * Custom data attached to this file(usually the response body from the server after upload).\n     */\n    data?: { [key: string]: any };\n}\n\nexport interface DominusQueuedFile extends DominusFile {\n    id: number;\n    progress: number;\n    error: string;\n    file: File;\n    canRetryUpload: boolean;\n}\n\nexport enum DmUploaderIntl {\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 DM_UPLOADER_INTL = new InjectionToken<Record<DmUploaderIntl, string>>('Dominus uploader i18n strings');\n\nexport interface DominusImageSize {\n    width?: number;\n    height?: number;\n}\n","import {ControlValueAccessor, NgControl} from \"@angular/forms\";\nimport {Component} from \"@angular/core\";\n\n@Component({\n    standalone: true,\n    template: ''\n})\nexport abstract class CustomAngularFormControl implements ControlValueAccessor {\n    protected _disabled: boolean = false;\n    private touched: boolean = false;\n    protected onChange = (value: any) => value;\n    protected onTouched = () => {\n    };\n\n    private incomingAngularFormValue = false;\n\n    protected constructor(\n        public ngControl: NgControl\n    ) {\n        if (this.ngControl) {\n            this.ngControl.valueAccessor = this;\n        }\n    }\n\n    abstract get value();\n    abstract set value(val: any);\n\n    registerOnChange(fn: any): void {\n        this.onChange = (value: any) => {\n            !this.incomingAngularFormValue && fn(value);\n        };\n    }\n\n    registerOnTouched(fn: any): void {\n        this.onTouched = fn;\n    }\n\n    controlTouched() {\n        !this.touched && this.onTouched();\n    }\n\n    setDisabledState(isDisabled: boolean): void {\n        this._disabled = isDisabled;\n    }\n\n    writeValue(value: any): void {\n        this.incomingAngularFormValue = true;\n        this.value = value;\n        this.incomingAngularFormValue = false;\n    }\n}\n","import {CustomAngularFormControl} from \"./custom-angular-form-control\";\nimport {MatFormFieldControl} from \"@angular/material/form-field\";\nimport {Component, ElementRef, Input, OnDestroy, OnInit, Optional, Self} from \"@angular/core\";\nimport {NgControl, Validators} from \"@angular/forms\";\nimport {FocusMonitor, FocusOrigin} from \"@angular/cdk/a11y\";\nimport {Subject, Subscription} from \"rxjs\";\nimport {coerceBooleanProperty} from \"@angular/cdk/coercion\";\n\n@Component({\n    standalone: true,\n    template: ''\n})\nexport abstract class CustomAngularMaterialFormControl<T> extends CustomAngularFormControl implements OnInit, OnDestroy, MatFormFieldControl<T> {\n    @Input() placeholder = '';\n\n    abstract id: string;\n    stateChanges = new Subject<void>();\n    focused = false;\n\n    protected _required: boolean = false;\n\n    private focusMonSub?: Subscription;\n    private formControlStatusChangesSub?: Subscription;\n\n    /**\n     * Base class for custom angular material form controls\n     * @param ngControl\n     * @param focusMonitor If set, the focus monitor will monitor the selfElementRef\n     * @param selfElementRef Required if focusMonitor is set\n     * @protected\n     */\n    protected constructor(\n        @Optional() @Self() ngControl: NgControl,\n        private focusMonitor?: FocusMonitor,\n        private selfElementRef?: ElementRef\n    ) {\n        super(ngControl);\n    }\n\n    ngOnInit() {\n        if (this.focusMonitor && this.selfElementRef) {\n            this.focusMonSub = this.focusMonitor.monitor(this.selfElementRef.nativeElement, true).subscribe(origin => this.onFocusLost(origin));\n        }\n\n        if (this.ngControl) {\n            const ngFormControl = this.ngControl.control;\n            if (ngFormControl) {\n                this._required = ngFormControl.hasValidator(Validators.required) ?? false;\n                this.formControlStatusChangesSub = ngFormControl.statusChanges.subscribe(() => {\n                    const required = ngFormControl.hasValidator(Validators.required) ?? false;\n                    if (required !== this._required) {\n                        this._required = required;\n                        this.stateChanges.next();\n                    }\n                });\n            }\n        }\n    }\n\n    abstract get empty(): boolean;\n\n    @Input()\n    get disabled() {\n        return this._disabled;\n    }\n\n    set disabled(dis) {\n        this._disabled = coerceBooleanProperty(dis);\n        this.stateChanges.next();\n    }\n\n    @Input()\n    get required(): boolean {\n        return this._required;\n    }\n\n    set required(req: any) {\n        this._required = coerceBooleanProperty(req);\n        this.stateChanges.next();\n    }\n\n    get errorState(): boolean {\n        return (this.ngControl && this.ngControl.invalid && this.ngControl.touched) as boolean;\n    }\n\n    get shouldLabelFloat() {\n        return this.focused || !this.empty;\n    }\n\n    setDescribedByIds(): void {\n    }\n\n    onContainerClick(): void {\n        this.controlTouched();\n    }\n\n    ngOnDestroy() {\n        this.stateChanges.complete();\n        if (this.focusMonitor) {\n            this.focusMonitor.stopMonitoring((this.selfElementRef as ElementRef).nativeElement);\n            (this.focusMonSub as Subscription).unsubscribe();\n        }\n        this.formControlStatusChangesSub?.unsubscribe();\n    }\n\n    /**\n     * FocusMonitor needs to be set in the constructor.\n     * Called whenever the form control loses focus.\n     * @protected\n     */\n    protected onFocusLost(origin: FocusOrigin) {\n        this.focused = !!origin;\n        this.stateChanges.next();\n    }\n}\n","import {Pipe, PipeTransform} from '@angular/core';\n\n@Pipe({\n    standalone: true,\n    name: 'dmFileSize'\n})\nexport class DmFileSizePipe implements PipeTransform {\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        if (Math.abs(bytes) < threshold) {\n            return bytes + ' bytes';\n        }\n\n        const units = ['kB', 'MB', 'GB', 'TB', 'PB'];\n        const maxUnits = units.length - 1;\n        let unit = -1;\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(2) + ' ' + units[unit];\n    }\n}\n","import {\n    AfterViewInit,\n    ChangeDetectionStrategy,\n    ChangeDetectorRef,\n    Component,\n    ElementRef,\n    EventEmitter,\n    Inject,\n    Input,\n    OnChanges, OnDestroy,\n    Optional,\n    Output,\n    Self, SimpleChanges,\n    ViewChild\n} from '@angular/core';\nimport {CommonModule} from '@angular/common';\nimport {MatIconModule} from \"@angular/material/icon\";\nimport {MatButtonModule} from \"@angular/material/button\";\nimport {MAT_FORM_FIELD, MatFormField, MatFormFieldControl} from \"@angular/material/form-field\";\nimport {NgControl} from \"@angular/forms\";\nimport {\n    DM_UPLOADER_INTL,\n    DominusFile,\n    DominusImageSize,\n    DominusQueuedFile,\n    DmUploaderIntl\n} from \"./dm-uploader\";\nimport {HttpClient, HttpEventType, HttpHeaders} from \"@angular/common/http\";\nimport {ThemePalette} from \"@angular/material/core\";\nimport {catchError, of} from \"rxjs\";\nimport {CustomAngularMaterialFormControl} from \"../shared/custom-angular-material-form-control\";\nimport {DmFileSizePipe} from \"./dm-uploader-file-size.pipe\";\nimport {MatProgressBarModule} from \"@angular/material/progress-bar\";\n\n@Component({\n    selector: 'dm-uploader',\n    standalone: true,\n    styleUrl: './dm-uploader.component.scss',\n    templateUrl: './dm-uploader.component.html',\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    providers: [\n        {\n            provide: MatFormFieldControl,\n            useExisting: DmUploaderComponent\n        }\n    ],\n    imports: [\n        CommonModule,\n        MatIconModule,\n        MatButtonModule,\n        DmFileSizePipe,\n        MatProgressBarModule\n    ],\n})\nexport class DmUploaderComponent extends CustomAngularMaterialFormControl<DominusFile[]> implements OnChanges, AfterViewInit, OnDestroy {\n    static nextId = 0;\n\n    id = `dm-uploader-${DmUploaderComponent.nextId++}`;\n\n    /**\n     * Endpoint that handles storing the file\n     */\n    @Input({required: true}) fileSaveEndpoint!: string;\n    @Input() fileSaveEndpointRequestMethod = 'POST';\n    @Input() fileSaveEndpointRequestHeaders?: HttpHeaders | { [p: string]: string | string[] } | Promise<HttpHeaders | {\n        [p: string]: string | string[]\n    }>;\n\n    /**\n     * Endpoint to be called when deleting a file or clearing all uploaded files if [multiple] = true\n     */\n    @Input() fileDeleteEndpoint?: string;\n    @Input() fileDeleteEndpointRequestMethod = 'DELETE';\n    @Input() fileDeleteEndpointRequestHeaders?: HttpHeaders | {\n        [p: string]: string | string[]\n    } | Promise<HttpHeaders | { [p: string]: string | string[] }>;\n\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    @Input() progressBarColor: ThemePalette = 'primary';\n\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    /**\n     * Maximum file size in bytes. Default: 5MB\n     */\n    @Input() maxFileSize = 5 * 1024 * 1024;\n\n    /**\n     * Whether to show a preview when the uploaded file is an image.\n     * Does not apply image-uploader type\n     */\n    @Input() showImagePreview = true;\n\n    /**\n     * Limits the maximum width and/or height of uploaded images.\n     * Multiple sizes can be added in the array, for example you can\n     * check if the uploaded image has a width of 100 by passing [maxImageSize]=\"[{width: 100}]\"\n     */\n    @Input() maxImageSize?: DominusImageSize[];\n\n    /**\n     * Event triggered when all the files in the upload queue are uploaded.\n     */\n    @Output() uploadFinished = new EventEmitter<DominusFile[]>();\n\n    protected containerClasses: { [className: string]: boolean } = {\n        'mat-form-field': false,\n        'dragover': false\n    };\n    protected _value: DominusFile[] = [];\n    protected lastFileId = 0;\n    protected filesQueue = new Map<number, DominusQueuedFile>();\n    protected maxImageSizeText: string = '';\n    protected allowedExtensionsText: string = '';\n    protected hasFiles = false;\n    protected readonly DmUploaderIntl = DmUploaderIntl;\n    protected readonly intl: Record<DmUploaderIntl, string>;\n\n    private viewInit = false;\n    @ViewChild('fileInput') private readonly fileInput!: ElementRef;\n\n    constructor(\n        protected readonly http: HttpClient,\n        protected readonly changeDetector: ChangeDetectorRef,\n        @Optional() @Self() ngControl: NgControl,\n        @Optional() @Inject(DM_UPLOADER_INTL) intl?: Record<DmUploaderIntl, string>,\n        @Optional() @Inject(MAT_FORM_FIELD) parentFormField?: MatFormField,\n    ) {\n        super(ngControl);\n\n        if(parentFormField) {\n            this.containerClasses['mat-form-field'] = true;\n        }\n\n        this.intl = Object.assign({\n            [DmUploaderIntl.NO_FILES_MSG]: 'Drag&drop your files or click to browse',\n            [DmUploaderIntl.UNKNOWN_ERROR]: 'Upload Failed!',\n            [DmUploaderIntl.INVALID_EXTENSION]: 'Invalid file extension!',\n            [DmUploaderIntl.MAX_SIZE_EXCEEDED]: 'File size is too big!',\n            [DmUploaderIntl.ALLOWED_EXTENSIONS]: 'Allowed Extensions',\n            [DmUploaderIntl.MAX_FILE_SIZE]: 'Maximum file size',\n            [DmUploaderIntl.IMAGE_SIZE_CHECK_FAILED]: 'Maximum width or height exceeded.',\n            [DmUploaderIntl.IMAGE_SIZE_CHECK_TEXT]: 'Allowed image dimensions (HxW)',\n        }, intl || {});\n    }\n\n    ngOnChanges(changes: SimpleChanges) {\n        if(changes['allowedExtensions']) {\n            this.allowedExtensionsText = this.allowedExtensions.join(', ');\n        }\n\n        if (changes['maxImageSize'] && this.maxImageSize?.length) {\n            this.maxImageSizeText = this.maxImageSize.map(size => size.height + 'x' + size.width).join(', ');\n        }\n\n        if(this.viewInit) {\n            this.changeDetector.markForCheck();\n            this.stateChanges.next();\n        }\n    }\n\n    ngAfterViewInit() {\n        this.viewInit = true;\n    }\n\n    /**\n     * Opens the file input dialog.\n     */\n    openFilesInput() {\n        this.fileInput.nativeElement.click()\n    }\n\n    get value(): DominusFile[] {\n        return this._value;\n    }\n\n    @Input()\n    set value(value: DominusFile[] | DominusFile | null) {\n        value = value || [];\n\n        if (!Array.isArray(value)) {\n            value = [value];\n        }\n\n        this._value = value;\n        this.hasFiles = this._value.length > 0;\n        this.onChange(value);\n        this.changeDetector.markForCheck();\n        this.stateChanges.next();\n    }\n\n    override get shouldLabelFloat() {\n        return true;\n    }\n\n    get empty() {\n        return this.value.length === 0;\n    }\n\n    protected onFilesAdded(addedFiles: FileList) {\n        if (!(addedFiles && addedFiles.length)) {\n            return;\n        }\n\n        const files = this.multiple ? addedFiles : [addedFiles[0]];\n        for (let i = files.length; i--;) {\n            const file: File = files[i];\n            this.checkFile(file).then(error => {\n                const queuedDominusFile: DominusQueuedFile = {\n                    id: ++this.lastFileId,\n                    name: file.name,\n                    progress: 0,\n                    size: file.size,\n                    error: error,\n                    canRetryUpload: error === '',\n                    imagePreviewUrl: file.type.includes('image') ? URL.createObjectURL(file) : '',\n                    file: file\n                };\n\n                this.filesQueue.set(queuedDominusFile.id, queuedDominusFile);\n                this.changeDetector.markForCheck();\n\n                if (error === '') {\n                    this.uploadFile(queuedDominusFile).then();\n                }\n            });\n        }\n\n        this.fileInput.nativeElement.value = '';\n    }\n\n    protected async uploadFile(queuedDominusFile: DominusQueuedFile) {\n        const formData = new FormData();\n        const file = queuedDominusFile.file;\n\n        formData.append(\"file\", file);\n\n        const requestHeaders = this.fileSaveEndpointRequestHeaders instanceof Promise ? await this.fileSaveEndpointRequestHeaders : this.fileSaveEndpointRequestHeaders;\n\n        this.http.request(this.fileSaveEndpointRequestMethod, this.fileSaveEndpoint, {\n            reportProgress: true,\n            observe: 'events',\n            body: formData,\n            headers: requestHeaders\n        }).pipe(\n            catchError(() => {\n                queuedDominusFile.error = this.intl[DmUploaderIntl.UNKNOWN_ERROR];\n                queuedDominusFile.progress = 0;\n                this.changeDetector.markForCheck();\n                return of(null);\n            }),\n        ).subscribe(event => {\n            if (event) {\n                switch (event.type) {\n                    case HttpEventType.UploadProgress:\n                        queuedDominusFile.progress = Math.floor(event.loaded / (event.total || 1) * 100);\n                        this.changeDetector.markForCheck();\n                        break;\n\n                    case HttpEventType.Response:\n                        if (!this.multiple) {\n                            this._value = [];\n                        }\n\n                        const uploadedFiles = this._value;\n\n                        uploadedFiles.push({\n                            name: file.name,\n                            size: file.size,\n                            type: file.type,\n                            imagePreviewUrl: file.type.includes('image') ? URL.createObjectURL(file) : '',\n                            data: event.body || {}\n                        });\n\n                        this.removeFromQueue(queuedDominusFile.id);\n                        this.value = uploadedFiles;\n                        break;\n                }\n            }\n        });\n    }\n\n    protected retryUpload(fileId: number) {\n        const queuedFile = this.filesQueue.get(fileId);\n\n        if (!queuedFile) {\n            return;\n        }\n\n        if (!queuedFile.canRetryUpload) {\n            this.removeFromQueue(fileId);\n            return;\n        }\n\n        this.uploadFile(queuedFile).then();\n    }\n\n    /**\n     * Removes an uploaded file by index\n     * @param fileIndex\n     */\n    protected async removeFile(fileIndex: number) {\n        const file = this._value.splice(fileIndex, 1)[0];\n\n        if (this.fileDeleteEndpoint) {\n            const requestHeaders = this.fileDeleteEndpointRequestHeaders instanceof Promise ? await this.fileDeleteEndpointRequestHeaders : this.fileDeleteEndpointRequestHeaders;\n            this.http.request(\n                this.fileDeleteEndpointRequestMethod,\n                this.fileDeleteEndpoint,\n                {\n                    body: [file],\n                    headers: requestHeaders\n                }).subscribe();\n        }\n\n        this.hasFiles = this._value.length > 0;\n        this.changeDetector.markForCheck();\n    }\n\n    protected removeFromQueue(fileId: number) {\n        this.filesQueue.delete(fileId);\n    }\n\n    protected onDragOver(evt: DragEvent) {\n        evt.preventDefault();\n        evt.stopPropagation();\n        this.containerClasses['dragover'] = true;\n        this.changeDetector.markForCheck();\n    }\n\n    protected onDragLeave(evt: DragEvent) {\n        evt.preventDefault();\n        evt.stopPropagation();\n        this.containerClasses['dragover'] = false;\n        this.changeDetector.markForCheck();\n    }\n\n    protected onFilesDropped(evt: DragEvent) {\n        const files = evt.dataTransfer?.files;\n        if (files) {\n            evt.preventDefault();\n            evt.stopPropagation();\n            this.onFilesAdded(files);\n        }\n\n        this.containerClasses['dragover'] = false;\n        this.changeDetector.markForCheck();\n    }\n\n    private async checkFile(file: File): Promise<string> {\n        const allowedExtensions = this.allowedExtensions;\n\n        if (allowedExtensions.length) {\n            const dotIndex = file.name.lastIndexOf('.');\n            let extensionValid;\n\n            if (dotIndex < 0) {\n                extensionValid = false;\n            } else {\n                const fileExtension = file.name.substring(dotIndex + 1).toLowerCase();\n                extensionValid = allowedExtensions.indexOf(fileExtension) !== -1;\n            }\n\n            if (!extensionValid) {\n                return this.intl[DmUploaderIntl.INVALID_EXTENSION];\n            }\n        }\n\n        if (file.size > this.maxFileSize) {\n            return this.intl[DmUploaderIntl.MAX_SIZE_EXCEEDED];\n        }\n\n        if (file.type.includes('image') && this.maxImageSize?.length) {\n            const maxImageSize = this.maxImageSize;\n            const imageSizes = await this.getImageSize(URL.createObjectURL(file));\n            let checkFail = true;\n            for (let i = maxImageSize.length; i--;) {\n                const sizeCheck = maxImageSize[i];\n\n                if (\n                    (sizeCheck.width !== undefined && sizeCheck.height !== undefined)\n                    && sizeCheck.width === imageSizes.width\n                    && sizeCheck.height === imageSizes.height\n                ) {\n                    checkFail = false;\n                    break;\n                } else if (sizeCheck.width !== undefined && sizeCheck.height === undefined && sizeCheck.width === imageSizes.width) {\n                    checkFail = false;\n                    break;\n                } else if (sizeCheck.height !== undefined && sizeCheck.width === undefined && sizeCheck.height === imageSizes.height) {\n                    checkFail = false;\n                    break;\n                }\n            }\n\n            if (checkFail) {\n                return this.intl[DmUploaderIntl.IMAGE_SIZE_CHECK_FAILED];\n            }\n        }\n\n        return '';\n    }\n\n    private async getImageSize(url: string): Promise<{ width: number; height: number; }> {\n        return new Promise((resolve, reject) => {\n            const img = new Image();\n\n            img.onload = () => {\n                resolve({\n                    width: img.width,\n                    height: img.height\n                });\n            };\n\n            img.onerror = () => {\n                reject('Error loading image');\n            };\n\n            img.src = url;\n        });\n    }\n\n    override ngOnDestroy() {\n        super.ngOnDestroy();\n        this.uploadFinished.complete();\n    }\n}\n","<div\n    class=\"dm-uploader-container\"\n    [ngClass]=\"containerClasses\"\n    (dragover)=\"onDragOver($event)\"\n    (dragleave)=\"onDragLeave($event)\"\n    (drop)=\"onFilesDropped($event)\"\n    (click)=\"openFilesInput()\"\n>\n    <label *ngIf=\"label !== ''\" class=\"dm-uploader-label\">{{ label }}</label>\n    <div class=\"dm-uploader-info\">\n        <label class=\"dm-uploader-info-primary\">{{ intl[DmUploaderIntl.NO_FILES_MSG] }}</label>\n        <div class=\"dm-uploader-info-secondary\">\n            <span *ngIf=\"allowedExtensions.length\" class=\"dm-uploader-info-secondary-msg\">\n                {{ intl[DmUploaderIntl.ALLOWED_EXTENSIONS] + ': ' + allowedExtensionsText }}\n            </span>\n            <span>{{ intl[DmUploaderIntl.MAX_FILE_SIZE] + ': ' + (maxFileSize | dmFileSize) }}</span>\n            <span *ngIf=\"maxImageSizeText\" class=\"dm-uploader-info-secondary-msg\">{{ intl[DmUploaderIntl.IMAGE_SIZE_CHECK_TEXT] + ': ' + maxImageSizeText }}</span>\n        </div>\n    </div>\n\n    <div class=\"dm-uploader-files\">\n        <ng-container\n            *ngFor=\"let uploadedFile of _value; index as uploadedFileIndex\"\n            [ngTemplateOutlet]=\"file\"\n            [ngTemplateOutletContext]=\"{file: uploadedFile, isQueuedFile: false, fileIndex: uploadedFileIndex}\"></ng-container>\n\n        <ng-container\n            *ngFor=\"let queuedFile of filesQueue.entries();\"\n            [ngTemplateOutlet]=\"file\"\n            [ngTemplateOutletContext]=\"{file: queuedFile[1], isQueuedFile: true, fileIndex: queuedFile[0]}\"></ng-container>\n    </div>\n</div>\n<input\n    #fileInput\n    class=\"dm-uploader-file-input\"\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=\"dm-uploader-file\" [ngClass]=\"[displayAs, showImagePreview && file.imagePreviewUrl ? 'preview' : '', (isQueued ? (file.error === '' ? 'dm-uploader-success' : 'dm-uploader-error') : '')]\">\n        <mat-progress-bar\n            *ngIf=\"isQueued && (file.error === '')\"\n            [mode]=\"file.progress > 0 ? 'determinate' : 'indeterminate'\"\n            [value]=\"file.progress || 0\"\n            class=\"dm-uploader-file-upload-progress\"></mat-progress-bar>\n\n        <div class=\"dm-uploader-file-header\" [ngClass]=\"file.error ? 'error' : 'success'\">\n            <div class=\"dm-uploader-file-info\">\n                <span class=\"dm-uploader-file-info-primary\">{{file.name}}</span>\n                <span class=\"dm-uploader-file-info-secondary\">{{(file.size || 0) | dmFileSize}}</span>\n            </div>\n            <div class=\"dm-uploader-file-info actions\">\n                <div class=\"dm-uploader-file-info\">\n                    <span class=\"dm-uploader-file-info-primary\">{{file.error}}</span>\n\n                </div>\n                <button mat-mini-fab *ngIf=\"(isQueued && file.error !== '') || file.progress === undefined\"\n                        color=\"warn\"\n                        (click)=\"$event.stopPropagation(); (isQueued ? removeFromQueue(file.id) : removeFile(fileIndex))\">\n                    <mat-icon>delete</mat-icon>\n                </button>\n\n                <button mat-mini-fab *ngIf=\"isQueued && file.error !== '' && file.canRetryUpload\"\n                        color=\"primary\"\n                        (click)=\"$event.stopPropagation(); retryUpload(file.id);\">\n                    <mat-icon>refresh</mat-icon>\n                </button>\n            </div>\n        </div>\n\n        <img\n            *ngIf=\"showImagePreview && file.imagePreviewUrl\"\n            class=\"dm-uploader-file-preview\"\n            [src]=\"file.imagePreviewUrl\" alt=\"\">\n    </div>\n</ng-template>\n","/*\n * Public API Surface of dm-uploader\n */\n\nexport * from './lib/dm-uploader';\nexport * from './lib/dm-uploader.component';\nexport * from './lib/dm-uploader-file-size.pipe';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2"],"mappings":"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"}