{"version":3,"file":"c8y-ngx-components-repository-firmware.mjs","sources":["../../repository/firmware/device-tab/firmware-device-tab.component.ts","../../repository/firmware/device-tab/firmware-device-tab.component.html","../../repository/firmware/device-tab/firmware-device-tab.guard.ts","../../repository/firmware/device-tab/firmware-repository-device-tab.module.ts","../../repository/firmware/list/add-firmware-patch-modal.component.ts","../../repository/firmware/list/add-firmware-patch-modal.component.html","../../repository/firmware/list/add-firmware-modal.component.ts","../../repository/firmware/list/add-firmware-modal.component.html","../../repository/firmware/list/firmware-details.component.ts","../../repository/firmware/list/firmware-details.component.html","../../repository/firmware/list/firmware-list.component.ts","../../repository/firmware/list/firmware-list.component.html","../../repository/firmware/list/firmware-repository-navigation-factory.ts","../../repository/firmware/list/firmware-repository-list.module.ts","../../repository/firmware/firmware-repository.module.ts","../../repository/firmware/c8y-ngx-components-repository-firmware.ts"],"sourcesContent":["import { Component } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { IManagedObject, InventoryService, IOperation, OperationStatus } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  GainsightService,\n  ModalSelectionMode,\n  C8yTranslateDirective,\n  IconDirective,\n  ListGroupComponent,\n  ListItemComponent,\n  ListItemIconComponent,\n  ListItemBodyComponent,\n  ProductExperienceDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport {\n  DeviceFirmware,\n  FilterCriteria,\n  FirmwareBinary,\n  PRODUCT_EXPERIENCE_REPOSITORY_SHARED,\n  RepositorySelectModalComponent,\n  RepositoryService,\n  RepositoryType\n} from '@c8y/ngx-components/repository/shared';\nimport { assign, get, isEmpty } from 'lodash-es';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { BehaviorSubject, combineLatest, from, Observable, of } from 'rxjs';\nimport { distinctUntilChanged, filter, map, shareReplay, switchMap, take } from 'rxjs/operators';\nimport { NgIf, AsyncPipe } from '@angular/common';\nimport { OperationDetailsComponent } from '@c8y/ngx-components/operations/operation-details';\n\n@Component({\n  selector: 'c8y-firmware-device-tab',\n  templateUrl: 'firmware-device-tab.component.html',\n  imports: [\n    C8yTranslateDirective,\n    NgIf,\n    IconDirective,\n    ListGroupComponent,\n    ListItemComponent,\n    ListItemIconComponent,\n    ListItemBodyComponent,\n    ProductExperienceDirective,\n    OperationDetailsComponent,\n    AsyncPipe,\n    C8yTranslatePipe\n  ]\n})\nexport class FirmwareDeviceTabComponent {\n  PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_REPOSITORY_SHARED;\n  isEmpty = isEmpty;\n  reloading = false;\n  device$: BehaviorSubject<IManagedObject> = new BehaviorSubject(\n    this.route.parent.snapshot.data.contextData\n  );\n  deviceFirmwareFragment$: Observable<DeviceFirmware> = this.device$.pipe(\n    map(device => device.c8y_Firmware)\n  );\n  firmwareBinary$: Observable<IManagedObject> = this.deviceFirmwareFragment$.pipe(\n    filter(deviceFirmwareFragment => !isEmpty(deviceFirmwareFragment)),\n    switchMap(deviceFirmwareFragment =>\n      from(\n        this.repository.getRepositoryBinaryMoByVersion(\n          deviceFirmwareFragment,\n          RepositoryType.FIRMWARE\n        )\n      )\n    ),\n    shareReplay(1)\n  );\n  repositoryEntry$: Observable<IManagedObject> = this.firmwareBinary$.pipe(\n    switchMap(mo => this.repository.getRepositoryEntryMO$(mo)),\n    shareReplay(1)\n  );\n  patches$: Observable<IManagedObject[]> = combineLatest(\n    this.firmwareBinary$,\n    this.repositoryEntry$\n  ).pipe(\n    switchMap(([firmwareBinary, repositoryEntry]) => {\n      if (repositoryEntry && firmwareBinary) {\n        const version: string = this.repository.getBaseVersionFromMO(\n          firmwareBinary as FirmwareBinary\n        );\n\n        return from(this.repository.listPatchVersions(repositoryEntry, version)).pipe(\n          map(({ data }) => data)\n        );\n      } else {\n        return of([]);\n      }\n    }),\n    shareReplay(1)\n  );\n  supportsFirmwareOperations$: Observable<boolean> = this.device$.pipe(\n    map(\n      (device: IManagedObject) =>\n        get(device, 'c8y_SupportedOperations', []).indexOf('c8y_Firmware') > -1\n    )\n  );\n  changesOperation$ = new BehaviorSubject<IOperation>(null);\n  changesInProgress$: Observable<boolean> = this.changesOperation$.pipe(\n    map(operation => this.isInProgress(operation))\n  );\n\n  constructor(\n    private route: ActivatedRoute,\n    private repository: RepositoryService,\n    private inventory: InventoryService,\n    private bsModal: BsModalService,\n    private gainsightService: GainsightService\n  ) {}\n\n  async ngOnInit() {\n    // TODO check route snapshot, why is not refreshing device.\n    // Scenario: missing deviceFirmwareFragment => install new version => switch tabs.\n    // Expected: device should be set.\n    await this.loadDevice();\n    await this.loadOperation();\n  }\n\n  installFirmware() {\n    const initialState: Partial<RepositorySelectModalComponent> & {\n      repositoryEntriesWithVersionsFn$: (modal: any) => Observable<IManagedObject[]>;\n    } = {\n      repositoryEntriesWithVersions$: of([]),\n      repositoryEntriesWithVersionsFn$: modal =>\n        this.getRepositoryEntriesWithVersions$(modal.content.searchTerm),\n      repositoryType: RepositoryType.FIRMWARE,\n      title: gettext('Install firmware'),\n      subTitle: gettext('Available firmwares matching the device type'),\n      icon: 'c8y-firmware',\n      mode: ModalSelectionMode.SINGLE,\n      labels: { ok: gettext('Install') },\n      disableSelected: false\n    };\n\n    this.deviceFirmwareFragment$\n      .pipe(\n        take(1),\n        switchMap(deviceFirmwareFragment => {\n          if (deviceFirmwareFragment) {\n            const { name, version } = deviceFirmwareFragment;\n            const selected = [{ name, version }];\n            assign(initialState, { selected });\n          }\n\n          const modal = this.bsModal.show(RepositorySelectModalComponent, {\n            ignoreBackdropClick: true,\n            initialState\n          });\n\n          if (initialState.repositoryEntriesWithVersionsFn$) {\n            modal.content.repositoryEntriesWithVersions$ =\n              initialState.repositoryEntriesWithVersionsFn$(modal);\n          }\n\n          modal.content.load.next();\n\n          return modal.content.resultEmitter;\n        })\n      )\n      .subscribe(([selectedFirmware]) => {\n        this.handleOperation(selectedFirmware);\n      });\n  }\n\n  getRepositoryEntriesWithVersions$(searchTerm$: BehaviorSubject<FilterCriteria>) {\n    return searchTerm$.pipe(\n      distinctUntilChanged(),\n      switchMap(searchTerm =>\n        this.repository.listRepositoryEntries(RepositoryType.FIRMWARE, {\n          query: this.repository.getDeviceTypeQuery(RepositoryType.FIRMWARE, this.device$.value),\n          partialName: searchTerm?.name,\n          params: { pageSize: 100 }\n        })\n      ),\n      map(({ data }) => data),\n      map(mos => this.getAndAssignRepositoryBinaries(mos)),\n      shareReplay(1)\n    );\n  }\n\n  getAndAssignRepositoryBinaries(mos: IManagedObject[]) {\n    mos.forEach(mo => {\n      mo.versions = this.repository.listBaseVersions(mo);\n    });\n    return mos;\n  }\n\n  addPatch() {\n    const initialState: Partial<RepositorySelectModalComponent> & {\n      repositoryEntriesWithVersions$: Observable<IManagedObject[]>;\n    } = {\n      repositoryType: RepositoryType.FIRMWARE,\n      repositoryEntriesWithVersions$: this.getRepositoryEntryWithPatches$(),\n      title: gettext('Install firmware'),\n      subTitle: gettext('Available firmwares matching the device type'),\n      icon: 'c8y-firmware',\n      mode: ModalSelectionMode.SINGLE,\n      labels: { ok: gettext('Install') },\n      disableSelected: false\n    };\n\n    this.deviceFirmwareFragment$\n      .pipe(\n        take(1),\n        switchMap(deviceFirmwareFragment => {\n          if (deviceFirmwareFragment) {\n            const { name, version } = deviceFirmwareFragment;\n            const selected = [{ name, version }];\n            assign(initialState, { selected });\n          }\n\n          const modal = this.bsModal.show(RepositorySelectModalComponent, {\n            ignoreBackdropClick: true,\n            initialState\n          });\n          modal.content.load.next();\n\n          return modal.content.resultEmitter;\n        })\n      )\n      .subscribe(([selectedOption]) => {\n        this.handleOperation(selectedOption);\n      });\n  }\n\n  getRepositoryEntryWithPatches$() {\n    return combineLatest(this.repositoryEntry$, this.patches$).pipe(\n      map(([repositoryEntry, patches]) => {\n        return [{ ...repositoryEntry, versions: patches }];\n      })\n    );\n  }\n\n  async loadDevice() {\n    this.reloading = true;\n    const deviceId = this.device$.value.id;\n    const device = (await this.inventory.detail(deviceId, { withChildren: false })).data;\n    this.device$.next(device);\n    this.reloading = false;\n  }\n\n  private async handleOperation(selectedFirmware) {\n    const operation = await this.repository.createFirmwareUpdateOperation(\n      this.device$.value,\n      selectedFirmware\n    );\n    this.trackOperation(operation);\n    this.gainsightService.triggerEvent(\n      PRODUCT_EXPERIENCE_REPOSITORY_SHARED.FIRMWARE.EVENTS.DEVICE_TAB,\n      {\n        component: PRODUCT_EXPERIENCE_REPOSITORY_SHARED.FIRMWARE.COMPONENTS.FIRMWARE_DEVICE_TAB,\n        result:\n          PRODUCT_EXPERIENCE_REPOSITORY_SHARED.FIRMWARE.RESULTS.CREATE_FIRMWARE_UPDATE_OPERATION\n      }\n    );\n  }\n\n  private async loadOperation() {\n    const deviceId = this.device$.value.id;\n    const operation = await this.repository.getLastFirmwareUpdateOperation(deviceId);\n    this.trackOperation(operation);\n  }\n\n  private trackOperation(operation: IOperation) {\n    if ([OperationStatus.SUCCESSFUL, OperationStatus.FAILED].includes(operation?.status)) {\n      this.changesOperation$.next(undefined);\n    } else this.changesOperation$.next(operation);\n\n    if (this.isInProgress(operation)) {\n      this.repository.observeOperation(operation).subscribe(\n        operationUpdate => {\n          this.changesOperation$.next(operationUpdate);\n          if (operationUpdate.status === OperationStatus.SUCCESSFUL) {\n            this.loadDevice();\n          }\n        },\n        operationUpdate => {\n          this.changesOperation$.next(operationUpdate);\n        }\n      );\n    }\n  }\n\n  private isInProgress(operation: IOperation) {\n    return (\n      operation && [OperationStatus.PENDING, OperationStatus.EXECUTING].includes(operation.status)\n    );\n  }\n}\n","<div class=\"row\">\n  <div class=\"col-lg-12 col-lg-max\">\n    <div class=\"card split-view--7-5 m-b-0\">\n      <div class=\"d-flex d-col flex-grow split-view__list\">\n        <div class=\"card-header separator\">\n          <div\n            class=\"card-title\"\n            translate\n          >\n            Current firmware\n          </div>\n        </div>\n        <div class=\"inner-scroll\">\n          <div class=\"card-block p-t-0 p-b-0\">\n            <!-- EMPTY STATE -->\n            <ng-container *ngIf=\"isEmpty(deviceFirmwareFragment$ | async); else firmwareBlock\">\n              <div class=\"c8y-empty-state text-center\">\n                <div\n                  class=\"h1 c8y-icon-duocolor\"\n                  c8yIcon=\"c8y-firmware\"\n                ></div>\n                <p>\n                  <strong translate>No firmware installed.</strong>\n                  <br />\n                  <small translate>Click below to install firmware into this device.</small>\n                </p>\n              </div>\n            </ng-container>\n\n            <!-- FIRMWARE -->\n            <ng-template #firmwareBlock>\n              <c8y-list-group class=\"no-border-last\">\n                <c8y-li>\n                  <c8y-li-icon>\n                    <i c8yIcon=\"c8y-firmware\"></i>\n                  </c8y-li-icon>\n\n                  <c8y-li-body *ngIf=\"deviceFirmwareFragment$ | async as deviceFirmwareFragment\">\n                    <!-- Firmware title -->\n                    <p class=\"text-medium\">\n                      {{ deviceFirmwareFragment.name }}\n                    </p>\n                    <!-- Firmware description -->\n                    <div *ngIf=\"repositoryEntry$ | async as repositoryEntry\">\n                      <span\n                        class=\"text-label-small m-r-4\"\n                        translate\n                      >\n                        Description\n                      </span>\n                      <span>\n                        {{ repositoryEntry.description }}\n                      </span>\n                    </div>\n\n                    <!-- BASE/PATCH VERSION -->\n                    <div class=\"d-flex a-i-baseline\">\n                      <p\n                        class=\"text-label-small m-r-4\"\n                        translate\n                      >\n                        Version\n                      </p>\n                      <p *ngIf=\"deviceFirmwareFragment.version; else versionNotSpecified\">\n                        {{ deviceFirmwareFragment.version }}\n                      </p>\n                      <ng-template #versionNotSpecified>\n                        <p>\n                          <em class=\"text-muted\">({{ 'not specified`version`' | translate }})</em>\n                        </p>\n                      </ng-template>\n                    </div>\n\n                    <!-- ADD PATCH -->\n                    <button\n                      class=\"btn btn-xs btn-primary\"\n                      title=\"{{ 'Patches available' | translate }}\"\n                      *ngIf=\"\n                        (supportsFirmwareOperations$ | async) && (this.patches$ | async)?.length > 0\n                      \"\n                      (click)=\"addPatch()\"\n                      [disabled]=\"changesInProgress$ | async\"\n                      c8yProductExperience\n                      [actionName]=\"PRODUCT_EXPERIENCE.FIRMWARE.EVENTS.DEVICE_TAB\"\n                      [actionData]=\"{\n                        component: PRODUCT_EXPERIENCE.FIRMWARE.COMPONENTS.FIRMWARE_DEVICE_TAB,\n                        action:\n                          PRODUCT_EXPERIENCE.FIRMWARE.ACTIONS.OPEN_INSTALL_FIRMWARE_PATCH_DIALOG\n                      }\"\n                    >\n                      {{ 'Patches available' | translate }}\n                    </button>\n                  </c8y-li-body>\n                </c8y-li>\n              </c8y-list-group>\n            </ng-template>\n          </div>\n        </div>\n        <div\n          class=\"card-footer separator-top\"\n          *ngIf=\"supportsFirmwareOperations$ | async\"\n        >\n          <!-- INSTALL FIRMWARE -->\n          <button\n            class=\"btn btn-primary\"\n            title=\"{{ 'Install firmware' | translate }}\"\n            *ngIf=\"isEmpty(deviceFirmwareFragment$ | async)\"\n            (click)=\"installFirmware()\"\n            c8yProductExperience\n            [actionName]=\"PRODUCT_EXPERIENCE.FIRMWARE.EVENTS.DEVICE_TAB\"\n            [actionData]=\"{\n              component: PRODUCT_EXPERIENCE.FIRMWARE.COMPONENTS.FIRMWARE_DEVICE_TAB,\n              action: PRODUCT_EXPERIENCE.FIRMWARE.ACTIONS.OPEN_INSTALL_FIRMWARE_DIALOG\n            }\"\n          >\n            {{ 'Install firmware' | translate }}\n          </button>\n\n          <!-- REPLACE FIRMWARE -->\n          <button\n            class=\"btn btn-primary\"\n            title=\"{{ 'Replace firmware' | translate }}\"\n            *ngIf=\"!isEmpty(deviceFirmwareFragment$ | async)\"\n            (click)=\"installFirmware()\"\n            [disabled]=\"changesInProgress$ | async\"\n            c8yProductExperience\n            [actionName]=\"PRODUCT_EXPERIENCE.FIRMWARE.EVENTS.DEVICE_TAB\"\n            [actionData]=\"{\n              component: PRODUCT_EXPERIENCE.FIRMWARE.COMPONENTS.FIRMWARE_DEVICE_TAB,\n              action: PRODUCT_EXPERIENCE.FIRMWARE.ACTIONS.OPEN_REPLACE_FIRMWARE_DIALOG\n            }\"\n          >\n            {{ 'Replace firmware' | translate }}\n          </button>\n        </div>\n      </div>\n      <div class=\"inner-scroll d-flex d-col bg-level-1 split-view__detail\">\n        <div class=\"card-header separator large-padding sticky-top\">\n          <div\n            class=\"card-title\"\n            translate\n          >\n            Firmware changes\n          </div>\n        </div>\n        <div class=\"flex-grow\">\n          <fieldset\n            class=\"card-block large-padding bg-level-2 p-0\"\n            id=\"operation-block\"\n            *ngIf=\"changesOperation$ | async\"\n          >\n            <c8y-operation-details [operation]=\"changesOperation$ | async\"></c8y-operation-details>\n          </fieldset>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n","import { Injectable } from '@angular/core';\n\nimport { get, has, indexOf } from 'lodash-es';\n\nconst FIRMWARE_FRAGMENT = 'c8y_Firmware';\nconst SUPPORTED_OPERATIONS_FRAGMENT = 'c8y_SupportedOperations';\n\n@Injectable()\nexport class FirmwareDeviceTabGuard {\n  canActivate(route) {\n    const contextData = get(route, 'data.contextData') || get(route, 'parent.data.contextData');\n    const supportedOperations = get(contextData, SUPPORTED_OPERATIONS_FRAGMENT);\n    return (\n      (!!supportedOperations ? indexOf(supportedOperations, FIRMWARE_FRAGMENT) >= 0 : false) ||\n      has(contextData, 'c8y_Firmware')\n    );\n  }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { FirmwareDeviceTabComponent } from './firmware-device-tab.component';\nimport { FirmwareDeviceTabGuard } from './firmware-device-tab.guard';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { hookRoute, ViewContext } from '@c8y/ngx-components';\nimport { SharedRepositoryModule } from '@c8y/ngx-components/repository/shared';\nimport { OperationDetailsModule } from '@c8y/ngx-components/operations/operation-details';\n\n@NgModule({\n  imports: [SharedRepositoryModule, OperationDetailsModule, FirmwareDeviceTabComponent]\n})\nexport class FirmwareRepositoryDeviceTabModule {\n  static forRoot(): ModuleWithProviders<FirmwareRepositoryDeviceTabModule> {\n    return {\n      ngModule: FirmwareRepositoryDeviceTabModule,\n      providers: [\n        FirmwareDeviceTabGuard,\n        hookRoute({\n          context: ViewContext.Device,\n          path: 'firmware',\n          component: FirmwareDeviceTabComponent,\n          label: gettext('Firmware'),\n          icon: 'c8y-firmware',\n          priority: 500,\n          canActivate: [FirmwareDeviceTabGuard]\n        })\n      ]\n    };\n  }\n}\n","import { Component, EventEmitter, Output, ViewChild } from '@angular/core';\nimport { NgForm, FormsModule } from '@angular/forms';\nimport { IManagedObject, IResultList } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  AlertService,\n  PickedFiles,\n  IconDirective,\n  C8yTranslateDirective,\n  FormGroupComponent,\n  TypeaheadComponent,\n  ForOfDirective,\n  ListItemComponent,\n  HighlightComponent,\n  MessagesComponent,\n  MessageDirective,\n  RequiredInputPlaceholderDirective,\n  FilePickerComponent,\n  ProductExperienceDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport {\n  ModalModel,\n  PRODUCT_EXPERIENCE_REPOSITORY_SHARED,\n  RepositoryCategory,\n  RepositoryService,\n  RepositoryType\n} from '@c8y/ngx-components/repository/shared';\nimport { isUndefined } from 'lodash-es';\nimport { BsDropdownDirective } from 'ngx-bootstrap/dropdown';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { BehaviorSubject, from, merge, Observable, of, pipe } from 'rxjs';\nimport {\n  debounceTime,\n  distinctUntilChanged,\n  map,\n  shareReplay,\n  switchMap,\n  tap\n} from 'rxjs/operators';\nimport { NgClass, AsyncPipe } from '@angular/common';\n\n@Component({\n  selector: 'c8y-add-firmware-patch-modal.component',\n  templateUrl: 'add-firmware-patch-modal.component.html',\n  imports: [\n    IconDirective,\n    C8yTranslateDirective,\n    FormsModule,\n    FormGroupComponent,\n    TypeaheadComponent,\n    ForOfDirective,\n    ListItemComponent,\n    HighlightComponent,\n    MessagesComponent,\n    MessageDirective,\n    RequiredInputPlaceholderDirective,\n    FilePickerComponent,\n    ProductExperienceDirective,\n    NgClass,\n    AsyncPipe,\n    C8yTranslatePipe\n  ]\n})\nexport class AddFirmwarePatchModalComponent {\n  PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_REPOSITORY_SHARED;\n  @Output() saved: EventEmitter<RepositoryCategory> = new EventEmitter<RepositoryCategory>();\n\n  @ViewChild('dropdown', { static: false }) dropdown: BsDropdownDirective;\n  @ViewChild('firmwarePatchForm', { static: false }) form: NgForm;\n  textForFirmwareUrlPopover: string =\n    gettext(`Path for binaries can vary depending on device agent implementation, for example:\n    /firmware/binaries/firmware1.bin\n    https://firmware/binary/123\n    ftp://firmware/binary/123.tar.gz\n  `);\n\n  model: ModalModel = {\n    selected: undefined,\n    dependency: null,\n    patchVersion: undefined,\n    binary: {\n      file: undefined,\n      url: undefined\n    }\n  };\n\n  firmwareInput$ = new BehaviorSubject<string>('');\n  firmwares$: Observable<IResultList<IManagedObject>> = this.firmwareInput$.pipe(\n    debounceTime(300),\n    distinctUntilChanged(),\n    switchMap(searchStr =>\n      from(\n        this.repository.listRepositoryEntries(RepositoryType.FIRMWARE, {\n          partialName: searchStr,\n          skipLegacy: true\n        })\n      )\n    ),\n    shareReplay(1)\n  );\n  firmwareSelected$ = new BehaviorSubject<Partial<RepositoryCategory>>(null);\n  patchDependencyInput$ = new BehaviorSubject<string>('');\n\n  saving = false;\n  firmwarePreselected = false;\n  baseVersions$: Observable<IResultList<IManagedObject>> = merge(\n    this.firmwareInput$.pipe(\n      tap(() => {\n        this.model.dependency = null;\n        if (this.form) {\n          this.form.form.get('patchDependency').reset();\n        }\n      }),\n      switchMap(() => of(null))\n    ),\n    this.firmwareSelected$\n  ).pipe(\n    switchMap(selectedFirmware =>\n      selectedFirmware ? this.repository.listBaseVersions(selectedFirmware) : of(null)\n    ),\n    shareReplay(1)\n  );\n  baseVersionsFilterPipe = pipe(\n    switchMap((data: []) =>\n      this.patchDependencyInput$.pipe(\n        map(partialVersion =>\n          data.filter((mo: any) => {\n            const version = mo.c8y_Firmware.version?.toLowerCase();\n            return (\n              partialVersion.length === 0 || version?.indexOf(partialVersion.toLowerCase()) > -1\n            );\n          })\n        )\n      )\n    )\n  );\n\n  constructor(\n    private modal: BsModalRef,\n    private repository: RepositoryService,\n    private alert: AlertService\n  ) {}\n\n  async ngOnInit() {\n    this.setInitialState();\n  }\n\n  setInitialState() {\n    if (this.model.selected) {\n      this.firmwarePreselected = true;\n      this.firmwareSelected$.next(this.model.selected);\n    }\n  }\n\n  async save() {\n    this.saving = true;\n    this.repository\n      .create(this.model, RepositoryType.FIRMWARE)\n      .then(savedFirmware => {\n        this.successMsg();\n        this.saving = false;\n        this.saved.next(savedFirmware);\n        this.cancel();\n      })\n      .catch(e => {\n        this.saving = false;\n        this.saved.error(e);\n        this.cancel();\n      });\n  }\n\n  successMsg() {\n    const msg = gettext('Firmware patch added.');\n    this.alert.success(msg);\n  }\n\n  cancel() {\n    this.modal.hide();\n    this.saved.complete();\n  }\n\n  onFile(dropped: PickedFiles) {\n    if (!isUndefined(dropped.url)) {\n      this.model.binary = {\n        url: dropped.url\n      };\n      return;\n    } else if (dropped.droppedFiles) {\n      this.model.binary = {\n        file: dropped.droppedFiles[0].file\n      };\n      return;\n    } else {\n      this.model.binary = {\n        file: undefined,\n        url: undefined\n      };\n    }\n  }\n}\n","<div class=\"viewport-modal\">\n  <div class=\"modal-header dialog-header\">\n    <i [c8yIcon]=\"'c8y-firmware'\"></i>\n    <h4\n      id=\"addFirmwarePatchModalTitle\"\n      translate\n    >\n      Add firmware patch\n    </h4>\n  </div>\n  <div\n    class=\"p-16 text-center separator-bottom\"\n    id=\"addFirmwarePatchModalDescription\"\n  >\n    <p\n      class=\"text-medium text-16 m-0\"\n      translate\n    >\n      Select a firmware version\n    </p>\n  </div>\n\n  <form\n    class=\"d-contents\"\n    autocomplete=\"off\"\n    #firmwarePatchForm=\"ngForm\"\n    (ngSubmit)=\"firmwarePatchForm.form.valid && save()\"\n  >\n    <div class=\"modal-inner-scroll\">\n      <div class=\"modal-body\">\n        <div [hidden]=\"firmwarePreselected\">\n          <c8y-form-group>\n            <label\n              for=\"firmwareName\"\n              translate\n            >\n              Firmware\n            </label>\n            <c8y-typeahead\n              placeholder=\"{{ 'Select or enter' | translate }}\"\n              name=\"firmwareName\"\n              [ngModel]=\"model.selected\"\n              (onSearch)=\"firmwareInput$.next($event)\"\n              [allowFreeEntries]=\"false\"\n              [required]=\"true\"\n            >\n              <c8y-li\n                class=\"p-l-8 p-r-8 c8y-list__item--link\"\n                *c8yFor=\"let firmware of firmwares$ | async; loadMore: 'auto'\"\n                (click)=\"model.selected = firmware; firmwareSelected$.next(firmware)\"\n                [active]=\"model.selected === firmware\"\n              >\n                <c8y-highlight\n                  [text]=\"firmware.name || '--'\"\n                  [pattern]=\"firmwareInput$ | async\"\n                ></c8y-highlight>\n              </c8y-li>\n            </c8y-typeahead>\n            <c8y-messages>\n              <c8y-message\n                name=\"notExisting\"\n                [text]=\"'Select one of the existing firmwares.' | translate\"\n              ></c8y-message>\n            </c8y-messages>\n          </c8y-form-group>\n        </div>\n\n        <c8y-form-group>\n          <label\n            class=\"m-r-8\"\n            for=\"patchDependency\"\n            translate\n          >\n            Version\n          </label>\n          <c8y-typeahead\n            placeholder=\"{{ 'Select or enter' | translate }}\"\n            name=\"patchDependency\"\n            [ngModel]=\"model.dependency\"\n            data-cy=\"add-firmware-patch-modal--patchDependency\"\n            (onSearch)=\"patchDependencyInput$.next($event)\"\n            [displayProperty]=\"'c8y_Firmware.version'\"\n            [allowFreeEntries]=\"false\"\n            [disabled]=\"\n              (baseVersions$ | async) === null || (baseVersions$ | async)?.data.length === 0\n            \"\n            [required]=\"true\"\n          >\n            <c8y-li\n              class=\"p-l-8 p-r-8 c8y-list__item--link\"\n              *c8yFor=\"\n                let baseVersion of baseVersions$;\n                loadMore: 'auto';\n                pipe: baseVersionsFilterPipe\n              \"\n              (click)=\"model.dependency = baseVersion\"\n              [active]=\"model.dependency === baseVersion\"\n            >\n              <c8y-highlight\n                [text]=\"baseVersion.c8y_Firmware.version || '--'\"\n                [pattern]=\"patchDependencyInput$ | async\"\n              ></c8y-highlight>\n            </c8y-li>\n          </c8y-typeahead>\n          <c8y-messages>\n            <c8y-message\n              name=\"notExisting\"\n              [text]=\"'Select one of the existing versions.' | translate\"\n            ></c8y-message>\n          </c8y-messages>\n        </c8y-form-group>\n\n        <c8y-form-group>\n          <label\n            for=\"patchVersion\"\n            translate\n          >\n            Patch\n          </label>\n          <input\n            class=\"form-control\"\n            id=\"patchVersion\"\n            placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n            name=\"patchVersion\"\n            autocomplete=\"off\"\n            required\n            data-cy=\"add-firmware-patch-modal--patchVersion\"\n            [(ngModel)]=\"model.patchVersion\"\n          />\n        </c8y-form-group>\n\n        <c8y-form-group>\n          <div\n            class=\"legend form-block m-t-40\"\n            translate\n          >\n            Patch file\n          </div>\n          <c8y-file-picker\n            [maxAllowedFiles]=\"1\"\n            (onFilesPicked)=\"onFile($event)\"\n            [allowedUploadChoices]=\"['uploadBinary', 'uploadUrl', 'provided']\"\n            [fileUrlPopover]=\"textForFirmwareUrlPopover\"\n          ></c8y-file-picker>\n        </c8y-form-group>\n      </div>\n    </div>\n    <div class=\"modal-footer\">\n      <button\n        class=\"btn btn-default\"\n        title=\"{{ 'Cancel' | translate }}\"\n        type=\"button\"\n        data-cy=\"add-firmware-patch-modal--cancel-btn\"\n        (click)=\"cancel()\"\n        [disabled]=\"saving\"\n        translate\n      >\n        Cancel\n      </button>\n      <button\n        class=\"btn btn-primary\"\n        title=\"{{ 'Add firmware patch' | translate }}\"\n        type=\"submit\"\n        [ngClass]=\"{ 'btn-pending': saving }\"\n        [disabled]=\"\n          !firmwarePatchForm.form.valid ||\n          firmwarePatchForm.form.pristine ||\n          (!model.binary?.url && !model.binary?.file && model.binary?.url !== '') ||\n          saving\n        \"\n        translate\n        c8yProductExperience\n        [actionName]=\"PRODUCT_EXPERIENCE.FIRMWARE.EVENTS.REPOSITORY\"\n        [actionData]=\"{\n          component: PRODUCT_EXPERIENCE.FIRMWARE.COMPONENTS.ADD_FIRMWAR_PATCH_MODAL,\n          result: PRODUCT_EXPERIENCE.FIRMWARE.RESULTS.ADD_FIRMWARE_PATCH\n        }\"\n      >\n        Add firmware patch\n      </button>\n    </div>\n  </form>\n</div>\n","import { AsyncPipe, NgClass } from '@angular/common';\nimport { Component, EventEmitter, Output, ViewChild } from '@angular/core';\nimport { FormsModule, NgForm } from '@angular/forms';\nimport { IManagedObject } from '@c8y/client';\nimport {\n  AlertService,\n  C8yTranslateDirective,\n  C8yTranslatePipe,\n  FilePickerComponent,\n  FormGroupComponent,\n  ForOfDirective,\n  HighlightComponent,\n  IconDirective,\n  ListItemComponent,\n  PickedFiles,\n  ProductExperienceDirective,\n  RequiredInputPlaceholderDirective,\n  TypeaheadComponent,\n  ValidationPattern\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  ModalModel,\n  PRODUCT_EXPERIENCE_REPOSITORY_SHARED,\n  RepositoryCategory,\n  RepositoryService,\n  RepositoryType\n} from '@c8y/ngx-components/repository/shared';\nimport { assign, get, isUndefined } from 'lodash-es';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { BehaviorSubject, from, Subscription } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, switchMap, tap } from 'rxjs/operators';\n\n@Component({\n  selector: 'c8y-add-firmware-software-modal',\n  templateUrl: 'add-firmware-modal.component.html',\n  imports: [\n    IconDirective,\n    C8yTranslateDirective,\n    FormsModule,\n    FormGroupComponent,\n    TypeaheadComponent,\n    ForOfDirective,\n    ListItemComponent,\n    HighlightComponent,\n    RequiredInputPlaceholderDirective,\n    PopoverDirective,\n    FilePickerComponent,\n    ProductExperienceDirective,\n    NgClass,\n    AsyncPipe,\n    C8yTranslatePipe\n  ]\n})\nexport class AddFirmwareModalComponent {\n  PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_REPOSITORY_SHARED;\n  @ViewChild('firmwareForm', { static: false }) form: NgForm;\n  @Output() saved: EventEmitter<RepositoryCategory> = new EventEmitter<RepositoryCategory>();\n  onInput: BehaviorSubject<string> = new BehaviorSubject<string>('');\n  model: ModalModel = {\n    selected: undefined,\n    version: undefined,\n    description: undefined,\n    deviceType: undefined,\n    binary: {\n      file: undefined,\n      url: undefined\n    }\n  };\n  firmwaresResult;\n  saving = false;\n  firmwarePreselected = false;\n  textForFirmwareUrlPopover: string =\n    gettext(`Path for binaries can vary depending on device agent implementation, for example:\n    /firmware/binaries/firmware1.bin\n    https://firmware/binary/123\n    ftp://firmware/binary/123.tar.gz\n  `);\n  ValidationPattern = ValidationPattern;\n  private inputSubscription$: Subscription;\n\n  constructor(\n    private modal: BsModalRef,\n    private repositoryService: RepositoryService,\n    private alert: AlertService\n  ) {}\n\n  ngOnInit() {\n    this.setInitialState();\n    this.loadFirmwares();\n  }\n\n  setInitialState() {\n    if (this.model.selected) {\n      this.firmwarePreselected = true;\n    }\n  }\n\n  loadFirmwares() {\n    this.inputSubscription$ = this.onInput\n      .pipe(\n        tap(() => {\n          if (!this.firmwarePreselected) {\n            this.model.description = null;\n            if (this.form) {\n              this.form.form.get('description').reset();\n            }\n          }\n        }),\n        debounceTime(300),\n        distinctUntilChanged(),\n        switchMap(searchStr => this.getFirmwareResult(searchStr))\n      )\n      .subscribe(result => {\n        this.firmwaresResult = result;\n      });\n  }\n\n  getFirmwareResult(searchStr: string) {\n    return from(\n      this.repositoryService.listRepositoryEntries(RepositoryType.FIRMWARE, {\n        partialName: searchStr,\n        skipLegacy: true\n      })\n    );\n  }\n\n  async save() {\n    this.saving = true;\n    this.repositoryService\n      .create(this.model, RepositoryType.FIRMWARE)\n      .then(savedFirmware => {\n        this.successMsg();\n        this.saving = false;\n        this.saved.next(savedFirmware);\n        this.cancel();\n      })\n      .catch(e => {\n        this.saving = false;\n        this.saved.error(e);\n        this.cancel();\n      });\n  }\n\n  successMsg() {\n    const msg = gettext('Firmware added.');\n    this.alert.success(msg);\n  }\n\n  cancel() {\n    this.modal.hide();\n    this.saved.complete();\n  }\n\n  ngOnDestroy() {\n    this.inputSubscription$.unsubscribe();\n  }\n\n  onFile(dropped: PickedFiles) {\n    if (!isUndefined(dropped.url)) {\n      this.model.binary = {\n        url: dropped.url\n      };\n      return;\n    } else if (dropped.droppedFiles) {\n      this.model.binary = {\n        file: dropped.droppedFiles[0].file\n      };\n      return;\n    } else {\n      this.model.binary = {\n        file: undefined,\n        url: undefined\n      };\n    }\n  }\n\n  onFirmwareSelect(firmware: IManagedObject) {\n    assign(this.model, {\n      selected: firmware,\n      description: firmware.description,\n      deviceType: get(firmware, 'c8y_Filter.type')\n    });\n  }\n}\n","<div class=\"viewport-modal\">\n  <div class=\"modal-header dialog-header\">\n    <i [c8yIcon]=\"'c8y-firmware'\"></i>\n    <div\n      class=\"modal-title\"\n      id=\"addFirmwareModalTitle\"\n      translate\n    >\n      Add firmware\n    </div>\n  </div>\n  @if (!firmwarePreselected) {\n    <div class=\"p-16 text-center separator-bottom\">\n      <p\n        class=\"text-medium text-16 m-0\"\n        translate\n      >\n        Select or create new firmware\n      </p>\n    </div>\n  }\n  <form\n    class=\"d-contents\"\n    autocomplete=\"off\"\n    #firmwareForm=\"ngForm\"\n    (ngSubmit)=\"firmwareForm.form.valid && save()\"\n  >\n    <div class=\"modal-inner-scroll\">\n      <div\n        class=\"modal-body\"\n        id=\"addFirmwareModalDescription\"\n      >\n        <div [hidden]=\"firmwarePreselected\">\n          <c8y-form-group>\n            <label\n              for=\"firmwareName\"\n              translate\n            >\n              Firmware\n            </label>\n            <c8y-typeahead\n              placeholder=\"{{ 'Select or enter' | translate }}\"\n              name=\"firmwareName\"\n              [(ngModel)]=\"model.selected\"\n              data-cy=\"add-firmware-modal--input-name\"\n              (onSearch)=\"onInput.next($event)\"\n              [required]=\"true\"\n            >\n              <c8y-li\n                class=\"p-l-8 p-r-8 c8y-list__item--link\"\n                *c8yFor=\"\n                  let firmware of firmwaresResult;\n                  loadMore: 'auto';\n                  notFound: notFoundTemplate\n                \"\n                (click)=\"onFirmwareSelect(firmware)\"\n                [active]=\"model.selected === firmware\"\n              >\n                <c8y-highlight\n                  [text]=\"firmware.name || '--'\"\n                  [pattern]=\"onInput | async\"\n                ></c8y-highlight>\n              </c8y-li>\n              <ng-template #notFoundTemplate>\n                @if ((onInput | async)?.length > 0) {\n                  <c8y-li class=\"bg-level-2 p-8\">\n                    <span translate>No match found.</span>\n                    <button\n                      class=\"btn btn-primary btn-xs m-l-8\"\n                      title=\"{{ 'Add new`firmware`' | translate }}\"\n                      type=\"button\"\n                      translate\n                    >\n                      Add new`firmware`\n                    </button>\n                  </c8y-li>\n                }\n              </ng-template>\n            </c8y-typeahead>\n          </c8y-form-group>\n\n          <c8y-form-group>\n            <label\n              for=\"firmwareDescription\"\n              translate\n            >\n              Description\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"firmwareDescription\"\n              placeholder=\"{{ 'e.g. Firmware for hardware revision B' | translate }}\"\n              name=\"description\"\n              autocomplete=\"off\"\n              data-cy=\"add-firmware-modal--input-description\"\n              [(ngModel)]=\"model.description\"\n              [disabled]=\"model.selected?.id\"\n              [required]=\"true\"\n              [pattern]=\"ValidationPattern.rules.noWhiteSpaceOnly.pattern\"\n            />\n          </c8y-form-group>\n\n          <c8y-form-group>\n            <label\n              class=\"control-label\"\n              for=\"firmwareDeviceTypeFilter\"\n            >\n              {{ 'Device type filter' | translate }}\n              <button\n                class=\"btn-help\"\n                [attr.aria-label]=\"'Help' | translate\"\n                popover=\"{{\n                  'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n                    | translate\n                }}\"\n                placement=\"right\"\n                triggers=\"focus\"\n                container=\"body\"\n                type=\"button\"\n              ></button>\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"firmwareDeviceTypeFilter\"\n              placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n              name=\"firmwareDeviceTypeFilter\"\n              data-cy=\"add-firmware-modal--firmwareDeviceTypeFilter\"\n              [(ngModel)]=\"model.deviceType\"\n              [disabled]=\"model.selected?.id\"\n              [pattern]=\"ValidationPattern.rules.noWhiteSpaceOnly.pattern\"\n            />\n          </c8y-form-group>\n        </div>\n\n        <c8y-form-group>\n          <label\n            for=\"firmwareVersion\"\n            translate\n          >\n            Version\n          </label>\n          <input\n            class=\"form-control\"\n            id=\"firmwareVersion\"\n            placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n            name=\"version\"\n            autocomplete=\"off\"\n            data-cy=\"add-firmware-modal--firmwareVersion\"\n            [(ngModel)]=\"model.version\"\n            [required]=\"true\"\n            [pattern]=\"ValidationPattern.rules.noWhiteSpaceOnly.pattern\"\n          />\n        </c8y-form-group>\n\n        <c8y-form-group>\n          <div\n            class=\"legend form-block m-t-40\"\n            translate\n          >\n            Firmware file\n          </div>\n          <c8y-file-picker\n            [maxAllowedFiles]=\"1\"\n            (onFilesPicked)=\"onFile($event)\"\n            [allowedUploadChoices]=\"['uploadBinary', 'uploadUrl', 'provided']\"\n            [fileUrlPopover]=\"textForFirmwareUrlPopover\"\n          ></c8y-file-picker>\n        </c8y-form-group>\n      </div>\n    </div>\n    <div class=\"modal-footer\">\n      <button\n        class=\"btn btn-default\"\n        title=\"{{ 'Cancel' | translate }}\"\n        type=\"button\"\n        data-cy=\"add-firmware-modal--cancel-btn\"\n        (click)=\"cancel()\"\n        [disabled]=\"saving\"\n        translate\n      >\n        Cancel\n      </button>\n\n      <button\n        class=\"btn btn-primary\"\n        title=\"{{ 'Add firmware' | translate }}\"\n        type=\"submit\"\n        [ngClass]=\"{ 'btn-pending': saving }\"\n        [disabled]=\"\n          !firmwareForm.form.valid ||\n          firmwareForm.form.pristine ||\n          saving ||\n          ([null, undefined].includes(model.binary?.url) && !model.binary?.file)\n        \"\n        [actionName]=\"PRODUCT_EXPERIENCE.FIRMWARE.EVENTS.REPOSITORY\"\n        [actionData]=\"{\n          component: PRODUCT_EXPERIENCE.FIRMWARE.COMPONENTS.ADD_FIRMWARE_MODAL,\n          result:\n            firmwarePreselected || model.selected?.id\n              ? PRODUCT_EXPERIENCE.FIRMWARE.RESULTS.ADD_FIRMWARE_VERSION\n              : PRODUCT_EXPERIENCE.FIRMWARE.RESULTS.ADD_FIRMWARE\n        }\"\n        translate\n        c8yProductExperience\n      >\n        Add firmware\n      </button>\n    </div>\n  </form>\n</div>\n","import { AsyncPipe, NgClass, NgPlural, NgPluralCase, NgStyle } from '@angular/common';\nimport { Component, OnDestroy, OnInit } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { IManagedObject, IResultList, InventoryService } from '@c8y/client';\nimport {\n  ActionBarItemComponent,\n  AlertService,\n  BreadcrumbComponent,\n  BreadcrumbItemComponent,\n  C8yTranslateDirective,\n  C8yTranslatePipe,\n  EmptyStateComponent,\n  ForOfDirective,\n  FormGroupComponent,\n  GainsightService,\n  IconDirective,\n  ListGroupComponent,\n  ListItemBodyComponent,\n  ListItemCollapseComponent,\n  ListItemComponent,\n  ListItemIconComponent,\n  ModalService,\n  RequiredInputPlaceholderDirective,\n  Status,\n  TitleComponent,\n  memoize\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  FileDownloadComponent,\n  FirmwareBinary,\n  PRODUCT_EXPERIENCE_REPOSITORY_SHARED,\n  RepositoryService\n} from '@c8y/ngx-components/repository/shared';\nimport { TranslateService } from '@ngx-translate/core';\nimport { property } from 'lodash-es';\nimport { BsModalService, ModalOptions } from 'ngx-bootstrap/modal';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { BehaviorSubject, Observable, Subject, combineLatest, defer, merge } from 'rxjs';\nimport {\n  distinctUntilKeyChanged,\n  map,\n  shareReplay,\n  switchMap,\n  take,\n  takeUntil,\n  tap,\n  withLatestFrom\n} from 'rxjs/operators';\nimport { AddFirmwareModalComponent } from './add-firmware-modal.component';\nimport { AddFirmwarePatchModalComponent } from './add-firmware-patch-modal.component';\n\n@Component({\n  selector: 'c8y-firmware-details',\n  templateUrl: './firmware-details.component.html',\n  imports: [\n    TitleComponent,\n    BreadcrumbComponent,\n    BreadcrumbItemComponent,\n    ActionBarItemComponent,\n    IconDirective,\n    NgClass,\n    FormGroupComponent,\n    RequiredInputPlaceholderDirective,\n    FormsModule,\n    NgStyle,\n    PopoverDirective,\n    C8yTranslateDirective,\n    EmptyStateComponent,\n    ListGroupComponent,\n    ForOfDirective,\n    ListItemComponent,\n    ListItemIconComponent,\n    ListItemBodyComponent,\n    FileDownloadComponent,\n    NgPlural,\n    NgPluralCase,\n    TooltipDirective,\n    ListItemCollapseComponent,\n    AsyncPipe,\n    C8yTranslatePipe\n  ]\n})\nexport class FirmwareDetailsComponent implements OnInit, OnDestroy {\n  reload$: Subject<void> = new Subject();\n  reloading$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n  firmware: IManagedObject;\n\n  updateFirmware$: Subject<Partial<IManagedObject>> = new Subject();\n  firmwareUpdated$: Subject<IManagedObject> = new Subject();\n  baseVersionsUpdated$: Subject<void> = new Subject();\n  patchVersionsUpdated$: Subject<void> = new Subject();\n\n  firmware$: Observable<IManagedObject> = merge(\n    this.activatedRoute.params.pipe(\n      map(params => params.id),\n      switchMap(id => defer(() => this.inventoryService.detail(id).then(result => result.data)))\n    ),\n    this.reload$.pipe(\n      tap(() => this.reloading$.next(true)),\n      switchMap(() => this.activatedRoute.params),\n      map(params => params.id),\n      switchMap(id => defer(() => this.inventoryService.detail(id).then(result => result.data))),\n      tap(() => this.reloading$.next(false))\n    ),\n    this.firmwareUpdated$\n  ).pipe(shareReplay(1));\n\n  baseVersions$: Observable<IResultList<IManagedObject>> = merge(\n    this.firmware$.pipe(distinctUntilKeyChanged('id')),\n    this.baseVersionsUpdated$,\n    this.patchVersionsUpdated$,\n    this.reload$\n  ).pipe(\n    switchMap(() => this.firmware$),\n    switchMap(firmware => this.repositoryService.listBaseVersions(firmware)),\n    shareReplay(1)\n  );\n\n  isLegacy$: Observable<boolean> = this.firmware$.pipe(\n    map(firmware => this.repositoryService.isLegacyEntry(firmware)),\n    shareReplay(1)\n  );\n\n  canAddPatchVersions$: Observable<boolean> = combineLatest(\n    this.isLegacy$,\n    this.baseVersions$.pipe(map(({ data }) => data.length > 0))\n  ).pipe(map(([isLegacy, hasBaseVersions]) => !isLegacy && hasBaseVersions));\n\n  expanded: { [id: string]: boolean } = {};\n\n  destroy$: Subject<boolean> = new Subject<boolean>();\n\n  constructor(\n    private activatedRoute: ActivatedRoute,\n    private inventoryService: InventoryService,\n    private repositoryService: RepositoryService,\n    private alertService: AlertService,\n    private translateService: TranslateService,\n    private modalService: ModalService,\n    private bsModalService: BsModalService,\n    private gainsightService: GainsightService,\n    private router: Router\n  ) {}\n\n  ngOnInit() {\n    this.updateFirmware$\n      .pipe(\n        withLatestFrom(this.firmware$),\n        switchMap(([firmwarePartial, firmware]) =>\n          this.inventoryService.update({\n            id: firmware.id,\n            ...firmwarePartial\n          })\n        ),\n        map(({ data }) => data),\n        tap(firmware => this.firmwareUpdated$.next(firmware)),\n        tap(() =>\n          this.gainsightService.triggerEvent(\n            PRODUCT_EXPERIENCE_REPOSITORY_SHARED.FIRMWARE.EVENTS.REPOSITORY,\n            {\n              result: PRODUCT_EXPERIENCE_REPOSITORY_SHARED.FIRMWARE.RESULTS.EDIT_FIRMWARE\n            }\n          )\n        ),\n        tap(() => this.alertService.success(gettext('Saved.'))),\n        takeUntil(this.destroy$)\n      )\n      .subscribe();\n\n    this.firmware$.subscribe(firmware => {\n      this.firmware = firmware;\n    });\n  }\n\n  @memoize(property('id'))\n  getPatchVersionsCount$(baseVersion: FirmwareBinary) {\n    return merge(\n      this.firmware$.pipe(distinctUntilKeyChanged('id')),\n      this.baseVersionsUpdated$,\n      this.patchVersionsUpdated$,\n      this.reload$\n    ).pipe(\n      switchMap(() => this.firmware$),\n      switchMap(firmware => this.repositoryService.getPatchVersionsCount$(firmware, baseVersion)),\n      shareReplay(1)\n    );\n  }\n\n  @memoize()\n  getBinaryName$(binaryUrl) {\n    return this.repositoryService.getBinaryName$(binaryUrl);\n  }\n\n  @memoize(property('id'))\n  getPatchVersions$(baseVersion) {\n    return merge(\n      this.firmware$.pipe(distinctUntilKeyChanged('id')),\n      this.patchVersionsUpdated$,\n      this.reload$\n    ).pipe(\n      switchMap(() => this.firmware$),\n      switchMap(firmware => this.repositoryService.listPatchVersions(firmware, baseVersion)),\n      shareReplay(1)\n    );\n  }\n\n  addBaseVersion() {\n    this.firmware$\n      .pipe(\n        take(1),\n        switchMap(firmware => {\n          const initialState = {\n            model: {\n              selected: firmware,\n              description: firmware.description\n            }\n          };\n          const config: ModalOptions<AddFirmwareModalComponent> = {\n            class: 'modal-sm',\n            ignoreBackdropClick: true,\n            keyboard: false,\n            ariaDescribedby: 'addFirmwareModalDescription',\n            ariaLabelledBy: 'addFirmwareModalTitle',\n            initialState\n          };\n          const modalRef = this.bsModalService.show(AddFirmwareModalComponent, config);\n          return modalRef.content.saved;\n        })\n      )\n      .subscribe(() => this.baseVersionsUpdated$.next());\n  }\n\n  addPatchVersion() {\n    this.firmware$\n      .pipe(\n        take(1),\n        switchMap(firmware => {\n          const initialState = {\n            model: {\n              selected: firmware\n            }\n          };\n          const config: ModalOptions<AddFirmwarePatchModalComponent> = {\n            class: 'modal-sm',\n            ignoreBackdropClick: true,\n            keyboard: false,\n            ariaDescribedby: 'addFirmwarePatchModalDescription',\n            ariaLabelledBy: 'addFirmwarePatchModalTitle',\n            initialState\n          };\n          const modalRef = this.bsModalService.show(AddFirmwarePatchModalComponent, config);\n          return modalRef.content.saved;\n        })\n      )\n      .subscribe(() => this.patchVersionsUpdated$.next());\n  }\n\n  async deleteBaseVersion(baseVersion: IManagedObject) {\n    try {\n      const title = gettext('Delete firmware');\n      const body = `\n        ${this.translateService.instant(\n          gettext('You are about to delete firmware {{ version }} with all its patches.'),\n          { version: baseVersion.c8y_Firmware.version }\n        )}\n        ${this.translateService.instant(gettext('This operation is irreversible.'))}\n        ${this.translateService.instant(gettext('Do you want to proceed?'))}\n      `;\n      const labels = {\n        ok: gettext('Delete')\n      };\n      await this.modalService.confirm(\n        title,\n        body,\n        Status.DANGER,\n        labels,\n        {},\n        { eventName: PRODUCT_EXPERIENCE_REPOSITORY_SHARED.FIRMWARE.EVENTS.REPOSITORY }\n      );\n      const isLastVersion = await this.baseVersions$\n        .pipe(\n          map(versions => versions?.data?.length === 1),\n          take(1)\n        )\n        .toPromise();\n      if (isLastVersion) {\n        await this.repositoryService.delete(this.firmware);\n        this.router.navigateByUrl('/firmware');\n      } else {\n        await this.repositoryService.delete(baseVersion);\n        this.baseVersionsUpdated$.next();\n      }\n      this.alertService.success(gettext('Firmware deleted.'));\n    } catch (ex) {\n      // only if not cancel from modal\n      if (ex) {\n        this.alertService.addServerFailure(ex);\n      }\n    }\n  }\n\n  async deletePatchVersion(patchVersion: IManagedObject) {\n    try {\n      const title = gettext('Delete firmware patch');\n      const body = `\n        ${this.translateService.instant(\n          gettext('You are about to delete firmware patch {{ version }}.'),\n          { version: patchVersion.c8y_Firmware.version }\n        )}\n        ${this.translateService.instant(gettext('This operation is irreversible.'))}\n        ${this.translateService.instant(gettext('Do you want to proceed?'))}\n      `;\n      const labels = {\n        ok: gettext('Delete')\n      };\n      await this.modalService.confirm(\n        title,\n        body,\n        Status.DANGER,\n        labels,\n        {},\n        { eventName: PRODUCT_EXPERIENCE_REPOSITORY_SHARED.FIRMWARE.EVENTS.REPOSITORY }\n      );\n      await this.repositoryService.delete(patchVersion);\n      this.alertService.success(gettext('Firmware patch deleted.'));\n      this.patchVersionsUpdated$.next();\n    } catch (ex) {\n      // only if not cancel from modal\n      if (ex) {\n        this.alertService.addServerFailure(ex);\n      }\n    }\n  }\n\n  ngOnDestroy() {\n    this.destroy$.next(true);\n    this.destroy$.unsubscribe();\n  }\n}\n","<c8y-title>\n  {{ (firmware$ | async)?.name }}\n</c8y-title>\n\n<c8y-breadcrumb>\n  <c8y-breadcrumb-item\n    icon=\"c8y-management\"\n    label=\"{{ 'Management' | translate }}\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    icon=\"c8y-firmware\"\n    path=\"#/firmware\"\n    label=\"{{ 'Firmware repository' | translate }}\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    icon=\"c8y-firmware\"\n    label=\"{{ (firmware$ | async)?.name }}\"\n  ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n  @if (!(isLegacy$ | async)) {\n    <button\n      class=\"btn btn-link\"\n      title=\"{{ 'Add firmware' | translate }}\"\n      type=\"button\"\n      data-cy=\"firmware-details--add-firmware-btn\"\n      (click)=\"addBaseVersion()\"\n    >\n      <i c8yIcon=\"plus-circle\"></i>\n      {{ 'Add firmware' | translate }}\n    </button>\n  }\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n  @if (canAddPatchVersions$ | async) {\n    <button\n      class=\"btn btn-link\"\n      title=\"{{ 'Add firmware patch' | translate }}\"\n      type=\"button\"\n      data-cy=\"firmware-details--add-firmware-patch-btn\"\n      (click)=\"addPatchVersion()\"\n    >\n      <i c8yIcon=\"plus-circle\"></i>\n      {{ 'Add firmware patch' | translate }}\n    </button>\n  }\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n  <button\n    class=\"btn btn-link\"\n    title=\"{{ 'Reload' | translate }}\"\n    type=\"button\"\n    (click)=\"reload$.next()\"\n  >\n    <i\n      c8yIcon=\"refresh\"\n      [ngClass]=\"{ 'icon-spin': reloading$ | async }\"\n    ></i>\n    {{ 'Reload' | translate }}\n  </button>\n</c8y-action-bar-item>\n\n<div class=\"row\">\n  <div class=\"col-lg-12 col-lg-max\">\n    <div class=\"card card--fullpage\">\n      <div class=\"card-block bg-level-1 flex-no-shrink p-t-24 p-b-24\">\n        <div class=\"content-flex-70\">\n          <div class=\"text-center\">\n            <i class=\"c8y-icon-duocolor icon-48 c8y-icon c8y-icon-firmware\"></i>\n            <p>\n              <small class=\"label label-info\">Firmware</small>\n            </p>\n          </div>\n          <div class=\"flex-grow col-10\">\n            <div class=\"row\">\n              <div class=\"col-md-4\">\n                <c8y-form-group>\n                  <label class=\"control-label\">\n                    {{ 'Name' | translate }}\n                  </label>\n                  <div class=\"input-group input-group-editable\">\n                    <input\n                      class=\"form-control\"\n                      [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.name?.length + 2 || 36 }\"\n                      placeholder=\"{{ 'e.g. My firmware' | translate }}\"\n                      type=\"text\"\n                      required\n                      #nameInput\n                      [ngModel]=\"(firmware$ | async)?.name\"\n                      #nameModel=\"ngModel\"\n                      data-cy=\"firmware-details--name-input\"\n                    />\n                    <span></span>\n                    <div class=\"input-group-btn\">\n                      <button\n                        class=\"btn btn-primary\"\n                        title=\"{{ 'Save' | translate }}\"\n                        type=\"button\"\n                        data-cy=\"firmware-details--name-save-btn\"\n                        (click)=\"updateFirmware$.next({ name: nameInput.value }); nameModel.reset()\"\n                        [disabled]=\"nameInput.value.length == 0\"\n                      >\n                        {{ 'Save' | translate }}\n                      </button>\n                    </div>\n                  </div>\n                </c8y-form-group>\n              </div>\n              <div class=\"col-md-4\">\n                <c8y-form-group>\n                  <label class=\"control-label\">\n                    {{ 'Description' | translate }}\n                  </label>\n                  <div class=\"input-group input-group-editable\">\n                    <input\n                      class=\"form-control\"\n                      [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.description?.length || 36 }\"\n                      placeholder=\"{{ 'e.g. Firmware for hardware revision B' | translate }}\"\n                      type=\"text\"\n                      #descriptionInput\n                      [ngModel]=\"(firmware$ | async)?.description\"\n                      #descriptionModel=\"ngModel\"\n                      data-cy=\"firmware-details--description-input\"\n                    />\n                    <span></span>\n                    <div class=\"input-group-btn\">\n                      <button\n                        class=\"btn btn-primary\"\n                        title=\"{{ 'Save' | translate }}\"\n                        type=\"button\"\n                        data-cy=\"firmware-details--description-save-btn\"\n                        (click)=\"\n                          updateFirmware$.next({ description: descriptionInput.value });\n                          descriptionModel.reset()\n                        \"\n                      >\n                        {{ 'Save' | translate }}\n                      </button>\n                    </div>\n                  </div>\n                </c8y-form-group>\n              </div>\n              <div class=\"col-md-4\">\n                <c8y-form-group>\n                  <label class=\"control-label\">\n                    {{ 'Device type filter' | translate }}\n\n                    <button\n                      class=\"btn-help\"\n                      [attr.aria-label]=\"'Help' | translate\"\n                      popover=\"{{\n                        'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n                          | translate\n                      }}\"\n                      placement=\"right\"\n                      triggers=\"focus\"\n                      container=\"body\"\n                      type=\"button\"\n                    >\n                      <i c8yIcon=\"question-circle-o\"></i>\n                    </button>\n                  </label>\n                  <div class=\"input-group input-group-editable\">\n                    <input\n                      class=\"form-control\"\n                      [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.type?.length || 36 }\"\n                      placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n                      type=\"text\"\n                      #deviceTypeInput\n                      [ngModel]=\"(firmware$ | async)?.c8y_Filter?.type\"\n                      #deviceTypeModel=\"ngModel\"\n                      data-cy=\"firmware-details--device-type-filter-input\"\n                    />\n                    <span></span>\n                    <div class=\"input-group-btn\">\n                      <button\n                        class=\"btn btn-primary\"\n                        title=\"{{ 'Save' | translate }}\"\n                        type=\"button\"\n                        data-cy=\"firmware-details--device-type-filter-save-btn\"\n                        (click)=\"\n                          updateFirmware$.next({ c8y_Filter: { type: deviceTypeInput.value } });\n                          deviceTypeModel.reset()\n                        \"\n                      >\n                        {{ 'Save' | translate }}\n                      </button>\n                    </div>\n                  </div>\n                </c8y-form-group>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class=\"inner-scroll\">\n        <div class=\"card-header separator-top-bottom bg-component sticky-top\">\n          <div\n            class=\"card-title\"\n            translate\n          >\n            Versions and patches\n          </div>\n        </div>\n\n        <div class=\"card-block p-t-0 p-b-24\">\n          @if ((baseVersions$ | async)?.data.length === 0) {\n            <div>\n              <c8y-ui-empty-state\n                [icon]=\"'c8y-firmware'\"\n                [title]=\"'No versions to display.' | translate\"\n                [subtitle]=\"'Add a new version by clicking below.' | translate\"\n                [horizontal]=\"true\"\n              >\n                <button\n                  class=\"btn btn-sm btn-default m-t-8\"\n                  title=\"{{ 'Add firmware' | translate }}\"\n                  type=\"button\"\n                  (click)=\"addBaseVersion()\"\n                >\n                  <i c8yIcon=\"plus-circle\"></i>\n                  {{ 'Add firmware' | translate }}\n                </button>\n              </c8y-ui-empty-state>\n            </div>\n          }\n\n          @if ((baseVersions$ | async)?.data.length > 0) {\n            <c8y-list-group>\n              <c8y-li\n                *c8yFor=\"let baseVersion of baseVersions$ | async; let i = index; loadMore: 'auto'\"\n                [emptyActions]=\"!(getPatchVersions$(baseVersion) | async)?.data.length\"\n                [collapsed]=\"!expanded[baseVersion.id]\"\n                (collapsedChange)=\"expanded[baseVersion.id] = !$event\"\n              >\n                <c8y-li-icon>\n                  <i c8yIcon=\"c8y-firmware\"></i>\n                </c8y-li-icon>\n                <c8y-li-body class=\"content-flex-50\">\n                  <div class=\"col-4\">\n                    <p\n                      class=\"text-truncate\"\n                      title=\"{{ baseVersion.c8y_Firmware.version }}\"\n                    >\n                      {{ baseVersion.c8y_Firmware.version }}\n                    </p>\n                  </div>\n                  <div class=\"col-5\">\n                    <p class=\"text-truncate\">\n                      <span\n                        class=\"text-label-small m-r-8\"\n                        translate\n                      >\n                        File\n                      </span>\n                      @if (baseVersion.c8y_Firmware.url === '') {\n                        <span title=\"{{ 'Provided by device' | translate }}\">\n                          {{ 'Provided by device' | translate }}\n                        </span>\n                      } @else {\n                        <span title=\"{{ getBinaryName$(baseVersion.c8y_Firmware.url) | async }}\">\n                          <c8y-file-download\n                            url=\"{{ baseVersion.c8y_Firmware.url }}\"\n                          ></c8y-file-download>\n                        </span>\n                      }\n                    </p>\n                  </div>\n                  <div class=\"col-2 d-flex a-i-start\">\n                    @if (isLegacy$ | async) {\n                      <span class=\"label label-warning m-l-auto-sm\">\n                        {{ 'Legacy' | translate }}\n                      </span>\n                    }\n                    @if (!(isLegacy$ | async)) {\n                      <span>\n                        @if ((getPatchVersionsCount$(baseVersion) | async) === null) {\n                          <span>\n                            <span class=\"label label-info\">\n                              <i\n                                class=\"icon-spin\"\n                                c8yIcon=\"circle-o-notch\"\n                              ></i>\n                            </span>\n                          </span>\n                        }\n                        @if ((getPatchVersionsCount$(baseVersion) | async) !== null) {\n                          <span>\n                            <span [ngPlural]=\"getPatchVersionsCount$(baseVersion) | async\">\n                              <ng-template ngPluralCase=\"=0\">\n                                <span class=\"label label-default m-l-auto-sm\">\n                                  <span translate>No patches</span>\n                                </span>\n                              </ng-template>\n                              <ng-template ngPluralCase=\"=1\">\n                                <span class=\"label label-info\">\n                                  <span translate>1 patch</span>\n                                </span>\n                              </ng-template>\n                              <ng-template ngPluralCase=\"other\">\n                                <span class=\"label label-info\">\n                                  <span\n                                    ngNonBindable\n                                    translate\n                                    [translateParams]=\"{\n                                      count: getPatchVersionsCount$(baseVersion) | async\n                                    }\"\n                                  >\n                                    {{ count }} patches\n                                  </span>\n                                </span>\n                              </ng-template>\n                            </span>\n                          </span>\n                        }\n                      </span>\n                    }\n                  </div>\n                  @if (!(isLegacy$ | async)) {\n                    <div class=\"fit-h-20 visible-xs\">\n                      <button\n                        class=\"btn btn-default btn-sm m-t-8\"\n                        title=\"{{ 'Delete' | translate }}\"\n                        type=\"button\"\n                        (click)=\"deleteBaseVersion(baseVersion)\"\n                      >\n                        <i c8yIcon=\"delete\"></i>\n                        {{ 'Delete' | translate }}\n                      </button>\n                    </div>\n                  }\n                  @if (!(isLegacy$ | async)) {\n                    <div class=\"m-l-auto fit-h-20 p-r-8 hidden-xs\">\n                      <button\n                        class=\"btn btn-dot btn-dot--danger showOnHover\"\n                        [attr.aria-label]=\"'Delete' | translate\"\n                        tooltip=\"{{ 'Delete' | translate }}\"\n                        type=\"button\"\n                        data-cy=\"firmware-details--delete-base-version\"\n                        [delay]=\"500\"\n                        (click)=\"deleteBaseVersion(baseVersion)\"\n                      >\n                        <i c8yIcon=\"delete\"></i>\n                      </button>\n                    </div>\n                  }\n                </c8y-li-body>\n                @if ((getPatchVersions$(baseVersion) | async)?.data.length) {\n                  <c8y-li-collapse>\n                    <c8y-list-group class=\"separator-top\">\n                      <c8y-li\n                        *c8yFor=\"\n                          let patchVersion of getPatchVersions$(baseVersion) | async;\n                          let i = index;\n                          loadMore: 'auto'\n                        \"\n                      >\n                        <c8y-li-icon>\n                          <i c8yIcon=\"c8y-firmware\"></i>\n                        </c8y-li-icon>\n                        <c8y-li-body class=\"content-flex-50\">\n                          <div class=\"col-4\">\n                            {{ patchVersion.c8y_Firmware.version }}\n                          </div>\n                          <div class=\"col-5\">\n                            <div class=\"text-truncate\">\n                              <span\n                                class=\"text-label-small m-r-8\"\n                                translate\n                              >\n                                File\n                              </span>\n                              @if (patchVersion?.c8y_Firmware?.url === '') {\n                                <span title=\"{{ 'Provided by device' | translate }}\">\n                                  {{ 'Provided by device' | translate }}\n                                </span>\n                              } @else {\n                                <span title=\"patchVersion.c8y_Firmware.url\">\n                                  <c8y-file-download\n                                    [url]=\"patchVersion.c8y_Firmware.url\"\n                                  ></c8y-file-download>\n                                </span>\n                              }\n                            </div>\n                          </div>\n                          <div class=\"visible-xs m-t-8\">\n                            <button\n                              class=\"btn btn-danger btn-xs\"\n                              title=\"{{ 'Delete' | translate }}\"\n                              type=\"button\"\n                              data-cy=\"firmware-details--delete-patch-version\"\n                              (click)=\"deletePatchVersion(patchVersion)\"\n                            >\n                              <i c8yIcon=\"delete\"></i>\n                              {{ 'Delete' | translate }}\n                            </button>\n                          </div>\n                          <div class=\"m-l-auto p-r-8 hidden-xs fit-h-20\">\n                            <button\n                              class=\"btn btn-dot text-danger showOnHover\"\n                              [attr.aria-label]=\"'Delete' | translate\"\n                              tooltip=\"{{ 'Delete' | translate }}\"\n                              placement=\"right\"\n                              type=\"button\"\n                              [delay]=\"500\"\n                              (click)=\"deletePatchVersion(patchVersion)\"\n                            >\n                              <i\n                                c8yIcon=\"delete\"\n                                data-cy=\"firmware-details--Remove-icon\"\n                              ></i>\n                            </button>\n                          </div>\n                        </c8y-li-body>\n                      </c8y-li>\n                    </c8y-list-group>\n                  </c8y-li-collapse>\n                }\n              </c8y-li>\n            </c8y-list-group>\n          }\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n","import { Component, EventEmitter } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { IManagedObject, IResultList } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  ActionControl,\n  AlertService,\n  BuiltInActionType,\n  Column,\n  DataGridService,\n  DataSourceModifier,\n  ModalService,\n  ServerSideDataCallback,\n  ServerSideDataResult,\n  Status,\n  TitleComponent,\n  BreadcrumbComponent,\n  BreadcrumbItemComponent,\n  ActionBarItemComponent,\n  IconDirective,\n  HelpComponent,\n  DataGridComponent,\n  EmptyStateContextDirective,\n  EmptyStateComponent,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport {\n  DescriptionGridColumn,\n  DeviceTypeGridColumn,\n  PRODUCT_EXPERIENCE_REPOSITORY_SHARED,\n  RepositoryItemNameGridColumn,\n  RepositoryService,\n  RepositoryType,\n  VersionsGridColumn\n} from '@c8y/ngx-components/repository/shared';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BsModalService, ModalOptions } from 'ngx-bootstrap/modal';\nimport { Observable, from, map } from 'rxjs';\nimport { AddFirmwareModalComponent } from './add-firmware-modal.component';\nimport { AddFirmwarePatchModalComponent } from './add-firmware-patch-modal.component';\nimport { AsyncPipe } from '@angular/common';\n\n@Component({\n  selector: 'c8y-firmware-list',\n  templateUrl: 'firmware-list.component.html',\n  imports: [\n    TitleComponent,\n    BreadcrumbComponent,\n    BreadcrumbItemComponent,\n    ActionBarItemComponent,\n    IconDirective,\n    HelpComponent,\n    DataGridComponent,\n    EmptyStateContextDirective,\n    EmptyStateComponent,\n    AsyncPipe,\n    C8yTranslatePipe\n  ]\n})\nexport class FirmwareListComponent {\n  sizeRequest: Promise<number>;\n  sizeRequestDone = false;\n  refresh$: EventEmitter<void> = new EventEmitter();\n  isDataPresent$: Observable<boolean> = from(\n    this.repositoryService.listRepositoryEntries(RepositoryType.FIRMWARE, { skipLegacy: true })\n  ).pipe(map(({ data }) => data.length > 0));\n\n  columns: Column[] = [\n    new RepositoryItemNameGridColumn({\n      filterLabel: gettext('Filter firmware by name'),\n      placeholder: gettext('ubuntu core')\n    }),\n    new DescriptionGridColumn({\n      filterLabel: gettext('Filter firmware by description'),\n      placeholder: gettext('Firmware for hardware revision B')\n    }),\n    new DeviceTypeGridColumn({ filterLabel: gettext('Filter firmware by device type') }),\n    new VersionsGridColumn()\n  ];\n  actionControls: ActionControl[] = [];\n  serverSideDataCallback: ServerSideDataCallback;\n  pagination = {\n    pageSize: 50,\n    currentPage: 1\n  };\n\n  noResultsMessage = gettext('No results to display.');\n  noDataMessage = gettext('No firmware to display.');\n  noResultsSubtitle = gettext('Refine your search terms or check your spelling.');\n  noDataSubtitle = gettext('Add a new firmware by clicking below.');\n\n  constructor(\n    private repositoryService: RepositoryService,\n    private gridService: DataGridService,\n    private modalService: ModalService,\n    private bsModalService: BsModalService,\n    private translateService: TranslateService,\n    private alertService: AlertService,\n    private router: Router,\n    private activatedRoute: ActivatedRoute\n  ) {\n    this.serverSideDataCallback = this.onDataSourceModifier.bind(this);\n  }\n\n  ngOnInit(): void {\n    this.actionControls.push({\n      type: BuiltInActionType.Edit,\n      callback: this.editFirmware.bind(this)\n    });\n    this.actionControls.push({\n      type: BuiltInActionType.Delete,\n      callback: this.deleteFirmware.bind(this)\n    });\n  }\n\n  addFirmware() {\n    const config: ModalOptions<AddFirmwareModalComponent> = {\n      class: 'modal-sm',\n      ariaDescribedby: 'addFirmwareModalDescription',\n      ariaLabelledBy: 'addFirmwareModalTitle',\n      ignoreBackdropClick: true,\n      keyboard: false\n    };\n    const modalRef = this.bsModalService.show(AddFirmwareModalComponent, config);\n    modalRef.content.saved.subscribe(savedFirmware => this.editFirmware(savedFirmware));\n  }\n\n  addFirmwarePatch() {\n    const config: ModalOptions<AddFirmwarePatchModalComponent> = {\n      class: 'modal-sm',\n      ariaDescribedby: 'addFirmwarePatchModalDescription',\n      ariaLabelledBy: 'addFirmwarePatchModalTitle',\n      ignoreBackdropClick: true,\n      keyboard: false\n    };\n    const modalRef = this.bsModalService.show(AddFirmwarePatchModalComponent, config);\n    modalRef.content.saved.subscribe(savedFirmware => this.editFirmware(savedFirmware));\n  }\n\n  editFirmware(firmware: Partial<IManagedObject>) {\n    this.router.navigate([firmware.id], { relativeTo: this.activatedRoute });\n  }\n\n  async deleteFirmware(firmware: IManagedObject) {\n    try {\n      const title = gettext('Delete firmware');\n      const body = `\n        ${this.translateService.instant(\n          gettext(\n            'You are about to delete firmware \"{{ name }}\" with all its versions and patches.'\n          ),\n          { name: firmware.name }\n        )}\n        ${this.translateService.instant(gettext('This operation is irreversible.'))}\n        ${this.translateService.instant(gettext('Do you want to proceed?'))}\n      `;\n      const labels = {\n        ok: gettext('Delete')\n      };\n      await this.modalService.confirm(\n        title,\n        body,\n        Status.DANGER,\n        labels,\n        {},\n        { eventName: PRODUCT_EXPERIENCE_REPOSITORY_SHARED.FIRMWARE.EVENTS.REPOSITORY }\n      );\n      await this.repositoryService.delete(firmware);\n      this.alertService.success(gettext('Firmware deleted.'));\n      this.refresh$.next();\n    } catch (ex) {\n      // only if not cancel from modal\n      if (ex) {\n        this.alertService.addServerFailure(ex);\n      }\n    }\n  }\n\n  async onDataSourceModifier(\n    dataSourceModifier: DataSourceModifier\n  ): Promise<ServerSideDataResult> {\n    const dataRequest: Promise<IResultList<IManagedObject>> =\n      this.repositoryService.listRepositoryEntries(RepositoryType.FIRMWARE, {\n        query: this.gridService.getQueryObj(dataSourceModifier.columns),\n        skipDefaultOrder: true,\n        params: {\n          pageSize: dataSourceModifier.pagination.pageSize,\n          currentPage: dataSourceModifier.pagination.currentPage\n        }\n      });\n\n    const filtererdSizeRequest: Promise<number> = this.repositoryService\n      .listRepositoryEntries(RepositoryType.FIRMWARE, {\n        skipDefaultOrder: true,\n        query: this.gridService.getQueryObj(dataSourceModifier.columns),\n        params: { pageSize: 1 }\n      })\n      .then(response => response?.paging?.totalPages);\n\n    this.sizeRequest = this.repositoryService\n      .listRepositoryEntries(RepositoryType.FIRMWARE, {\n        skipDefaultOrder: true,\n        params: { pageSize: 1 }\n      })\n      .then(response => {\n        this.sizeRequestDone = true;\n        return response?.paging?.totalPages;\n      });\n\n    const [dataResponse, size, filteredSize] = await Promise.all([\n      dataRequest,\n      this.sizeRequest,\n      filtererdSizeRequest\n    ]);\n\n    const { res, data, paging } = dataResponse;\n\n    const serverSideDataResult: ServerSideDataResult = {\n      res,\n      data,\n      paging,\n      filteredSize,\n      size\n    };\n\n    return serverSideDataResult;\n  }\n\n  trackByName(_index, column: Column): string {\n    return column.name;\n  }\n}\n","<c8y-title>\n  {{ 'Firmware repository' | translate }}\n</c8y-title>\n\n<c8y-breadcrumb>\n  <c8y-breadcrumb-item\n    icon=\"c8y-management\"\n    label=\"{{ 'Management' | translate }}\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    icon=\"c8y-firmware\"\n    label=\"{{ 'Firmware repository' | translate }}\"\n  ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n  <button\n    class=\"btn btn-link\"\n    title=\"{{ 'Add firmware' | translate }}\"\n    (click)=\"addFirmware()\"\n    data-cy=\"firmware-list--toolbar-add-firmware-btn\"\n  >\n    <i c8yIcon=\"plus-circle\"></i>\n    {{ 'Add firmware' | translate }}\n  </button>\n</c8y-action-bar-item>\n\n@if (isDataPresent$ | async) {\n  <c8y-action-bar-item [placement]=\"'right'\">\n    <button\n      class=\"btn btn-link\"\n      title=\"{{ 'Add firmware patch' | translate }}\"\n      (click)=\"addFirmwarePatch()\"\n    >\n      <i c8yIcon=\"plus-circle\"></i>\n      {{ 'Add firmware patch' | translate }}\n    </button>\n  </c8y-action-bar-item>\n}\n\n<c8y-help\n  src=\"/docs/device-management-application/managing-device-data/#managing-firmware\"\n></c8y-help>\n\n<div class=\"content-fullpage border-top border-bottom\">\n  <c8y-data-grid\n    [title]=\"'Firmware' | translate\"\n    [refresh]=\"refresh$\"\n    [pagination]=\"pagination\"\n    [columns]=\"columns\"\n    [actionControls]=\"actionControls\"\n    [infiniteScroll]=\"'auto'\"\n    [serverSideDataCallback]=\"serverSideDataCallback\"\n  >\n    <c8y-ui-empty-state\n      [icon]=\"stats?.size > 0 ? 'search' : 'c8y-tools'\"\n      [title]=\"stats?.size > 0 ? (noResultsMessage | translate) : (noDataMessage | translate)\"\n      [subtitle]=\"stats?.size > 0 ? (noResultsSubtitle | translate) : (noDataSubtitle | translate)\"\n      *emptyStateContext=\"let stats\"\n      [horizontal]=\"stats?.size > 0\"\n    >\n      @if (stats?.size === 0) {\n        <p>\n          <button\n            class=\"btn btn-primary\"\n            title=\"{{ 'Add firmware' | translate }}\"\n            type=\"button\"\n            (click)=\"addFirmware()\"\n          >\n            {{ 'Add firmware' | translate }}\n          </button>\n        </p>\n      }\n    </c8y-ui-empty-state>\n  </c8y-data-grid>\n</div>\n","import { Injectable } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { NavigatorNode, NavigatorNodeFactory } from '@c8y/ngx-components';\n\n@Injectable()\nexport class FirmwareRepositoryNavigationFactory implements NavigatorNodeFactory {\n  node: NavigatorNode;\n\n  constructor() {\n    this.node = new NavigatorNode({\n      label: gettext('Firmware repository'),\n      path: 'firmware',\n      icon: 'c8y-firmware',\n      parent: gettext('Management'),\n      priority: 1000\n    });\n  }\n\n  get(): NavigatorNode {\n    return this.node;\n  }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { hookNavigator, hookRoute } from '@c8y/ngx-components';\nimport { SharedRepositoryModule } from '@c8y/ngx-components/repository/shared';\nimport { AddFirmwareModalComponent } from './add-firmware-modal.component';\nimport { AddFirmwarePatchModalComponent } from './add-firmware-patch-modal.component';\nimport { FirmwareDetailsComponent } from './firmware-details.component';\nimport { FirmwareListComponent } from './firmware-list.component';\nimport { FirmwareRepositoryNavigationFactory } from './firmware-repository-navigation-factory';\n\n@NgModule({\n  imports: [\n    SharedRepositoryModule,\n    FirmwareListComponent,\n    FirmwareDetailsComponent,\n    AddFirmwareModalComponent,\n    AddFirmwarePatchModalComponent\n  ]\n})\nexport class FirmwareRepositoryListModule {\n  static forRoot(): ModuleWithProviders<FirmwareRepositoryListModule> {\n    return {\n      ngModule: FirmwareRepositoryListModule,\n      providers: [\n        hookNavigator(FirmwareRepositoryNavigationFactory),\n        hookRoute([\n          {\n            path: 'firmware',\n            component: FirmwareListComponent\n          },\n          {\n            path: 'firmware/:id',\n            component: FirmwareDetailsComponent\n          }\n        ])\n      ]\n    };\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { FirmwareRepositoryDeviceTabModule } from './device-tab/firmware-repository-device-tab.module';\nimport { FirmwareRepositoryListModule } from './list/firmware-repository-list.module';\n\n@NgModule({\n  imports: [FirmwareRepositoryListModule.forRoot(), FirmwareRepositoryDeviceTabModule.forRoot()]\n})\nexport class FirmwareRepositoryModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i4","i5","i1","i3","i2","i6","i7","map","i1.FirmwareRepositoryListModule","i2.FirmwareRepositoryDeviceTabModule"],"mappings":"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"}