UNPKG

ngx-file-drag-drop

Version:

angular material file input component supports file drag and drop, and selection with native file picker

1 lines 27 kB
{"version":3,"file":"ngx-file-drag-drop.mjs","sources":["../../../projects/ngx-file-drag-drop/src/lib/byte.pipe.ts","../../../projects/ngx-file-drag-drop/src/lib/ngx-file-drag-drop.component.ts","../../../projects/ngx-file-drag-drop/src/lib/validators.ts","../../../projects/ngx-file-drag-drop/src/public-api.ts","../../../projects/ngx-file-drag-drop/src/ngx-file-drag-drop.ts"],"sourcesContent":["import { Pipe, PipeTransform } from \"@angular/core\";\n\n@Pipe({\n name: \"byte\",\n standalone: true,\n})\nexport class BytePipe implements PipeTransform {\n transform(value: string | number, decimals: number | string = 2): string {\n value = value.toString();\n if (parseInt(value, 10) >= 0) {\n value = this.formatBytes(+value, +decimals);\n }\n return value;\n }\n\n // https://stackoverflow.com/questions/15900485/correct-way-to-convert-size-in-bytes-to-kb-mb-gb-in-javascript\n formatBytes(bytes: number, decimals = 2): string {\n if (bytes === 0) {\n return \"0 Bytes\";\n }\n\n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = [\"Bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\", \"EB\", \"ZB\", \"YB\"];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + \" \" + sizes[i];\n }\n}\n","import {\n Component,\n ElementRef,\n EventEmitter,\n HostBinding,\n HostListener,\n Input,\n Output,\n ViewChild,\n forwardRef,\n} from \"@angular/core\";\nimport { BytePipe } from \"./byte.pipe\";\nimport { MatChipsModule } from \"@angular/material/chips\";\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\nimport { coerceBooleanProperty } from \"@angular/cdk/coercion\";\nimport { MatIconModule } from \"@angular/material/icon\";\nimport { NG_VALUE_ACCESSOR } from \"@angular/forms\";\n\n@Component({\n selector: \"ngx-file-drag-drop\",\n standalone: true,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => NgxFileDragDropComponent),\n multi: true,\n },\n ],\n imports: [MatChipsModule, MatTooltipModule, MatIconModule, BytePipe],\n template: `\n @if(files.length){\n <mat-chip-listbox selectable=\"false\">\n @for (file of files; track file) {\n <mat-chip\n matTooltip=\"{{ file.size | byte }}\"\n matTooltipPosition=\"below\"\n [matTooltipDisabled]=\"displayFileSize\"\n selected\n highlighted\n [disabled]=\"disabled\"\n color=\"accent\"\n disableRipple=\"true\"\n [removable]=\"!disabled\"\n (removed)=\"removeFile(file)\"\n >\n <span class=\"filename\">{{ getFileName(file) }}</span>\n @if(!disabled){\n <mat-icon matChipRemove>cancel</mat-icon>\n }\n </mat-chip>\n }\n </mat-chip-listbox>\n } @if (!files.length){\n <span class=\"placeholder\">{{ emptyPlaceholder }}</span>\n }\n <input\n #fileInputEl\n class=\"hidden\"\n #fileInput\n type=\"file\"\n [attr.multiple]=\"multiple ? '' : null\"\n [attr.accept]=\"accept\"\n />\n `,\n styles: `\n input {\n width: 0px;\n height: 0px;\n opacity: 0;\n overflow: hidden;\n position: absolute;\n z-index: -1;\n}\n\n:host {\n display: block;\n border: 2px dashed;\n border-radius: 20px;\n min-height: 50px;\n margin: 10px auto;\n max-width: 500px;\n padding: 20px;\n cursor: pointer;\n}\n:host.disabled {\n opacity: 0.5;\n cursor: unset;\n}\n\n.placeholder {\n color: grey;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\nmat-chip {\n max-width: 100%;\n}\n.filename {\n max-width: calc(100% - 1em);\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n:host.empty-input {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.mat-mdc-chip.mat-mdc-standard-chip.mat-focus-indicator {\n box-shadow: none;\n}\n\n.mat-mdc-chip.mat-mdc-standard-chip::after {\n background: unset;\n}\n `,\n})\nexport class NgxFileDragDropComponent {\n @HostBinding(\"class.disabled\")\n @Input()\n get disabled() {\n return this._disabled;\n }\n set disabled(val: boolean) {\n this._disabled = coerceBooleanProperty(val);\n }\n @Input()\n set multiple(value: boolean) {\n this._multiple = coerceBooleanProperty(value);\n }\n get multiple() {\n return this._multiple;\n }\n\n @Input()\n set displayFileSize(value: boolean) {\n this._displayFileSize = coerceBooleanProperty(value);\n }\n get displayFileSize() {\n return this._displayFileSize;\n }\n\n @Input()\n @HostBinding(\"style.border-color\")\n set activeBorderColor(color: string) {\n this._activeBorderColor = color;\n }\n get activeBorderColor() {\n return this.isDragover ? this._activeBorderColor : \"#ccc\";\n }\n get files() {\n return this._files;\n }\n\n @HostBinding(\"class.empty-input\")\n get isEmpty() {\n return !this.files?.length;\n }\n\n // @HostBinding('class.drag-over')\n get isDragover() {\n return this._isDragOver;\n }\n set isDragover(value: boolean) {\n if (!this.disabled) {\n this._isDragOver = value;\n }\n }\n\n @Output()\n private valueChanged = new EventEmitter<File[]>();\n\n @ViewChild(\"fileInputEl\")\n private fileInputEl: ElementRef | undefined;\n\n // does no validation, just sets the hidden file input\n @Input() accept = \"*\";\n\n private _disabled = false;\n\n _multiple = false;\n\n @Input() emptyPlaceholder = `Drop file${\n this.multiple ? \"s\" : \"\"\n } or click to select`;\n\n private _displayFileSize = false;\n\n private _activeBorderColor = \"purple\";\n\n private _files: File[] = [];\n private _isDragOver = false;\n\n // https://angular.io/api/forms/ControlValueAccessor\n private _onChange = (_: File[]) => {};\n private _onTouched = () => {};\n\n writeValue(files: File[]): void {\n const fileArray = this.convertToArray(files);\n if (fileArray.length < 2 || this.multiple) {\n this._files = fileArray;\n this.emitChanges(this._files);\n } else {\n throw Error(\"Multiple files not allowed\");\n }\n }\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n }\n\n private emitChanges(files: File[]) {\n this.valueChanged.emit(files);\n this._onChange(files);\n }\n\n addFiles(files: File[] | FileList | File) {\n // this._onTouched();\n\n const fileArray = this.convertToArray(files);\n\n if (this.multiple) {\n // this.errorOnEqualFilenames(fileArray);\n const merged = this.files.concat(fileArray);\n this.writeValue(merged);\n } else {\n this.writeValue(fileArray);\n }\n }\n\n removeFile(file: File) {\n const fileIndex = this.files.indexOf(file);\n if (fileIndex >= 0) {\n const currentFiles = this.files.slice();\n currentFiles.splice(fileIndex, 1);\n this.writeValue(currentFiles);\n }\n }\n\n clear() {\n this.writeValue([]);\n }\n\n @HostListener(\"change\", [\"$event\"])\n change(event: Event) {\n event.stopPropagation();\n this._onTouched();\n const fileList = (event.target as HTMLInputElement).files;\n if (fileList?.length) {\n this.addFiles(fileList);\n }\n // clear it so change is triggered if same file is selected again\n (event.target as HTMLInputElement).value = \"\";\n }\n\n @HostListener(\"dragenter\", [\"$event\"])\n @HostListener(\"dragover\", [\"$event\"])\n activate(e: Event) {\n e.preventDefault();\n this.isDragover = true;\n }\n\n @HostListener(\"dragleave\", [\"$event\"])\n deactivate(e: {\n dataTransfer?: { files: FileList };\n preventDefault(): void;\n }) {\n e.preventDefault();\n this.isDragover = false;\n }\n\n @HostListener(\"drop\", [\"$event\"])\n handleDrop(e: { dataTransfer: { files: FileList }; preventDefault(): void }) {\n this.deactivate(e);\n if (!this.disabled) {\n const fileList = e.dataTransfer.files;\n this.removeDirectories(fileList).then((files: File[]) => {\n if (files?.length) {\n this.addFiles(files);\n }\n this._onTouched();\n });\n }\n }\n\n @HostListener(\"click\")\n open() {\n if (!this.disabled) {\n this.fileInputEl?.nativeElement.click();\n }\n }\n\n private removeDirectories(files: FileList): Promise<File[]> {\n return new Promise((resolve) => {\n const fileArray = this.convertToArray(files);\n\n const dirnames: string[] = [];\n\n const readerList = [];\n\n for (let i = 0; i < fileArray.length; i++) {\n const reader = new FileReader();\n\n reader.onerror = () => {\n dirnames.push(fileArray[i].name);\n };\n\n reader.onloadend = () => addToReaderList(i);\n\n reader.readAsArrayBuffer(fileArray[i]);\n }\n\n function addToReaderList(val: number) {\n readerList.push(val);\n if (readerList.length === fileArray.length) {\n resolve(\n fileArray.filter((file: File) => !dirnames.includes(file.name))\n );\n }\n }\n });\n }\n\n private convertToArray(\n files: FileList | File[] | File | null | undefined\n ): File[] {\n if (files) {\n if (files instanceof File) {\n return [files];\n } else if (Array.isArray(files)) {\n return files;\n } else {\n return Array.prototype.slice.call(files);\n }\n }\n return [];\n }\n\n getFileName(file: File): string {\n if (!this._displayFileSize) {\n return file.name;\n }\n\n const size = new BytePipe().transform(file.size);\n return `${file.name} (${size})`;\n }\n}\n","import { ValidatorFn, AbstractControl, ValidationErrors } from \"@angular/forms\";\n\nexport class FileValidators {\n static fileExtension(ext: string[]): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const validExtensions = ext.map((e) => e.trim().toLowerCase());\n const fileArray = control.value as File[];\n\n const invalidFiles = fileArray\n .map((file) => file.name)\n .filter((fname) => {\n const extension = fname\n .slice(((fname.lastIndexOf(\".\") - 1) >>> 0) + 2)\n .toLowerCase();\n return !validExtensions.includes(extension);\n })\n .map((name) => ({\n name,\n ext: name.slice(((name.lastIndexOf(\".\") - 1) >>> 0) + 2),\n }));\n\n return !invalidFiles.length\n ? null\n : {\n fileExtension: {\n requiredExtension: ext.toString(),\n actualExtensions: invalidFiles,\n },\n };\n };\n }\n\n static uniqueFileNames(control: AbstractControl): ValidationErrors | null {\n const fileNameArray = (control.value as File[]).map((file) => file.name);\n const duplicates = fileNameArray.reduce(\n (acc: Record<string, number>, curr) => {\n acc[curr] = acc[curr] ? acc[curr] + 1 : 1;\n return acc;\n },\n {}\n );\n\n const duplicatesArray: { name: string; count: number }[] = (\n Object.entries(duplicates) as [string, number][]\n )\n .filter((arr) => arr[1] > 1)\n .map((arr) => ({ name: arr[0], count: arr[1] }));\n\n return !duplicatesArray.length\n ? null\n : {\n uniqueFileNames: { duplicatedFileNames: duplicatesArray },\n };\n }\n\n static fileType(types: string[] | RegExp): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n let regExp: RegExp;\n if (Array.isArray(types)) {\n const joinedTypes = types.join(\"$|^\");\n regExp = new RegExp(`^${joinedTypes}$`, \"i\");\n } else {\n regExp = types;\n }\n\n const fileArray = control.value as File[];\n\n const invalidFiles = fileArray\n .filter((file) => !regExp.test(file.type))\n .map((file) => ({ name: file.name, type: file.type }));\n\n return !invalidFiles.length\n ? null\n : {\n fileType: {\n requiredType: types.toString(),\n actualTypes: invalidFiles,\n },\n };\n };\n }\n\n static maxFileCount(count: number): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const fileCount = control?.value ? (control.value as File[]).length : 0;\n const result = count >= fileCount;\n return result\n ? null\n : {\n maxFileCount: {\n maxCount: count,\n actualCount: fileCount,\n },\n };\n };\n }\n\n static maxFileSize(bytes: number): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const fileArray = control.value as File[];\n\n const invalidFiles = fileArray\n .filter((file) => file.size > bytes)\n .map((file) => ({ name: file.name, size: file.size }));\n\n return !invalidFiles.length\n ? null\n : {\n maxFileSize: {\n maxSize: bytes,\n actualSizes: invalidFiles,\n },\n };\n };\n }\n\n static maxTotalSize(bytes: number): ValidatorFn {\n return (control: AbstractControl): ValidationErrors | null => {\n const size = control?.value\n ? (control.value as File[])\n .map((file) => file.size)\n .reduce((acc, i) => acc + i, 0)\n : 0;\n const result = bytes >= size;\n return result\n ? null\n : {\n maxTotalSize: {\n maxSize: bytes,\n actualSize: size,\n },\n };\n };\n }\n static required(control: AbstractControl): ValidationErrors | null {\n const count = control?.value?.length;\n return count\n ? null\n : {\n required: true,\n };\n }\n}\n","/*\n * Public API Surface of ngx-file-drag-drop\n */\n\nexport * from './lib/ngx-file-drag-drop.component';\nexport * from './lib/byte.pipe';\nexport * from './lib/validators';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}