{"version":3,"file":"fundamental-ngx-core-file-uploader.mjs","sources":["../../../../libs/core/file-uploader/file-uploader.service.ts","../../../../libs/core/file-uploader/directives/file-uploader-dragndrop.directive.ts","../../../../libs/core/file-uploader/directives/file-uploader-select.directive.ts","../../../../libs/core/file-uploader/file-uploader.component.ts","../../../../libs/core/file-uploader/file-uploader.component.html","../../../../libs/core/file-uploader/file-uploader.module.ts","../../../../libs/core/file-uploader/fundamental-ngx-core-file-uploader.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\nimport { Nullable, parserFileSize } from '@fundamental-ngx/cdk/utils';\n\nexport interface FileUploadOutput {\n    validFiles?: File[];\n    invalidFiles?: File[];\n}\n\n@Injectable({ providedIn: 'root' })\nexport class FileUploaderService {\n    /**\n     * Method that validates files passed. It is based on\n     * @param files File[]\n     * @param minFileSize string\n     * @param maxFileSize string\n     * @param acceptedExtensions string\n     */\n    validateFiles(\n        files: File[],\n        minFileSize: string,\n        maxFileSize: string,\n        acceptedExtensions: Nullable<string>\n    ): FileUploadOutput {\n        const maxSize = parserFileSize(maxFileSize);\n        const minSize = parserFileSize(minFileSize);\n\n        let allowedExtensions: string[] | null = null;\n        if (acceptedExtensions) {\n            allowedExtensions = acceptedExtensions.toLocaleLowerCase().replace(/[\\s.]/g, '').split(',');\n        }\n\n        const fileUploadOutput: FileUploadOutput = {};\n\n        fileUploadOutput.validFiles = files.filter(\n            (file) => this._checkSize(file.size, maxSize, minSize) && this._checkExtension(file, allowedExtensions)\n        );\n        fileUploadOutput.invalidFiles = files.filter(\n            (file) => !this._checkSize(file.size, maxSize, minSize) || !this._checkExtension(file, allowedExtensions)\n        );\n\n        return fileUploadOutput;\n    }\n\n    /** @hidden */\n    private _checkExtension(file: File, allowedExtensions: string[] | null): boolean {\n        if (!allowedExtensions) {\n            return true;\n        }\n        const extension = file.name.split('.')[file.name.split('.').length - 1].toLocaleLowerCase();\n        return allowedExtensions.lastIndexOf(extension) !== -1;\n    }\n\n    /** @hidden */\n    private _checkSize(fileSize: number, maxSize: number, minSize: number): boolean {\n        if (maxSize && fileSize > maxSize) {\n            return false;\n        }\n        if (minSize && fileSize < minSize) {\n            return false;\n        }\n        return true;\n    }\n}\n","import { Directive, EventEmitter, HostListener, Input, Output } from '@angular/core';\nimport { FileUploadOutput, FileUploaderService } from '../file-uploader.service';\n\n/**\n * Directive that handles the drag and drop feature of the file input.\n */\n@Directive({\n    selector: '[fdFileDragnDrop], [fd-file-drag-n-drop]',\n    standalone: true\n})\nexport class FileUploaderDragndropDirective {\n    /** Whether multiple files can be dropped at once. */\n    @Input()\n    multiple = true;\n\n    /** Accepted file extensions. Format: `'.png,.jpg'`. */\n    @Input()\n    accept: string;\n\n    /** Max file size in bytes that the input will accept. */\n    @Input()\n    maxFileSize = '';\n\n    /** Min file size in bytes that the input will accept. */\n    @Input()\n    minFileSize = '';\n\n    /** Whether selecting of new files is disabled. */\n    @Input()\n    disabled = false;\n\n    /** Whether drag and drop is enabled. Disables this directive. */\n    @Input()\n    dragndrop = true;\n\n    /** Event emitted when files are dropped. Passes back an array of files. */\n    @Output()\n    readonly fileChanged = new EventEmitter<FileUploadOutput>();\n\n    /** Event emitted when the dragged file enters the dropzone. */\n    @Output()\n    readonly dragEntered = new EventEmitter<void>();\n\n    /** Event emitted when the dragged file exits the dropzone. */\n    @Output()\n    readonly dragLeave = new EventEmitter<void>();\n\n    /** @hidden */\n    private elementStateCounter = 0;\n\n    /** @hidden */\n    constructor(private _fileUploadService: FileUploaderService) {}\n\n    /** @hidden */\n    @HostListener('dragover', ['$event'])\n    public onDragover(event: Event): void {\n        if (this.dragndrop) {\n            this._muteEvent(event);\n        }\n    }\n\n    /** @hidden */\n    @HostListener('dragenter', [])\n    public onDragenter(): void {\n        ++this.elementStateCounter;\n        if (this.dragndrop && this.elementStateCounter === 1) {\n            this.dragEntered.emit();\n        }\n    }\n\n    /** @hidden */\n    @HostListener('dragleave', ['$event'])\n    public onDragleave(event: Event): void {\n        --this.elementStateCounter;\n        if (this.dragndrop && this.elementStateCounter === 0) {\n            this._muteEvent(event);\n            this.dragLeave.emit();\n        }\n    }\n\n    /** @hidden */\n    @HostListener('drop', ['$event'])\n    public onDrop(event: any): void {\n        this.elementStateCounter = 0;\n\n        if (!this.dragndrop || this.disabled) {\n            return;\n        }\n        this._muteEvent(event);\n        const rawFiles = event.dataTransfer.files;\n        const files: File[] = Array.from(rawFiles);\n\n        if (!this.multiple && files.length > 1) {\n            this.fileChanged.emit({\n                validFiles: [],\n                invalidFiles: files\n            });\n            return;\n        }\n\n        const fileOutput: FileUploadOutput = this._fileUploadService.validateFiles(\n            files,\n            this.minFileSize,\n            this.maxFileSize,\n            this.accept\n        );\n\n        this.fileChanged.emit(fileOutput);\n    }\n\n    /** @hidden */\n    private _muteEvent(event: Event): void {\n        event.preventDefault();\n        event.stopPropagation();\n    }\n}\n","import { Directive, EventEmitter, HostBinding, HostListener, Input, Output } from '@angular/core';\n\n/**\n * Directive tool to facilitate interacting with a native file input element.\n */\n@Directive({\n    selector: '[fdFileSelect]',\n    standalone: true\n})\nexport class FileUploaderSelectDirective {\n    /** Whether the input should accept multiple file selections. */\n    @Input()\n    multiple = true;\n\n    /** Event emitted when files are selected. */\n    @Output()\n    readonly fileSelected = new EventEmitter<File[]>();\n\n    /** @hidden */\n    @HostBinding('attr.multiple')\n    get multipleBinding(): boolean | undefined {\n        return this.multiple ? true : undefined;\n    }\n\n    /** @hidden */\n    @HostListener('change', ['$event'])\n    onChange(event: Event): void {\n        if (event.target instanceof HTMLInputElement) {\n            const elRef = <HTMLInputElement>event.target;\n            const files = elRef.files;\n            if (files?.length) {\n                const fileArray = Array.from(files);\n                this.fileSelected.emit(fileArray);\n            }\n        }\n    }\n}\n","import { ENTER, SPACE, TAB } from '@angular/cdk/keycodes';\nimport {\n    ChangeDetectionStrategy,\n    ChangeDetectorRef,\n    Component,\n    ElementRef,\n    EventEmitter,\n    Input,\n    OnDestroy,\n    Output,\n    ViewChild,\n    ViewEncapsulation,\n    forwardRef\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { KeyUtil, Nullable } from '@fundamental-ngx/cdk/utils';\nimport { ButtonComponent } from '@fundamental-ngx/core/button';\nimport { ContentDensityObserver, contentDensityObserverProviders } from '@fundamental-ngx/core/content-density';\nimport { FormItemControl, registerFormItemControl } from '@fundamental-ngx/core/form';\nimport { stateType } from '@fundamental-ngx/core/radio';\nimport { Subscription } from 'rxjs';\nimport { FileUploaderDragndropDirective } from './directives/file-uploader-dragndrop.directive';\nimport { FileUploaderSelectDirective } from './directives/file-uploader-select.directive';\nimport { FileUploadOutput, FileUploaderService } from './file-uploader.service';\n\nlet fileUploaderInputUniqueId = 0;\n\n/**\n * Tool to facilitate the input of files from the user.\n * It supports drag and drop, multiple input, max file size and more.\n * The drag events make it very easy to create and style elements like a dropzone.\n */\n@Component({\n    selector: 'fd-file-uploader',\n    templateUrl: './file-uploader.component.html',\n    styleUrl: './file-uploader.component.scss',\n    host: {\n        '(blur)': 'onTouched()',\n        class: 'fd-file-uploader'\n    },\n    providers: [\n        {\n            provide: NG_VALUE_ACCESSOR,\n            useExisting: forwardRef(() => FileUploaderComponent),\n            multi: true\n        },\n        registerFormItemControl(FileUploaderComponent),\n        contentDensityObserverProviders()\n    ],\n    encapsulation: ViewEncapsulation.None,\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    imports: [FileUploaderDragndropDirective, ButtonComponent, FileUploaderSelectDirective]\n})\nexport class FileUploaderComponent implements ControlValueAccessor, OnDestroy, FormItemControl {\n    /** @hidden */\n    @ViewChild('fileInput')\n    inputRef: ElementRef<HTMLInputElement>;\n\n    /** @hidden */\n    @ViewChild('textInput')\n    inputRefText: ElementRef;\n\n    /** Whether the file input is disabled. */\n    @Input()\n    disabled = false;\n\n    /** If it is mandatory field */\n    @Input()\n    required = false;\n\n    /** Whether the file input should accept multiple files. */\n    @Input()\n    multiple = true;\n\n    /** Accepted file extensions. Format: `'.png,.jpg'`. */\n    @Input()\n    accept!: string;\n\n    /** Whether the file input accepts drag and dropped files. */\n    @Input()\n    dragndrop = true;\n\n    /** Max file size in bytes that the input will accept. */\n    @Input()\n    maxFileSize = '';\n\n    /** Min file size in bytes that the input will accept. */\n    @Input()\n    minFileSize = '';\n\n    /** Id for the input element. */\n    @Input()\n    id: string = 'fd-file-uploader-input' + fileUploaderInputUniqueId++;\n\n    /** aria-label value for input element. */\n    @Input()\n    ariaLabel: Nullable<string>;\n\n    /** aria-label-by value for input element.*/\n    @Input()\n    ariaLabelledBy: Nullable<string>;\n\n    /** placeholder for input element. */\n    @Input()\n    placeholder: string;\n\n    /** button value */\n    @Input()\n    buttonLabel: string;\n\n    /** value for input element. */\n    @Input()\n    buttonAriaLabel: Nullable<string>;\n\n    /** The field to set state of radio button using:\n     * 'success' | 'error' | 'warning' | 'default' | 'information'\n     * by default value is set to 'default'\n     */\n    @Input()\n    state: stateType = 'default';\n\n    /** specifies number of files to allow to select */\n    @Input()\n    fileLimit: number;\n\n    /** Whether or not to hide the input, leaving only the upload/browse button. */\n    @Input()\n    inputHidden = false;\n\n    /** Width of the file uploader */\n    @Input()\n    width: string;\n\n    /** Event fired when files are selected. Passed object is the array of files selected. */\n    @Output()\n    readonly selectedFilesChanged = new EventEmitter<File[]>();\n\n    /** Event fired when some invalid files are selected. Passed object is the array of invalid files. */\n    @Output()\n    readonly selectedInvalidFiles = new EventEmitter<File[]>();\n\n    /** Event fired when the dragged file enters the component boundaries. */\n    @Output()\n    // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n    readonly onDragEnter = new EventEmitter<void>();\n\n    /** Event fired when the dragged file exits the component boundaries. */\n    @Output()\n    // eslint-disable-next-line @angular-eslint/no-output-on-prefix\n    readonly onDragLeave = new EventEmitter<void>();\n\n    /** * It stores the valid files  */\n    validFiles: File[] = [];\n\n    /** * It stores the invalid files  */\n    invalidFiles: File[] = [];\n\n    /** @hidden */\n    private _previousValidFiles;\n\n    /** @hidden */\n    private _previousInvalidFiles;\n\n    /** @hidden */\n    private _subscriptions = new Subscription();\n\n    /** @hidden */\n    constructor(\n        private _fileUploadService: FileUploaderService,\n        private _changeDetRef: ChangeDetectorRef,\n        readonly _contentDensityObserver: ContentDensityObserver\n    ) {}\n\n    /** @hidden */\n    ngOnDestroy(): void {\n        this._subscriptions.unsubscribe();\n    }\n\n    /** @hidden */\n    onChange: (values: File[]) => void = () => {};\n\n    /** @hidden */\n    onTouched = (): void => {};\n\n    /** @hidden */\n    registerOnChange(fn: any): void {\n        this.onChange = fn;\n    }\n\n    /** @hidden */\n    registerOnTouched(fn: any): void {\n        this.onTouched = fn;\n    }\n\n    /** @hidden */\n    setDisabledState(isDisabled: boolean): void {\n        this.disabled = isDisabled;\n        this._changeDetRef.detectChanges();\n    }\n\n    /** @hidden */\n    writeValue(files: File[]): void {\n        if (this.validFiles.length > 0 && files && files.length === 0) {\n            this.clear();\n        } else if (!files?.length) {\n            return;\n        } else {\n            this._propagateFiles(false);\n        }\n    }\n\n    /** @hidden */\n    handleDrop(files: FileUploadOutput): void {\n        this.validFiles = files.validFiles ?? [];\n        this.invalidFiles = files.invalidFiles ?? [];\n        this._propagateFiles();\n    }\n\n    /** @hidden */\n    selectHandler(event: File[]): void {\n        this.validateFiles(event);\n        this._propagateFiles();\n    }\n\n    /** @hidden */\n    validateFiles(event: File[]): void {\n        if (this.fileLimit && event.length > this.fileLimit) {\n            throw new Error('FileLimitError - Selected files count is more than specified limit ');\n        }\n\n        const fileOutput: FileUploadOutput = this._fileUploadService.validateFiles(\n            event,\n            this.minFileSize,\n            this.maxFileSize,\n            this.accept\n        );\n\n        this.validFiles = fileOutput.validFiles ?? [];\n        this.invalidFiles = fileOutput.invalidFiles ?? [];\n    }\n\n    /** @hidden */\n    setInputValue(selectedFiles: File[], fromClear = false): void {\n        const fileName = selectedFiles.map((file) => file.name).join(' ');\n        if (!this.inputRefText) {\n            return;\n        }\n        this.inputRefText.nativeElement.value = fileName;\n        this.inputRefText.nativeElement.title = fileName || this.placeholder;\n        this.inputRefText.nativeElement.placeholder = fileName || this.placeholder;\n        if (!fromClear) {\n            this.inputRefText.nativeElement.focus();\n        }\n    }\n\n    /** @hidden */\n    keyDownHandle(event: KeyboardEvent): void {\n        if (KeyUtil.isKeyCode(event, [ENTER, SPACE])) {\n            this.open();\n        }\n        if (!KeyUtil.isKeyCode(event, [TAB])) {\n            event.preventDefault();\n        }\n    }\n\n    /**\n     * Opens the file selector.\n     */\n    public open(): void {\n        this.inputRef.nativeElement.click();\n    }\n\n    /**\n     * Clears the files from the input.\n     */\n    public clear(): void {\n        const shouldPropagate = this.validFiles.length > 0 || this.invalidFiles.length > 0;\n        this.validFiles = [];\n        this.invalidFiles = [];\n        this.inputRef.nativeElement.value = '';\n        if (shouldPropagate) {\n            this._propagateFiles();\n        }\n    }\n\n    /** @hidden */\n    private _propagateFiles(handleOnChange = true): void {\n        this.setInputValue(this.validFiles);\n        if (handleOnChange) {\n            this.onChange(this.validFiles);\n        }\n        if (this._previousValidFiles !== this.validFiles) {\n            this._previousValidFiles = this.validFiles;\n            this.selectedFilesChanged.emit(this.validFiles);\n        }\n        if (this._previousInvalidFiles !== this.invalidFiles) {\n            this._previousInvalidFiles = this.invalidFiles;\n            this.selectedInvalidFiles.emit(this.invalidFiles);\n        }\n    }\n}\n","<div\n    class=\"fd-file-uploader__container\"\n    fdFileDragnDrop\n    [accept]=\"accept\"\n    [maxFileSize]=\"maxFileSize\"\n    [minFileSize]=\"minFileSize\"\n    [dragndrop]=\"dragndrop\"\n    [disabled]=\"disabled\"\n    [multiple]=\"multiple\"\n    (fileChanged)=\"handleDrop($event)\"\n    (dragEntered)=\"onDragEnter.emit()\"\n    (dragLeave)=\"onDragLeave.emit()\"\n>\n    <input\n        #textInput\n        class=\"fd-input fd-file-uploader__input\"\n        [class]=\"state ? ' is-' + state : ''\"\n        aria-live=\"polite\"\n        autocomplete=\"off\"\n        type=\"text\"\n        tabindex=\"0\"\n        [id]=\"id\"\n        [attr.aria-label]=\"ariaLabel\"\n        [attr.aria-labelledby]=\"ariaLabelledBy\"\n        [attr.aria-required]=\"required\"\n        [title]=\"ariaLabel\"\n        [placeholder]=\"placeholder\"\n        [value]=\"\"\n        [style.width]=\"width\"\n        [hidden]=\"inputHidden\"\n        [disabled]=\"disabled\"\n        (click)=\"open()\"\n        (keydown)=\"keyDownHandle($event)\"\n    />\n\n    <button\n        fd-button\n        [attr.aria-label]=\"buttonAriaLabel\"\n        [label]=\"buttonLabel\"\n        [disabled]=\"disabled\"\n        (click)=\"open()\"\n    ></button>\n    <ng-content select=\"[fd-form-control]\"></ng-content>\n</div>\n\n<input\n    #fileInput\n    fdFileSelect\n    class=\"fd-file-uploader__hidden\"\n    type=\"file\"\n    [attr.accept]=\"accept\"\n    [multiple]=\"multiple\"\n    [disabled]=\"disabled\"\n    (fileSelected)=\"selectHandler($event)\"\n/>\n","import { NgModule } from '@angular/core';\nimport { FileUploaderDragndropDirective } from './directives/file-uploader-dragndrop.directive';\nimport { FileUploaderSelectDirective } from './directives/file-uploader-select.directive';\nimport { FileUploaderComponent } from './file-uploader.component';\n\nconst components = [FileUploaderComponent, FileUploaderSelectDirective, FileUploaderDragndropDirective];\n\n/**\n * @deprecated\n * Use direct imports of components and directives.\n */\n@NgModule({\n    imports: [...components],\n    exports: [...components]\n})\nexport class FileUploaderModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.FileUploaderService"],"mappings":"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"}