{"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 { GainsightService, gettext, ModalSelectionMode } 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';\n\n@Component({\n  selector: 'c8y-firmware-device-tab',\n  templateUrl: 'firmware-device-tab.component.html',\n  standalone: false\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 { CommonModule } from '@angular/common';\nimport { FirmwareDeviceTabComponent } from './firmware-device-tab.component';\nimport { FirmwareDeviceTabGuard } from './firmware-device-tab.guard';\nimport { CoreModule, gettext, 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: [CommonModule, CoreModule, SharedRepositoryModule, OperationDetailsModule],\n  declarations: [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 } from '@angular/forms';\nimport { IManagedObject, IResultList } from '@c8y/client';\nimport { AlertService, gettext, PickedFiles } 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';\n\n@Component({\n  selector: 'c8y-add-firmware-patch-modal.component',\n  templateUrl: 'add-firmware-patch-modal.component.html',\n  standalone: false\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 translate id=\"addFirmwarePatchModalTitle\">Add firmware patch</h4>\n  </div>\n  <div class=\"p-16 text-center separator-bottom\" id=\"addFirmwarePatchModalDescription\">\n    <p class=\"text-medium text-16 m-0\" translate>Select a firmware version</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 for=\"firmwareName\" translate>Firmware</label>\n            <c8y-typeahead\n              [ngModel]=\"model.selected\"\n              name=\"firmwareName\"\n              placeholder=\"{{ 'Select or enter' | translate }}\"\n              (onSearch)=\"firmwareInput$.next($event)\"\n              [allowFreeEntries]=\"false\"\n              [required]=\"true\"\n            >\n              <c8y-li\n                *c8yFor=\"let firmware of firmwares$ | async; loadMore: 'auto'\"\n                class=\"p-l-8 p-r-8 c8y-list__item--link\"\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 for=\"patchDependency\" class=\"m-r-8\" translate>Version</label>\n          <c8y-typeahead\n            [ngModel]=\"model.dependency\"\n            name=\"patchDependency\"\n            data-cy=\"add-firmware-patch-modal--patchDependency\"\n            placeholder=\"{{ 'Select or enter' | translate }}\"\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              *c8yFor=\"\n                let baseVersion of baseVersions$;\n                loadMore: 'auto';\n                pipe: baseVersionsFilterPipe\n              \"\n              class=\"p-l-8 p-r-8 c8y-list__item--link\"\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 for=\"patchVersion\" translate>Patch</label>\n          <input\n            id=\"patchVersion\"\n            class=\"form-control\"\n            autocomplete=\"off\"\n            name=\"patchVersion\"\n            data-cy=\"add-firmware-patch-modal--patchVersion\"\n            [(ngModel)]=\"model.patchVersion\"\n            placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n            required\n          />\n        </c8y-form-group>\n\n        <c8y-form-group>\n          <div class=\"legend form-block m-t-40\" translate>Patch file</div>\n          <c8y-file-picker\n            [maxAllowedFiles]=\"1\"\n            (onFilesPicked)=\"onFile($event)\"\n            [fileUrlPopover]=\"textForFirmwareUrlPopover\"\n          ></c8y-file-picker>\n        </c8y-form-group>\n      </div>\n    </div>\n    <div class=\"modal-footer\">\n      <button\n        title=\"{{ 'Cancel' | translate }}\"\n        data-cy=\"add-firmware-patch-modal--cancel-btn\"\n        class=\"btn btn-default\"\n        type=\"button\"\n        (click)=\"cancel()\"\n        [disabled]=\"saving\"\n        translate\n      >\n        Cancel\n      </button>\n      <button\n        title=\"{{ 'Add firmware patch' | translate }}\"\n        class=\"btn btn-primary\"\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) ||\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 { Component, EventEmitter, Output, ViewChild } from '@angular/core';\nimport { NgForm } from '@angular/forms';\nimport { IManagedObject } from '@c8y/client';\nimport { AlertService, gettext, PickedFiles, ValidationPattern } 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 { assign, get, isUndefined } from 'lodash-es';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\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  standalone: false\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 class=\"modal-title\" translate id=\"addFirmwareModalTitle\">Add firmware</div>\n  </div>\n  <div class=\"p-16 text-center separator-bottom\" *ngIf=\"!firmwarePreselected\">\n    <p class=\"text-medium text-16 m-0\" translate>Select or create new firmware</p>\n  </div>\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 class=\"modal-body\" id=\"addFirmwareModalDescription\">\n        <div [hidden]=\"firmwarePreselected\">\n          <c8y-form-group>\n            <label for=\"firmwareName\" translate>Firmware</label>\n            <c8y-typeahead\n              [(ngModel)]=\"model.selected\"\n              name=\"firmwareName\"\n              placeholder=\"{{ 'Select or enter' | translate }}\"\n              data-cy=\"add-firmware-modal--input-name\"\n              (onSearch)=\"onInput.next($event)\"\n              [required]=\"true\"\n            >\n              <c8y-li\n                *c8yFor=\"\n                  let firmware of firmwaresResult;\n                  loadMore: 'auto';\n                  notFound: notFoundTemplate\n                \"\n                class=\"p-l-8 p-r-8 c8y-list__item--link\"\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                <c8y-li class=\"bg-level-2 p-8\" *ngIf=\"(onInput | async)?.length > 0\">\n                  <span translate>No match found.</span>\n                  <button\n                    class=\"btn btn-primary btn-xs m-l-8\"\n                    type=\"button\"\n                    title=\"{{ 'Add new`firmware`' | translate }}\"\n                    translate\n                  >\n                    Add new`firmware`\n                  </button>\n                </c8y-li>\n              </ng-template>\n            </c8y-typeahead>\n          </c8y-form-group>\n\n          <c8y-form-group>\n            <label for=\"firmwareDescription\" translate>Description</label>\n            <input\n              id=\"firmwareDescription\"\n              data-cy=\"add-firmware-modal--input-description\"\n              class=\"form-control\"\n              autocomplete=\"off\"\n              name=\"description\"\n              [(ngModel)]=\"model.description\"\n              placeholder=\"{{ 'e.g. Firmware for hardware revision B' | translate }}\"\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 class=\"control-label\" for=\"firmwareDeviceTypeFilter\">\n              {{ 'Device type filter' | translate }}\n              <button\n                class=\"btn-help\"\n                type=\"button\"\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                triggers=\"focus\"\n                placement=\"right\"\n                container=\"body\"\n              ></button>\n            </label>\n            <input\n              id=\"firmwareDeviceTypeFilter\"\n              data-cy=\"add-firmware-modal--firmwareDeviceTypeFilter\"\n              class=\"form-control\"\n              name=\"firmwareDeviceTypeFilter\"\n              [(ngModel)]=\"model.deviceType\"\n              placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\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 for=\"firmwareVersion\" translate>Version</label>\n          <input\n            id=\"firmwareVersion\"\n            data-cy=\"add-firmware-modal--firmwareVersion\"\n            class=\"form-control\"\n            autocomplete=\"off\"\n            name=\"version\"\n            [(ngModel)]=\"model.version\"\n            placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n            [required]=\"true\"\n            [pattern]=\"ValidationPattern.rules.noWhiteSpaceOnly.pattern\"\n          />\n        </c8y-form-group>\n\n        <c8y-form-group>\n          <div class=\"legend form-block m-t-40\" translate>Firmware file</div>\n          <c8y-file-picker\n            [maxAllowedFiles]=\"1\"\n            (onFilesPicked)=\"onFile($event)\"\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        type=\"button\"\n        title=\"{{ 'Cancel' | translate }}\"\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        type=\"submit\"\n        title=\"{{ 'Add firmware' | translate }}\"\n        [ngClass]=\"{ 'btn-pending': saving }\"\n        [disabled]=\"\n          !firmwareForm.form.valid ||\n          firmwareForm.form.pristine ||\n          saving ||\n          (!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 { Component, OnDestroy, OnInit } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { IManagedObject, IResultList, InventoryService } from '@c8y/client';\nimport {\n  AlertService,\n  GainsightService,\n  ModalService,\n  Status,\n  gettext,\n  memoize\n} from '@c8y/ngx-components';\nimport {\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 { 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  standalone: false\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    label=\"{{ 'Management' | translate }}\"\n    icon=\"c8y-management\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    path=\"#/firmware\"\n    label=\"{{ 'Firmware repository' | translate }}\"\n    icon=\"c8y-firmware\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    label=\"{{ (firmware$ | async)?.name }}\"\n    icon=\"c8y-firmware\"\n  ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n  <button\n    *ngIf=\"!(isLegacy$ | async)\"\n    class=\"btn btn-link\"\n    type=\"button\"\n    title=\"{{ 'Add firmware' | translate }}\"\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</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n  <button\n    *ngIf=\"canAddPatchVersions$ | async\"\n    class=\"btn btn-link\"\n    type=\"button\"\n    title=\"{{ 'Add firmware patch' | translate }}\"\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</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n  <button\n    class=\"btn btn-link\"\n    type=\"button\"\n    title=\"{{ 'Reload' | translate }}\"\n    (click)=\"reload$.next()\"\n  >\n    <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading$ | async }\"></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                      #nameInput\n                      type=\"text\"\n                      class=\"form-control\"\n                      [ngModel]=\"(firmware$ | async)?.name\"\n                      #nameModel=\"ngModel\"\n                      placeholder=\"{{ 'e.g. My firmware' | translate }}\"\n                      data-cy=\"firmware-details--name-input\"\n                      [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.name?.length + 2 || 36 }\"\n                      required\n                    />\n                    <span></span>\n                    <div class=\"input-group-btn\">\n                      <button\n                        class=\"btn btn-primary\"\n                        type=\"button\"\n                        title=\"{{ 'Save' | translate }}\"\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                      #descriptionInput\n                      type=\"text\"\n                      class=\"form-control\"\n                      [ngModel]=\"(firmware$ | async)?.description\"\n                      #descriptionModel=\"ngModel\"\n                      placeholder=\"{{ 'e.g. Firmware for hardware revision B' | translate }}\"\n                      data-cy=\"firmware-details--description-input\"\n                      [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.description?.length || 36 }\"\n                    />\n                    <span></span>\n                    <div class=\"input-group-btn\">\n                      <button\n                        class=\"btn btn-primary\"\n                        type=\"button\"\n                        title=\"{{ 'Save' | translate }}\"\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                      type=\"button\"\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                    >\n                      <i c8yIcon=\"question-circle-o\"></i>\n                    </button>\n                  </label>\n                  <div class=\"input-group input-group-editable\">\n                    <input\n                      #deviceTypeInput\n                      type=\"text\"\n                      class=\"form-control\"\n                      [ngModel]=\"(firmware$ | async)?.c8y_Filter?.type\"\n                      #deviceTypeModel=\"ngModel\"\n                      placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n                      data-cy=\"firmware-details--device-type-filter-input\"\n                      [ngStyle]=\"{ 'width.ch': (firmware$ | async)?.type?.length || 36 }\"\n                    />\n                    <span></span>\n                    <div class=\"input-group-btn\">\n                      <button\n                        class=\"btn btn-primary\"\n                        type=\"button\"\n                        title=\"{{ 'Save' | translate }}\"\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 class=\"card-title\" translate>Versions and patches</div>\n        </div>\n\n        <div class=\"card-block p-t-0 p-b-24\">\n          <div *ngIf=\"(baseVersions$ | async)?.data.length === 0\">\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                type=\"button\"\n                title=\"{{ 'Add firmware' | translate }}\"\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          <c8y-list-group *ngIf=\"(baseVersions$ | async)?.data.length > 0\">\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\n              <c8y-li-body class=\"content-flex-50\">\n                <div class=\"col-4\">\n                  <p class=\"text-truncate\" title=\"{{ baseVersion.c8y_Firmware.version }}\">\n                    {{ baseVersion.c8y_Firmware.version }}\n                  </p>\n                </div>\n                <div class=\"col-5\">\n                  <p class=\"text-truncate\">\n                    <span class=\"text-label-small m-r-8\" translate>File</span>\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                  </p>\n                </div>\n                <div class=\"col-2 d-flex a-i-start\">\n                  <span *ngIf=\"isLegacy$ | async\" class=\"label label-warning m-l-auto-sm\">\n                    {{ 'Legacy' | translate }}\n                  </span>\n\n                  <span *ngIf=\"!(isLegacy$ | async)\">\n                    <span *ngIf=\"(getPatchVersionsCount$(baseVersion) | async) === null\">\n                      <span class=\"label label-info\">\n                        <i c8yIcon=\"circle-o-notch\" class=\"icon-spin\"></i>\n                      </span>\n                    </span>\n                    <span *ngIf=\"(getPatchVersionsCount$(baseVersion) | async) !== null\">\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                  </span>\n                </div>\n                <div class=\"fit-h-20 visible-xs\" *ngIf=\"!(isLegacy$ | async)\">\n                  <button\n                    class=\"btn btn-default btn-sm m-t-8\"\n                    type=\"button\"\n                    title=\"{{ 'Delete' | translate }}\"\n                    (click)=\"deleteBaseVersion(baseVersion)\"\n                  >\n                    <i c8yIcon=\"delete\"></i>\n                    {{ 'Delete' | translate }}\n                  </button>\n                </div>\n                <div *ngIf=\"!(isLegacy$ | async)\" class=\"m-l-auto fit-h-20 p-r-8 hidden-xs\">\n                  <button\n                    class=\"btn btn-dot btn-dot--danger showOnHover\"\n                    type=\"button\"\n                    [attr.aria-label]=\"'Delete' | translate\"\n                    data-cy=\"firmware-details--delete-base-version\"\n                    tooltip=\"{{ 'Delete' | translate }}\"\n                    [delay]=\"500\"\n                    (click)=\"deleteBaseVersion(baseVersion)\"\n                  >\n                    <i c8yIcon=\"delete\"></i>\n                  </button>\n                </div>\n              </c8y-li-body>\n              <c8y-li-collapse *ngIf=\"(getPatchVersions$(baseVersion) | async)?.data.length\">\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 class=\"text-label-small m-r-8\" translate>File</span>\n                          <c8y-file-download\n                            url=\"{{ patchVersion.c8y_Firmware.url }}\"\n                          ></c8y-file-download>\n                        </div>\n                      </div>\n                      <div class=\"visible-xs m-t-8\">\n                        <button\n                          class=\"btn btn-danger btn-xs\"\n                          type=\"button\"\n                          title=\"{{ 'Delete' | translate }}\"\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                          type=\"button\"\n                          [attr.aria-label]=\"'Delete' | translate\"\n                          tooltip=\"{{ 'Delete' | translate }}\"\n                          placement=\"right\"\n                          [delay]=\"500\"\n                          (click)=\"deletePatchVersion(patchVersion)\"\n                        >\n                          <i c8yIcon=\"delete\" data-cy=\"firmware-details--Remove-icon\"></i>\n                        </button>\n                      </div>\n                    </c8y-li-body>\n                  </c8y-li>\n                </c8y-list-group>\n              </c8y-li-collapse>\n            </c8y-li>\n          </c8y-list-group>\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 {\n  ActionControl,\n  AlertService,\n  BuiltInActionType,\n  Column,\n  DataGridService,\n  DataSourceModifier,\n  ModalService,\n  ServerSideDataCallback,\n  ServerSideDataResult,\n  Status,\n  gettext\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';\n\n@Component({\n  selector: 'c8y-firmware-list',\n  templateUrl: 'firmware-list.component.html',\n  standalone: false\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<c8y-action-bar-item [placement]=\"'right'\">\n  <button\n    class=\"btn btn-link\"\n    title=\"{{ 'Add firmware patch' | translate }}\"\n    *ngIf=\"isDataPresent$ | async\"\n    (click)=\"addFirmwarePatch()\"\n  >\n    <i c8yIcon=\"plus-circle\"></i>\n    {{ 'Add firmware patch' | translate }}\n  </button>\n</c8y-action-bar-item>\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      <p *ngIf=\"stats?.size === 0\">\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    </c8y-ui-empty-state>\n    <ng-container *ngFor=\"let column of columns; trackBy: trackByName\">\n      <c8y-column [name]=\"column.name\"></c8y-column>\n    </ng-container>\n  </c8y-data-grid>\n</div>\n","import { Injectable } from '@angular/core';\nimport { gettext, 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 { CommonModule } from '@angular/common';\nimport { ModuleWithProviders, NgModule } from '@angular/core';\nimport { CoreModule, FormsModule, hookNavigator, hookRoute } from '@c8y/ngx-components';\nimport { DeviceGridModule } from '@c8y/ngx-components/device-grid';\nimport { SharedRepositoryModule } from '@c8y/ngx-components/repository/shared';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\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    CommonModule,\n    CoreModule,\n    FormsModule,\n    DeviceGridModule,\n    PopoverModule,\n    TooltipModule,\n    SharedRepositoryModule\n  ],\n  declarations: [\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","i6","i7","i1","i3","i2","i8","i9","map","i1.FirmwareRepositoryListModule","i2.FirmwareRepositoryDeviceTabModule"],"mappings":"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"}