{"version":3,"file":"c8y-ngx-components-widgets-implementations-image.mjs","sources":["../../widgets/implementations/image/image-widget.model.ts","../../widgets/implementations/image/image-widget.service.ts","../../widgets/implementations/image/image-widget-view/image-widget-view.component.ts","../../widgets/implementations/image/image-widget-view/image-widget-view.component.html","../../widgets/implementations/image/image-widget-config/image-widget-config.component.ts","../../widgets/implementations/image/image-widget-config/image-widget-config.component.html","../../widgets/implementations/image/image-widget.module.ts","../../widgets/implementations/image/c8y-ngx-components-widgets-implementations-image.ts"],"sourcesContent":["export interface ImageWidgetConfig {\n  imageBinaryId: string;\n  styling?: ImageWidgetConfigStyling;\n}\n\nexport interface ImageWidgetConfigStyling {\n  objectFit: string;\n  objectPositionX: string;\n  objectPositionY: string;\n}\n\nexport interface ImageWidgetStyle {\n  [key: string]: string;\n}\n\nexport const defaultObjectFitValue = 'contain';\nexport const defaultObjectPositionValue = 'center';\n","import { Injectable } from '@angular/core';\nimport { IManagedObject } from '@c8y/client';\nimport { InventoryBinaryService } from '@c8y/client';\nimport { IManagedObjectBinary, InventoryService } from '@c8y/client';\nimport { AlertService, FilesService, gettext } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport {\n  defaultObjectPositionValue,\n  ImageWidgetConfig,\n  ImageWidgetStyle\n} from './image-widget.model';\n\n@Injectable({ providedIn: 'root' })\nexport class ImageWidgetService {\n  constructor(\n    private inventory: InventoryService,\n    private fileService: FilesService,\n    private alert: AlertService,\n    private translate: TranslateService,\n    private binary: InventoryBinaryService\n  ) {}\n\n  async getImageDetails(imageBinaryId: string | null): Promise<{ file: File; base64: string }> {\n    if (!imageBinaryId) {\n      return null;\n    }\n\n    try {\n      const { data: imageBinaryMo } = await this.inventory.detail(imageBinaryId);\n      const file = await this.fileService.getFile(imageBinaryMo as IManagedObjectBinary);\n      const base64 = await this.fileService.toBase64(file);\n      return {\n        file,\n        base64: base64 as string\n      };\n    } catch (e) {\n      const text = this.translate.instant(\n        gettext('Unable to retrieve image with id: {{ imageBinaryId }}'),\n        { imageBinaryId }\n      );\n      this.alert.danger(text, e?.data);\n    }\n\n    return null;\n  }\n\n  async uploadFile(\n    file: File,\n    options: {\n      dashboardMoId?: string;\n      isDeviceTypeDashboard?: boolean;\n    } = {}\n  ): Promise<string> {\n    const hash = await this.fileService.getHashSumOfFile(file);\n    const fileDetails = { c8y_SHA256: hash };\n    const globalImage = !options?.dashboardMoId || options?.isDeviceTypeDashboard;\n    const partialBinaryMo: Partial<IManagedObject> = !globalImage\n      ? { ...fileDetails }\n      : { ...fileDetails, c8y_Global: {} };\n    const { data: mo } = await this.binary.create(file, partialBinaryMo);\n    if (options?.dashboardMoId) {\n      await this.inventory.childAdditionsAdd(mo, options?.dashboardMoId);\n    }\n    return mo.id;\n  }\n\n  getStyling(config: ImageWidgetConfig): ImageWidgetStyle | null {\n    if (!config.styling?.objectFit || config.styling?.objectFit === 'full-width') {\n      return null;\n    }\n    return {\n      'object-fit': config.styling.objectFit,\n      'object-position': `${config.styling?.objectPositionX || defaultObjectPositionValue} ${\n        config.styling?.objectPositionY || defaultObjectPositionValue\n      }`\n    };\n  }\n}\n","import { Component, Input, OnChanges, SimpleChanges } from '@angular/core';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { distinctUntilChanged, shareReplay, switchMap, tap } from 'rxjs/operators';\nimport { ImageWidgetConfig, ImageWidgetStyle } from '../image-widget.model';\nimport { ImageWidgetService } from '../image-widget.service';\nimport { EmptyStateComponent, LoadingComponent } from '@c8y/ngx-components';\nimport { AsyncPipe, NgClass, NgIf, NgStyle } from '@angular/common';\n\n@Component({\n  selector: 'c8y-image-widget-view',\n  templateUrl: './image-widget-view.component.html',\n  standalone: true,\n  imports: [NgIf, NgClass, AsyncPipe, NgStyle, LoadingComponent, EmptyStateComponent]\n})\nexport class ImageWidgetViewComponent implements OnChanges {\n  @Input() config: ImageWidgetConfig;\n  imageBinaryId$ = new BehaviorSubject<string>(null);\n  imageDetails$: Observable<{\n    file: File;\n    base64: string;\n  }>;\n  styling: ImageWidgetStyle | null;\n  loading = true;\n\n  constructor(private imageWidget: ImageWidgetService) {\n    this.imageDetails$ = this.imageBinaryId$.pipe(\n      distinctUntilChanged(),\n      tap(() => (this.loading = true)),\n      switchMap(imageBinaryId => this.imageWidget.getImageDetails(imageBinaryId)),\n      tap(() => (this.loading = false)),\n      shareReplay(1)\n    );\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    if (changes.config) {\n      const value = changes.config.currentValue as ImageWidgetConfig;\n      this.imageBinaryId$.next(value.imageBinaryId);\n      this.setStyling(value);\n    }\n  }\n\n  private setStyling(config: ImageWidgetConfig): void {\n    this.styling = this.imageWidget.getStyling(config);\n  }\n}\n","<ng-container *ngIf=\"imageDetails$ | async as details; else empty\">\n  <img\n    [src]=\"details.base64\"\n    [title]=\"details.file.name\"\n    [ngClass]=\"styling ? 'fit-h fit-w' : 'img-responsive'\"\n    [ngStyle]=\"styling\"\n  />\n</ng-container>\n\n<ng-template #empty>\n  <div class=\"d-flex fit-h fit-w j-c-center a-i-center\" *ngIf=\"!loading\">\n    <c8y-ui-empty-state\n      class=\"fit-w\"\n      [icon]=\"'no-image'\"\n      [title]=\"'No image to display.' | translate\"\n      [subtitle]=\"'Upload an image.' | translate\"\n      [horizontal]=\"true\"\n    ></c8y-ui-empty-state>\n  </div>\n</ng-template>\n<div class=\"d-flex fit-h fit-w j-c-center a-i-center\" *ngIf=\"loading\">\n  <c8y-loading></c8y-loading>\n</div>\n","import { Component, Input, OnDestroy, OnInit, Optional } from '@angular/core';\nimport { WidgetConfigComponent } from '@c8y/ngx-components/context-dashboard';\nimport {\n  C8yValidators,\n  OnBeforeSave,\n  FilesService,\n  AlertService,\n  gettext,\n  FormGroupComponent,\n  MessagesComponent,\n  MessageDirective,\n  C8yTranslatePipe,\n  DropAreaComponent\n} from '@c8y/ngx-components';\nimport { get } from 'lodash-es';\nimport {\n  defaultObjectFitValue,\n  defaultObjectPositionValue,\n  ImageWidgetConfig,\n  ImageWidgetConfigStyling,\n  ImageWidgetStyle\n} from '../image-widget.model';\nimport {\n  ControlContainer,\n  FormBuilder,\n  FormGroup,\n  NgForm,\n  ReactiveFormsModule,\n  Validators\n} from '@angular/forms';\nimport { BehaviorSubject, Observable, merge, Subject } from 'rxjs';\nimport {\n  distinctUntilChanged,\n  filter,\n  map,\n  shareReplay,\n  switchMap,\n  takeUntil,\n  tap\n} from 'rxjs/operators';\nimport { ImageWidgetService } from '../image-widget.service';\nimport { AsyncPipe, NgClass, NgForOf, NgIf, NgStyle } from '@angular/common';\n\n@Component({\n  selector: 'c8y-image-widget-config',\n  templateUrl: './image-widget-config.component.html',\n  viewProviders: [{ provide: ControlContainer, useExisting: NgForm }],\n  standalone: true,\n  imports: [\n    ReactiveFormsModule,\n    FormGroupComponent,\n    MessagesComponent,\n    MessageDirective,\n    C8yTranslatePipe,\n    AsyncPipe,\n    NgIf,\n    NgStyle,\n    NgClass,\n    NgForOf,\n    DropAreaComponent\n  ]\n})\nexport class ImageWidgetConfigComponent implements OnInit, OnDestroy, OnBeforeSave {\n  @Input() config: ImageWidgetConfig;\n  imageBinaryId$ = new BehaviorSubject<string>(null);\n  imageSrc$: Observable<string>;\n  loading = false;\n  formGroup: FormGroup;\n  fileFromConfig: File;\n  styling: ImageWidgetStyle | null;\n  destroyed$ = new Subject<void>();\n  objectFitOptions = [\n    {\n      label: gettext('Contain`verb, image fitting option`'),\n      value: 'contain',\n      description: gettext(\n        'The image is entirely displayed within the widget while preserving the aspect ratio.'\n      )\n    },\n    {\n      label: gettext('Cover`verb, image fitting option`'),\n      value: 'cover',\n      description: gettext(\n        'The image is resized to fill the widget while preserving the aspect ratio. Overflowing areas are clipped.'\n      )\n    },\n    {\n      label: gettext('Fill`verb, image fitting option`'),\n      value: 'fill',\n      description: gettext(\n        'The image is stretched to fill the widget, overriding the aspect-ratio.'\n      )\n    },\n    {\n      label: gettext('Full width`image fitting option`'),\n      value: 'full-width',\n      description: gettext(\n        `The image is resized to fit the widget's width while preserving the aspect ratio. Overflowing area is scrollable.`\n      )\n    }\n  ];\n\n  constructor(\n    private formBuilder: FormBuilder,\n    private form: NgForm,\n    private fileService: FilesService,\n    private alert: AlertService,\n    private imageWidget: ImageWidgetService,\n    @Optional() private widgetConfig: WidgetConfigComponent\n  ) {}\n\n  async onBeforeSave(config?: ImageWidgetConfig): Promise<boolean> {\n    if (this.formGroup.invalid) {\n      return false;\n    }\n\n    const fileFromForm = this.getFileFromFormValue(this.formGroup.value);\n    if (fileFromForm && fileFromForm !== this.fileFromConfig) {\n      try {\n        const imageBinaryId = await this.imageWidget.uploadFile(fileFromForm, {\n          dashboardMoId: this.getDashboardMoId(),\n          isDeviceTypeDashboard: this.widgetConfig?.isDeviceTypeDashboard\n        });\n        Object.assign(config, { imageBinaryId });\n      } catch (e) {\n        this.alert.danger(gettext('Unable to upload image.'), e?.data);\n        return false;\n      }\n    }\n    const styling: ImageWidgetConfigStyling = this.formGroup.value.styling;\n    Object.assign(config, { styling });\n\n    return true;\n  }\n\n  ngOnInit() {\n    this.initForm();\n    const imageFromConfig = this.imageBinaryId$.pipe(\n      filter(id => !!id),\n      distinctUntilChanged(),\n      tap(() => (this.loading = true)),\n      switchMap(imageBinaryId => this.imageWidget.getImageDetails(imageBinaryId)),\n      tap(details => {\n        this.loading = false;\n        this.fileFromConfig = details.file;\n        if (details) {\n          this.formGroup.patchValue({ images: [{ file: details.file, name: details.file.name }] });\n        }\n      }),\n      map(details => details?.base64),\n      shareReplay(1)\n    );\n    const selectedFile = this.formGroup.valueChanges.pipe(\n      map(value => this.getFileFromFormValue(value)),\n      distinctUntilChanged(),\n      switchMap(file => (file ? this.fileService.toBase64(file) : Promise.resolve('')))\n    );\n    this.imageSrc$ = merge(imageFromConfig, selectedFile).pipe(\n      map(base64 => (base64 ? (base64 as string) : ''))\n    );\n    this.imageBinaryId$.next(this.config?.imageBinaryId);\n  }\n\n  ngOnDestroy(): void {\n    this.destroyed$.next();\n    this.destroyed$.complete();\n  }\n\n  private getDashboardMoId(): string | null {\n    return get(this.widgetConfig, 'mo.id', null);\n  }\n\n  private async initForm(): Promise<void> {\n    const stylingFormGroup = this.formBuilder.group({\n      objectFit: [\n        // fallback to 'full-width' for old legacy widgets, newly created widgets should use defaultObjectFitValue\n        this.config.imageBinaryId && !this.config.styling ? 'full-width' : defaultObjectFitValue,\n        [Validators.required]\n      ],\n      objectPositionX: [defaultObjectPositionValue, [Validators.required]],\n      objectPositionY: [defaultObjectPositionValue, [Validators.required]]\n    });\n    this.formGroup = this.formBuilder.group({\n      images: [\n        null,\n        [\n          Validators.required,\n          Validators.minLength(1),\n          Validators.maxLength(1),\n          C8yValidators.filesValidator({ maximumFileSizeInKb: 1000, typePrefix: 'image/' })\n        ]\n      ],\n      styling: stylingFormGroup\n    });\n    this.form.form.addControl('config', this.formGroup);\n    this.formGroup.patchValue(this.config);\n    this.formGroup.valueChanges\n      .pipe(takeUntil(this.destroyed$))\n      .subscribe(changes => this.setStyling(changes));\n  }\n\n  private getFileFromFormValue(formValue: any): File | null {\n    const images: any[] = formValue?.images || [];\n    return images[0]?.file || null;\n  }\n\n  private setStyling(config: ImageWidgetConfig): void {\n    this.styling = this.imageWidget.getStyling(config);\n  }\n}\n","<div class=\"p-l-24 p-r-24\">\n  <div [formGroup]=\"formGroup\" class=\"row p-t-8\">\n    <div class=\"col-md-12\">\n      <c8y-form-group>\n        <label>{{ 'Image' | translate }}</label>\n        <c8y-drop-area\n          formControlName=\"images\"\n          class=\"drop-area-sm\"\n          [icon]=\"'upload'\"\n          [accept]=\"'image'\"\n          [maxAllowedFiles]=\"1\"\n        ></c8y-drop-area>\n        <c8y-messages>\n          <c8y-message\n            name=\"maxFileSizeReached\"\n            [text]=\"\n              'The maximum image size is {{ maxFileSize }} kB. The selected image has a size of {{ actualFileSize }} kB.'\n                | translate\n            \"\n          ></c8y-message>\n          <c8y-message\n            name=\"wrongFileType\"\n            [text]=\"'Wrong file type, select an image.' | translate\"\n          ></c8y-message>\n          <c8y-message name=\"maxlength\" [text]=\"'Only select one image.' | translate\"></c8y-message>\n          <c8y-message name=\"required\" [text]=\"'An image is required.' | translate\"></c8y-message>\n          <c8y-message name=\"minlength\" [text]=\"'An image is required.' | translate\"></c8y-message>\n        </c8y-messages>\n      </c8y-form-group>\n    </div>\n    <ng-container *ngIf=\"imageSrc$ | async as src\">\n      <div class=\"col-md-6\">\n        <div class=\"legend form-block\">\n          {{ 'Size and alignment' | translate }}\n        </div>\n        <div [formGroupName]=\"'styling'\">\n          <c8y-form-group>\n            <label>\n              {{ 'Image display' | translate }}\n            </label>\n            <ul class=\"list-group separator-top-bottom\">\n              <li\n                class=\"list-group-item d-flex a-i-center p-l-0\"\n                *ngFor=\"let objectFitOption of objectFitOptions; let i = index\"\n              >\n                <label class=\"c8y-radio\">\n                  <input\n                    type=\"radio\"\n                    [id]=\"'groupradiocontentclass' + i\"\n                    formControlName=\"objectFit\"\n                    [value]=\"objectFitOption.value\"\n                  />\n                  <span></span>\n                  <span class=\"l-h-1\">\n                    {{ objectFitOption.label | translate }}\n                    <br />\n                    <small class=\"text-muted\">\n                      {{ objectFitOption.description | translate }}\n                    </small>\n                  </span>\n                </label>\n              </li>\n            </ul>\n          </c8y-form-group>\n          <div class=\"row\">\n            <div class=\"col-md-6\">\n              <c8y-form-group>\n                <label>{{ 'Horizontal alignment' | translate }}</label>\n                <div class=\"c8y-select-wrapper\">\n                  <select class=\"form-control\" formControlName=\"objectPositionX\">\n                    <option [ngValue]=\"'left'\">\n                      {{ 'left`horizontal alignment`' | translate }}\n                    </option>\n                    <option [ngValue]=\"'center'\">\n                      {{ 'center`horizontal alignment`' | translate }}\n                    </option>\n                    <option [ngValue]=\"'right'\">\n                      {{ 'right`horizontal alignment`' | translate }}\n                    </option>\n                  </select>\n                </div>\n              </c8y-form-group>\n            </div>\n            <div class=\"col-md-6\">\n              <c8y-form-group>\n                <label>{{ 'Vertical alignment' | translate }}</label>\n                <div class=\"c8y-select-wrapper\">\n                  <select class=\"form-control\" formControlName=\"objectPositionY\">\n                    <option [ngValue]=\"'top'\">\n                      {{ 'top`vertical alignment`' | translate }}\n                    </option>\n                    <option [ngValue]=\"'center'\">\n                      {{ 'center`vertical alignment`' | translate }}\n                    </option>\n                    <option [ngValue]=\"'bottom'\">\n                      {{ 'bottom`vertical alignment`' | translate }}\n                    </option>\n                  </select>\n                </div>\n              </c8y-form-group>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class=\"col-md-6\">\n        <div class=\"legend form-block\">{{ 'Preview' | translate }}</div>\n        <div class=\"form-group\">\n          <div\n            class=\"border-top border-right border-bottom border-left inner-scroll\"\n            style=\"height: 300px\"\n          >\n            <img\n              [src]=\"src\"\n              [ngClass]=\"styling ? 'fit-h fit-w' : 'img-responsive'\"\n              [ngStyle]=\"styling\"\n            />\n          </div>\n        </div>\n      </div>\n    </ng-container>\n    <div class=\"col-md-12 d-flex j-c-center\" *ngIf=\"loading\">\n      <c8y-loading></c8y-loading>\n    </div>\n  </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { ImageWidgetViewComponent } from './image-widget-view/image-widget-view.component';\nimport { ImageWidgetConfigComponent } from './image-widget-config/image-widget-config.component';\n\n/**\n * @deprecated\n */\n@NgModule({\n  imports: [ImageWidgetViewComponent, ImageWidgetConfigComponent]\n})\nexport class ImageWidgetModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1.ImageWidgetService","i1","i3.ImageWidgetService"],"mappings":"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"}