{"version":3,"file":"bugsplat-ngx-file-drop.mjs","sources":["../../../projects/ngx-file-drop/src/lib/ngx-file-drop-entry.ts","../../../projects/ngx-file-drop/src/lib/ngx-templates.directive.ts","../../../projects/ngx-file-drop/src/lib/ngx-file-drop.component.ts","../../../projects/ngx-file-drop/src/lib/ngx-file-drop.component.html","../../../projects/ngx-file-drop/src/lib/ngx-file-drop.module.ts","../../../projects/ngx-file-drop/src/bugsplat-ngx-file-drop.ts"],"sourcesContent":["import { FileSystemEntry, FileSystemFileEntry, FileSystemDirectoryEntry } from './dom.types';\n\n/**\n * fileEntry is an instance of {@link FileSystemFileEntry} or {@link FileSystemDirectoryEntry}.\n * Which one is it can be checked using {@link FileSystemEntry.isFile} or {@link FileSystemEntry.isDirectory}\n * properties of the given {@link FileSystemEntry}.\n */\nexport class NgxFileDropEntry {\n    constructor(\n        public relativePath: string,\n        public fileEntry: FileSystemEntry\n    ) {\n    }\n}\n","import { Directive, TemplateRef } from '@angular/core';\n\n@Directive({\n    selector: '[ngx-file-drop-content-tmp]',\n    standalone: false\n})\nexport class NgxFileDropContentTemplateDirective {\n  constructor(public template: TemplateRef<any>) { }\n}\n","import {\n  Component,\n  ContentChild,\n  ElementRef,\n  EventEmitter,\n  Input,\n  NgZone,\n  OnDestroy,\n  Output,\n  Renderer2,\n  TemplateRef,\n  ViewChild\n} from '@angular/core';\nimport { Subscription, timer } from 'rxjs';\n\nimport { NgxFileDropEntry } from './ngx-file-drop-entry';\nimport { FileSystemDirectoryEntry, FileSystemEntry, FileSystemFileEntry } from './dom.types';\nimport { NgxFileDropContentTemplateDirective } from './ngx-templates.directive';\n\n@Component({\n    selector: 'ngx-file-drop',\n    templateUrl: './ngx-file-drop.component.html',\n    styleUrls: ['./ngx-file-drop.component.scss'],\n    standalone: false\n})\nexport class NgxFileDropComponent implements OnDestroy {\n\n  @Input()\n  public accept: string = '*';\n\n  @Input()\n  public directory: boolean = false;\n\n  @Input()\n  public multiple: boolean = true;\n\n  @Input()\n  public dropZoneLabel: string = '';\n\n  @Input()\n  public dropZoneClassName: string = 'ngx-file-drop__drop-zone';\n\n  @Input()\n  public useDragEnter: boolean = false;\n\n  @Input()\n  public contentClassName: string = 'ngx-file-drop__content';\n\n  @Input()\n  public showBrowseBtn: boolean = false;\n\n  @Input()\n  public browseBtnClassName: string = 'btn btn-primary btn-xs ngx-file-drop__browse-btn';\n\n  @Input()\n  public browseBtnLabel: string = 'Browse files';\n\n  @Output()\n  public onFileDrop: EventEmitter<NgxFileDropEntry[]> = new EventEmitter();\n\n  @Output()\n  public onFileOver: EventEmitter<any> = new EventEmitter();\n\n  @Output()\n  public onFileLeave: EventEmitter<any> = new EventEmitter();\n\n  // custom templates\n  @ContentChild(NgxFileDropContentTemplateDirective, { read: TemplateRef }) contentTemplate?: TemplateRef<any>;\n\n  @ViewChild('fileSelector', { static: true })\n  public fileSelector?: ElementRef;\n\n  public isDraggingOverDropZone: boolean = false;\n\n  private globalDraggingInProgress: boolean = false;\n  private readonly globalDragStartListener: () => void;\n  private readonly globalDragEndListener: () => void;\n\n  private files: NgxFileDropEntry[] = [];\n  private numOfActiveReadEntries: number = 0;\n\n  private helperFormEl: HTMLFormElement | null = null;\n  private fileInputPlaceholderEl: HTMLDivElement | null = null;\n\n  private dropEventTimerSubscription: Subscription | null = null;\n\n  private _disabled: boolean = false;\n\n  public get disabled(): boolean { return this._disabled; }\n\n  @Input()\n  public set disabled(value: boolean) {\n    this._disabled = (value != null && `${value}` !== 'false');\n  }\n\n  constructor(\n    private zone: NgZone,\n    private renderer: Renderer2\n  ) {\n    this.globalDragStartListener = this.renderer.listen('document', 'dragstart', (evt: Event) => {\n      this.globalDraggingInProgress = true;\n    });\n    this.globalDragEndListener = this.renderer.listen('document', 'dragend', (evt: Event) => {\n      this.globalDraggingInProgress = false;\n    });\n  }\n\n  public ngOnDestroy(): void {\n    if (this.dropEventTimerSubscription) {\n      this.dropEventTimerSubscription.unsubscribe();\n      this.dropEventTimerSubscription = null;\n    }\n    this.globalDragStartListener();\n    this.globalDragEndListener();\n    this.files = [];\n    this.helperFormEl = null;\n    this.fileInputPlaceholderEl = null;\n  }\n\n  public onDragOver(event: DragEvent): void {\n    if (this.useDragEnter) {\n      this.preventAndStop(event);\n      if (event.dataTransfer) {\n        event.dataTransfer.dropEffect = 'copy';\n      }\n    } else if (!this.isDropzoneDisabled() && !this.useDragEnter && event.dataTransfer) {\n      if (!this.isDraggingOverDropZone) {\n        this.isDraggingOverDropZone = true;\n        this.onFileOver.emit(event);\n      }\n      this.preventAndStop(event);\n      event.dataTransfer.dropEffect = 'copy';\n    }\n  }\n\n  public onDragEnter(event: Event): void {\n    if (!this.isDropzoneDisabled() && this.useDragEnter) {\n      if (!this.isDraggingOverDropZone) {\n        this.isDraggingOverDropZone = true;\n        this.onFileOver.emit(event);\n      }\n      this.preventAndStop(event);\n    }\n  }\n\n  public onDragLeave(event: Event): void {\n    if (!this.isDropzoneDisabled()) {\n      if (this.isDraggingOverDropZone) {\n        this.isDraggingOverDropZone = false;\n        this.onFileLeave.emit(event);\n      }\n      this.preventAndStop(event);\n    }\n  }\n\n  public dropFiles(event: DragEvent): void {\n    if (this.isDropzoneDisabled()) {\n      return;\n    }\n    this.isDraggingOverDropZone = false;\n    if (event.dataTransfer) {\n      let items: FileList | DataTransferItemList;\n      if (event.dataTransfer.items) {\n        items = event.dataTransfer.items;\n      } else {\n        items = event.dataTransfer.files;\n      }\n      this.preventAndStop(event);\n      this.checkFiles(items);\n    }\n  }\n\n  public openFileSelector = (event?: MouseEvent): void => {\n    if (this.fileSelector && this.fileSelector.nativeElement) {\n      (this.fileSelector.nativeElement as HTMLInputElement).click();\n    }\n  };\n\n  /**\n   * Processes the change event of the file input and adds the given files.\n   * @param Event event\n   */\n  public uploadFiles(event: Event): void {\n    if (this.isDropzoneDisabled()) {\n      return;\n    }\n    if (event.target) {\n      const items = (event.target as HTMLInputElement).files || ([] as any);\n      this.checkFiles(items);\n      this.resetFileInput();\n    }\n  }\n\n  private getFakeDropEntry(file: File): NgxFileDropEntry {\n    const fakeFileEntry: FileSystemFileEntry = {\n      name: file.name,\n      isDirectory: false,\n      isFile: true,\n      file: <T>(callback: (filea: File) => T) => callback(file),\n    };\n    return new NgxFileDropEntry(fakeFileEntry.name, fakeFileEntry);\n  }\n\n  private checkFile(item: DataTransferItem | File): void {\n    if (!item) {\n      return;\n    }\n    // if (\"getAsFile\" in item) {\n    //   const file = item.getAsFile();\n    //   if (file) {\n    //     this.addToQueue(\n    //       this.getFakeDropEntry(file)\n    //     );\n    //     return;\n    //   }\n    // }\n    if (\"webkitGetAsEntry\" in item) {\n      let entry = item.webkitGetAsEntry();\n      if (entry) {\n        if (entry.isFile) {\n          const toUpload: NgxFileDropEntry = new NgxFileDropEntry(entry.name, entry);\n          this.addToQueue(toUpload);\n\n        } else if (entry.isDirectory) {\n          this.traverseFileTree(entry, entry.name);\n        }\n        return;\n      }\n    }\n    this.addToQueue(this.getFakeDropEntry((item as File)));\n  }\n\n  private checkFiles(items: FileList | DataTransferItemList): void {\n    for (let i = 0; i < items.length; i++) {\n      this.checkFile(items[i]);\n    }\n\n    if (this.dropEventTimerSubscription) {\n      this.dropEventTimerSubscription.unsubscribe();\n    }\n    this.dropEventTimerSubscription = timer(200, 200)\n      .subscribe(() => {\n        if (this.files.length > 0 && this.numOfActiveReadEntries === 0) {\n          const files = this.files;\n          this.files = [];\n          this.onFileDrop.emit(files);\n        }\n      });\n  }\n\n  private traverseFileTree(item: FileSystemEntry, path: string): void {\n    if (item.isFile) {\n      const toUpload: NgxFileDropEntry = new NgxFileDropEntry(path, item);\n      this.files.push(toUpload);\n\n    } else {\n      path = path + '/';\n      const dirReader = (item as FileSystemDirectoryEntry).createReader();\n      let entries: FileSystemEntry[] = [];\n\n      const readEntries = () => {\n        this.numOfActiveReadEntries++;\n        dirReader.readEntries((result) => {\n          if (!result.length) {\n            // add empty folders\n            if (entries.length === 0) {\n              const toUpload: NgxFileDropEntry = new NgxFileDropEntry(path, item);\n              this.zone.run(() => {\n                this.addToQueue(toUpload);\n              });\n\n            } else {\n              for (let i = 0; i < entries.length; i++) {\n                this.zone.run(() => {\n                  this.traverseFileTree(entries[i], path + entries[i].name);\n                });\n              }\n            }\n\n          } else {\n            // continue with the reading\n            entries = entries.concat(result);\n            readEntries();\n          }\n\n          this.numOfActiveReadEntries--;\n        });\n      };\n\n      readEntries();\n    }\n  }\n\n  /**\n   * Clears any added files from the file input element so the same file can subsequently be added multiple times.\n   */\n  private resetFileInput(): void {\n    if (this.fileSelector && this.fileSelector.nativeElement) {\n      const fileInputEl = this.fileSelector.nativeElement as HTMLInputElement;\n      const fileInputContainerEl = fileInputEl.parentElement;\n      const helperFormEl = this.getHelperFormElement();\n      const fileInputPlaceholderEl = this.getFileInputPlaceholderElement();\n\n      // Just a quick check so we do not mess up the DOM (will never happen though).\n      if (fileInputContainerEl !== helperFormEl) {\n        // Insert the form input placeholder in the DOM before the form input element.\n        this.renderer.insertBefore(fileInputContainerEl, fileInputPlaceholderEl, fileInputEl);\n        // Add the form input as child of the temporary form element, removing the form input from the DOM.\n        this.renderer.appendChild(helperFormEl, fileInputEl);\n        // Reset the form, thus clearing the input element of any files.\n        helperFormEl.reset();\n        // Add the file input back to the DOM in place of the file input placeholder element.\n        this.renderer.insertBefore(fileInputContainerEl, fileInputEl, fileInputPlaceholderEl);\n        // Remove the input placeholder from the DOM\n        this.renderer.removeChild(fileInputContainerEl, fileInputPlaceholderEl);\n      }\n    }\n  }\n\n  /**\n   * Get a cached HTML form element as a helper element to clear the file input element.\n   */\n  private getHelperFormElement(): HTMLFormElement {\n    if (!this.helperFormEl) {\n      this.helperFormEl = this.renderer.createElement('form') as HTMLFormElement;\n    }\n\n    return this.helperFormEl;\n  }\n\n  /**\n   * Get a cached HTML div element to be used as placeholder for the file input element when clearing said element.\n   */\n  private getFileInputPlaceholderElement(): HTMLDivElement {\n    if (!this.fileInputPlaceholderEl) {\n      this.fileInputPlaceholderEl = this.renderer.createElement('div') as HTMLDivElement;\n    }\n\n    return this.fileInputPlaceholderEl;\n  }\n\n  private isDropzoneDisabled(): boolean {\n    return (this.globalDraggingInProgress || this.disabled);\n  }\n\n  private addToQueue(item: NgxFileDropEntry): void {\n    this.files.push(item);\n  }\n\n  private preventAndStop(event: Event): void {\n    event.stopPropagation();\n    event.preventDefault();\n  }\n}\n","<div [className]=\"dropZoneClassName\"\n  [class.ngx-file-drop__drop-zone--over]=\"isDraggingOverDropZone\"\n  (drop)=\"dropFiles($event)\"\n  (dragover)=\"onDragOver($event)\"\n  (dragenter)=\"onDragEnter($event)\"\n  (dragleave)=\"onDragLeave($event)\">\n  <div [className]=\"contentClassName\">\n    <input\n      type=\"file\"\n      #fileSelector\n      [accept]=\"accept\"\n      [attr.directory]=\"directory || undefined\"\n      [attr.webkitdirectory]=\"directory || undefined\"\n      [attr.mozdirectory]=\"directory || undefined\"\n      [attr.msdirectory]=\"directory || undefined\"\n      [attr.odirectory]=\"directory || undefined\"\n      [multiple]=\"multiple\"\n      (change)=\"uploadFiles($event)\"\n      class=\"ngx-file-drop__file-input\"\n      />\n\n    <ng-template #defaultContentTemplate>\n      @if (dropZoneLabel) {\n        <div class=\"ngx-file-drop__drop-zone-label\">{{dropZoneLabel}}</div>\n      }\n      @if (showBrowseBtn) {\n        <div>\n          <input type=\"button\" [className]=\"browseBtnClassName\" value=\"{{browseBtnLabel}}\" (click)=\"openFileSelector($event)\" />\n        </div>\n      }\n    </ng-template>\n\n    <ng-template\n      [ngTemplateOutlet]=\"contentTemplate || defaultContentTemplate\"\n      [ngTemplateOutletContext]=\"{ openFileSelector: openFileSelector }\">\n    </ng-template>\n  </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { NgxFileDropComponent } from './ngx-file-drop.component';\nimport { NgxFileDropContentTemplateDirective } from './ngx-templates.directive';\n\n@NgModule({\n  declarations: [\n    NgxFileDropComponent,\n    NgxFileDropContentTemplateDirective,\n  ],\n  imports: [\n    CommonModule\n  ],\n  exports: [\n    NgxFileDropComponent,\n    NgxFileDropContentTemplateDirective,\n  ],\n  providers: [],\n  bootstrap: [\n    NgxFileDropComponent\n  ],\n})\nexport class NgxFileDropModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}