{"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 {\n  Component,\n  computed,\n  EventEmitter,\n  Inject,\n  input,\n  OnDestroy,\n  TemplateRef\n} from '@angular/core';\nimport { BsModalRef, BsModalService } from 'ngx-bootstrap/modal';\nimport { IFetchResponse, 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';\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: [IconDirective, ModalComponent, LoadingComponent, C8yTranslatePipe, BytesPipe]\n})\nexport class FilePreviewComponent implements OnDestroy {\n  mo = input.required<IManagedObjectBinary>();\n  downloadFn = input<() => Promise<IFetchResponse>>();\n\n  contentType = computed(() => this.resolveContentType(this.mo()));\n  progress: IFetchWithProgress = {\n    totalBytes: 0,\n    bufferedBytes: 0,\n    percentage: 0,\n    bytesPerSecond: 0\n  };\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    if (this.downloadFn()) {\n      await this.fetchWithDownloadFn();\n      return;\n    }\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 async fetchWithDownloadFn(): Promise<void> {\n    try {\n      const fn = this.downloadFn();\n      if (!fn) {\n        return;\n      }\n      const response = await fn();\n      const blob = await response.blob();\n      this.dataUrl = URL.createObjectURL(blob);\n      this.safeDataUrl = this.sanitizer.bypassSecurityTrustUrl(this.dataUrl);\n    } catch (e) {\n      this.modalRef.hide();\n      this.alertService.addServerFailure(e);\n    }\n  }\n\n  private removeDownloadedFile(): void {\n    URL.revokeObjectURL(this.dataUrl);\n    delete this.dataUrl;\n    delete this.safeDataUrl;\n  }\n\n  private resolveContentType(\n    mo: IManagedObjectBinary\n  ): 'image' | 'video' | 'text' | 'json' | 'unsupported' {\n    if (!mo || !mo.hasOwnProperty('c8y_IsBinary')) {\n      // eslint-disable-next-line no-console\n      console.warn('Provided Managed object is not binary');\n      return 'unsupported';\n    }\n\n    if (mo.contentType.startsWith('image/')) {\n      return 'image';\n    } else if (mo.contentType.startsWith('video/')) {\n      return 'video';\n    } else if (mo.contentType.startsWith('text/')) {\n      // @TODO: Implement in future\n      return 'unsupported';\n    } else if (mo.contentType.startsWith('application/json')) {\n      // @TODO: Implement in future\n      return 'unsupported';\n    }\n    return 'unsupported';\n  }\n}\n","@if (contentType() !== 'unsupported') {\n  <div\n    class=\"d-inline-block\"\n    (click)=\"openModal(modalTemplate)\"\n  >\n    <div #customButtonRef>\n      <ng-content select=\"[customButton]\"></ng-content>\n    </div>\n\n    @if (!customButtonRef.children.length) {\n      <button\n        class=\"btn btn-default btn-icon\"\n        [title]=\"'Preview file' | translate\"\n        type=\"button\"\n      >\n        <i c8yIcon=\"search\"></i>\n      </button>\n    }\n  </div>\n}\n\n<ng-template #modalTemplate>\n  <c8y-modal\n    class=\"text-break-word\"\n    [title]=\"mo().name\"\n    [customFooter]=\"false\"\n    (onClose)=\"modalRef.hide()\"\n    (onDismiss)=\"modalRef.hide()\"\n    [labels]=\"{ cancel: '', ok: 'Close' | translate }\"\n  >\n    @if (!dataUrl) {\n      <div class=\"text-center d-block\">\n        <c8y-loading\n          layout=\"application\"\n          [progress]=\"progress.percentage\"\n        ></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\n    @if (dataUrl) {\n      <div id=\"modal-body\">\n        @switch (contentType()) {\n          @case ('image') {\n            <img\n              class=\"fit-w\"\n              alt=\"safeDataUrl\"\n              [src]=\"safeDataUrl\"\n            />\n          }\n          @case ('video') {\n            <video\n              class=\"fit-w\"\n              controls\n              autoplay\n            >\n              <source [src]=\"safeDataUrl\" />\n              {{ 'Your browser does not support the video tag.' | translate }}\n            </video>\n          }\n          @case ('text') {\n            <!--        @TODO: Implement text viewer-->\n            text\n          }\n          @case ('json') {\n            <!--        @TODO: Implement json viewer-->\n            json\n          }\n        }\n      </div>\n    }\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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"}