file-input-accessor
Version:
Angular directive that provides file input functionality in reactive & template driven Angular forms.
1 lines • 19.6 kB
Source Map (JSON)
{"version":3,"file":"file-input-accessor.mjs","sources":["../../../projects/file-input-accessor/src/lib/file-input-accessor.ts","../../../projects/file-input-accessor/src/lib/file-input-accessor.module.ts","../../../projects/file-input-accessor/src/public_api.ts","../../../projects/file-input-accessor/src/file-input-accessor.ts"],"sourcesContent":["import {Directive, ElementRef, forwardRef, HostListener, Input, Renderer2} from '@angular/core';\nimport {\n AbstractControl,\n AsyncValidator,\n AsyncValidatorFn,\n ControlValueAccessor,\n UntypedFormControl,\n NG_ASYNC_VALIDATORS,\n NG_VALUE_ACCESSOR,\n ValidationErrors\n} from '@angular/forms';\n\nimport {forkJoin, fromEventPattern, Observable, of, ReplaySubject} from 'rxjs';\nimport {first, map, shareReplay, take} from 'rxjs/operators';\nimport {ICustomFile} from './interfaces';\n\n\n@Directive({\n selector: 'input[type=file][formControl],input[type=file][formControlName],input[type=file][ngModel]',\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => FileInputAccessor),\n multi: true\n },\n {\n provide: NG_ASYNC_VALIDATORS,\n useExisting: forwardRef(() => FileInputAccessor),\n multi: true\n }\n ],\n standalone: false\n})\nexport class FileInputAccessor implements ControlValueAccessor, AsyncValidator {\n @Input() allowedTypes: RegExp | string | string[];\n\n @Input() size: number;\n\n @Input() withMeta: boolean;\n\n @Input() maxHeight: number;\n\n @Input() maxWidth: number;\n\n @Input() minHeight: number;\n\n @Input() minWidth: number;\n\n @Input()\n set allowedExt(value: RegExp | string | string[]) {\n if (typeof value === 'string') {\n value = value + '$';\n }\n if (value instanceof Array) {\n value = value.join('|') + '$';\n }\n this._allowedExt = value;\n }\n\n get allowedExt(): RegExp | string | string[] {\n return this._allowedExt;\n }\n\n validator: AsyncValidatorFn;\n\n private _allowedExt: RegExp | string | string[];\n\n @HostListener('change', ['$event.target.files']) onChange = (_: any) => {};\n @HostListener('blur') onTouched = () => {};\n\n constructor(private _renderer: Renderer2, private _elementRef: ElementRef) {\n this.validator = this.generateAsyncValidator();\n }\n\n writeValue(value: any) {\n this._renderer.setProperty(this._elementRef.nativeElement, 'value', null);\n }\n\n registerOnChange(fn: (_: any) => {}): void {\n this.onChange = this.onChangeGenerator(fn);\n }\n\n registerOnTouched(fn: () => {}): void {}\n\n setDisabledState(isDisabled: boolean): void {\n this._renderer.setProperty(this._elementRef.nativeElement, 'disabled', isDisabled);\n }\n\n validate(c: AbstractControl): Observable<ValidationErrors | null> | Promise<ValidationErrors | null> {\n return this.validator(c);\n }\n\n /**\n * Generator method that I used to move the code for the AsyncValidator down here so it didn't\n * get in my way, way up there ^.\n */\n private generateAsyncValidator(): AsyncValidatorFn {\n return (c: UntypedFormControl): Observable<ValidationErrors> => {\n if (!c.value || !c.value.length || c.disabled) return of({});\n\n const errors: ValidationErrors = {};\n const loaders: ReplaySubject<ProgressEvent>[] = [];\n\n for (const f of c.value) {\n if (this.size && this.size < f.size) {\n f.errors.fileSize = true;\n errors.fileSize = true;\n }\n\n if (f.isImg && (this.maxWidth || this.maxHeight || this.minWidth || this.minHeight)) {\n loaders.push(\n f.imgLoadReplay\n .pipe(\n take(1),\n map((e: ProgressEvent) => {\n const minWidthError = this.minWidth && f.imgWidth < this.minWidth;\n const minHeightError = this.minHeight && f.imgHeight < this.minHeight;\n const maxWidthError = this.maxWidth && f.imgWidth > this.maxWidth;\n const maxHeightError = this.maxHeight && f.imgHeight > this.maxHeight;\n\n if (minWidthError) {\n f.errors.minWidth = true;\n errors.minWidth = true;\n }\n\n if (minHeightError) {\n f.errors.minHeight = true;\n errors.minHeight = true;\n }\n\n if (maxWidthError) {\n f.errors.maxWidth = true;\n errors.maxWidth = true;\n }\n\n if (maxHeightError) {\n f.errors.maxHeight = true;\n errors.maxHeight = true;\n }\n\n /** will be @deprecated **/\n if (minWidthError || maxWidthError) {\n f.errors.imageWidth = true;\n errors.imageWidth = true;\n }\n\n /** will be @deprecated **/\n if (minHeightError || maxHeightError) {\n f.errors.imageHeight = true;\n errors.imageHeight = true;\n }\n\n return e;\n }))\n );\n }\n\n if (!this.allowedExt && !this.allowedTypes) continue;\n\n const extP = this.generateRegExp(this.allowedExt);\n const typeP = this.generateRegExp(this.allowedTypes);\n\n if (extP && !extP.test(f.name)) {\n f.errors.fileExt = true;\n errors.fileExt = true;\n }\n\n if (typeP && !typeP.test(f.type)) {\n f.errors.fileType = true;\n errors.fileType = true;\n }\n }\n if (loaders.length) {\n return forkJoin(...loaders).pipe(map(() => errors));\n }\n return of(errors);\n };\n }\n\n /**\n * Generator method that returns an onChange handler\n */\n private onChangeGenerator(fn: (_: any) => {}): (_: ICustomFile[]) => void {\n return (files: ICustomFile[]) => {\n const fileArr: File[] = [];\n\n for (const f of files) {\n if (this.withMeta && FileReader) {\n const fr = new FileReader();\n this.generateFileMeta(f, fr);\n }\n f.errors = {};\n fileArr.push(f);\n }\n fn(fileArr);\n };\n }\n\n private generateRegExp(pattern: RegExp | string | string[]): RegExp | null {\n if (!pattern) return null;\n\n if (pattern instanceof RegExp) {\n return new RegExp(pattern);\n } else if (typeof pattern === 'string') {\n return new RegExp(pattern, 'ig');\n } else if (pattern instanceof Array) {\n return new RegExp(`(${pattern.join('|')})`, 'ig');\n }\n return null;\n }\n\n /**\n * The ICustomFile has a ReplaySubject property for text / image files that will emit\n * once the file has been loaded. Might get removed later since I haven't found a use for it yet.\n */\n private generateFileMeta(f: ICustomFile, fr: FileReader) {\n if (f.type.match(/text.*/)) {\n f.textLoadReplay = this.setText(f, fr);\n } else if (f.type.match(/image.*/)) {\n f.imgLoadReplay = this.setImage(f, fr);\n }\n }\n\n private setImage(f: ICustomFile, fr: FileReader): ReplaySubject<[Event, ProgressEvent]> {\n f.isImg = true;\n\n const img = new Image();\n\n const imgLoadObs = fromEventPattern<Event>(\n ((handler: any) => img.addEventListener('load', handler)),\n ((handler: any) => img.removeEventListener('load', handler))\n ).pipe(\n take(1),\n shareReplay()\n );\n\n const frLoadObs = fromEventPattern<ProgressEvent>(\n ((handler: any) => fr.addEventListener('load', handler)),\n ((handler: any) => fr.removeEventListener('load', handler))\n ).pipe(\n take(1),\n shareReplay()\n );\n\n const onloadReplay = new ReplaySubject<[Event, ProgressEvent]>(1);\n forkJoin([imgLoadObs, frLoadObs]).pipe(first()).subscribe(onloadReplay);\n\n imgLoadObs.pipe(first()).subscribe(() => {\n f.imgHeight = img.height;\n f.imgWidth = img.width;\n });\n\n frLoadObs.pipe(first()).subscribe(() => {\n f.imgSrc = fr.result + '';\n img.src = fr.result + '';\n });\n\n fr.readAsDataURL(f);\n\n return onloadReplay;\n }\n\n private setText(f: ICustomFile, fr: FileReader): ReplaySubject<ProgressEvent> {\n const frLoadObs = fromEventPattern<ProgressEvent>(\n ((handler: any) => fr.addEventListener('load', handler)),\n ((handler: any ) => fr.removeEventListener('load', handler))\n ).pipe(\n take(1),\n shareReplay()\n );\n\n const onloadReplay = new ReplaySubject<ProgressEvent>(1);\n frLoadObs.subscribe(onloadReplay);\n\n frLoadObs.pipe(first()).subscribe(() => {\n f.textContent = fr.result + '';\n });\n\n fr.readAsText(f);\n\n return onloadReplay;\n }\n}\n","import {NgModule} from '@angular/core';\nimport {FileInputAccessor} from './file-input-accessor';\nimport {FormsModule, ReactiveFormsModule} from '@angular/forms';\n\n@NgModule({\n declarations: [FileInputAccessor],\n imports: [\n FormsModule,\n ReactiveFormsModule\n ],\n exports: [\n FileInputAccessor,\n FormsModule,\n ReactiveFormsModule\n ]\n})\nexport class FileInputAccessorModule {\n}\n","/*\n * Public API Surface of file-input-accessor\n */\n\nexport * from './lib/file-input-accessor';\nexport * from './lib/file-input-accessor.module';\nexport * from './lib/interfaces';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}