{"version":3,"file":"c8y-ngx-components-repository-software.mjs","sources":["../../repository/software/list/add-software-modal.component.ts","../../repository/software/list/add-software-modal.component.html","../../repository/software/list/software-list.component.ts","../../repository/software/list/software-list.component.html","../../repository/software/list/software-details.component.ts","../../repository/software/list/software-details.component.html","../../repository/software/list/software-repository-navigation-factory.ts","../../repository/software/list/software-repository-list.module.ts","../../repository/software/device-tab/device-software.service.ts","../../repository/software/device-tab/device-software-list.component.ts","../../repository/software/device-tab/device-software-list.component.html","../../repository/software/device-tab/device-software-changes.component.ts","../../repository/software/device-tab/device-software-changes.component.html","../../repository/software/device-tab/installed-software.component.ts","../../repository/software/device-tab/installed-software.component.html","../../repository/software/device-tab/software-device-tab.component.ts","../../repository/software/device-tab/software-device-tab.component.html","../../repository/software/device-tab/software-device-tab.guard.ts","../../repository/software/device-tab/software-repository-device-tab.module.ts","../../repository/software/software-repository.module.ts","../../repository/software/c8y-ngx-components-repository-software.ts"],"sourcesContent":["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  SoftwareTypeComponent\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-software-software-modal',\n  templateUrl: 'add-software-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    SoftwareTypeComponent,\n    FilePickerComponent,\n    ProductExperienceDirective,\n    NgClass,\n    AsyncPipe,\n    C8yTranslatePipe\n  ]\n})\nexport class AddSoftwareModalComponent {\n  PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_REPOSITORY_SHARED;\n  @ViewChild('softwareForm', { 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    softwareType: undefined,\n    binary: {\n      file: undefined,\n      url: undefined\n    }\n  };\n\n  softwaresResult;\n  saving = false;\n  softwarePreselected = false;\n  textForSoftwareUrlPopover: string =\n    gettext(`Path for binaries can vary depending on device agent implementation, for example:\n    /software/binaries/software1.bin\n    https://software/binary/123\n    ftp://software/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.loadSoftwares();\n  }\n\n  setInitialState() {\n    if (this.model.selected) {\n      this.softwarePreselected = true;\n    }\n  }\n\n  loadSoftwares() {\n    this.inputSubscription$ = this.onInput\n      .pipe(\n        tap(() => {\n          if (!this.softwarePreselected) {\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.getSoftwareResult(searchStr))\n      )\n      .subscribe(result => {\n        this.softwaresResult = result;\n      });\n  }\n\n  getSoftwareResult(searchStr: string) {\n    return from(\n      this.repositoryService.listRepositoryEntries(RepositoryType.SOFTWARE, {\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.SOFTWARE)\n      .then(savedSoftware => {\n        this.successMsg();\n        this.saving = false;\n        this.saved.next(savedSoftware);\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('Software 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  onSoftwareSelect(software: IManagedObject) {\n    assign(this.model, {\n      selected: software,\n      description: software.description,\n      deviceType: get(software, 'c8y_Filter.type'),\n      softwareType: software\n    });\n  }\n}\n","<div class=\"viewport-modal\">\n  <div class=\"modal-header dialog-header\">\n    <i [c8yIcon]=\"'c8y-tools'\"></i>\n    <div\n      class=\"modal-title\"\n      id=\"addSoftwareModalTitle\"\n      translate\n    >\n      Add software\n    </div>\n  </div>\n  @if (!softwarePreselected) {\n    <div class=\"p-16 text-center separator-bottom\">\n      <p\n        class=\"text-medium text-16\"\n        translate\n      >\n        Select or create new software\n      </p>\n    </div>\n  }\n  <form\n    class=\"d-contents\"\n    autocomplete=\"off\"\n    #softwareForm=\"ngForm\"\n    (ngSubmit)=\"softwareForm.form.valid && save()\"\n  >\n    <div class=\"modal-inner-scroll\">\n      <div\n        class=\"modal-body\"\n        id=\"addSoftwareModalDescription\"\n      >\n        <div [hidden]=\"softwarePreselected\">\n          <c8y-form-group>\n            <label\n              for=\"softwareName\"\n              translate\n            >\n              Software\n            </label>\n            <c8y-typeahead\n              placeholder=\"{{ 'Select or enter' | translate }}\"\n              name=\"softwareName\"\n              [(ngModel)]=\"model.selected\"\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 software of softwaresResult;\n                  loadMore: 'auto';\n                  notFound: notFoundTemplate\n                \"\n                (click)=\"onSoftwareSelect(software)\"\n                [active]=\"model.selected === software\"\n              >\n                <c8y-highlight\n                  [text]=\"software.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`software`' | translate }}\"\n                      type=\"button\"\n                    >\n                      {{ 'Add new`software`' | translate }}\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=\"softwareDescription\"\n              translate\n            >\n              Description\n            </label>\n            <input\n              class=\"form-control\"\n              id=\"softwareDescription\"\n              placeholder=\"{{ 'e.g. Cloud connectivity software' | translate }}\"\n              name=\"description\"\n              autocomplete=\"off\"\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=\"softwareDeviceTypeFilter\"\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 software 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=\"softwareDeviceTypeFilter\"\n              placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n              name=\"softwareDeviceTypeFilter\"\n              [(ngModel)]=\"model.deviceType\"\n              [disabled]=\"model.selected?.id\"\n              [pattern]=\"ValidationPattern.rules.noWhiteSpaceOnly.pattern\"\n            />\n          </c8y-form-group>\n\n          <c8y-form-group>\n            <label\n              for=\"softwareType\"\n              translate\n            >\n              Software type\n            </label>\n            <c8y-software-type\n              name=\"softwareType\"\n              [(ngModel)]=\"model.softwareType\"\n              [disabled]=\"model.selected?.id\"\n            ></c8y-software-type>\n          </c8y-form-group>\n        </div>\n\n        <c8y-form-group>\n          <label\n            for=\"softwareVersion\"\n            translate\n          >\n            Version\n          </label>\n          <input\n            class=\"form-control\"\n            id=\"softwareVersion\"\n            placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n            name=\"version\"\n            autocomplete=\"off\"\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            Software file\n          </div>\n          <c8y-file-picker\n            [maxAllowedFiles]=\"1\"\n            [allowedUploadChoices]=\"['uploadBinary', 'uploadUrl', 'provided']\"\n            (onFilesPicked)=\"onFile($event)\"\n            [fileUrlPopover]=\"textForSoftwareUrlPopover\"\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        (click)=\"cancel()\"\n        [disabled]=\"saving\"\n      >\n        {{ 'Cancel' | translate }}\n      </button>\n\n      <button\n        class=\"btn btn-primary\"\n        title=\"{{ 'Add software' | translate }}\"\n        type=\"submit\"\n        [ngClass]=\"{ 'btn-pending': saving }\"\n        [disabled]=\"\n          !softwareForm.form.valid ||\n          softwareForm.form.pristine ||\n          saving ||\n          (model.binary?.url == null && !model.binary?.file)\n        \"\n        c8yProductExperience\n        [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.REPOSITORY\"\n        [actionData]=\"{\n          component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.ADD_SOFTWARE_MODAL,\n          result:\n            softwarePreselected || model.selected?.id\n              ? PRODUCT_EXPERIENCE.SOFTWARE.RESULTS.ADD_SOFTWARE_VERSION\n              : PRODUCT_EXPERIENCE.SOFTWARE.RESULTS.ADD_SOFTWARE\n        }\"\n      >\n        {{ 'Add software' | translate }}\n      </button>\n    </div>\n  </form>\n</div>\n","import { Component, EventEmitter, OnInit } 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  TypeGridColumn,\n  VersionsGridColumn\n} from '@c8y/ngx-components/repository/shared';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BsModalService, ModalOptions } from 'ngx-bootstrap/modal';\nimport { AddSoftwareModalComponent } from './add-software-modal.component';\n\n@Component({\n  selector: 'c8y-software-list',\n  templateUrl: 'software-list.component.html',\n  imports: [\n    TitleComponent,\n    BreadcrumbComponent,\n    BreadcrumbItemComponent,\n    ActionBarItemComponent,\n    IconDirective,\n    HelpComponent,\n    DataGridComponent,\n    EmptyStateContextDirective,\n    EmptyStateComponent,\n    C8yTranslatePipe\n  ]\n})\nexport class SoftwareListComponent implements OnInit {\n  sizeRequest: Promise<number>;\n  sizeRequestDone = false;\n  refresh$: EventEmitter<void> = new EventEmitter();\n\n  columns: Column[] = [\n    new RepositoryItemNameGridColumn({\n      filterLabel: gettext('Filter software by name')\n    }),\n    new DescriptionGridColumn({\n      filterLabel: gettext('Filter software by description'),\n      placeholder: gettext('Cloud connectivity software')\n    }),\n    new DeviceTypeGridColumn({ filterLabel: gettext('Filter software by device type') }),\n    new TypeGridColumn({\n      header: gettext('Software type'),\n      filterLabel: gettext('Filter by software type'),\n      example: 'yum',\n      path: 'softwareType',\n      repositoryType: RepositoryType.SOFTWARE\n    }),\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 software to display.');\n  noResultsSubtitle = gettext('Refine your search terms or check your spelling.');\n  noDataSubtitle = gettext('Add a new software 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.editSoftware.bind(this)\n    });\n    this.actionControls.push({\n      type: BuiltInActionType.Delete,\n      callback: this.deleteSoftware.bind(this)\n    });\n  }\n\n  async onDataSourceModifier(\n    dataSourceModifier: DataSourceModifier\n  ): Promise<ServerSideDataResult> {\n    const dataRequest: Promise<IResultList<IManagedObject>> =\n      this.repositoryService.listRepositoryEntries(RepositoryType.SOFTWARE, {\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.SOFTWARE, {\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.SOFTWARE, {\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  addSoftware() {\n    const config: ModalOptions<AddSoftwareModalComponent> = {\n      class: 'modal-sm',\n      ariaDescribedby: 'addSoftwareModalDescription',\n      ariaLabelledBy: 'addSoftwareModalTitle',\n      ignoreBackdropClick: true,\n      keyboard: false\n    };\n    const modalRef = this.bsModalService.show(AddSoftwareModalComponent, config);\n    modalRef.content.saved.subscribe(savedSoftware => this.editSoftware(savedSoftware));\n  }\n\n  editSoftware(software: Partial<IManagedObject>) {\n    this.router.navigate([software.id], { relativeTo: this.activatedRoute });\n  }\n\n  async deleteSoftware(software: IManagedObject) {\n    try {\n      const title = gettext('Delete software');\n      const body = `\n        ${this.translateService.instant(\n          gettext('You are about to delete software \"{{ name }}\" with all its versions.'),\n          { name: software.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.SOFTWARE.EVENTS.REPOSITORY }\n      );\n      await this.repositoryService.delete(software);\n      this.alertService.success(gettext('Software 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  trackByName(_index, column: Column): string {\n    return column.name;\n  }\n}\n","<c8y-title>\n  {{ 'Software repository' | translate }}\n</c8y-title>\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-tools\"\n    label=\"{{ 'Software 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 software' | translate }}\"\n    type=\"button\"\n    (click)=\"addSoftware()\"\n  >\n    <i c8yIcon=\"plus-circle\"></i>\n    {{ 'Add software' | translate }}\n  </button>\n</c8y-action-bar-item>\n\n<c8y-help\n  src=\"/docs/device-management-application/managing-device-data/#managing-software\"\n></c8y-help>\n\n<div class=\"content-fullpage border-top border-bottom\">\n  <c8y-data-grid\n    [title]=\"'Software' | 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 software' | translate\"\n            type=\"button\"\n            (click)=\"addSoftware()\"\n          >\n            {{ 'Add software' | translate }}\n          </button>\n        </p>\n      }\n    </c8y-ui-empty-state>\n  </c8y-data-grid>\n</div>\n","import { AsyncPipe, NgClass, NgStyle } from '@angular/common';\nimport { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { IManagedObject, InventoryService, IResultList } from '@c8y/client';\nimport {\n  ActionBarItemComponent,\n  AlertService,\n  BreadcrumbComponent,\n  BreadcrumbItemComponent,\n  C8yTranslateDirective,\n  C8yTranslatePipe,\n  EmptyStateComponent,\n  FormGroupComponent,\n  ForOfDirective,\n  GainsightService,\n  IconDirective,\n  ListGroupComponent,\n  ListItemBodyComponent,\n  ListItemComponent,\n  ListItemIconComponent,\n  memoize,\n  ModalService,\n  RequiredInputPlaceholderDirective,\n  Status,\n  TitleComponent\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  FileDownloadComponent,\n  PRODUCT_EXPERIENCE_REPOSITORY_SHARED,\n  RepositoryService,\n  SoftwareTypeComponent\n} from '@c8y/ngx-components/repository/shared';\nimport { TranslateService } from '@ngx-translate/core';\nimport { BsModalService, ModalOptions } from 'ngx-bootstrap/modal';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\nimport { BehaviorSubject, from, merge, Observable, Subject } from 'rxjs';\nimport {\n  distinctUntilKeyChanged,\n  map,\n  shareReplay,\n  switchMap,\n  take,\n  takeUntil,\n  tap,\n  withLatestFrom\n} from 'rxjs/operators';\nimport { AddSoftwareModalComponent } from './add-software-modal.component';\n\n@Component({\n  selector: 'c8y-software-details',\n  templateUrl: './software-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    SoftwareTypeComponent,\n    C8yTranslateDirective,\n    EmptyStateComponent,\n    ListGroupComponent,\n    ForOfDirective,\n    ListItemComponent,\n    ListItemIconComponent,\n    ListItemBodyComponent,\n    FileDownloadComponent,\n    TooltipDirective,\n    AsyncPipe,\n    C8yTranslatePipe\n  ]\n})\nexport class SoftwareDetailsComponent implements OnInit, OnDestroy {\n  @ViewChild(SoftwareTypeComponent, { static: true })\n  softwareType: SoftwareTypeComponent;\n\n  reload$: Subject<void> = new Subject();\n  reloading$: BehaviorSubject<boolean> = new BehaviorSubject(false);\n  softwareTypeObject: IManagedObject;\n  isSoftwareTypeChanged = false;\n\n  updateSoftware$: Subject<Partial<IManagedObject>> = new Subject();\n  softwareUpdated$: Subject<IManagedObject> = new Subject();\n  baseVersionsUpdated$: Subject<void> = new Subject();\n\n  software$: Observable<IManagedObject> = merge(\n    this.activatedRoute.params.pipe(\n      map(params => params.id),\n      switchMap(id => from(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 => from(this.inventoryService.detail(id).then(result => result.data))),\n      tap(() => this.reloading$.next(false))\n    ),\n    this.softwareUpdated$\n  ).pipe(shareReplay(1));\n\n  baseVersions$: Observable<IResultList<IManagedObject>> = merge(\n    this.software$.pipe(distinctUntilKeyChanged('id')),\n    this.baseVersionsUpdated$,\n    this.reload$\n  ).pipe(\n    switchMap(() => this.software$),\n    switchMap(software => this.repositoryService.listBaseVersions(software)),\n    shareReplay(1)\n  );\n\n  isLegacy$: Observable<boolean> = this.software$.pipe(\n    map(software => this.repositoryService.isLegacyEntry(software)),\n    shareReplay(1)\n  );\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.updateSoftware$\n      .pipe(\n        withLatestFrom(this.software$),\n        switchMap(([softwarePartial, software]) =>\n          this.inventoryService.update({\n            id: software.id,\n            ...softwarePartial\n          })\n        ),\n        map(({ data }) => data),\n        tap(software => this.softwareUpdated$.next(software)),\n        tap(() => this.alertService.success(gettext('Saved.'))),\n        tap(() =>\n          this.gainsightService.triggerEvent(\n            PRODUCT_EXPERIENCE_REPOSITORY_SHARED.SOFTWARE.EVENTS.REPOSITORY,\n            {\n              result: PRODUCT_EXPERIENCE_REPOSITORY_SHARED.SOFTWARE.RESULTS.EDIT_SOFTWARE\n            }\n          )\n        ),\n        takeUntil(this.destroy$)\n      )\n      .subscribe();\n\n    this.software$.subscribe(software => {\n      this.softwareTypeObject = software;\n    });\n  }\n\n  @memoize()\n  getBinaryName$(binaryUrl) {\n    return this.repositoryService.getBinaryName$(binaryUrl);\n  }\n\n  addBaseVersion() {\n    this.software$\n      .pipe(\n        take(1),\n        switchMap(software => {\n          const initialState = {\n            model: {\n              selected: software,\n              description: software.description\n            }\n          };\n          const config: ModalOptions<AddSoftwareModalComponent> = {\n            class: 'modal-sm',\n            ariaDescribedby: 'addSoftwareModalDescription',\n            ariaLabelledBy: 'addSoftwareModalTitle',\n            ignoreBackdropClick: true,\n            keyboard: false,\n            initialState\n          };\n          const modalRef = this.bsModalService.show(AddSoftwareModalComponent, config);\n          return modalRef.content.saved;\n        })\n      )\n      .subscribe(() => this.baseVersionsUpdated$.next());\n  }\n\n  async deleteBaseVersion(baseVersion: IManagedObject) {\n    try {\n      const title = gettext('Delete software');\n      const body = `\n        ${this.translateService.instant(\n          gettext('You are about to delete software {{ version }}.'),\n          { version: baseVersion.c8y_Software.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(title, body, Status.DANGER, labels);\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.softwareTypeObject);\n        this.router.navigateByUrl('/software');\n      } else {\n        await this.repositoryService.delete(baseVersion);\n        this.baseVersionsUpdated$.next();\n      }\n      this.alertService.success(gettext('Software deleted.'));\n    } catch (ex) {\n      // only if not cancel from modal\n      if (ex) {\n        this.alertService.addServerFailure(ex);\n      }\n    }\n  }\n\n  onSelectSoftwareType(software) {\n    this.isSoftwareTypeChanged = !(\n      this.softwareTypeObject?.softwareType === software?.softwareType\n    );\n    this.softwareTypeObject = software;\n  }\n\n  ngOnDestroy() {\n    this.destroy$.next(true);\n    this.destroy$.unsubscribe();\n  }\n}\n","<c8y-title>\n  {{ (software$ | 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-tools\"\n    path=\"#/software\"\n    label=\"{{ 'Software repository' | translate }}\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    icon=\"c8y-tools\"\n    label=\"{{ (software$ | 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 software' | translate }}\"\n      type=\"button\"\n      (click)=\"addBaseVersion()\"\n    >\n      <i c8yIcon=\"plus-circle\"></i>\n      {{ 'Add software' | 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 overflow-visible\">\n        <div class=\"content-flex-70\">\n          <div class=\"text-center\">\n            <i class=\"c8y-icon-duocolor icon-48 c8y-icon c8y-icon-tools\"></i>\n            <p>\n              <small class=\"label label-info\">Software</small>\n            </p>\n          </div>\n          <div class=\"flex-grow col-10\">\n            <div class=\"row\">\n              <div class=\"col-sm-6\">\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': (software$ | async)?.name?.length + 2 || 31 }\"\n                      placeholder=\"{{ 'e.g. My software' | translate }}\"\n                      type=\"text\"\n                      required\n                      #nameInput\n                      [ngModel]=\"(software$ | async)?.name\"\n                      #nameModel=\"ngModel\"\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                        (click)=\"updateSoftware$.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-sm-6\">\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': (software$ | async)?.description?.length + 2 || 31 }\"\n                      placeholder=\"{{ 'e.g. Cloud connectivity software' | translate }}\"\n                      type=\"text\"\n                      #descriptionInput\n                      [ngModel]=\"(software$ | async)?.description\"\n                      #descriptionModel=\"ngModel\"\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                        (click)=\"\n                          updateSoftware$.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>\n            <div class=\"row\">\n              <div class=\"col-sm-6\">\n                <c8y-form-group>\n                  <label class=\"control-label\">\n                    {{ 'Device type' | translate }}\n                    <button\n                      class=\"btn-help\"\n                      [attr.aria-label]=\"'Help' | translate\"\n                      popover=\"{{\n                        'If the filter is set, the software 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                      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': (software$ | async)?.type?.length + 2 || 31 }\"\n                      placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n                      type=\"text\"\n                      #deviceTypeInput\n                      [ngModel]=\"(software$ | async)?.c8y_Filter?.type\"\n                      #deviceTypeModel=\"ngModel\"\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                        (click)=\"\n                          updateSoftware$.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 class=\"col-sm-6\">\n                <c8y-form-group>\n                  <label class=\"control-label\">\n                    {{ 'Software type' | translate }}\n                  </label>\n                  <div class=\"input-group input-group-editable\">\n                    <c8y-software-type\n                      [style]=\"{ 'width.ch': softwareTypeObject?.softwareType?.length + 2 || 31 }\"\n                      [softwareTypeMO]=\"softwareTypeObject\"\n                      (onSelectSoftware)=\"onSelectSoftwareType($event)\"\n                    ></c8y-software-type>\n                    <div class=\"input-group-btn\">\n                      <button\n                        class=\"btn btn-primary\"\n                        title=\"{{ 'Save' | translate }}\"\n                        type=\"button\"\n                        [ngClass]=\"isSoftwareTypeChanged ? '' : 'hidden'\"\n                        [disabled]=\"softwareTypeObject?.softwareType === ''\"\n                        (click)=\"\n                          updateSoftware$.next({ softwareType: softwareTypeObject.softwareType });\n                          softwareType.resetInput();\n                          isSoftwareTypeChanged = false\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 sticky-top bg-component\">\n          <div\n            class=\"card-title\"\n            translate\n          >\n            Versions\n          </div>\n        </div>\n\n        <div class=\"card-block p-t-0 p-b-24\">\n          @if ((baseVersions$ | async)?.data.length === 0) {\n            <c8y-ui-empty-state\n              [icon]=\"'c8y-tools'\"\n              [title]=\"'No versions to display.' | translate\"\n              [subtitle]=\"'Add a new version by clicking below.' | translate\"\n            >\n              <p>\n                <button\n                  class=\"btn btn-primary\"\n                  title=\"{{ 'Add software' | translate }}\"\n                  type=\"button\"\n                  (click)=\"addBaseVersion()\"\n                >\n                  {{ 'Add software' | translate }}\n                </button>\n              </p>\n            </c8y-ui-empty-state>\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              >\n                <c8y-li-icon>\n                  <i c8yIcon=\"c8y-tools\"></i>\n                </c8y-li-icon>\n                <c8y-li-body class=\"content-flex-50\">\n                  <div class=\"col-4\">\n                    <p\n                      class=\"text-truncate-wrap\"\n                      title=\"{{ baseVersion.c8y_Software.version }}\"\n                    >\n                      {{ baseVersion.c8y_Software.version }}\n                    </p>\n                  </div>\n                  <div class=\"col-5\">\n                    <p class=\"text-truncate-wrap\">\n                      <span\n                        class=\"text-label-small m-r-8\"\n                        translate\n                      >\n                        File\n                      </span>\n                      @if (baseVersion?.c8y_Software?.url === '') {\n                        <span title=\"{{ 'Provided by device' | translate }}\">\n                          {{ 'Provided by device' | translate }}\n                        </span>\n                      } @else {\n                        <span title=\"{{ getBinaryName$(baseVersion.c8y_Software.url) | async }}\">\n                          <c8y-file-download\n                            [url]=\"baseVersion.c8y_Software.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                      <div class=\"fit-h-20\">\n                        <button\n                          class=\"btn btn-danger btn-xs visible-xs m-l-auto m-r-8 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                  </div>\n                  @if (!(isLegacy$ | async)) {\n                    <div class=\"m-l-auto fit-h-20 hidden-xs\">\n                      <button\n                        class=\"btn btn-dot text-danger showOnHover\"\n                        [attr.aria-label]=\"'Delete' | translate\"\n                        tooltip=\"{{ 'Delete' | translate }}\"\n                        type=\"button\"\n                        data-cy=\"software-details-component--Delete-button\"\n                        [delay]=\"500\"\n                        (click)=\"deleteBaseVersion(baseVersion)\"\n                      >\n                        <i c8yIcon=\"delete\"></i>\n                      </button>\n                    </div>\n                  }\n                </c8y-li-body>\n              </c8y-li>\n            </c8y-list-group>\n          }\n        </div>\n      </div>\n    </div>\n  </div>\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 SoftwareRepositoryNavigationFactory implements NavigatorNodeFactory {\n  node: NavigatorNode;\n\n  constructor() {\n    this.node = new NavigatorNode({\n      label: gettext('Software repository'),\n      path: 'software',\n      icon: 'c8y-tools',\n      parent: gettext('Management'),\n      priority: 900\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 { AddSoftwareModalComponent } from './add-software-modal.component';\nimport { SoftwareDetailsComponent } from './software-details.component';\nimport { SoftwareListComponent } from './software-list.component';\nimport { SoftwareRepositoryNavigationFactory } from './software-repository-navigation-factory';\n\n@NgModule({\n  imports: [\n    SharedRepositoryModule,\n    SoftwareListComponent,\n    SoftwareDetailsComponent,\n    AddSoftwareModalComponent\n  ]\n})\nexport class SoftwareRepositoryListModule {\n  static forRoot(): ModuleWithProviders<SoftwareRepositoryListModule> {\n    return {\n      ngModule: SoftwareRepositoryListModule,\n      providers: [\n        hookNavigator(SoftwareRepositoryNavigationFactory),\n        hookRoute([\n          {\n            path: 'software',\n            component: SoftwareListComponent\n          },\n          {\n            path: 'software/:id',\n            component: SoftwareDetailsComponent\n          }\n        ])\n      ]\n    };\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { IResultList, Paging } from '@c8y/client';\nimport { ServiceRegistry } from '@c8y/ngx-components';\nimport {\n  DeviceSoftware,\n  FilterCriteria,\n  IAdvancedSoftwareService\n} from '@c8y/ngx-components/repository/shared';\nimport { head, set } from 'lodash-es';\nimport { BehaviorSubject, Observable, Subject } from 'rxjs';\nimport { share, switchMap } from 'rxjs/operators';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class DeviceSoftwareService {\n  /**\n   * Indicates whether device software data is currently being loaded.\n   */\n  get loading$(): Observable<boolean> {\n    return this.loadingSubject$.asObservable().pipe(share());\n  }\n\n  private reloadSubject$ = new BehaviorSubject<void>(null);\n  private loadingSubject$ = new Subject<boolean>();\n\n  constructor(private serviceRegistry: ServiceRegistry) {}\n\n  /**\n   * Trigger device software data reload.\n   */\n  reload() {\n    this.reloadSubject$.next();\n  }\n\n  /**\n   * Retrieves the software list that is installed on a given device.\n   *\n   * @param deviceId ID of the device to retrieve software data for\n   * @param filterCriteria Criteria that software items are filtered by.\n   * @param legacySoftwareList If provided no data will be fetched from backend. The provided software list\n   * will be filtered by the specified filter criteria.\n   *\n   * @returns The software items installed on the specified device filtered by the specified criteria.\n   */\n  getSoftwareList(\n    deviceId,\n    filterCriteria: FilterCriteria,\n    legacySoftwareList?: DeviceSoftware[]\n  ): Observable<IResultList<DeviceSoftware>> {\n    this.loadingSubject$.next(true);\n\n    return this.reloadSubject$.pipe(\n      switchMap(() => {\n        const softwareList$ = !!legacySoftwareList\n          ? this.getLegacySoftwareList(legacySoftwareList, filterCriteria)\n          : this.getAdvancedSoftwareList(deviceId, filterCriteria);\n        return softwareList$.then(resultList => {\n          this.loadingSubject$.next(false);\n          return resultList;\n        });\n      }),\n      share()\n    );\n  }\n\n  private getAdvancedSoftwareList(\n    deviceId,\n    filterCriteria: FilterCriteria\n  ): Promise<IResultList<DeviceSoftware>> {\n    const queryFilter = {\n      deviceId,\n      currentPage: 1,\n      pageSize: 50,\n      withTotalPages: true\n    };\n    const advancedSoftwareService: IAdvancedSoftwareService = head(this.serviceRegistry.get('asm'));\n    if (filterCriteria?.name) {\n      set(queryFilter, 'name', `*${filterCriteria.name}*`);\n    }\n    if (filterCriteria?.softwareType) {\n      set(queryFilter, 'type', `${filterCriteria.softwareType}`);\n    }\n    return advancedSoftwareService.list(queryFilter) as unknown as Promise<\n      IResultList<DeviceSoftware>\n    >;\n  }\n\n  private getLegacySoftwareList(\n    legacySoftwareList: DeviceSoftware[],\n    filterCriteria: FilterCriteria\n  ): Promise<IResultList<DeviceSoftware>> {\n    const data = filterCriteria\n      ? legacySoftwareList.filter(item => {\n          let match = true;\n          if (filterCriteria?.name) {\n            match = match && item.name?.includes(filterCriteria.name);\n          }\n          if (filterCriteria?.softwareType) {\n            match = match && item.softwareType === filterCriteria.softwareType;\n          }\n\n          return match;\n        })\n      : legacySoftwareList;\n    return Promise.resolve({\n      data,\n      res: null,\n      paging: {\n        totalPages: data.length\n      } as Paging<DeviceSoftware>\n    });\n  }\n}\n","import {\n  AfterContentInit,\n  Component,\n  EventEmitter,\n  Input,\n  OnDestroy,\n  OnInit,\n  Output\n} from '@angular/core';\nimport { IManagedObject, IResultList } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  ListGroupComponent,\n  ForOfDirective,\n  ListItemComponent,\n  ListItemIconComponent,\n  IconDirective,\n  ListItemBodyComponent,\n  C8yTranslateDirective,\n  ProductExperienceDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport {\n  DeviceSoftware,\n  DeviceSoftwareChange,\n  FilterCriteria,\n  PRODUCT_EXPERIENCE_REPOSITORY_SHARED\n} from '@c8y/ngx-components/repository/shared';\nimport { filter, get } from 'lodash-es';\nimport { BehaviorSubject, combineLatest, Observable, of, Subject } from 'rxjs';\nimport {\n  debounceTime,\n  distinctUntilChanged,\n  map,\n  share,\n  switchMap,\n  takeUntil,\n  tap\n} from 'rxjs/operators';\nimport { DeviceSoftwareService } from './device-software.service';\nimport { NgClass, NgIf } from '@angular/common';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\n\n@Component({\n  selector: 'c8y-device-software-list',\n  templateUrl: 'device-software-list.component.html',\n  imports: [\n    ListGroupComponent,\n    ForOfDirective,\n    ListItemComponent,\n    NgClass,\n    ListItemIconComponent,\n    IconDirective,\n    ListItemBodyComponent,\n    C8yTranslateDirective,\n    NgIf,\n    TooltipDirective,\n    ProductExperienceDirective,\n    C8yTranslatePipe\n  ]\n})\nexport class DeviceSoftwareListComponent implements OnInit, AfterContentInit, OnDestroy {\n  PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_REPOSITORY_SHARED;\n  @Input() set softwareList(softwareList: DeviceSoftware[]) {\n    if (softwareList !== null) {\n      this.legacySoftwareList$.next(softwareList);\n    }\n  }\n  @Input() device: IManagedObject;\n  @Input() deviceSoftwareChanges: DeviceSoftwareChange[];\n  @Input() filterCriteria$: Observable<FilterCriteria> = of(null);\n  @Output() update = new EventEmitter<DeviceSoftware>();\n  @Output() remove = new EventEmitter<DeviceSoftware>();\n  @Output() onListEmpty: EventEmitter<boolean> = new EventEmitter();\n  softwareItems$: Observable<IResultList<DeviceSoftware>>;\n  showUpdate: boolean;\n  showRemove: boolean;\n  emptyList: boolean;\n  noSearchResults: boolean;\n  alreadyInstalledMessage = gettext('This software is already installed on the device');\n  supportsSoftwareOperations = false;\n\n  private readonly operationTypes = ['c8y_SoftwareUpdate', 'c8y_SoftwareList', 'c8y_Software'];\n\n  private legacySoftwareList$: BehaviorSubject<DeviceSoftware[]> = new BehaviorSubject([]);\n  private destroyed$ = new Subject<void>();\n\n  constructor(private deviceSoftwareService: DeviceSoftwareService) {}\n\n  ngOnInit(): void {\n    this.softwareItems$ = combineLatest([\n      this.filterCriteria$.pipe(debounceTime(300), distinctUntilChanged()),\n      this.legacySoftwareList$\n    ]).pipe(\n      switchMap(([filterCriteria, legacySoftwareList]) =>\n        this.deviceSoftwareService\n          .getSoftwareList(this.device?.id, filterCriteria, legacySoftwareList)\n          .pipe(map(resultList => ({ resultList, filterCriteria })))\n      ),\n      tap(({ resultList, filterCriteria }) => {\n        this.notifyListEmpty(!resultList?.paging?.totalPages && !filterCriteria);\n        this.noSearchResults = !resultList?.paging?.totalPages && !!filterCriteria;\n      }),\n      map(({ resultList }) => resultList),\n      share(),\n      takeUntil(this.destroyed$)\n    );\n    const supportedOperations = get(this.device, 'c8y_SupportedOperations', []);\n    this.supportsSoftwareOperations = this.operationTypes.some(\n      operationType => supportedOperations.indexOf(operationType) > -1\n    );\n  }\n\n  ngAfterContentInit() {\n    this.showUpdate = this.update.observers.length > 0;\n    this.showRemove = this.remove.observers.length > 0;\n  }\n\n  isSoftwareGoingToBeChanged(software: DeviceSoftware): boolean {\n    const relevantChanges = filter(this.deviceSoftwareChanges, software);\n    return relevantChanges.length > 0;\n  }\n\n  ngOnDestroy(): void {\n    this.destroyed$.next();\n    this.destroyed$.complete();\n  }\n\n  private notifyListEmpty(isEmpty: boolean): void {\n    this.emptyList = isEmpty;\n    this.onListEmpty.emit(isEmpty);\n  }\n}\n","<c8y-list-group class=\"no-border-2nd-last\">\n  <c8y-li\n    [ngClass]=\"{ disabled: isSoftwareGoingToBeChanged(software) }\"\n    *c8yFor=\"let software of softwareItems$\"\n  >\n    <!-- SOFTWARE ICON -->\n    <c8y-li-icon>\n      <i c8yIcon=\"c8y-tools\"></i>\n    </c8y-li-icon>\n\n    <c8y-li-body class=\"content-flex-20\">\n      <div title=\"{{ software.name }}\" class=\"col-9\">\n        <p class=\"d-flex\">\n          <!-- SOFTWARE NAME -->\n          <span class=\"text-truncate\">\n            {{ software.name }}\n          </span>\n          <!-- SOFTWARE TYPE-->\n          <span class=\"text-truncate\">\n            <span class=\"label label-primary m-l-8\">{{ software.softwareType }}</span>\n          </span>\n        </p>\n        <!-- SOFTWARE VERSION -->\n        <p class=\"d-flex a-i-center\">\n          <span class=\"text-truncate text-label-small m-r-4\" translate>Version</span>\n          <span class=\"text-truncate m-r-4\" title=\"{{ software.version }}\">\n            {{ software.version }}\n          </span>\n          <i\n            *ngIf=\"software.installed\"\n            c8yIcon=\"warning\"\n            class=\"text-warning a-s-center\"\n            [tooltip]=\"\n              alreadyInstalledMessage\n                | translate: { name: software.name, version: software.version }\n            \"\n            container=\"body\"\n            placement=\"top\"\n            [delay]=\"500\"\n          ></i>\n        </p>\n      </div>\n\n      <div\n        *ngIf=\"supportsSoftwareOperations && (showUpdate || showRemove)\"\n        class=\"col-3 text-right m-0 flex-grow d-flex a-i-center\"\n      >\n        <!-- UPDATE SOFTWARE -->\n        <button\n          class=\"btn btn-default btn-xs m-l-auto m-r-4\"\n          type=\"button\"\n          title=\"{{ 'Update`software,verb`' | translate }}\"\n          *ngIf=\"showUpdate && !isSoftwareGoingToBeChanged(software)\"\n          (click)=\"update.emit(software)\"\n          c8yProductExperience\n          [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.DEVICE_TAB\"\n          [actionData]=\"{\n            component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.DEVICE_SOFTWARE_LIST,\n            action: PRODUCT_EXPERIENCE.SOFTWARE.ACTIONS.OPEN_UPDATE_SOFTWARE\n          }\"\n        >\n          {{ 'Update`software,verb`' | translate }}\n        </button>\n\n        <!-- REMOVE SOFTWARE -->\n        <button\n          class=\"btn btn-dot btn-dot--danger m-l-4\"\n          type=\"button\"\n          [attr.aria-label]=\"'Remove`software,verb`' | translate\"\n          tooltip=\"{{ 'Remove`software,verb`' | translate }}\"\n          placement=\"bottom\"\n          container=\"body\"\n          [delay]=\"500\"\n          c8yProductExperience\n          [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.DEVICE_TAB\"\n          [actionData]=\"{\n            component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.DEVICE_SOFTWARE_LIST,\n            action: PRODUCT_EXPERIENCE.SOFTWARE.ACTIONS.DELETE_SOFTWARE\n          }\"\n          *ngIf=\"showRemove && !isSoftwareGoingToBeChanged(software)\"\n          (click)=\"remove.emit(software)\"\n        >\n          <i c8yIcon=\"minus-circle\"></i>\n        </button>\n      </div>\n    </c8y-li-body>\n  </c8y-li>\n</c8y-list-group>\n<!-- NO SEARCH RESULTS STATE -->\n<div class=\"card-block\" *ngIf=\"noSearchResults || emptyList\">\n  <ng-content *ngIf=\"emptyList\" select=\".c8y-empty-state:not(.c8y-no-results-state)\"></ng-content>\n  <ng-content *ngIf=\"noSearchResults\" select=\".c8y-no-results-state\"></ng-content>\n</div>\n","import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core';\nimport { IOperation } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  IconDirective,\n  C8yTranslateDirective,\n  ProductExperienceDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport {\n  DeviceSoftwareChange,\n  PRODUCT_EXPERIENCE_REPOSITORY_SHARED\n} from '@c8y/ngx-components/repository/shared';\nimport { BehaviorSubject } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { NgIf, NgClass, AsyncPipe } from '@angular/common';\nimport { OperationDetailsComponent } from '@c8y/ngx-components/operations/operation-details';\nimport { DeviceSoftwareListComponent } from './device-software-list.component';\n\n@Component({\n  selector: 'c8y-device-software-changes',\n  templateUrl: 'device-software-changes.component.html',\n  imports: [\n    IconDirective,\n    C8yTranslateDirective,\n    NgIf,\n    OperationDetailsComponent,\n    DeviceSoftwareListComponent,\n    ProductExperienceDirective,\n    NgClass,\n    AsyncPipe,\n    C8yTranslatePipe\n  ]\n})\nexport class DeviceSoftwareChangesComponent implements OnChanges {\n  PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_REPOSITORY_SHARED;\n  @Input() changes: DeviceSoftwareChange[];\n  @Input() changesInProgress: boolean;\n  @Input() deviceSoftwareChangesOperation: IOperation;\n  @Output() clear: EventEmitter<void> = new EventEmitter();\n  @Output() drop: EventEmitter<DeviceSoftwareChange> = new EventEmitter();\n  @Output() apply: EventEmitter<void> = new EventEmitter();\n  @Output() hideSoftwareChanges = new EventEmitter<void>();\n\n  get applyButtonLabel() {\n    return this.changesInProgress ? gettext('Applying changes…') : gettext('Apply changes');\n  }\n\n  changes$ = new BehaviorSubject<DeviceSoftwareChange[]>([]);\n  installations$ = this.changes$.pipe(\n    map(changes => {\n      return changes.filter(change => change.action === 'install');\n    })\n  );\n\n  removals$ = this.changes$.pipe(\n    map(changes => {\n      return changes.filter(change => change.action === 'delete');\n    })\n  );\n\n  ngOnChanges(changes: SimpleChanges) {\n    if (changes.changes) {\n      this.changes$.next(changes.changes.currentValue);\n    }\n  }\n}\n","<div class=\"inner-scroll d-flex d-col\">\n  <div class=\"card-header separator sticky-top visible-sm visible-xs\">\n    <button\n      class=\"btn btn-dot text-primary\"\n      [title]=\"'Back' | translate\"\n      type=\"button\"\n      (click)=\"hideSoftwareChanges.emit()\"\n    >\n      <i c8yIcon=\"chevron-left\"></i>\n      <span translate>Back</span>\n    </button>\n  </div>\n  <div class=\"card-header separator large-padding sticky-top\">\n    <div\n      class=\"card-title\"\n      translate\n    >\n      Software 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=\"deviceSoftwareChangesOperation\"\n    >\n      <c8y-operation-details [operation]=\"deviceSoftwareChangesOperation\"></c8y-operation-details>\n    </fieldset>\n  </div>\n  <div\n    class=\"flex-grow inner-scroll\"\n    id=\"software-changes-list\"\n  >\n    <div\n      class=\"card-block large-padding\"\n      *ngIf=\"(changes$ | async).length === 0; else changesList\"\n    >\n      <div class=\"c8y-empty-state\">\n        <div class=\"h1 c8y-icon c8y-icon-device-control c8y-icon-duocolor\"></div>\n        <p>\n          <strong translate>No software changes.</strong>\n          <br />\n          <small translate>Selected actions will be displayed here.</small>\n        </p>\n      </div>\n    </div>\n\n    <ng-template #changesList>\n      <fieldset\n        class=\"card-block p-t-0 p-b-0\"\n        *ngIf=\"(installations$ | async).length > 0\"\n        [disabled]=\"changesInProgress\"\n      >\n        <div\n          class=\"form-block legend\"\n          translate\n        >\n          Installations`software`\n        </div>\n        <c8y-device-software-list\n          [softwareList]=\"installations$ | async\"\n          (remove)=\"drop.emit($event)\"\n        ></c8y-device-software-list>\n      </fieldset>\n\n      <fieldset\n        class=\"card-block p-t-0 p-b-0\"\n        *ngIf=\"(removals$ | async).length > 0\"\n        [disabled]=\"changesInProgress\"\n      >\n        <div\n          class=\"form-block legend\"\n          translate\n        >\n          Removals`software`\n        </div>\n        <c8y-device-software-list\n          [softwareList]=\"removals$ | async\"\n          (remove)=\"drop.emit($event)\"\n        ></c8y-device-software-list>\n      </fieldset>\n    </ng-template>\n  </div>\n  <div\n    class=\"card-footer separator large-padding sticky-bottom\"\n    *ngIf=\"(changes$ | async).length > 0\"\n  >\n    <button\n      class=\"btn btn-default\"\n      title=\"{{ 'Clear changes' | translate }}\"\n      type=\"button\"\n      (click)=\"clear.emit()\"\n      [disabled]=\"changesInProgress\"\n      translate\n      c8yProductExperience\n      [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.DEVICE_TAB\"\n      [actionData]=\"{\n        component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.DEVICE_SOFTWARE_CHANGES,\n        action: PRODUCT_EXPERIENCE.SOFTWARE.ACTIONS.CLEAR_SOFTWARE_CHANGES\n      }\"\n    >\n      Clear`changes`\n    </button>\n    <button\n      class=\"btn btn-primary\"\n      title=\"{{ applyButtonLabel | translate }}\"\n      type=\"button\"\n      [ngClass]=\"{ 'btn-pending': changesInProgress }\"\n      [disabled]=\"changesInProgress\"\n      (click)=\"apply.emit(); hideSoftwareChanges.emit()\"\n      c8yProductExperience\n      [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.DEVICE_TAB\"\n      [actionData]=\"{\n        component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.DEVICE_SOFTWARE_CHANGES,\n        action: PRODUCT_EXPERIENCE.SOFTWARE.ACTIONS.APPLY_SOFTWARE_CHANGES\n      }\"\n    >\n      {{ applyButtonLabel | translate }}\n    </button>\n  </div>\n</div>\n","import {\n  Component,\n  EventEmitter,\n  Input,\n  OnDestroy,\n  OnInit,\n  Output,\n  TemplateRef,\n  ViewChild\n} from '@angular/core';\nimport { IManagedObject, QueriesUtil } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  ISelectModalObject,\n  IUpdateItemEvent,\n  ModalSelectionMode,\n  C8yTranslateDirective,\n  IconDirective,\n  ProductExperienceDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport {\n  DeviceSoftware,\n  DeviceSoftwareChange,\n  FilterCriteria,\n  PRODUCT_EXPERIENCE_REPOSITORY_SHARED,\n  RepositorySelectModalComponent,\n  RepositoryService,\n  RepositoryType,\n  SoftwareTypeComponent\n} from '@c8y/ngx-components/repository/shared';\nimport { get } from 'lodash-es';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { BehaviorSubject, Observable, Subject, combineLatest, from, of, pipe } from 'rxjs';\nimport {\n  distinctUntilChanged,\n  filter,\n  map,\n  mergeMap,\n  shareReplay,\n  switchMap,\n  takeUntil,\n  tap\n} from 'rxjs/operators';\nimport { NgIf, NgClass, AsyncPipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { DeviceSoftwareListComponent } from './device-software-list.component';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\n\n@Component({\n  selector: 'c8y-installed-software',\n  templateUrl: 'installed-software.component.html',\n  imports: [\n    C8yTranslateDirective,\n    NgIf,\n    FormsModule,\n    IconDirective,\n    SoftwareTypeComponent,\n    DeviceSoftwareListComponent,\n    NgClass,\n    ProductExperienceDirective,\n    TooltipDirective,\n    AsyncPipe,\n    C8yTranslatePipe\n  ]\n})\nexport class InstalledSoftwareComponent implements OnDestroy, OnInit {\n  PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_REPOSITORY_SHARED;\n  @Input() device: IManagedObject;\n  @Input() softwareList: DeviceSoftware[];\n  @Input() deviceSoftwareChanges: DeviceSoftwareChange[];\n  @Input() deviceSoftwareChangesInProgress: boolean;\n  @Input() typesQuery: object;\n  @Output() changes = new EventEmitter<DeviceSoftwareChange[]>();\n  @Output() showSoftwareChanges = new EventEmitter<void>();\n\n  @ViewChild('alreadyInstalledWarning', { static: true })\n  alreadyInstalledWarningTemplate: TemplateRef<any>;\n  alreadyInstalledMessage = gettext(\n    '{{ name }} (v. {{ version }}) is already installed on this device'\n  );\n  @ViewChild('loading', { static: true })\n  loadingTemplate: TemplateRef<any>;\n\n  @ViewChild('softwareType', { static: true })\n  softwareTypeTemplate: TemplateRef<any>;\n\n  showFilter = false;\n  supportsSoftwareOperations = false;\n  textFilter$: BehaviorSubject<string> = new BehaviorSubject('');\n  softwareTypeFilter$: BehaviorSubject<string> = new BehaviorSubject('');\n  filterCriteria$: Observable<FilterCriteria>;\n\n  private readonly operationTypes = ['c8y_SoftwareUpdate', 'c8y_SoftwareList', 'c8y_Software'];\n\n  private queriesUtil: QueriesUtil;\n  private modalSearch: (filterCriteria: FilterCriteria) => void;\n  private destroyed$: Subject<void> = new Subject();\n\n  constructor(\n    private repository: RepositoryService,\n    private bsModal: BsModalService\n  ) {\n    this.filterCriteria$ = combineLatest([this.textFilter$, this.softwareTypeFilter$]).pipe(\n      map(([textFilter, softwareTypeFilter]) => ({\n        name: textFilter,\n        softwareType: softwareTypeFilter\n      })),\n      map(filterCriteria =>\n        !filterCriteria.name && !filterCriteria.softwareType ? null : filterCriteria\n      )\n    );\n    this.queriesUtil = new QueriesUtil();\n  }\n\n  ngOnInit(): void {\n    const supportedOperations = get(this.device, 'c8y_SupportedOperations', []);\n    this.supportsSoftwareOperations = this.operationTypes.some(\n      operationType => supportedOperations.indexOf(operationType) > -1\n    );\n  }\n\n  installSoftware() {\n    const { resultEmitter, choiceEmitter, updateInstallableList$ } =\n      this.displaySoftwareSelectModal({\n        title: gettext('Install software'),\n        subTitle: gettext('Available softwares matching the device type'),\n        labels: { ok: gettext('Install') },\n        noItemsMessage: gettext('No matching software available.'),\n        showAdditionalFilter: true,\n        additionalFilterTemplate: this.softwareTypeTemplate,\n        repositoryEntriesWithVersions$: of([]),\n        repositoryEntriesWithVersionsFn$: modal =>\n          this.getInstallableSoftwareListWithVersions$(modal.content.searchTerm)\n      });\n\n    resultEmitter.pipe(takeUntil(this.destroyed$)).subscribe(softwareToInstall => {\n      this.emitSoftwareInstall(softwareToInstall);\n      this.showSoftwareChanges.emit();\n    });\n\n    choiceEmitter\n      .pipe(\n        this.isSoftwareInstalledOnDevicePipe(updateInstallableList$),\n        takeUntil(this.destroyed$)\n      )\n      .subscribe(({ item }) =>\n        updateInstallableList$.next({\n          object: item,\n          template: this.alreadyInstalledWarningTemplate,\n          mapper: object => {\n            object.installed = true;\n            return object;\n          }\n        })\n      );\n  }\n\n  updateSoftware(softwareToUpdate) {\n    const { resultEmitter, choiceEmitter, updateInstallableList$ } =\n      this.displaySoftwareSelectModal({\n        title: gettext('Update software'),\n        subTitle: gettext('Select one of the available software versions'),\n        labels: { ok: gettext('Update') },\n        noItemsMessage: gettext('No other software versions available.'),\n        showFilter: false,\n        repositoryEntriesWithVersions$: this.getSingleSoftwareWithVersions$(softwareToUpdate)\n      });\n\n    resultEmitter.pipe(takeUntil(this.destroyed$)).subscribe(softwareToInstall => {\n      this.emitSoftwareInstall(softwareToInstall);\n      this.showSoftwareChanges.emit();\n    });\n\n    choiceEmitter\n      .pipe(\n        this.isSoftwareInstalledOnDevicePipe(updateInstallableList$),\n        takeUntil(this.destroyed$)\n      )\n      .subscribe(({ item }) =>\n        updateInstallableList$.next({\n          object: item,\n          template: this.alreadyInstalledWarningTemplate,\n          mapper: object => {\n            object.installed = true;\n            return object;\n          }\n        })\n      );\n  }\n\n  removeSoftware(softwareToRemove) {\n    this.emitSoftwareRemoval([softwareToRemove]);\n  }\n\n  getInstallableSoftwareListWithVersions$(searchTerm$: BehaviorSubject<FilterCriteria>) {\n    const installedSoftwareNames = (this.softwareList || []).map(s => s.name);\n    return searchTerm$.pipe(\n      distinctUntilChanged(),\n      switchMap(searchTerm =>\n        this.repository.listRepositoryEntries(RepositoryType.SOFTWARE, {\n          query: searchTerm.softwareType\n            ? this.queriesUtil.addAndFilter(this.typesQuery, {\n                softwareType: searchTerm.softwareType\n              })\n            : this.typesQuery,\n          partialName: searchTerm?.name,\n          params: { pageSize: 100 }\n        })\n      ),\n      map(({ data }) => data),\n      map(softwareList => {\n        return softwareList.filter(software => {\n          return !installedSoftwareNames.includes(software.name);\n        });\n      }),\n      map(softwareList => this.attachVersions(softwareList)),\n      shareReplay(1)\n    );\n  }\n\n  getSingleSoftwareWithVersions$(software: DeviceSoftware) {\n    return from(\n      this.repository.listRepositoryEntries(RepositoryType.SOFTWARE, {\n        query: { name: software.name }\n      })\n    ).pipe(\n      map(({ data }) => data),\n      map(softwareList => this.attachVersions(softwareList)),\n      shareReplay(1)\n    );\n  }\n\n  attachVersions(softwareList: IManagedObject[]) {\n    softwareList.forEach(software => {\n      software.versions = this.repository.listBaseVersions(software);\n    });\n    return softwareList;\n  }\n\n  displaySoftwareSelectModal(initialStateOverrides) {\n    const initialState = {\n      repositoryType: RepositoryType.SOFTWARE,\n      mode: ModalSelectionMode.MULTI,\n      icon: 'c8y-tools',\n      disableSelected: false,\n      selected: this.softwareList,\n      hideEmptyItems: true,\n      ...initialStateOverrides\n    };\n    const modal = this.bsModal.show(RepositorySelectModalComponent, {\n      ignoreBackdropClick: true,\n      class: 'modal-sm',\n      ariaDescribedby: 'modal-body',\n      ariaLabelledBy: 'modal-title',\n      initialState\n    });\n\n    if (initialStateOverrides.repositoryEntriesWithVersionsFn$) {\n      modal.content.repositoryEntriesWithVersions$ =\n        initialStateOverrides.repositoryEntriesWithVersionsFn$(modal);\n    }\n\n    this.modalSearch = modal.content.search.bind(modal.content);\n\n    modal.content.load.next();\n    return {\n      resultEmitter: modal.content.resultEmitter,\n      choiceEmitter: modal.content.onChoiceUpdated,\n      updateInstallableList$: modal.content.updateInstallableList$\n    };\n  }\n\n  search(filterCriteria: FilterCriteria) {\n    if (this.modalSearch) {\n      this.modalSearch(filterCriteria);\n    }\n  }\n\n  emitSoftwareInstall(items: DeviceSoftware[]) {\n    this.changes.emit(\n      items.map(item => {\n        return { ...item, action: 'install' };\n      })\n    );\n  }\n\n  emitSoftwareRemoval(items: DeviceSoftware[]) {\n    this.changes.emit(\n      items.map(item => {\n        return { ...item, action: 'delete' };\n      })\n    );\n  }\n\n  ngOnDestroy(): void {\n    this.destroyed$.next();\n    this.destroyed$.complete();\n  }\n\n  private isSoftwareInstalledOnDevicePipe(updateInstallableList$: Subject<IUpdateItemEvent<any>>) {\n    return pipe(\n      tap((item: ISelectModalObject) =>\n        updateInstallableList$.next({ object: item, template: this.loadingTemplate })\n      ),\n      map(item => ({\n        item,\n        software: (\n          (item.options || []).find(option => option.obj.id === (item as any).selectedId) || {}\n        ).obj\n      })),\n      mergeMap(({ item, software }) =>\n        from(\n          this.repository.isSoftwareInstalledOnDevice(this.device.id, software as DeviceSoftware)\n        ).pipe(map(installed => ({ item, installed })))\n      ),\n      tap(({ item }) => updateInstallableList$.next({ object: item })),\n      filter(({ installed }) => !!installed)\n    );\n  }\n}\n","<div class=\"d-flex d-col flex-grow\">\n  <div class=\"card-header large-padding separator sticky-top\">\n    <div\n      class=\"card-title\"\n      translate\n    >\n      Installed software\n    </div>\n  </div>\n  <div class=\"flex-grow\">\n    <fieldset\n      class=\"card-block large-padding overflow-visible separator-bottom\"\n      *ngIf=\"showFilter\"\n    >\n      <div class=\"row\">\n        <div class=\"col-xs-6\">\n          <div class=\"input-group input-group-search\">\n            <label\n              class=\"sr-only\"\n              for=\"filter\"\n            >\n              {{ 'Filter…' | translate }}\n            </label>\n            <input\n              class=\"form-control\"\n              title=\"{{ 'Filter…' | translate }}\"\n              id=\"filter\"\n              placeholder=\"{{ 'Filter…' | translate }}\"\n              type=\"search\"\n              [ngModel]=\"textFilter$ | async\"\n              (ngModelChange)=\"textFilter$.next($event)\"\n            />\n            <span class=\"input-group-addon\">\n              <i\n                c8yIcon=\"search\"\n                *ngIf=\"(textFilter$ | async).length === 0\"\n              ></i>\n              <i\n                class=\"text-muted\"\n                c8yIcon=\"times\"\n                *ngIf=\"(textFilter$ | async).length > 0\"\n                (click)=\"textFilter$.next('')\"\n              ></i>\n            </span>\n            <span\n              class=\"sr-only\"\n              for=\"search\"\n              translate\n            >\n              Filter…\n            </span>\n          </div>\n        </div>\n        <div class=\"col-xs-6\">\n          <c8y-software-type\n            [required]=\"false\"\n            [emitResultsOnly]=\"true\"\n            [showBtnInNotFoundMessage]=\"false\"\n            [allowFreeEntries]=\"false\"\n            [placeholder]=\"'Filter by software type…' | translate\"\n            [showClearSelectionOption]=\"true\"\n            [presetSoftwareTypes]=\"device.c8y_SupportedSoftwareTypes\"\n            (onSelectSoftware)=\"softwareTypeFilter$.next($event?.softwareType)\"\n          ></c8y-software-type>\n        </div>\n      </div>\n    </fieldset>\n\n    <fieldset\n      class=\"flex-grow inner-scroll\"\n      id=\"software-list\"\n      [disabled]=\"deviceSoftwareChangesInProgress\"\n    >\n      <!-- NOT EMPTY STATE -->\n      <c8y-device-software-list\n        class=\"d-block p-l-16 p-r-16\"\n        container=\"body\"\n        [device]=\"device\"\n        [filterCriteria$]=\"filterCriteria$\"\n        [softwareList]=\"softwareList\"\n        [deviceSoftwareChanges]=\"deviceSoftwareChanges\"\n        (update)=\"updateSoftware($event)\"\n        (remove)=\"removeSoftware($event)\"\n        (onListEmpty)=\"showFilter = !$event\"\n      >\n        <!-- EMPTY STATE -->\n        <div class=\"c8y-empty-state text-center\">\n          <div class=\"h1 c8y-icon c8y-icon-tools c8y-icon-duocolor\"></div>\n          <p>\n            <strong translate>No software installed.</strong>\n            <br />\n            <small translate>Click below to install software into this device.</small>\n          </p>\n        </div>\n        <!-- NO SEARCH RESULTS STATE -->\n        <div class=\"c8y-empty-state c8y-no-results-state text-center\">\n          <div class=\"h1 c8y-icon c8y-icon-tools c8y-icon-duocolor\"></div>\n          <p>\n            <strong translate>No software matches your filter criteria.</strong>\n            <br />\n            <small translate>Try changing your search criteria.</small>\n          </p>\n        </div>\n      </c8y-device-software-list>\n    </fieldset>\n  </div>\n  <!-- INSTALL SOFTWARE-->\n  <div\n    class=\"card-footer large-padding separator sticky-bottom d-flex j-c-between bg-level-0\"\n    [ngClass]=\"{ 'visible-sm visible-xs': !supportsSoftwareOperations }\"\n  >\n    <button\n      class=\"btn btn-default\"\n      title=\"{{ 'Install software' | translate }}\"\n      *ngIf=\"supportsSoftwareOperations\"\n      (click)=\"installSoftware()\"\n      [disabled]=\"deviceSoftwareChangesInProgress\"\n      c8yProductExperience\n      [actionName]=\"PRODUCT_EXPERIENCE.SOFTWARE.EVENTS.DEVICE_TAB\"\n      [actionData]=\"{\n        component: PRODUCT_EXPERIENCE.SOFTWARE.COMPONENTS.DEVICE_SOFTWARE_LIST,\n        action: PRODUCT_EXPERIENCE.SOFTWARE.ACTIONS.OPEN_INSTALL_SOFTWARE\n      }\"\n    >\n      <i c8yIcon=\"plus-circle\"></i>\n      {{ 'Install software' | translate }}\n    </button>\n    <button\n      class=\"btn btn-clean text-primary visible-sm visible-xs\"\n      [title]=\"'Show &quot;Software changes&quot;' | translate\"\n      (click)=\"showSoftwareChanges.emit()\"\n    >\n      <span translate>Show \"Software changes\"</span>\n      <i c8yIcon=\"chevron-right\"></i>\n    </button>\n  </div>\n</div>\n\n<ng-template\n  #alreadyInstalledWarning\n  let-item\n  let-option=\"option\"\n>\n  <i\n    class=\"text-warning a-s-center\"\n    c8yIcon=\"warning\"\n    [tooltip]=\"\n      alreadyInstalledMessage\n        | translate: { name: item.body[0].value, version: option.body[0].value }\n    \"\n  ></i>\n</ng-template>\n\n<ng-template #loading>\n  <div class=\"p-relative d-flex m-l-auto\">\n    <i\n      class=\"icon-spin\"\n      c8yIcon=\"circle-o-notch\"\n    ></i>\n  </div>\n</ng-template>\n\n<ng-template #softwareType>\n  <c8y-software-type\n    additionalFilter\n    [required]=\"false\"\n    [placeholder]=\"'Filter by software type…' | translate\"\n    (onSelectSoftware)=\"search({ softwareType: $event?.softwareType })\"\n    [emitResultsOnly]=\"true\"\n    [showBtnInNotFoundMessage]=\"false\"\n    [allowFreeEntries]=\"false\"\n    [showClearSelectionOption]=\"true\"\n    [presetSoftwareTypes]=\"device.c8y_SupportedSoftwareTypes\"\n  ></c8y-software-type>\n</ng-template>\n","import { Component, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { IManagedObject, IOperation, InventoryService, OperationStatus } from '@c8y/client';\nimport {\n  ServiceRegistry,\n  ActionBarItemComponent,\n  IconDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport {\n  DeviceSoftware,\n  DeviceSoftwareChange,\n  IAdvancedSoftwareService,\n  RepositoryService,\n  RepositoryType\n} from '@c8y/ngx-components/repository/shared';\nimport { head } from 'lodash-es';\nimport { BehaviorSubject, Observable, of } from 'rxjs';\nimport { filter, map, switchMap, take } from 'rxjs/operators';\nimport { DeviceSoftwareService } from './device-software.service';\nimport { NgClass, AsyncPipe } from '@angular/common';\nimport { InstalledSoftwareComponent } from './installed-software.component';\nimport { DeviceSoftwareChangesComponent } from './device-software-changes.component';\n\n@Component({\n  selector: 'c8y-software-device-tab',\n  templateUrl: 'software-device-tab.component.html',\n  imports: [\n    ActionBarItemComponent,\n    IconDirective,\n    NgClass,\n    InstalledSoftwareComponent,\n    DeviceSoftwareChangesComponent,\n    AsyncPipe,\n    C8yTranslatePipe\n  ]\n})\nexport class SoftwareDeviceTabComponent implements OnInit {\n  deviceId: string | number = this.route.snapshot.parent.data.contextData.id;\n  device$ = new BehaviorSubject<IManagedObject>(this.route.snapshot.parent.data.contextData);\n  typesQuery$: Observable<object> = this.device$.pipe(\n    map(device => {\n      const deviceTypeQuery = this.repository.getDeviceTypeQuery(RepositoryType.SOFTWARE, device);\n      return this.repository.getSoftwareTypeQuery(device, deviceTypeQuery);\n    })\n  );\n  list$: Observable<DeviceSoftware[]>;\n  changes$ = new BehaviorSubject<DeviceSoftwareChange[]>([]);\n  changesOperation$ = new BehaviorSubject<IOperation>(null);\n  changesInProgress$: Observable<boolean> = this.changesOperation$.pipe(\n    map(operation => this.isInProgress(operation))\n  );\n  reloading = false;\n  showSoftwareChanges = false;\n\n  constructor(\n    private route: ActivatedRoute,\n    private repository: RepositoryService,\n    private inventory: InventoryService,\n    private deviceSoftwareService: DeviceSoftwareService,\n    private serviceRegistry: ServiceRegistry\n  ) {}\n\n  async ngOnInit() {\n    const advancedSoftwareService: IAdvancedSoftwareService | undefined = head(\n      this.serviceRegistry.get('asm')\n    );\n    this.list$ = this.device$.pipe(\n      switchMap(device =>\n        advancedSoftwareService\n          ? advancedSoftwareService\n              .isASMAvailable()\n              .then(isASMAvailable => ({ isASMAvailable, device }))\n          : of({ isASMAvailable: false, device })\n      ),\n      map(({ isASMAvailable, device }) =>\n        // with ASM available software items will be retrieved directly in the\n        // device-software-list component\n        isASMAvailable ? undefined : this.repository.getDeviceSoftwareList(device)\n      )\n    );\n    await this.loadDevice();\n    await this.loadOperation();\n  }\n\n  addChanges(requestedChanges: DeviceSoftwareChange[]) {\n    let stagedChanges = [...this.changes$.value];\n    requestedChanges.forEach(requestedChange => {\n      const alreadyStaged = stagedChanges.some(stagedChange =>\n        this.areSameChanges(stagedChange, requestedChange)\n      );\n      if (!alreadyStaged) {\n        stagedChanges = [...stagedChanges, requestedChange];\n      }\n    });\n    this.changes$.next(stagedChanges);\n  }\n\n  dropChange(changeToBeDropped: DeviceSoftwareChange) {\n    let stagedChanges = [...this.changes$.value];\n    stagedChanges = stagedChanges.filter(\n      stagedChange => !this.areSameChanges(stagedChange, changeToBeDropped)\n    );\n    this.changes$.next(stagedChanges);\n  }\n\n  areSameChanges(change1: DeviceSoftwareChange, change2: DeviceSoftwareChange) {\n    return (\n      change1.name === change2.name &&\n      change1.version === change2.version &&\n      change1.action === change2.action\n    );\n  }\n\n  clearChanges() {\n    this.changes$.next([]);\n  }\n\n  async loadDevice() {\n    this.reloading = true;\n    this.deviceSoftwareService.reload();\n    const device = await Promise.all([\n      this.deviceSoftwareService.loading$\n        .pipe(\n          filter(loading => !loading),\n          take(1)\n        )\n        .toPromise(),\n      this.inventory.detail(this.deviceId, { withChildren: false }).then(result => result.data)\n    ]).then(([_, device]) => device);\n    this.device$.next(device);\n    this.reloading = false;\n  }\n\n  async applyChanges() {\n    const operation = await this.repository.createSoftwareUpdateOperation(\n      this.device$.value,\n      this.changes$.value\n    );\n    await this.trackOperation(operation);\n  }\n\n  private async loadOperation() {\n    const operation = await this.repository.getLastSoftwareUpdateOperation(this.deviceId);\n    await this.trackOperation(operation);\n  }\n\n  private async 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      await this.displayChangesFromOperation(operation);\n      this.repository.observeOperation(operation).subscribe(\n        operationUpdate => {\n          this.changesOperation$.next(operationUpdate);\n          if (operationUpdate.status === OperationStatus.SUCCESSFUL) {\n            this.clearChanges();\n            this.loadDevice();\n          }\n        },\n        operationUpdate => {\n          this.changesOperation$.next(operationUpdate);\n        }\n      );\n    }\n  }\n\n  private async displayChangesFromOperation(operation: IOperation) {\n    const changes = await this.repository.getDeviceSoftwareChangesFromOperation(\n      operation,\n      this.device$.value\n    );\n    this.changes$.next(changes);\n  }\n\n  private isInProgress(operation: IOperation) {\n    return (\n      operation && [OperationStatus.PENDING, OperationStatus.EXECUTING].includes(operation.status)\n    );\n  }\n}\n","<c8y-action-bar-item [placement]=\"'right'\">\n  <button\n    class=\"btn btn-link\"\n    title=\"{{ 'Reload' | translate }}\"\n    (click)=\"loadDevice()\"\n  >\n    <i\n      c8yIcon=\"refresh\"\n      [ngClass]=\"{ 'icon-spin': reloading }\"\n    ></i>\n    {{ 'Reload' | translate }}\n  </button>\n</c8y-action-bar-item>\n\n<div class=\"card split-view--7-5 m-b-0\">\n  <c8y-installed-software\n    class=\"split-view__list\"\n    [device]=\"device$ | async\"\n    [typesQuery]=\"typesQuery$ | async\"\n    [softwareList]=\"list$ | async\"\n    [deviceSoftwareChanges]=\"changes$ | async\"\n    [deviceSoftwareChangesInProgress]=\"changesInProgress$ | async\"\n    (changes)=\"addChanges($event)\"\n    (showSoftwareChanges)=\"showSoftwareChanges = true\"\n  ></c8y-installed-software>\n  <c8y-device-software-changes\n    class=\"bg-level-1 split-view__detail\"\n    [ngClass]=\"{ 'split-view__detail--selected': showSoftwareChanges }\"\n    [deviceSoftwareChangesOperation]=\"changesOperation$ | async\"\n    [changes]=\"changes$ | async\"\n    [changesInProgress]=\"changesInProgress$ | async\"\n    (clear)=\"clearChanges()\"\n    (drop)=\"dropChange($event)\"\n    (apply)=\"applyChanges()\"\n    (hideSoftwareChanges)=\"showSoftwareChanges = false\"\n  ></c8y-device-software-changes>\n</div>\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot } from '@angular/router';\nimport { IManagedObject } from '@c8y/client';\nimport { get, has } from 'lodash-es';\n\n@Injectable()\nexport class SoftwareDeviceTabGuard {\n  private readonly operations = ['c8y_SoftwareUpdate', 'c8y_SoftwareList', 'c8y_Software'];\n\n  canActivate(route: ActivatedRouteSnapshot) {\n    const device = get(route, 'data.contextData') || get(route, 'parent.data.contextData');\n    return (\n      this.isAnyOperationSupported(device) ||\n      has(device, 'c8y_Software') ||\n      has(device, 'c8y_SoftwareList') ||\n      has(device, 'c8y_SupportedSoftwareTypes')\n    );\n  }\n\n  private isAnyOperationSupported(device: IManagedObject) {\n    const supportedOperations = device?.c8y_SupportedOperations || [];\n    return this.operations.some(operation => supportedOperations.indexOf(operation) >= 0);\n  }\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { hookRoute, ViewContext } from '@c8y/ngx-components';\nimport { OperationDetailsModule } from '@c8y/ngx-components/operations/operation-details';\nimport { SharedRepositoryModule } from '@c8y/ngx-components/repository/shared';\nimport { DeviceSoftwareChangesComponent } from './device-software-changes.component';\nimport { DeviceSoftwareListComponent } from './device-software-list.component';\nimport { InstalledSoftwareComponent } from './installed-software.component';\nimport { SoftwareDeviceTabComponent } from './software-device-tab.component';\nimport { SoftwareDeviceTabGuard } from './software-device-tab.guard';\n\n@NgModule({\n  imports: [\n    SharedRepositoryModule,\n    OperationDetailsModule,\n    SoftwareDeviceTabComponent,\n    InstalledSoftwareComponent,\n    DeviceSoftwareListComponent,\n    DeviceSoftwareChangesComponent\n  ]\n})\nexport class SoftwareRepositoryDeviceTabModule {\n  static forRoot(): ModuleWithProviders<SoftwareRepositoryDeviceTabModule> {\n    return {\n      ngModule: SoftwareRepositoryDeviceTabModule,\n      providers: [\n        SoftwareDeviceTabGuard,\n        hookRoute({\n          context: ViewContext.Device,\n          path: 'software',\n          component: SoftwareDeviceTabComponent,\n          label: gettext('Software'),\n          icon: 'c8y-tools',\n          priority: 499,\n          canActivate: [SoftwareDeviceTabGuard]\n        })\n      ]\n    };\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { SoftwareRepositoryDeviceTabModule } from './device-tab/software-repository-device-tab.module';\nimport { SoftwareRepositoryListModule } from './list/software-repository-list.module';\n\n@NgModule({\n  imports: [SoftwareRepositoryDeviceTabModule.forRoot(), SoftwareRepositoryListModule.forRoot()]\n})\nexport class SoftwareRepositoryModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2","i3","i1","i4","i5","i6","i7","i1.DeviceSoftwareService","filter","i4.DeviceSoftwareService","i1.SoftwareRepositoryDeviceTabModule","i2.SoftwareRepositoryListModule"],"mappings":"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"}