{"version":3,"file":"ifsworld-granite-components-file-upload.mjs","sources":["../../../../libs/granite-components/file-upload/src/lib/file-upload.constants.ts","../../../../libs/granite-components/file-upload/src/lib/file-upload.utils.ts","../../../../libs/granite-components/file-upload/src/lib/directives/file-drag-and-drop.directive.ts","../../../../libs/granite-components/file-upload/src/lib/file-upload.component.ts","../../../../libs/granite-components/file-upload/src/lib/file-upload.component.html","../../../../libs/granite-components/file-upload/src/lib/file-upload.module.ts","../../../../libs/granite-components/file-upload/src/ifsworld-granite-components-file-upload.ts"],"sourcesContent":["import { CarouselResponsiveOptions } from 'primeng/carousel';\n\nexport interface SelectedFile {\n  file: File;\n  readableSize?: string;\n  imageUrl?: string;\n}\n\nexport interface FileUploadError {\n  isError: boolean;\n  type: FilUploadErrorTypes;\n}\n\nexport const fileSizes: string[] = [\n  'Bytes',\n  'KB',\n  'MB',\n  'GB',\n  'TB',\n  'PB',\n  'EB',\n  'ZB',\n  'YB',\n];\n\nexport enum FileUploadStatus {\n  NotStarted = 'NotStarted',\n  InProgress = 'InProgress',\n  Completed = 'Completed',\n  Failed = 'Failed',\n  Cancelled = 'Cancelled',\n}\n\nexport enum FilUploadErrorTypes {\n  ExtensionNotSupported = 'ExtensionNotSupported',\n  MultipleFilesNotSupported = 'MultipleFilesNotSupported',\n}\n\nexport const DEFAULT_MULTI_FILE_SUPPORT = false;\nexport const DEFAULT_ACCEPT_TYPE: string = '*.*';\nexport const DEFAULT_UPLOAD_TITLE: string = 'Upload Files';\nexport const DEFAULT_UPLOAD_ICON: string = 'icon-upload';\nexport const DEFAULT_FILE_BROWSE_BUTTON_ICON: string = 'icon-folder-alt';\nexport const DEFAULT_DROPZONE_TEXT: string = 'Drop here or';\nexport const DEFAULT_BROWSE_BUTTON_TEXT: string = 'Browse';\nexport const DEFAULT_DROP_PLACEHOLDER_TEXT: string = 'Drop files here';\nexport const DEFAULT_DROPZONE_HINT: string = '';\nexport const DEFAULT_REMOVE_BUTTON_TEXT: string = 'Remove';\nexport const DEFAULT_UPLOAD_BUTTON_TEXT: string = 'Upload Files';\nexport const DEFAULT_RETRY_BUTTON_TEXT: string = 'Retry';\nexport const DEFAULT_CANCEL_BUTTON_TEXT: string = 'Cancel';\nexport const DEFAULT_RESPONSIVE_OPTIONS: CarouselResponsiveOptions[] = [\n  { breakpoint: '1200px', numVisible: 4, numScroll: 1 },\n  { breakpoint: '992px', numVisible: 3, numScroll: 1 },\n  { breakpoint: '768px', numVisible: 2, numScroll: 1 },\n  { breakpoint: '576px', numVisible: 1, numScroll: 1 },\n];\nexport const DEFAULT_VISIBLE_FILES: number = 10;\n","export function validFileTypes<T>(\n  mimeTypesStringToCheck: string,\n  files: T[]\n): boolean {\n  const supportedFileMimeTypes = mimeTypesStringToCheck\n    .split(',')\n    .map((ext) => ext.trim());\n\n  if (!files || files.length === 0) {\n    return false;\n  }\n\n  return files.every((file: T) => {\n    const fileType = file['type'];\n    return fileType && supportedFileMimeTypes.includes(fileType);\n  });\n}\n","import {\n  Directive,\n  EventEmitter,\n  HostBinding,\n  HostListener,\n  Input,\n  Output,\n} from '@angular/core';\nimport { FileUploadError, FilUploadErrorTypes } from '../file-upload.constants';\nimport { validFileTypes } from '../file-upload.utils';\n\n@Directive({\n  selector: '[graniteFileDragAndDrop]',\n  standalone: false,\n  exportAs: 'graniteFileDragAndDrop',\n})\nexport class GraniteFileDragAndDropDirective {\n  @HostBinding('class.file-over')\n  fileOver: boolean;\n\n  @HostBinding('class.file-error')\n  fileBrowseError: boolean;\n\n  @Input()\n  multiFileUploadEnabled: boolean;\n\n  @Input()\n  accept: string;\n\n  @Input()\n  currentFiles: File[] = [];\n\n  @Output()\n  readonly droppedFiles: EventEmitter<File[]> = new EventEmitter<File[]>();\n\n  @Output()\n  readonly isFileOver: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n  @Output()\n  readonly fileUploadValidation: EventEmitter<FileUploadError> =\n    new EventEmitter<FileUploadError>();\n\n  @HostListener('dragover', ['$event'])\n  onDragOver(event: DragEvent): void {\n    event.preventDefault();\n    event.stopPropagation();\n\n    const transferFiles = event.dataTransfer?.items ?? [];\n\n    if (!validFileTypes(this.accept, Array.from(transferFiles))) {\n      this.fileBrowseError = true;\n      this.fileUploadValidation.emit({\n        isError: this.fileBrowseError,\n        type: FilUploadErrorTypes.ExtensionNotSupported,\n      });\n      return;\n    }\n\n    if (\n      !this.multiFileUploadEnabled &&\n      (transferFiles.length > 1 || this.currentFiles.length >= 1)\n    ) {\n      this.fileBrowseError = true;\n      this.fileUploadValidation.emit({\n        isError: this.fileBrowseError,\n        type: FilUploadErrorTypes.MultipleFilesNotSupported,\n      });\n      return;\n    }\n\n    this.fileOver = true;\n    this.isFileOver.emit(this.fileOver);\n  }\n\n  @HostListener('dragleave', ['$event'])\n  onDragLeave(event: DragEvent): void {\n    event.preventDefault();\n    event.stopPropagation();\n\n    this.fileOver = false;\n    this.fileBrowseError = false;\n    this.fileUploadValidation.emit({ isError: false, type: null });\n    this.isFileOver.emit(this.fileOver);\n  }\n\n  @HostListener('drop', ['$event'])\n  onDrop(event: DragEvent): void {\n    event.preventDefault();\n    event.stopPropagation();\n\n    if (this.fileBrowseError) {\n      this.fileBrowseError = false;\n      this.fileUploadValidation.emit({\n        isError: this.fileBrowseError,\n        type: null,\n      });\n      return;\n    }\n\n    this.currentFiles = [\n      ...this.currentFiles,\n      ...Array.from(event.dataTransfer.files),\n    ];\n\n    this.fileOver = false;\n    this.isFileOver.emit(this.fileOver);\n\n    if (this.currentFiles.length > 0) {\n      this.droppedFiles.emit(this.currentFiles);\n    }\n  }\n}\n","import {\n  Component,\n  ElementRef,\n  EventEmitter,\n  Input,\n  Output,\n  ViewChild,\n} from '@angular/core';\nimport {\n  DEFAULT_BROWSE_BUTTON_TEXT,\n  DEFAULT_CANCEL_BUTTON_TEXT,\n  DEFAULT_DROP_PLACEHOLDER_TEXT,\n  DEFAULT_DROPZONE_HINT,\n  DEFAULT_DROPZONE_TEXT,\n  DEFAULT_FILE_BROWSE_BUTTON_ICON,\n  DEFAULT_ACCEPT_TYPE,\n  DEFAULT_MULTI_FILE_SUPPORT,\n  DEFAULT_REMOVE_BUTTON_TEXT,\n  DEFAULT_RETRY_BUTTON_TEXT,\n  DEFAULT_UPLOAD_BUTTON_TEXT,\n  DEFAULT_UPLOAD_ICON,\n  DEFAULT_UPLOAD_TITLE,\n  fileSizes,\n  FileUploadError,\n  FileUploadStatus,\n  FilUploadErrorTypes,\n  SelectedFile,\n  DEFAULT_RESPONSIVE_OPTIONS,\n  DEFAULT_VISIBLE_FILES,\n} from './file-upload.constants';\nimport { coerceBooleanProperty } from '@angular/cdk/coercion';\nimport { validFileTypes } from './file-upload.utils';\nimport { CarouselResponsiveOptions } from 'primeng/carousel';\n\n@Component({\n  selector: 'granite-file-upload',\n  templateUrl: './file-upload.component.html',\n  styleUrls: ['./file-upload.component.scss'],\n  standalone: false,\n})\nexport class GraniteFileUploadComponent {\n  @ViewChild('fileDropRef', { read: ElementRef })\n  fileDropRef!: ElementRef<HTMLInputElement>;\n\n  @Input()\n  accept: string = DEFAULT_ACCEPT_TYPE;\n\n  @Input()\n  uploadTitle: string = DEFAULT_UPLOAD_TITLE;\n\n  @Input()\n  uploadIcon: string = DEFAULT_UPLOAD_ICON;\n\n  @Input()\n  browseIcon: string = DEFAULT_FILE_BROWSE_BUTTON_ICON;\n\n  @Input()\n  dropZoneText: string = DEFAULT_DROPZONE_TEXT;\n\n  @Input()\n  browseButtonText: string = DEFAULT_BROWSE_BUTTON_TEXT;\n\n  @Input()\n  dropPlaceholderText: string = DEFAULT_DROP_PLACEHOLDER_TEXT;\n\n  @Input()\n  dropZoneHint: string = DEFAULT_DROPZONE_HINT;\n\n  @Input()\n  removeButtonText: string = DEFAULT_REMOVE_BUTTON_TEXT;\n\n  @Input()\n  uploadButtonText: string = DEFAULT_UPLOAD_BUTTON_TEXT;\n\n  @Input()\n  retryButtonText: string = DEFAULT_RETRY_BUTTON_TEXT;\n\n  @Input()\n  cancelButtonText: string = DEFAULT_CANCEL_BUTTON_TEXT;\n\n  @Input()\n  multiFileUpload: boolean = DEFAULT_MULTI_FILE_SUPPORT;\n\n  @Input()\n  responsiveOptions: CarouselResponsiveOptions[] = DEFAULT_RESPONSIVE_OPTIONS;\n\n  @Output()\n  readonly browseOrDragFiles: EventEmitter<SelectedFile[]> = new EventEmitter<\n    SelectedFile[]\n  >();\n\n  @Output()\n  readonly removeFiles: EventEmitter<SelectedFile[]> = new EventEmitter<\n    SelectedFile[]\n  >();\n\n  @Output()\n  readonly filesUpload: EventEmitter<void> = new EventEmitter<void>();\n\n  @Output()\n  readonly fileUploadValidation: EventEmitter<FileUploadError> =\n    new EventEmitter<FileUploadError>();\n\n  selectedFiles: File[] = [];\n  previewReadyFiles: SelectedFile[] = [];\n  isFileOnDropzone: boolean = false;\n  FileUploadStatus = FileUploadStatus;\n  fileError: boolean = false;\n  fileDropErrorType: string;\n  numVisible: number = DEFAULT_VISIBLE_FILES;\n\n  protected _uploadStatus: FileUploadStatus = FileUploadStatus.NotStarted;\n\n  @Input()\n  get uploadStatus(): FileUploadStatus {\n    return this._uploadStatus;\n  }\n\n  set uploadStatus(status: FileUploadStatus) {\n    this._uploadStatus = status;\n  }\n\n  protected _autoUpload: boolean = true;\n\n  @Input()\n  get autoUpload(): boolean {\n    return this._autoUpload;\n  }\n\n  set autoUpload(value: boolean) {\n    this._autoUpload = coerceBooleanProperty(value);\n  }\n\n  fileBrowseHandler(event: Event): void {\n    const target = event.target as HTMLInputElement;\n    const files: File[] = Array.from(target.files);\n\n    if (!validFileTypes(this.accept, files)) {\n      this.fileUploadValidation.emit({\n        isError: true,\n        type: FilUploadErrorTypes.ExtensionNotSupported,\n      });\n      this.fileDropRef.nativeElement.value = null;\n      return;\n    }\n\n    this.selectedFiles = [...this.selectedFiles, ...files];\n    this.previewReadyFiles = this.prepareSelectedFiles(this.selectedFiles);\n    this.browseOrDragFiles.emit(this.previewReadyFiles);\n  }\n\n  fileRemoveHandler(fileToRemove: SelectedFile): void {\n    const index = this.previewReadyFiles.findIndex(\n      (file) =>\n        file.imageUrl === fileToRemove.imageUrl &&\n        file.file?.name === fileToRemove.file?.name &&\n        file.readableSize === fileToRemove.readableSize\n    );\n    this.selectedFiles.splice(index, 1);\n    this.previewReadyFiles.splice(index, 1);\n\n    if (\n      this.selectedFiles.length === 0 &&\n      this.previewReadyFiles.length === 0\n    ) {\n      this.fileDropRef.nativeElement.value = null;\n      this.uploadStatus = FileUploadStatus.NotStarted;\n    }\n\n    this.removeFiles.emit(this.previewReadyFiles);\n  }\n\n  onFilesDropHandler(files: File[]): void {\n    if (\n      !this.multiFileUpload &&\n      (this.selectedFiles.length === 1 || files.length !== 1)\n    ) {\n      this.fileError = true;\n      return;\n    }\n\n    this.selectedFiles = files;\n\n    this.previewReadyFiles = this.prepareSelectedFiles(this.selectedFiles);\n    this.browseOrDragFiles.emit(this.previewReadyFiles);\n  }\n\n  onFileOverDropzone(isFileOver: boolean): void {\n    this.isFileOnDropzone = isFileOver;\n  }\n\n  onFileDropError(validation: FileUploadError): void {\n    this.fileError = validation.isError;\n    this.fileDropErrorType = validation.type;\n  }\n\n  prepareSelectedFiles(files: File[]): SelectedFile[] {\n    return files.map((file: File) => ({\n      file,\n      readableSize: this.formatBytesToReadableSize(file.size, 2),\n      imageUrl: file.type.startsWith('image/')\n        ? URL.createObjectURL(file)\n        : null,\n    }));\n  }\n\n  uploadFiles(): void {\n    this.filesUpload.emit();\n  }\n\n  retryUpload(): void {\n    this.filesUpload.emit();\n  }\n\n  cancelUpload(): void {\n    this.resetFileUpload();\n    this.removeFiles.emit(this.previewReadyFiles);\n  }\n\n  resetFileUpload(): void {\n    this.fileDropRef.nativeElement.value = null;\n    this.fileError = false;\n    this.fileDropErrorType = '';\n    this.selectedFiles = [];\n    this.previewReadyFiles = [];\n    this.uploadStatus = FileUploadStatus.NotStarted;\n  }\n\n  formatBytesToReadableSize(bytes: number, decimals: number): string {\n    if (bytes === 0) {\n      return `0 ${fileSizes[0]}`;\n    }\n\n    const bytesPerKB = 1024;\n    const decimalPoints = decimals <= 0 ? 0 : decimals || 2;\n    const exp = Math.floor(Math.log(bytes) / Math.log(bytesPerKB));\n    return `${parseFloat(\n      (bytes / Math.pow(bytesPerKB, exp)).toFixed(decimalPoints)\n    )} ${fileSizes[exp]}`;\n  }\n}\n","<div class=\"file-upload-wrapper\">\n  <h2 class=\"file-upload-title\">{{ uploadTitle }}</h2>\n  <div\n    class=\"file-dropzone\"\n    [ngClass]=\"{ 'upload-failed': uploadStatus === FileUploadStatus.Failed }\"\n    graniteFileDragAndDrop\n    (droppedFiles)=\"onFilesDropHandler($event)\"\n    (isFileOver)=\"onFileOverDropzone($event)\"\n    (fileUploadValidation)=\"onFileDropError($event)\"\n    [multiFileUploadEnabled]=\"multiFileUpload\"\n    [accept]=\"accept\"\n    [currentFiles]=\"selectedFiles\"\n  >\n    <input\n      class=\"file-input\"\n      #fileDropRef\n      type=\"file\"\n      title=\"fileUpload\"\n      (change)=\"fileBrowseHandler($event)\"\n      [multiple]=\"multiFileUpload\"\n      [accept]=\"accept\"\n    />\n    <div class=\"file-upload-body\">\n      @if (!isFileOnDropzone && !fileError) {\n        @switch (previewReadyFiles.length) {\n          @case (0) {\n            <div class=\"file-upload-browse\">\n              <granite-icon\n                class=\"file-upload-icon\"\n                [fontIcon]=\"uploadIcon\"\n              ></granite-icon>\n              <div class=\"file-selection\">\n                <h2 class=\"file-upload-body-text\">{{ dropZoneText }}</h2>\n                <button\n                  class=\"file-select-button\"\n                  graniteButton\n                  (click)=\"fileDropRef.click()\"\n                >\n                  <granite-icon\n                    class=\"browse-button-icon\"\n                    [fontIcon]=\"browseIcon\"\n                  ></granite-icon>\n                  <div class=\"browse-button-text\">{{ browseButtonText }}</div>\n                </button>\n              </div>\n              <p *ngIf=\"dropZoneHint\" class=\"file-upload-hint\">\n                {{ dropZoneHint }}\n              </p>\n            </div>\n          }\n          @case (1) {\n            <ng-container\n              *ngTemplateOutlet=\"\n                filePreviewTemplate;\n                context: { previewFile: previewReadyFiles[0] }\n              \"\n            ></ng-container>\n          }\n          @default {\n            <granite-carousel\n              [items]=\"previewReadyFiles\"\n              [numVisible]=\"numVisible\"\n              [responsiveOptions]=\"responsiveOptions\"\n            >\n              <ng-template let-previewFile #itemTemplate>\n                <ng-container\n                  *ngTemplateOutlet=\"\n                    filePreviewTemplate;\n                    context: { previewFile: previewFile }\n                  \"\n                ></ng-container>\n              </ng-template>\n            </granite-carousel>\n          }\n        }\n      } @else {\n        <p class=\"drop-area-placeholder\">\n          {{ dropPlaceholderText }}\n        </p>\n      }\n    </div>\n  </div>\n  <div class=\"file-upload-footer\">\n    <div class=\"footer-container\" *ngIf=\"previewReadyFiles.length > 0\">\n      <button\n        *ngIf=\"!autoUpload && uploadStatus === FileUploadStatus.NotStarted\"\n        granitePrimaryButton\n        (click)=\"uploadFiles()\"\n      >\n        {{ uploadButtonText }}\n      </button>\n      <ng-container *ngIf=\"uploadStatus === FileUploadStatus.Failed\">\n        <button graniteButton (click)=\"cancelUpload()\">\n          {{ cancelButtonText }}\n        </button>\n        <button\n          class=\"retry-upload-button\"\n          granitePrimaryButton\n          (click)=\"retryUpload()\"\n        >\n          {{ retryButtonText }}\n        </button>\n      </ng-container>\n    </div>\n  </div>\n</div>\n\n<ng-template #uploadingOverlay>\n  <div class=\"file-preview-overlay\"></div>\n  <div class=\"loading-container\">\n    <div class=\"uploading-spinner\"></div>\n  </div>\n</ng-template>\n\n<ng-template #uploadFailedOverlay>\n  <div class=\"file-preview-overlay\"></div>\n</ng-template>\n\n<ng-template #filePreviewTemplate let-previewFile=\"previewFile\">\n  <div class=\"file-preview-container\">\n    @if (previewFile?.imageUrl) {\n      <a\n        class=\"file-preview-link\"\n        [ngClass]=\"{\n          'uploading-in-progress': uploadStatus === FileUploadStatus.InProgress,\n          'upload-failed': uploadStatus === FileUploadStatus.Failed\n        }\"\n        [href]=\"previewFile?.imageUrl\"\n        target=\"_blank\"\n      >\n        <div class=\"file-preview-holder\">\n          <img\n            role=\"presentation\"\n            [src]=\"previewFile?.imageUrl\"\n            [alt]=\"previewFile?.file?.name\"\n          />\n          <ng-container\n            *ngIf=\"uploadStatus === FileUploadStatus.InProgress\"\n            [ngTemplateOutlet]=\"uploadingOverlay\"\n          ></ng-container>\n          <ng-container\n            *ngIf=\"uploadStatus === FileUploadStatus.Failed\"\n            [ngTemplateOutlet]=\"uploadFailedOverlay\"\n          >\n          </ng-container>\n        </div>\n        <p class=\"file-name\" [title]=\"previewFile?.file?.name\">\n          {{ previewFile?.file?.name }}\n        </p>\n        <p class=\"file-size\">{{ previewFile?.readableSize }}</p>\n      </a>\n    } @else {\n      <div\n        class=\"document-preview-link\"\n        [ngClass]=\"{\n          'uploading-in-progress': uploadStatus === FileUploadStatus.InProgress,\n          'upload-failed': uploadStatus === FileUploadStatus.Failed\n        }\"\n      >\n        <div class=\"document-preview-holder\">\n          <granite-icon\n            class=\"document-file-preview\"\n            [class.upload-failed]=\"uploadStatus === FileUploadStatus.Failed\"\n            [fontIcon]=\"'icon-document-alt'\"\n          ></granite-icon>\n          <ng-container\n            *ngIf=\"uploadStatus === FileUploadStatus.InProgress\"\n            [ngTemplateOutlet]=\"uploadingOverlay\"\n          ></ng-container>\n        </div>\n        <p class=\"file-name\" [title]=\"previewFile?.file?.name\">\n          {{ previewFile?.file?.name }}\n        </p>\n        <p class=\"file-size\">{{ previewFile?.readableSize }}</p>\n      </div>\n    }\n    <button\n      graniteButton\n      *ngIf=\"\n        [FileUploadStatus.Completed, FileUploadStatus.NotStarted].includes(\n          uploadStatus\n        )\n      \"\n      (click)=\"fileRemoveHandler(previewFile)\"\n    >\n      {{ removeButtonText }}\n    </button>\n  </div>\n</ng-template>\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { GraniteFileUploadComponent } from './file-upload.component';\nimport { GraniteFileDragAndDropDirective } from './directives/file-drag-and-drop.directive';\nimport { GraniteCarouselModule } from '@ifsworld/granite-components/carousel';\nimport {\n  GraniteButtonModule,\n  GraniteIconModule,\n} from '@ifsworld/granite-components';\n\n@NgModule({\n  declarations: [GraniteFileUploadComponent, GraniteFileDragAndDropDirective],\n  exports: [GraniteFileUploadComponent],\n  imports: [\n    CommonModule,\n    GraniteButtonModule,\n    GraniteIconModule,\n    GraniteCarouselModule,\n  ],\n})\nexport class GraniteFileUploadModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i4.GraniteFileDragAndDropDirective"],"mappings":"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"}