{"version":3,"file":"c8y-ngx-components-file-preview.mjs","sources":["../../file-preview/file-preview-product-experience.constants.ts","../../file-preview/download-emitter.token.ts","../../file-preview/file-preview.component.ts","../../file-preview/file-preview.component.html","../../file-preview/file-preview.module.ts","../../file-preview/c8y-ngx-components-file-preview.ts"],"sourcesContent":["export const PRODUCT_EXPERIENCE_FILE_PREVIEW = {\n  EVENTS: {\n    FILE_PREVIEW: 'filePreview'\n  },\n  COMPONENTS: {\n    FILE_PREVIEW_COMPONENT: 'file-preview'\n  },\n  ACTIONS: {\n    OPEN_PREVIEW: 'openPreview'\n  }\n} as const;\n","import { EventEmitter, InjectionToken } from '@angular/core';\n\n/**\n * Provides InjectionToken used in FilePreviewModule. This token is used to inject EventEmitter instance, that is\n * shared among all instances of FilePreviewComponent. These components communicate between each other using this\n * emitter, which enables them to clear downloaded files from memory, if other instance of FilePreviewComponent\n * started downloading different file. Value emitted by this EventEmitter is ID of downloaded file.\n */\nexport const DOWNLOAD_EMITTER = new InjectionToken<EventEmitter<string>>('downloadEmitter');\n","import { Component, EventEmitter, Inject, Input, OnDestroy, TemplateRef } from '@angular/core';\nimport { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';\nimport { IManagedObjectBinary } from '@c8y/client';\nimport { DomSanitizer, SafeUrl } from '@angular/platform-browser';\nimport { first, takeUntil } from 'rxjs/operators';\nimport { Subject } from 'rxjs';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  AlertService,\n  FilesService,\n  IFetchWithProgress,\n  GainsightService,\n  IconDirective,\n  ModalComponent,\n  LoadingComponent,\n  C8yTranslatePipe,\n  BytesPipe\n} from '@c8y/ngx-components';\nimport { PRODUCT_EXPERIENCE_FILE_PREVIEW } from './file-preview-product-experience.constants';\nimport { DOWNLOAD_EMITTER } from './download-emitter.token';\nimport { NgIf, NgSwitch, NgSwitchCase, NgSwitchDefault } from '@angular/common';\n\n/**\n * A component which shows a button that opens a modal with the preview of a binary managed object.\n * This component requires CSP 'blob:' rule for img-src and media-src to be set.\n *\n * ```html\n * <c8y-file-preview [mo]=\"managedObject\">\n *     <button customButton>Preview</button>\n * </c8y-file-preview>\n * ```\n * If no custom button provided, the component will use the default search icon button instead.\n *\n */\n@Component({\n  selector: 'c8y-file-preview',\n  templateUrl: './file-preview.component.html',\n  imports: [\n    NgIf,\n    IconDirective,\n    ModalComponent,\n    LoadingComponent,\n    NgSwitch,\n    NgSwitchCase,\n    NgSwitchDefault,\n    C8yTranslatePipe,\n    BytesPipe\n  ]\n})\nexport class FilePreviewComponent implements OnDestroy {\n  @Input('mo')\n  set _mo(mo: IManagedObjectBinary) {\n    this.mo = mo;\n    this.setContentType();\n  }\n  mo: IManagedObjectBinary;\n\n  contentType: 'image' | 'video' | 'text' | 'json' | 'unsupported' = 'unsupported';\n  progress: IFetchWithProgress;\n\n  dataUrl: string;\n  safeDataUrl: SafeUrl;\n  BUFFERING_STATUS_TEXT = gettext(\n    '{{speed}}/s - {{bufferedBytes}} of {{totalBytes}} buffered ({{percentage}}%)'\n  );\n\n  private destroy$: Subject<any> = new Subject();\n\n  constructor(\n    @Inject(DOWNLOAD_EMITTER) private downloadEmitter: EventEmitter<string>,\n    public modalRef: BsModalRef,\n    private modalService: BsModalService,\n    private sanitizer: DomSanitizer,\n    private filesService: FilesService,\n    private alertService: AlertService,\n    private gainsightService: GainsightService\n  ) {\n    downloadEmitter.pipe(takeUntil(this.destroy$)).subscribe(id => {\n      if (this.dataUrl && this.mo.id !== id) {\n        this.removeDownloadedFile();\n      }\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.removeDownloadedFile();\n    this.destroy$.next(true);\n    this.destroy$.complete();\n  }\n\n  async openModal(template: TemplateRef<any>) {\n    this.modalRef = this.modalService.show(template, {\n      ariaDescribedby: 'modal-body',\n      ariaLabelledBy: 'modal-title',\n      ignoreBackdropClick: true\n    });\n\n    this.gainsightService.triggerEvent(PRODUCT_EXPERIENCE_FILE_PREVIEW.EVENTS.FILE_PREVIEW, {\n      component: PRODUCT_EXPERIENCE_FILE_PREVIEW.COMPONENTS.FILE_PREVIEW_COMPONENT,\n      action: PRODUCT_EXPERIENCE_FILE_PREVIEW.ACTIONS.OPEN_PREVIEW\n    });\n\n    if (this.dataUrl) {\n      return;\n    }\n\n    this.downloadEmitter.emit(this.mo.id);\n\n    const subscription = this.filesService\n      .fetchFileWithProgress$(this.mo)\n      .pipe(takeUntil(this.destroy$))\n      .subscribe(\n        progress => {\n          this.progress = progress;\n          if (this.progress.blob) {\n            this.dataUrl = URL.createObjectURL(progress.blob);\n            this.safeDataUrl = this.sanitizer.bypassSecurityTrustUrl(this.dataUrl);\n          }\n        },\n        e => {\n          this.modalRef.hide();\n          this.alertService.addServerFailure(e);\n        }\n      );\n\n    this.modalRef.onHide.pipe(first(), takeUntil(this.destroy$)).subscribe(() => {\n      subscription.unsubscribe();\n    });\n  }\n\n  private removeDownloadedFile(): void {\n    URL.revokeObjectURL(this.dataUrl);\n    delete this.dataUrl;\n    delete this.safeDataUrl;\n  }\n\n  private setContentType(): void {\n    if (!this.mo || !this.mo.hasOwnProperty('c8y_IsBinary')) {\n      // eslint-disable-next-line no-console\n      console.warn('Provided Managed object is not binary');\n      this.contentType = 'unsupported';\n      return;\n    }\n\n    if (this.mo.contentType.startsWith('image/')) {\n      this.contentType = 'image';\n    } else if (this.mo.contentType.startsWith('video/')) {\n      this.contentType = 'video';\n    } else if (this.mo.contentType.startsWith('text/')) {\n      // @TODO: Implement in future\n      this.contentType = 'unsupported';\n    } else if (this.mo.contentType.startsWith('application/json')) {\n      // @TODO: Implement in future\n      this.contentType = 'unsupported';\n    } else {\n      this.contentType = 'unsupported';\n    }\n  }\n}\n","<div\n  class=\"d-inline-block\"\n  *ngIf=\"contentType !== 'unsupported'\"\n  (click)=\"openModal(modalTemplate)\"\n>\n  <div #customButtonRef>\n    <ng-content select=\"[customButton]\"></ng-content>\n  </div>\n\n  <ng-container *ngIf=\"!customButtonRef.children.length\">\n    <button [title]=\"'Preview file' | translate\" type=\"button\" class=\"btn btn-default btn-icon\">\n      <i c8yIcon=\"search\"></i>\n    </button>\n  </ng-container>\n</div>\n\n<ng-template #modalTemplate>\n  <c8y-modal\n    [title]=\"mo.name\"\n    [customFooter]=\"false\"\n    (onClose)=\"modalRef.hide()\"\n    (onDismiss)=\"modalRef.hide()\"\n    [labels]=\"{ cancel: '', ok: 'Close' | translate }\"\n    class=\"text-break-word\"\n  >\n    <div class=\"text-center d-block\" *ngIf=\"!dataUrl\">\n      <c8y-loading layout=\"application\" [progress]=\"progress.percentage\"></c8y-loading>\n      {{\n        BUFFERING_STATUS_TEXT\n          | translate\n            : {\n                totalBytes: progress.totalBytes | bytes,\n                bufferedBytes: progress.bufferedBytes | bytes,\n                percentage: progress.percentage,\n                speed: progress.bytesPerSecond | bytes\n              }\n      }}\n    </div>\n\n    <ng-container *ngIf=\"dataUrl\" [ngSwitch]=\"contentType\" id=\"modal-body\">\n      <ng-container *ngSwitchCase=\"'image'\">\n        <img class=\"fit-w\" alt=\"safeDataUrl\" [src]=\"safeDataUrl\" />\n      </ng-container>\n\n      <ng-container *ngSwitchCase=\"'video'\">\n        <video controls autoplay class=\"fit-w\">\n          <source [src]=\"safeDataUrl\" />\n          {{ 'Your browser does not support the video tag.' | translate }}\n        </video>\n      </ng-container>\n\n      <ng-container *ngSwitchCase=\"'text'\">\n        <!--        @TODO: Implement text viewer-->\n        text\n      </ng-container>\n\n      <ng-container *ngSwitchCase=\"'json'\">\n        <!--        @TODO: Implement json viewer-->\n        json\n      </ng-container>\n\n      <ng-container *ngSwitchDefault></ng-container>\n    </ng-container>\n  </c8y-modal>\n</ng-template>\n","import { EventEmitter, NgModule } from '@angular/core';\nimport { CoreModule, CommonModule } from '@c8y/ngx-components';\nimport { FilePreviewComponent } from './file-preview.component';\nimport { DOWNLOAD_EMITTER } from './download-emitter.token';\n\nconst downloadEmitter = new EventEmitter<string>();\n\n@NgModule({\n  imports: [CoreModule, CommonModule, FilePreviewComponent],\n  exports: [FilePreviewComponent],\n  providers: [\n    {\n      provide: DOWNLOAD_EMITTER,\n      useValue: downloadEmitter\n    }\n  ]\n})\nexport class FilePreviewModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}