@ngx-dropzone/cdk
Version:
CDK with basic dropzone functionality.
1 lines • 40 kB
Source Map (JSON)
{"version":3,"file":"ngx-dropzone-cdk.mjs","sources":["../../../projects/cdk/src/lib/coercion/boolean-coercion.ts","../../../projects/cdk/src/lib/file-input/accept.service.ts","../../../projects/cdk/src/lib/file-input/file-input-validators.ts","../../../projects/cdk/src/lib/file-input/file-input-errors.ts","../../../projects/cdk/src/lib/file-input/file-input.directive.ts","../../../projects/cdk/src/lib/dropzone/dropzone-errors.ts","../../../projects/cdk/src/lib/dropzone/dropzone.service.ts","../../../projects/cdk/src/lib/dropzone/dropzone.component.ts","../../../projects/cdk/src/public-api.ts","../../../projects/cdk/src/ngx-dropzone-cdk.ts"],"sourcesContent":["export type BooleanInput = boolean | string | number | null | undefined;\n\n/** Inspired by the Angular Material library, we check our input properties. */\nexport function coerceBoolean(value?: BooleanInput): boolean {\n return ['', '1', 'true'].includes(`${value}`);\n}\n\n/** Allows filtering `null` and `undefined` elements from arrays. */\nexport function nonNullable<T>(value: T | null): value is T {\n return value !== null && value !== undefined;\n}\n","import { Injectable } from '@angular/core';\nimport { FileInputValue } from './file-input-value';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AcceptService {\n /**\n * Returns `true` if all files match the provided `accept` parameter.\n * See [MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/accept)\n * for more information.\n */\n accepts(fileValue: FileInputValue, accept: string): boolean {\n if (!fileValue || accept === '*') {\n return true;\n }\n\n const acceptedMimeTypes = this.parseAttribute(accept, (t) => this.isValidMimeType(t));\n const acceptedExtensions = this.parseAttribute(accept, (t) => this.isValidExtension(t));\n\n const fileList = Array.isArray(fileValue) ? fileValue : [fileValue];\n\n return fileList.every(\n (file) =>\n this.isAcceptedByExtension(file, acceptedExtensions) || this.isAcceptedByMimeType(file, acceptedMimeTypes)\n );\n }\n\n private isAcceptedByExtension(file: File, acceptedExtensions: string[]): boolean {\n return acceptedExtensions.some((ext) => file.name.toLowerCase().endsWith(ext));\n }\n\n private isAcceptedByMimeType(file: File, acceptedMimeTypes: string[]): boolean {\n return acceptedMimeTypes.some((type) => {\n if (type === file.type) {\n return true;\n }\n\n const [media, sub] = type.split('/', 2);\n const fileMedia = file.type.split('/')[0];\n\n return sub === '*' && media === fileMedia;\n });\n }\n\n private parseAttribute(accept: string, predicate: (type: string) => boolean): string[] {\n if (!accept?.length) {\n return [];\n }\n\n return accept.split(',').reduce((types, type) => {\n const trimmedType = type.trim();\n if (trimmedType.length && predicate(trimmedType)) {\n types.push(trimmedType.toLowerCase());\n }\n return types;\n }, [] as string[]);\n }\n\n private isValidMimeType(type: string): boolean {\n const safeType = type || '';\n const slashPos = safeType.indexOf('/');\n\n if (slashPos <= 0 || slashPos === safeType.length - 1) {\n return false;\n }\n\n return Array.from(safeType).every((char, i) => this.isValidToken(char) || i === slashPos);\n }\n\n private isValidExtension(type: string): boolean {\n const safeType = type || '';\n return safeType.length >= 2 && safeType[0] === '.';\n }\n\n private isValidToken(char: string): boolean {\n const invalidChars = Array.from('\" (),/:@[]{}');\n return this.isAscii(char) && !invalidChars.includes(char);\n }\n\n private isAscii(char: string): boolean {\n return (char || '').charCodeAt(0) < 127;\n }\n}\n","import { AbstractControl, ValidationErrors, ValidatorFn } from '@angular/forms';\nimport { AcceptService } from '.';\nimport { FileInputValue } from './file-input-value';\n\nexport class FileInputValidators {\n /**\n * Checks if the file size is equal or greater than the minimum size.\n * Validates every file within array or single file. Returns no error when null.\n */\n static minSize(min: number): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const valid = this.validate(control.value, (file) => file.size >= min);\n return valid ? null : { minSize: { value: control.value } };\n };\n }\n\n /**\n * Checks if the file size is equal or smaller than the allowed size.\n * Validates every file within array or single file. Returns no error when null.\n */\n static maxSize(max: number): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const valid = this.validate(control.value, (file) => file.size <= max);\n return valid ? null : { maxSize: { value: control.value } };\n };\n }\n\n /** Checks if all provided files match the specified `accept` value. */\n static accept(accept: string): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const allAccepted = new AcceptService().accepts(control.value, accept);\n return allAccepted ? null : { accept: { value: control.value } };\n };\n }\n\n private static validate(value: FileInputValue, predicate: (file: File) => boolean): boolean {\n if (!value) {\n return true;\n }\n\n if (Array.isArray(value)) {\n return value.every((f) => f && predicate(f));\n }\n\n return predicate(value);\n }\n}\n","/**\n * Returns an exception to be thrown when attempting to add the `FileInputDirective`\n * to an HTML `<input>` element with a type other than \"file\".\n */\nexport function getInputTypeError() {\n return Error('The [fileInput] directive may only be applied to `<input type=\"file\" />` elements.');\n}\n\n/**\n * Returns an exception to be thrown when attempting to assign an array value\n * to a file input element without the `multiple` attribute.\n */\nexport function getArrayValueError() {\n return Error('Value must not be an array when the multiple attribute is not present.');\n}\n\n/**\n * Returns an exception to be thrown when attempting to assign a non-array value\n * to a file input element in `multiple` mode. Note that `undefined` and `null` are\n * valid values to allow for resetting the value.\n */\nexport function getNonArrayValueError() {\n return Error('Value must be an array when the multiple attribute is present.');\n}\n","import {\n Directive,\n DoCheck,\n ElementRef,\n EventEmitter,\n HostBinding,\n HostListener,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n Optional,\n Output,\n Self,\n} from '@angular/core';\nimport { ControlValueAccessor, FormGroupDirective, NgControl, NgForm } from '@angular/forms';\nimport { Subject } from 'rxjs';\nimport { BooleanInput, coerceBoolean, nonNullable } from '../coercion';\nimport { AcceptService } from './accept.service';\nimport { getArrayValueError, getInputTypeError, getNonArrayValueError } from './file-input-errors';\nimport { FileInputMode, FileInputValue } from './file-input-value';\n\n@Directive({\n selector: 'input[fileInput]',\n exportAs: 'fileInput',\n host: {\n style: 'display: none',\n '(focus)': '_focusChanged(true)',\n '(blur)': '_focusChanged(false)',\n },\n})\nexport class FileInputDirective implements ControlValueAccessor, OnInit, OnChanges, DoCheck, OnDestroy {\n private _value: FileInputValue = null;\n private _parent: FormGroupDirective | NgForm | null = null;\n\n private _focused = false;\n private _touched = false;\n private _errorState = false;\n\n private _onChange: ((value: FileInputValue) => void) | null = null;\n private _onTouched: (() => void) | null = null;\n\n /** Emits whenever the parent dropzone should re-render. */\n readonly stateChanges = new Subject<void>();\n\n /** The value of the file input control. */\n @Input('value')\n get _fileValue() {\n return this.value;\n }\n set _fileValue(newValue: FileInputValue) {\n /**\n * We may not use the property name `value` for the setter\n * because it already exists on the native input element\n * and would break our tests.\n */\n if (newValue !== this._value || Array.isArray(newValue)) {\n this._assertMultipleValue(newValue);\n\n this._value = newValue;\n this._updateErrorState();\n\n this._onTouched?.();\n this._touched = true;\n\n this.stateChanges.next();\n }\n }\n\n /** Returns the selected value of the file input control (alias as syntactic sugar). */\n get value(): FileInputValue {\n return this._value;\n }\n\n /** Returns true if the file input has no selected item. */\n get empty(): boolean {\n return this.value === null || (Array.isArray(this.value) && !this.value.length);\n }\n\n /** Returns the error state. */\n get errorState(): boolean {\n return this._errorState;\n }\n\n /** Returns true if the file input element is focused. */\n get focused(): boolean {\n return this._focused;\n }\n\n /** Returns true if the `multiple` attribute is present on the input element. */\n get multiple(): boolean {\n return this.elementRef.nativeElement.multiple;\n }\n\n /** Controls the accepted file types. */\n @Input()\n @HostBinding('accept')\n get accept(): string {\n return this._accept;\n }\n set accept(value: string) {\n this._accept = value;\n this._updateErrorState();\n\n this.stateChanges.next();\n }\n private _accept = '*';\n\n /** Controls the value setting strategy. */\n @Input()\n get mode(): FileInputMode {\n return this._mode;\n }\n set mode(value: FileInputMode) {\n this._mode = value;\n this.stateChanges.next();\n }\n private _mode: FileInputMode = 'replace';\n\n /** The disabled state of the file input control. */\n @Input()\n @HostBinding('disabled')\n get disabled(): boolean {\n return this.ngControl?.disabled || this._parent?.disabled || this.elementRef.nativeElement.disabled;\n }\n set disabled(value: BooleanInput) {\n this.elementRef.nativeElement.disabled = coerceBoolean(value);\n\n if (this.focused) {\n this._focused = false;\n }\n\n this.stateChanges.next();\n }\n\n /** Event emitted when the selected files have been changed by the user. */\n @Output() readonly selectionChange = new EventEmitter<FileInputValue>();\n\n constructor(\n private _acceptService: AcceptService,\n public elementRef: ElementRef<HTMLInputElement>,\n @Optional() _parentForm: NgForm,\n @Optional() _parentFormGroup: FormGroupDirective,\n @Optional() @Self() public ngControl: NgControl\n ) {\n this._parent = _parentForm || _parentFormGroup;\n\n if (ngControl != null) {\n // Setting the value accessor directly (instead of using\n // the providers) to allow access to error state.\n ngControl.valueAccessor = this;\n }\n }\n\n ngOnInit() {\n if (this.elementRef.nativeElement.type !== 'file') {\n throw getInputTypeError();\n }\n }\n\n ngOnChanges() {\n this.stateChanges.next();\n }\n\n ngDoCheck() {\n this._updateErrorState();\n }\n\n ngOnDestroy() {\n this.stateChanges.complete();\n }\n\n /** Opens the native OS file picker. */\n openFilePicker() {\n this.elementRef.nativeElement.click();\n }\n\n /** Handles the native (change) event. */\n @HostListener('change', ['$event.target.files'])\n _handleChange(fileList: FileList) {\n if (this.disabled) return;\n\n const files = this.multiple ? Array.from(fileList) : fileList.item(0);\n const filesWithPaths = this._copyRelativePaths(files);\n this._fileValue = this._appendOrReplace(filesWithPaths);\n\n this.selectionChange.emit(this._fileValue);\n this._onChange?.(this._fileValue);\n\n // Reset the native element for another selection.\n this.elementRef.nativeElement.value = '';\n }\n\n /** Handles the drop of a file array. */\n handleFileDrop(files: File[]) {\n if (this.disabled) return;\n this._fileValue = this._appendOrReplace(this.multiple ? files : files[0]);\n\n this.selectionChange.emit(this._fileValue);\n this._onChange?.(this._fileValue);\n }\n\n /** Sets the selected files value as required by the `ControlValueAccessor` interface. */\n writeValue(value: FileInputValue) {\n this._fileValue = value;\n this.selectionChange.emit(this._fileValue);\n }\n\n /** Registers the change handler as required by `ControlValueAccessor`. */\n registerOnChange(fn: (value: FileInputValue) => void) {\n this._onChange = fn;\n }\n\n /** Registers the touched handler as required by `ControlValueAccessor`. */\n registerOnTouched(fn: () => void) {\n this._onTouched = fn;\n }\n\n /** Implements the disabled state setter from `ControlValueAccessor`. */\n setDisabledState(disabled: boolean) {\n this.disabled = disabled;\n }\n\n /** Called when the input element is focused or blurred. */\n _focusChanged(focused: boolean) {\n if (this._focused !== focused) {\n this._focused = focused;\n this.stateChanges.next();\n }\n }\n\n /**\n * On directory drops, the readonly `webkitRelativePath` property is not available.\n * We manually set the `relativePath` property for dropped file trees instead.\n * To achieve a consistent behavior when using the file picker, we copy the value.\n */\n private _copyRelativePaths(value: FileInputValue) {\n if (!value) return value;\n\n if (Array.isArray(value)) {\n return value.map((file) => {\n file.relativePath = file.webkitRelativePath;\n return file;\n });\n }\n\n value.relativePath = value.webkitRelativePath;\n return value;\n }\n\n /** Asserts that the provided value type matches the input element's multiple attribute. */\n private _assertMultipleValue(value: FileInputValue) {\n if (this.multiple && !Array.isArray(value || [])) {\n throw getNonArrayValueError();\n }\n\n if (!this.multiple && Array.isArray(value)) {\n throw getArrayValueError();\n }\n }\n\n private _appendOrReplace(value: FileInputValue): FileInputValue {\n if (this._canAppend(this._value)) {\n const valueArray = Array.isArray(value) ? value : [value];\n return [...this._value, ...valueArray.filter(nonNullable)];\n }\n\n return value;\n }\n\n private _canAppend(value: FileInputValue): value is File[] {\n return this._mode === 'append' && this.multiple && Array.isArray(value);\n }\n\n private _updateErrorState() {\n // Check for any errors of the FormControl or NgModel.\n const { invalid, touched } = this.ngControl?.control ?? {};\n const reactiveError = !!(invalid && (touched || this._parent?.submitted));\n\n // Check for any errors directly on the native input element.\n const nativeError = this._touched && !this._acceptService.accepts(this.value, this._accept);\n\n const errorState = reactiveError || nativeError;\n\n if (this._errorState !== errorState) {\n this._errorState = errorState;\n this.stateChanges.next();\n }\n }\n}\n","/**\n * Returns an exception to be thrown when creating a dropzone\n * without a FileInputDirective child.\n */\nexport function getMissingControlError() {\n return Error('The `ngx-dropzone` component requires a child of `<input type=\"file\" fileInput />`.');\n}\n","import { Injectable } from '@angular/core';\nimport { nonNullable } from '../coercion';\nimport { type File } from './../file-input';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class DropzoneService {\n /**\n * Returns a `File[]` from a `DragEvent`. Accepts a list of files or folders.\n */\n async getFiles(event: DragEvent): Promise<File[]> {\n if (!event.dataTransfer?.items) {\n // Fallback for older specifications\n return Array.from(event.dataTransfer?.files ?? []);\n }\n\n const fsEntries = Array.from(event.dataTransfer?.items ?? [])\n .map((item) => this._toFileSystemEntry(item))\n .map((entry) => this._getFilesFromEntry(entry))\n .filter(nonNullable);\n\n const files: File[][] = await Promise.all(fsEntries);\n return this._flattenFiles(files);\n }\n\n private _toFileSystemEntry(item: DataTransferItem): FileSystemEntry | File | null {\n // In the future, we can use the `getAsEntry` method when it becomes available.\n if ('getAsEntry' in item && typeof item.getAsEntry === 'function') {\n return item.getAsEntry();\n }\n\n // If supported, use the `webkitGetAsEntry` method to allow folder drops.\n // As a fallback, use the well-supported `getAsFile` method.\n return item.webkitGetAsEntry() || item.getAsFile();\n }\n\n private async _getFilesFromEntry(entry: FileSystemEntry | File | null): Promise<File[]> {\n if (!entry) return [];\n\n if (entry instanceof File) {\n return [entry];\n }\n\n if (this._isFile(entry)) {\n const file = await this._readFilePromise(entry);\n\n // Manually set the `relativePath` property for dropped files.\n file.relativePath = entry.fullPath?.slice(1) ?? '';\n\n return [file];\n }\n\n if (this._isDirectory(entry)) {\n const entries = await this._readDirectoryWithoutLimit(entry);\n const children = entries.map((e) => this._getFilesFromEntry(e));\n\n const files = await Promise.all(children);\n return this._flattenFiles(files);\n }\n\n return [];\n }\n\n /**\n * In Chrome >= 77, the `readEntries` method returns only 100 files.\n * To achieve a consistent behavior across browsers and not restrict user interaction,\n * we break the limit by recursively calling `readEntries`.\n */\n private async _readDirectoryWithoutLimit(entry: FileSystemDirectoryEntry): Promise<FileSystemEntry[]> {\n const reader = entry.createReader();\n let entries: FileSystemEntry[] = [];\n\n const readEntries = async () => {\n const children = await this._readDirectoryPromise(reader);\n\n if (children.length) {\n entries = entries.concat(children);\n await readEntries();\n }\n };\n\n await readEntries();\n return entries;\n }\n\n private _isFile = (item: FileSystemEntry): item is FileSystemFileEntry => item.isFile;\n private _isDirectory = (item: FileSystemEntry): item is FileSystemDirectoryEntry => item.isDirectory;\n private _flattenFiles = (files: File[][]) => ([] as File[]).concat(...files);\n\n private _readFilePromise(entry: FileSystemFileEntry) {\n return new Promise<File>((resolve) => {\n entry.file((file) => resolve(file));\n });\n }\n\n private _readDirectoryPromise(reader: FileSystemDirectoryReader) {\n return new Promise<FileSystemEntry[]>((resolve) => {\n reader.readEntries((entries) => resolve(entries));\n });\n }\n}\n","import {\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChild,\n HostBinding,\n HostListener,\n inject,\n Input,\n OnDestroy,\n ViewEncapsulation,\n} from '@angular/core';\nimport { NgControl } from '@angular/forms';\nimport { BehaviorSubject, Subject, takeUntil, tap } from 'rxjs';\nimport { FileInputDirective, FileInputValue } from './../file-input';\nimport { getMissingControlError } from './dropzone-errors';\nimport { DropzoneService } from './dropzone.service';\n\n@Component({\n selector: 'ngx-dropzone',\n exportAs: 'dropzone',\n imports: [FileInputDirective],\n providers: [DropzoneService],\n template: `<ng-content></ng-content>`,\n host: {\n tabindex: '0',\n '[class.ng-untouched]': '_forwardProp(\"untouched\")',\n '[class.ng-touched]': '_forwardProp(\"touched\")',\n '[class.ng-pristine]': '_forwardProp(\"pristine\")',\n '[class.ng-dirty]': '_forwardProp(\"dirty\")',\n '[class.ng-valid]': '_forwardProp(\"valid\")',\n '[class.ng-invalid]': '_forwardProp(\"invalid\")',\n },\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DropzoneComponent implements AfterContentInit, OnDestroy {\n protected _destroy$ = new Subject<void>();\n protected _changeDetectorRef = inject(ChangeDetectorRef);\n protected _dropzoneService = inject(DropzoneService);\n\n @ContentChild(FileInputDirective, { static: true })\n readonly fileInputDirective: FileInputDirective | null = null;\n\n readonly dragover$ = new BehaviorSubject<boolean>(false);\n\n @HostBinding('class.dragover')\n get isDragover() {\n return this.dragover$.value;\n }\n\n @HostBinding('class.disabled')\n get disabled(): boolean {\n return this.fileInputDirective?.disabled || false;\n }\n\n @HostBinding('class.focused')\n get focused(): boolean {\n return this.fileInputDirective?.focused || this.isDragover;\n }\n\n @HostBinding('attr.aria-invalid')\n get errorState() {\n return this.fileInputDirective?.errorState || false;\n }\n\n @Input()\n get value() {\n return this.fileInputDirective?.value || null;\n }\n set value(newValue: FileInputValue) {\n if (this.fileInputDirective) {\n this.fileInputDirective._fileValue = newValue;\n }\n }\n\n ngAfterContentInit() {\n if (!this.fileInputDirective) {\n throw getMissingControlError();\n }\n\n // Forward state changes from the child input element.\n this.fileInputDirective.stateChanges\n .pipe(\n tap(() => this._changeDetectorRef.markForCheck()),\n takeUntil(this._destroy$)\n )\n .subscribe();\n }\n\n ngOnDestroy(): void {\n this._destroy$.next();\n this._destroy$.complete();\n }\n\n /** Opens the native OS file picker. */\n @HostListener('keydown.code.enter')\n openFilePicker() {\n if (!this.disabled && this.fileInputDirective) {\n this.fileInputDirective.openFilePicker();\n }\n }\n\n /** Forwards styling property from control to host element. */\n _forwardProp(prop: keyof NgControl): boolean {\n return !!this.fileInputDirective?.ngControl?.[prop];\n }\n\n @HostListener('dragover', ['$event'])\n _onDragOver = (event: DragEvent) => {\n event?.preventDefault();\n };\n\n @HostListener('dragenter', ['$event'])\n _onDragEnter = (event: DragEvent) => {\n event?.preventDefault();\n this.dragover$.next(true);\n\n // Indicate to the Browser that files will be copied.\n if (event?.dataTransfer) {\n event.dataTransfer.dropEffect = 'copy';\n }\n };\n\n @HostListener('dragleave', ['$event'])\n _onDragLeave = (event: DragEvent) => {\n event?.preventDefault();\n this.dragover$.next(false);\n };\n\n @HostListener('drop', ['$event'])\n _onDrop = async (event: DragEvent) => {\n this._onDragLeave(event);\n\n const files = await this._dropzoneService.getFiles(event);\n this.fileInputDirective?.handleFileDrop(files);\n };\n}\n","/*\n * Public API Surface of cdk\n */\n\nexport * from './lib/coercion';\nexport * from './lib/dropzone';\nexport * from './lib/file-input';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.AcceptService"],"mappings":"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"}