ngx-om-material-file-input
Version:
File input management for Angular Material
1 lines • 27.8 kB
Source Map (JSON)
{"version":3,"file":"ngx-om-material-file-input.mjs","sources":["../../../libs/material-file-input/src/lib/model/file-input.model.ts","../../../libs/material-file-input/src/lib/file-input/file-input-mixin.ts","../../../libs/material-file-input/src/lib/file-input/file-input.component.ts","../../../libs/material-file-input/src/lib/file-input/file-input.component.html","../../../libs/material-file-input/src/lib/model/file-input-config.model.ts","../../../libs/material-file-input/src/lib/pipe/byte-format.pipe.ts","../../../libs/material-file-input/src/lib/material-file-input.module.ts","../../../libs/material-file-input/src/lib/validator/file-validator.ts","../../../libs/material-file-input/src/index.ts","../../../libs/material-file-input/src/ngx-om-material-file-input.ts"],"sourcesContent":["/**\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 { FormGroupDirective, NgControl, NgForm } from '@angular/forms';\r\nimport { ErrorStateMatcher } from '@angular/material/core';\r\nimport { Subject } from \"rxjs\";\r\n\r\n/**\r\n * Class that tracks the error state of a component.\r\n * @docs-private\r\n */\r\nexport class ErrorStateTracker {\r\n public _defaultMatcher;\r\n public _parentFormGroup;\r\n public _parentForm;\r\n public _stateChanges;\r\n public ngControl;\r\n public errorState;\r\n public matcher;\r\n\r\n\r\n constructor(_defaultMatcher, ngControl, _parentFormGroup, _parentForm, _stateChanges) {\r\n this._defaultMatcher = _defaultMatcher;\r\n this.ngControl = ngControl;\r\n this._parentFormGroup = _parentFormGroup;\r\n this._parentForm = _parentForm;\r\n this._stateChanges = _stateChanges;\r\n /** Whether the tracker is currently in an error state. */\r\n this.errorState = false;\r\n }\r\n /** Updates the error state based on the provided error state matcher. */\r\n updateErrorState() {\r\n const oldState = this.errorState;\r\n const parent = this._parentFormGroup || this._parentForm;\r\n const matcher = this.matcher || this._defaultMatcher;\r\n const control = this.ngControl ? this.ngControl.control : null;\r\n const newState = matcher?.isErrorState(control, parent) ?? false;\r\n if (newState !== oldState) {\r\n this.errorState = newState;\r\n this._stateChanges.next();\r\n }\r\n }\r\n}\r\n\r\nfunction mixinErrorState(base) {\r\n return class extends base {\r\n /** Whether the component is in an error state. */\r\n get errorState() {\r\n return this._getTracker().errorState;\r\n }\r\n set errorState(value) {\r\n this._getTracker().errorState = value;\r\n }\r\n /** An object used to control the error state of the component. */\r\n get errorStateMatcher() {\r\n return this._getTracker().matcher;\r\n }\r\n set errorStateMatcher(value) {\r\n this._getTracker().matcher = value;\r\n }\r\n /** Updates the error state based on the provided error state matcher. */\r\n updateErrorState() {\r\n this._getTracker().updateErrorState();\r\n }\r\n _getTracker() {\r\n if (!this._tracker) {\r\n this._tracker = new ErrorStateTracker(this._defaultErrorStateMatcher, this.ngControl, this._parentFormGroup, this._parentForm, this.stateChanges);\r\n }\r\n return this._tracker;\r\n }\r\n constructor(...args) {\r\n super(...args);\r\n }\r\n };\r\n}\r\n\r\n// Boilerplate for applying mixins to FileInput\r\n/** @docs-private */\r\nexport class FileInputBase {\r\n constructor(\r\n public _defaultErrorStateMatcher: ErrorStateMatcher,\r\n public _parentForm: NgForm,\r\n public _parentFormGroup: FormGroupDirective,\r\n public ngControl: NgControl,\r\n public stateChanges: Subject<void>\r\n ) {}\r\n}\r\n\r\n/**\r\n * Allows to use a custom ErrorStateMatcher with the file-input component\r\n */\r\nexport const FileInputMixinBase = mixinErrorState(FileInputBase);\r\n","import { Component, OnInit, Input, ElementRef, OnDestroy, HostBinding, Renderer2, HostListener, Optional, Self, DoCheck } from '@angular/core';\nimport { ControlValueAccessor, NgControl, NgForm, FormGroupDirective } from '@angular/forms';\n\n\nimport { FileInput } from '../model/file-input.model';\nimport { FileInputMixinBase } from './file-input-mixin';\nimport { MatFormFieldControl } from \"@angular/material/form-field\";\nimport { ErrorStateMatcher } from \"@angular/material/core\";\nimport { coerceBooleanProperty } from \"@angular/cdk/coercion\";\nimport { FocusMonitor } from \"@angular/cdk/a11y\";\nimport { Subject } from \"rxjs\";\n\n@Component({\n selector: 'ngx-mat-file-input',\n templateUrl: './file-input.component.html',\n styleUrls: ['./file-input.component.css'],\n providers: [{ provide: MatFormFieldControl, useExisting: FileInputComponent }],\n standalone: false,\n})\nexport class FileInputComponent\n extends FileInputMixinBase\n implements MatFormFieldControl<FileInput>, ControlValueAccessor, OnInit, OnDestroy, DoCheck\n{\n static nextId = 0;\n\n focused = false;\n controlType = 'file-input';\n\n @Input() autofilled = false;\n\n private _placeholder: string;\n private _required = false;\n private _multiple: boolean;\n\n @Input() valuePlaceholder: string;\n @Input() accept: string | null = null;\n @Input()\n private _errorStateMatcher: ErrorStateMatcher;\n public get errorStateMatcher(): ErrorStateMatcher {\n return this._errorStateMatcher;\n }\n public set errorStateMatcher(value: ErrorStateMatcher) {\n this._errorStateMatcher = value;\n }\n\n @HostBinding() id = `ngx-mat-file-input-${FileInputComponent.nextId++}`;\n @HostBinding('attr.aria-describedby') describedBy = '';\n\n setDescribedByIds(ids: string[]) {\n this.describedBy = ids.join(' ');\n }\n\n @Input()\n get value(): FileInput | null {\n return this.empty ? null : new FileInput(this._elementRef.nativeElement.value || []);\n }\n set value(fileInput: FileInput | null) {\n if (fileInput) {\n this.writeValue(fileInput);\n this.stateChanges.next();\n }\n }\n\n @Input()\n get multiple(): boolean {\n return this._multiple;\n }\n set multiple(value: boolean | string) {\n this._multiple = coerceBooleanProperty(value);\n this.stateChanges.next();\n }\n\n @Input()\n get placeholder() {\n return this._placeholder;\n }\n set placeholder(plh) {\n this._placeholder = plh;\n this.stateChanges.next();\n }\n\n /**\n * Whether the current input has files\n */\n get empty() {\n return !this._elementRef.nativeElement.value || this._elementRef.nativeElement.value.length === 0;\n }\n\n @HostBinding('class.mat-form-field-should-float')\n get shouldLabelFloat() {\n return this.focused || !this.empty || this.valuePlaceholder !== undefined;\n }\n\n @Input()\n get required(): boolean {\n return this._required;\n }\n set required(req: boolean | string) {\n this._required = coerceBooleanProperty(req);\n this.stateChanges.next();\n }\n\n @HostBinding('class.file-input-disabled')\n get isDisabled() {\n return this.disabled;\n }\n @Input()\n get disabled(): boolean {\n return this._elementRef.nativeElement.disabled;\n }\n set disabled(dis: boolean | string) {\n this.setDisabledState(coerceBooleanProperty(dis));\n this.stateChanges.next();\n }\n\n onContainerClick(event: MouseEvent) {\n if ((event.target as Element).tagName.toLowerCase() !== 'input' && !this.disabled) {\n this._elementRef.nativeElement.querySelector('input').focus();\n this.focused = true;\n this.open();\n }\n }\n\n /** Whether the component is in an error state. */\n private _errorState = false;\n\n get errorState() {\n return this._errorState;\n }\n set errorState(value) {\n this._errorState = value;\n }\n\n /**\n * @see https://angular.io/api/forms/ControlValueAccessor\n */\n constructor(\n private fm: FocusMonitor,\n private _elementRef: ElementRef,\n private _renderer: Renderer2,\n public _defaultErrorStateMatcher: ErrorStateMatcher,\n @Optional()\n @Self()\n public ngControl: NgControl,\n @Optional() public _parentForm: NgForm,\n @Optional() public _parentFormGroup: FormGroupDirective\n ) {\n super(_defaultErrorStateMatcher, _parentForm, _parentFormGroup, ngControl, new Subject<void>());\n\n if (this.ngControl != null) {\n this.ngControl.valueAccessor = this;\n }\n fm.monitor(_elementRef.nativeElement, true).subscribe((origin) => {\n this.focused = !!origin;\n this.stateChanges.next();\n });\n }\n\n private _onChange = (_: any) => {};\n private _onTouched = () => {};\n\n get fileNames() {\n return this.value ? this.value.fileNames : this.valuePlaceholder;\n }\n\n writeValue(obj: FileInput | null): void {\n this._renderer.setProperty(this._elementRef.nativeElement, 'value', obj instanceof FileInput ? obj.files : null);\n }\n\n registerOnChange(fn: (_: any) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n\n /**\n * Remove all files from the file input component\n * @param [event] optional event that may have triggered the clear action\n */\n clear(event?: Event) {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n this.value = new FileInput([]);\n this._elementRef.nativeElement.querySelector('input').value = null;\n this._onChange(this.value);\n }\n\n @HostListener('change', ['$event'])\n change(event: Event) {\n const fileList: FileList | null = (<HTMLInputElement>event.target).files;\n const fileArray: File[] = [];\n if (fileList) {\n for (let i = 0; i < fileList.length; i++) {\n fileArray.push(fileList[i]);\n }\n }\n this.value = new FileInput(fileArray);\n this._onChange(this.value);\n }\n\n @HostListener('focusout')\n blur() {\n this.focused = false;\n this._onTouched();\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._renderer.setProperty(this._elementRef.nativeElement, 'disabled', isDisabled);\n }\n\n ngOnInit() {\n this.multiple = coerceBooleanProperty(this.multiple);\n }\n\n open() {\n if (!this.disabled) {\n this._elementRef.nativeElement.querySelector('input').click();\n }\n }\n\n ngOnDestroy() {\n this.stateChanges.complete();\n this.fm.stopMonitoring(this._elementRef.nativeElement);\n }\n\n ngDoCheck(): void {\n if (this.ngControl) {\n // We need to re-evaluate this on every change detection cycle, because there are some\n // error triggers that we can't subscribe to (e.g. parent form submissions). This means\n // that whatever logic is in here has to be super lean or we risk destroying the performance.\n this.updateErrorState();\n }\n }\n\n readonly stateChanges = new Subject<void>();\n\n public updateErrorState() {\n const parentSubmitted = this._parentFormGroup?.submitted || this._parentForm?.submitted;\n const touchedOrParentSubmitted = parentSubmitted;\n\n const newState = this.ngControl?.invalid && touchedOrParentSubmitted;\n\n if (this.errorState !== newState) {\n this.errorState = newState;\n this.stateChanges.next(); // Notify listeners of state changes.\n }\n }\n}\n","<input #input type=\"file\" [attr.multiple]=\"multiple? '' : null\" [attr.accept]=\"accept\">\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 '../model/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 { FocusMonitor } from '@angular/cdk/a11y';\r\nimport { FileInputComponent } from './file-input/file-input.component';\r\nimport { ByteFormatPipe } from './pipe/byte-format.pipe';\r\n\r\n@NgModule({\r\n declarations: [FileInputComponent, ByteFormatPipe],\r\n providers: [FocusMonitor],\r\n exports: [FileInputComponent, ByteFormatPipe]\r\n})\r\nexport class MaterialFileInputModule {}\r\n","import { ValidatorFn, AbstractControl } from '@angular/forms';\r\nimport { FileInput } from '../model/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\r\n */\r\n static maxContentSize(bytes: number): ValidatorFn {\r\n return (control: AbstractControl): { [key: string]: any } | null => {\r\n const size = control && control.value ? (control.value as FileInput).files.map(f => f.size).reduce((acc, i) => acc + i, 0) : 0;\r\n const condition = bytes >= size;\r\n return condition\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","// Module\r\nexport { MaterialFileInputModule } from './lib/material-file-input.module';\r\n\r\n// Model & Constant\r\nexport { NGX_MAT_FILE_INPUT_CONFIG } from './lib/model/file-input-config.model';\r\nexport { FileInput } from './lib/model/file-input.model';\r\nexport { FileInputConfig } from './lib/model/file-input-config.model';\r\n\r\n// Components\r\nexport { FileInputComponent } from './lib/file-input/file-input.component';\r\n\r\n// Filters\r\nexport { ByteFormatPipe } from './lib/pipe/byte-format.pipe';\r\n\r\n// Utilities\r\nexport { FileValidator } from './lib/validator/file-validator';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}