UNPKG

ngx-custom-material-file-input

Version:
1 lines 31.9 kB
{"version":3,"file":"ngx-custom-material-file-input.mjs","sources":["../../../projects/material-file-input/src/lib/file-input/file-input.base.ts","../../../projects/material-file-input/src/lib/models/file-input.model.ts","../../../projects/material-file-input/src/lib/file-input/file-input.component.ts","../../../projects/material-file-input/src/lib/file-input/file-input.component.html","../../../projects/material-file-input/src/lib/models/file-input-config.model.ts","../../../projects/material-file-input/src/lib/pipe/byte-format.pipe.ts","../../../projects/material-file-input/src/lib/material-file-input.module.ts","../../../projects/material-file-input/src/lib/validator/file-validator.ts","../../../projects/material-file-input/src/public-api.ts","../../../projects/material-file-input/src/ngx-custom-material-file-input.ts"],"sourcesContent":["import { FormGroupDirective, NgControl, NgForm } from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { Subject } from 'rxjs';\r\n\r\n/** Base class for error state management */\r\nexport class FileInputBase {\r\n private _errorState = false;\r\n\r\n constructor(\r\n public _defaultErrorStateMatcher: ErrorStateMatcher,\r\n public _parentForm: NgForm | null,\r\n public _parentFormGroup: FormGroupDirective | null,\r\n public ngControl: NgControl,\r\n public stateChanges: Subject<void>\r\n ) {}\r\n\r\n /** Determines whether the control is in an error state */\r\n get errorState(): boolean {\r\n const control = this.ngControl?.control || null; \r\n const form = this._parentForm || this._parentFormGroup || null;\r\n\r\n return this._defaultErrorStateMatcher.isErrorState(control, form);\r\n }\r\n\r\n /** Triggers error state update */\r\n updateErrorState() {\r\n const previousState = this._errorState;\r\n this._errorState = this.errorState;\r\n\r\n if (previousState !== this._errorState) {\r\n this.stateChanges.next();\r\n }\r\n }\r\n}\r\n","/**\r\n * The files to be uploaded\r\n */\r\nexport class FileInput {\r\n private _fileNames: string;\r\n\r\n constructor(private _files: File[] | null, private delimiter: string = ', ') {\r\n this._fileNames = (this._files || []).map((f: File) => f.name).join(delimiter);\r\n }\r\n\r\n get files() {\r\n return this._files || [];\r\n }\r\n\r\n get fileNames(): string {\r\n return this._fileNames;\r\n }\r\n}\r\n","import { Component, OnInit, Input, ElementRef, OnDestroy, HostBinding, Renderer2, HostListener, Optional, Self, DoCheck } from '@angular/core';\r\nimport { ControlValueAccessor, NgControl, NgForm, FormGroupDirective } from '@angular/forms';\r\nimport { MatFormFieldControl } from \"@angular/material/form-field\";\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { coerceBooleanProperty } from \"@angular/cdk/coercion\";\r\nimport { FocusMonitor } from '@angular/cdk/a11y';\r\nimport { FileInputBase } from './file-input.base';\r\nimport { FileInput } from '../models/file-input.model';\r\nimport { Subject } from 'rxjs/internal/Subject';\r\n\r\n@Component({\r\n selector: 'ngx-mat-file-input',\r\n templateUrl: './file-input.component.html',\r\n styleUrls: ['./file-input.component.css'],\r\n providers: [{ provide: MatFormFieldControl, useExisting: FileInputComponent }],\r\n standalone: false\r\n})\r\nexport class FileInputComponent extends FileInputBase implements MatFormFieldControl<FileInput>, ControlValueAccessor, OnInit, OnDestroy, DoCheck {\r\n static nextId = 0;\r\n\r\n focused = false;\r\n controlType = 'file-input';\r\n\r\n @Input() autofilled = false;\r\n\r\n private _placeholder: string;\r\n private _required = false;\r\n private _multiple = false;\r\n private _previewUrls: string[] = [];\r\n private _objectURLs: string[] = [];\r\n\r\n @Input() valuePlaceholder: string;\r\n @Input() accept: string | null = null;\r\n @Input() errorStateMatcher: ErrorStateMatcher;\r\n @Input() defaultIconBase64: string = 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0Ij48cGF0aCBkPSJNMCAwaDI0djI0SDBWMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNMTUgMkg2Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjdsLTUtNXpNNiAyMFY0aDh2NGg0djEySDZ6bTEwLTEwdjVjMCAyLjIxLTEuNzkgNC00IDRzLTQtMS43OS00LTRWOC41YzAtMS40NyAxLjI2LTIuNjQgMi43Ni0yLjQ5IDEuMy4xMyAyLjI0IDEuMzIgMi4yNCAyLjYzVjE1aC0yVjguNWMwLS4yOC0uMjItLjUtLjUtLjVzLS41LjIyLS41LjVWMTVjMCAxLjEuOSAyIDIgMnMyLS45IDItMnYtNWgyeiIvPjwvc3ZnPg==';\r\n\r\n override get errorState(): boolean {\r\n const control = this.ngControl?.control || null;\r\n const form = this._parentForm || this._parentFormGroup || null;\r\n const matcher = this.errorStateMatcher || this._defaultErrorStateMatcher;\r\n\r\n return matcher.isErrorState(control, form);\r\n }\r\n\r\n @HostBinding() id = `ngx-mat-file-input-${FileInputComponent.nextId++}`;\r\n @HostBinding('attr.aria-describedby') describedBy = '';\r\n\r\n public setDescribedByIds(ids: string[]) {\r\n this.describedBy = ids.join(' ');\r\n }\r\n\r\n @Input()\r\n get value(): FileInput | null {\r\n return this.empty ? null : new FileInput(this._elementRef.nativeElement.value || []);\r\n }\r\n\r\n set value(fileInput: FileInput | null) {\r\n if (fileInput) {\r\n this.writeValue(fileInput);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n @Input()\r\n get multiple(): boolean {\r\n return this._multiple;\r\n }\r\n set multiple(value: boolean | string) {\r\n this._multiple = coerceBooleanProperty(value);\r\n this.stateChanges.next();\r\n }\r\n\r\n @Input()\r\n get placeholder() {\r\n return this._placeholder;\r\n }\r\n set placeholder(plh) {\r\n this._placeholder = plh;\r\n this.stateChanges.next();\r\n }\r\n\r\n /**\r\n * Whether the current input has files\r\n */\r\n get empty() {\r\n return !this._elementRef.nativeElement.value || this._elementRef.nativeElement.value.length === 0;\r\n }\r\n\r\n @HostBinding('class.mat-form-field-should-float')\r\n get shouldLabelFloat() {\r\n return this.focused || !this.empty || this.valuePlaceholder !== undefined;\r\n }\r\n\r\n @Input()\r\n get required(): boolean {\r\n return this._required;\r\n }\r\n set required(req: boolean | string) {\r\n this._required = coerceBooleanProperty(req);\r\n this.stateChanges.next();\r\n }\r\n\r\n @HostBinding('class.file-input-disabled')\r\n get isDisabled() {\r\n return this.disabled;\r\n }\r\n @Input()\r\n get disabled(): boolean {\r\n return this._elementRef.nativeElement.disabled;\r\n }\r\n set disabled(dis: boolean | string) {\r\n this.setDisabledState(coerceBooleanProperty(dis));\r\n this.stateChanges.next();\r\n }\r\n\r\n get previewUrls(): string[] {\r\n return this._previewUrls;\r\n }\r\n\r\n public onContainerClick(event: MouseEvent) {\r\n if ((event.target as Element).tagName.toLowerCase() !== 'input' && !this.disabled) {\r\n this._elementRef.nativeElement.querySelector('input').focus();\r\n this.focused = true;\r\n this.open();\r\n }\r\n }\r\n\r\n /**\r\n * @see https://angular.io/api/forms/ControlValueAccessor\r\n */\r\n constructor(\r\n private fm: FocusMonitor,\r\n private _elementRef: ElementRef,\r\n private _renderer: Renderer2,\r\n public override _defaultErrorStateMatcher: ErrorStateMatcher,\r\n @Optional()\r\n @Self()\r\n public override ngControl: NgControl,\r\n @Optional() public override _parentForm: NgForm,\r\n @Optional() public override _parentFormGroup: FormGroupDirective,\r\n ) {\r\n super(_defaultErrorStateMatcher, _parentForm, _parentFormGroup, ngControl, new Subject<void>())\r\n\r\n if (this.ngControl != null) {\r\n this.ngControl.valueAccessor = this;\r\n }\r\n fm.monitor(_elementRef.nativeElement, true).subscribe(origin => {\r\n this.focused = !!origin;\r\n this.stateChanges.next();\r\n });\r\n }\r\n\r\n private _onChange = (_: any) => {};\r\n private _onTouched = () => {};\r\n\r\n get fileNames() {\r\n return this.value ? this.value.fileNames : this.valuePlaceholder;\r\n }\r\n\r\n public writeValue(obj: FileInput | null): void {\r\n this._renderer.setProperty(this._elementRef.nativeElement, 'value', obj instanceof FileInput ? obj.files : null);\r\n }\r\n\r\n public registerOnChange(fn: (_: any) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n public registerOnTouched(fn: any): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n /**\r\n * Remove all files from the file input component\r\n * @param [event] optional event that may have triggered the clear action\r\n */\r\n public clear(event?: Event) {\r\n if (event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n }\r\n this.value = new FileInput([]);\r\n this._previewUrls = [];\r\n this._elementRef.nativeElement.querySelector('input').value = null;\r\n this._onChange(this.value);\r\n }\r\n\r\n @HostListener('change', ['$event'])\r\n change(event: Event) {\r\n const fileList: FileList | null = (<HTMLInputElement>event.target).files;\r\n \r\n if (!fileList) return;\r\n \r\n if (this.multiple) {\r\n const existingFiles = this.value?.files || [];\r\n const newFiles: File[] = [];\r\n \r\n for (let i = 0; i < fileList.length; i++) {\r\n newFiles.push(fileList[i]);\r\n }\r\n \r\n const updatedFiles = [...existingFiles, ...newFiles];\r\n this.value = new FileInput(updatedFiles);\r\n } else {\r\n this.value = new FileInput(Array.from(fileList));\r\n }\r\n \r\n this._onChange(this.value);\r\n this.updatePreviewUrls();\r\n }\r\n\r\n private updatePreviewUrls() {\r\n this._objectURLs = [];\r\n if (this.value?.files?.length) {\r\n this._previewUrls = this.value.files.map((file) => {\r\n const isImage = file.type.startsWith('image/');\r\n if (isImage) {\r\n const url = URL.createObjectURL(file);\r\n this._objectURLs.push(url);\r\n return url;\r\n } else {\r\n return this.defaultIconBase64;\r\n }\r\n });\r\n } else {\r\n this._previewUrls = [];\r\n }\r\n }\r\n\r\n private revokeObjectURLs() {\r\n this._objectURLs.forEach((url) => URL.revokeObjectURL(url));\r\n this._objectURLs = [];\r\n }\r\n\r\n removeFile(index: number) {\r\n if (!this.value?.files?.length) return;\r\n\r\n const updatedFiles = [...this.value.files];\r\n updatedFiles.splice(index, 1);\r\n this.value = new FileInput(updatedFiles);\r\n this._onChange(this.value);\r\n this.updatePreviewUrls();\r\n }\r\n\r\n @HostListener('focusout')\r\n public blur() {\r\n this.focused = false;\r\n this._onTouched();\r\n }\r\n\r\n public setDisabledState(isDisabled: boolean): void {\r\n this._renderer.setProperty(this._elementRef.nativeElement, 'disabled', isDisabled);\r\n }\r\n\r\n public open() {\r\n if (!this.disabled) {\r\n this._elementRef.nativeElement.querySelector('input').click();\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.multiple = coerceBooleanProperty(this.multiple);\r\n }\r\n\r\n ngOnDestroy() {\r\n this.revokeObjectURLs();\r\n this.stateChanges.complete();\r\n this.fm.stopMonitoring(this._elementRef.nativeElement);\r\n }\r\n\r\n ngDoCheck(): void {\r\n if (this.ngControl) {\r\n // We need to re-evaluate this on every change detection cycle, because there are some\r\n // error triggers that we can't subscribe to (e.g. parent form submissions). This means\r\n // that whatever logic is in here has to be super lean or we risk destroying the performance.\r\n this.updateErrorState();\r\n }\r\n }\r\n}\r\n","<input\r\n #input\r\n [id]=\"id\"\r\n type=\"file\"\r\n [attr.multiple]=\"multiple ? '' : null\"\r\n [attr.accept]=\"accept\"\r\n/>\r\n<span class=\"filename\" [title]=\"fileNames\">{{ fileNames }}</span>\r\n","import { InjectionToken } from '@angular/core';\r\n\r\n/**\r\n * Optional token to provide custom configuration to the module\r\n */\r\nexport const NGX_MAT_FILE_INPUT_CONFIG = new InjectionToken<FileInputConfig>(\r\n 'ngx-mat-file-input.config'\r\n);\r\n\r\n/**\r\n * Provide additional configuration to dynamically customize the module injection\r\n */\r\nexport interface FileInputConfig {\r\n /**\r\n * Unit used with the ByteFormatPipe, default value is *Byte*.\r\n * The first letter is used for the short notation.\r\n */\r\n sizeUnit: string;\r\n}\r\n","import { Pipe, PipeTransform, Optional, Inject } from '@angular/core';\r\nimport { FileInputConfig, NGX_MAT_FILE_INPUT_CONFIG } from '../models/file-input-config.model';\r\n\r\n@Pipe({\n name: 'byteFormat',\n standalone: false\n})\r\nexport class ByteFormatPipe implements PipeTransform {\r\n private unit: string;\r\n\r\n constructor(\r\n @Optional()\r\n @Inject(NGX_MAT_FILE_INPUT_CONFIG)\r\n private config: FileInputConfig\r\n ) {\r\n this.unit = config ? config.sizeUnit : 'Byte';\r\n }\r\n\r\n transform(value: any, args?: any): any {\r\n if (parseInt(value, 10) >= 0) {\r\n value = this.formatBytes(+value, +args);\r\n }\r\n return value;\r\n }\r\n\r\n private formatBytes(bytes: number, decimals?: number) {\r\n if (bytes === 0) {\r\n return '0 ' + this.unit;\r\n }\r\n const B = this.unit.charAt(0);\r\n const k = 1024;\r\n const dm = decimals || 2;\r\n const sizes = [this.unit, 'K' + B, 'M' + B, 'G' + B, 'T' + B, 'P' + B, 'E' + B, 'Z' + B, 'Y' + B];\r\n const i = Math.floor(Math.log(bytes) / Math.log(k));\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i];\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { FileInputComponent } from './file-input/file-input.component';\r\nimport { FocusMonitor } from '@angular/cdk/a11y';\r\nimport { ByteFormatPipe } from './pipe/byte-format.pipe';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\n\r\n@NgModule({\r\n declarations: [FileInputComponent, ByteFormatPipe],\r\n providers: [FocusMonitor, ErrorStateMatcher],\r\n exports: [FileInputComponent, ByteFormatPipe],\r\n})\r\nexport class MaterialFileInputModule {}\r\n","import { ValidatorFn, AbstractControl, ValidationErrors } from '@angular/forms';\r\nimport { FileInput } from '../models/file-input.model';\r\n\r\nexport class FileValidator {\r\n /**\r\n * Function to control content of files\r\n *\r\n * @param bytes max number of bytes allowed\r\n *\r\n * @returns Validator function\r\n */\r\n static maxContentSize(bytes: number): ValidatorFn {\r\n return (control: AbstractControl): { [key: string]: any } | null => {\r\n const size =\r\n control && control.value && control.value.files\r\n ? (control.value as FileInput).files\r\n .map((file) => file.size)\r\n .reduce((acc, fileSize) => acc + fileSize, 0)\r\n : 0;\r\n\r\n const isValid = bytes >= size;\r\n\r\n return isValid\r\n ? null\r\n : {\r\n maxContentSize: {\r\n actualSize: size,\r\n maxSize: bytes,\r\n },\r\n };\r\n };\r\n }\r\n\r\n /**\r\n * Validator function to validate accepted file formats\r\n *\r\n * @param acceptedMimeTypes Array of accepted MIME types (e.g., ['image/jpeg', 'application/pdf'])\r\n * @returns Validator function\r\n */\r\n static acceptedMimeTypes(acceptedMimeTypes: string[]): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n const files: File[] = control.value ? (control.value as FileInput).files : [];\r\n const invalidFiles: File[] = files.filter(file => !acceptedMimeTypes.includes(file.type));\r\n \r\n if (invalidFiles.length > 0) {\r\n return {\r\n acceptedMimeTypes: {\r\n validTypes: acceptedMimeTypes\r\n }\r\n };\r\n }\r\n \r\n return null;\r\n };\r\n }\r\n\r\n /**\r\n * Validator function to validate the min number of uploaded files\r\n *\r\n * @param minCount Number of minimum files to upload\r\n * @returns Validator function\r\n */\r\n static minFileCount(minCount: number): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) {\r\n return {\r\n minFileCount: {\r\n minCount: minCount,\r\n actualCount: 0\r\n }\r\n };\r\n }\r\n\r\n const files: File[] = (control.value as FileInput).files;\r\n\r\n if (files && files.length < minCount) {\r\n return {\r\n minFileCount: {\r\n minCount: minCount,\r\n actualCount: files.length\r\n }\r\n };\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n\r\n /**\r\n * Validator function to validate the max number of uploaded files\r\n *\r\n * @param maxCount Number of maximum files to upload\r\n * @returns Validator function\r\n */\r\n static maxFileCount(maxCount: number): ValidatorFn {\r\n return (control: AbstractControl): ValidationErrors | null => {\r\n if (!control.value) {\r\n return null;\r\n }\r\n\r\n const files: File[] = control.value ? (control.value as FileInput).files : [];\r\n\r\n if (files && files.length > maxCount) {\r\n return {\r\n maxFileCount: {\r\n maxCount: maxCount,\r\n actualCount: files.length\r\n }\r\n };\r\n }\r\n\r\n return null;\r\n };\r\n }\r\n}\r\n","/*\n * Public API Surface of material-file-input\n */\n\n// Module\nexport { MaterialFileInputModule } from './lib/material-file-input.module';\n\n// Model & Constant\nexport { NGX_MAT_FILE_INPUT_CONFIG } from './lib/models/file-input-config.model';\nexport { FileInput } from './lib/models/file-input.model';\nexport { FileInputConfig } from './lib/models/file-input-config.model';\n\n// Components\nexport { FileInputComponent } from './lib/file-input/file-input.component';\n\n// Filters\nexport { ByteFormatPipe } from './lib/pipe/byte-format.pipe';\n\n// Utilities\nexport { FileValidator } from './lib/validator/file-validator';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}