{"version":3,"file":"c8y-ngx-components-device-profile.mjs","sources":["../../device-profile/device-profile-navigation.factory.ts","../../device-profile/device-profile.service.ts","../../device-profile/select-configuration-modal.component.ts","../../device-profile/select-configuration-modal.component.html","../../device-profile/device-profile.model.ts","../../device-profile/device-profile.component.ts","../../device-profile/device-profile.component.html","../../device-profile/add-device-profile.component.ts","../../device-profile/add-device-profile-component.html","../../device-profile/device-profile-list.component.ts","../../device-profile/device-profile-list.component.html","../../device-profile/device-profile.guard.ts","../../device-profile/device-tab-profile/device-profile-item-list.component.ts","../../device-profile/device-tab-profile/device-profile-item-list.component.html","../../device-profile/device-tab-profile/device-tab-profile-detail.component.ts","../../device-profile/device-tab-profile/device-tab-profile-detail.component.html","../../device-profile/device-tab-profile/device-tab-profile.component.ts","../../device-profile/device-tab-profile/device-tab-profile.component.html","../../device-profile/device-profile.module.ts","../../device-profile/c8y-ngx-components-device-profile.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { NavigatorNode, NavigatorNodeFactory } from '@c8y/ngx-components';\n\n@Injectable()\nexport class DeviceProfileNavigationFactory implements NavigatorNodeFactory {\n  nodeItem: NavigatorNode;\n\n  async get() {\n    if (!this.nodeItem) {\n      this.nodeItem = new NavigatorNode({\n        label: gettext('Device profiles'),\n        path: '/device-profiles',\n        icon: 'c8y-device-profile',\n        parent: gettext('Management')\n      });\n    }\n    return this.nodeItem;\n  }\n}\n","import { Injectable } from '@angular/core';\nimport {\n  IManagedObject,\n  InventoryService,\n  IOperation,\n  IResultList,\n  OperationService,\n  OperationStatus,\n  QueriesUtil\n} from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { AlertService } from '@c8y/ngx-components';\nimport {\n  get,\n  isEmpty,\n  isNil,\n  keyBy,\n  keys,\n  mapValues,\n  omitBy,\n  pickBy,\n  sortBy,\n  toArray,\n  uniqBy\n} from 'lodash-es';\nimport {\n  ComparisonResult,\n  DeviceProfile,\n  DeviceProfileFirmware,\n  DeviceProfileSoftware\n} from './device-profile.model';\n\n@Injectable()\nexport class DeviceProfileService {\n  readonly dateFrom = new Date(0);\n  readonly dateTo = new Date(Date.now() + 86400000); // 1 day in the future\n  private queriesUtil: QueriesUtil;\n\n  private NOT_INSTALLED_WARNING = gettext('Not installed on the device');\n  private VERSION_MISSMATCH_WARNING = gettext('Version mismatch');\n  private SAME_URL_WARNING = gettext(\n    'Installed configuration has the same URL but different name or type than the one in the profile'\n  );\n\n  constructor(\n    private inventoryService: InventoryService,\n    private operationService: OperationService,\n    private alertService: AlertService\n  ) {\n    this.queriesUtil = new QueriesUtil();\n  }\n\n  createDeviceProfile(deviceProfile: Partial<DeviceProfile>) {\n    if (get(deviceProfile, 'c8y_Filter.type') === '') {\n      delete deviceProfile.c8y_Filter.type;\n    }\n    return this.inventoryService.create(deviceProfile as IManagedObject);\n  }\n\n  /**\n   * Determines the available device profiles for a given device by considering device type\n   * and the supported software types declared by the devices. Because of limitations in the\n   * Inventory Query API the methods return profile that contain at least one of the supported\n   * software types and omits profiles having only non-supported software types. Resulting device\n   * profiles need to be further filtered on the client side to exclude the ones that contain\n   * non-supported software types next to the supported ones.\n   *\n   * @param device A device MO\n   * @param name Optional device profile name filter\n   * @returns Candidate device profiles that contain at least on software with supported type.\n   */\n  getDeviceProfilesByDevice(\n    device: IManagedObject,\n    name: string = null\n  ): Promise<IResultList<IManagedObject>> {\n    const deviceTypeFilter = {\n      __or: [\n        { 'c8y_Filter.type': device.type },\n        { 'c8y_Filter.type': '' },\n        { __not: { __has: 'c8y_Filter.type' } }\n      ]\n    };\n\n    let softwareTypeFilter = {};\n    if (!isEmpty(device.c8y_SupportedSoftwareTypes)) {\n      softwareTypeFilter = {\n        __hasany: device.c8y_SupportedSoftwareTypes.map((type: string) => `softwareType!${type}`)\n      };\n    }\n    let query = this.queriesUtil.addAndFilter(deviceTypeFilter, softwareTypeFilter);\n\n    let profileNameFilter = {};\n    if (!isEmpty(name)) {\n      profileNameFilter = { name: `*${name}*` };\n    }\n    query = this.queriesUtil.addAndFilter(query, profileNameFilter);\n\n    return this.getDeviceProfiles(query);\n  }\n\n  /**\n   * @deprecated Use `getDeviceProfilesByDevice` instead as it also considers the supported software types.\n   */\n  getDeviceProfilesByDeviceType(deviceType: string): Promise<IResultList<IManagedObject>> {\n    const deviceTypeFilter = {\n      __or: [\n        { 'c8y_Filter.type': deviceType },\n        { 'c8y_Filter.type': '' },\n        { __not: { __has: 'c8y_Filter.type' } }\n      ]\n    };\n    return this.getDeviceProfiles(deviceTypeFilter);\n  }\n\n  getDeviceProfiles(andQuery?: any): Promise<IResultList<IManagedObject>> {\n    let query: object = {\n      type: 'c8y_Profile'\n    };\n    const filter: object = {\n      pageSize: 100,\n      withTotalPages: true\n    };\n    query = this.queriesUtil.addAndFilter(query, andQuery || {});\n    return this.inventoryService.listQuery(query, filter);\n  }\n\n  async getProfileOperation(deviceId: string | number) {\n    const filter: object = {\n      deviceId,\n      fragmentType: 'c8y_DeviceProfile',\n      dateFrom: this.dateFrom.toISOString(),\n      dateTo: this.dateTo.toISOString(),\n      revert: true,\n      pageSize: 1\n    };\n\n    const operation = (await this.operationService.list(filter)).data[0];\n    return operation && operation.status !== OperationStatus.SUCCESSFUL ? operation : undefined;\n  }\n\n  async createProfileOperation(device: IManagedObject, deviceProfile: Partial<DeviceProfile>) {\n    let operation;\n    const operationCfg: IOperation = {\n      deviceId: device.id,\n      profileId: deviceProfile.id,\n      profileName: deviceProfile.name,\n      c8y_DeviceProfile: deviceProfile.c8y_DeviceProfile,\n      description: `Assign device profile ${deviceProfile.name} to device ${device.name}`\n    };\n    try {\n      const { data } = await this.operationService.create(operationCfg);\n      operation = data;\n    } catch (ex) {\n      this.alertService.addServerFailure(ex);\n    }\n    return operation;\n  }\n\n  getFirmwareItems(\n    device: IManagedObject,\n    selectedProfile: Partial<DeviceProfile>\n  ): ComparisonResult[] {\n    const deviceFirmware = device.c8y_Firmware;\n    const profileFirmware = get(selectedProfile, 'c8y_DeviceProfile.firmware');\n    const deviceItems = [];\n    const profileItems = [];\n\n    if (deviceFirmware) {\n      deviceItems.push(deviceFirmware);\n    }\n    if (profileFirmware) {\n      profileItems.push(profileFirmware);\n    }\n    return this.createProfileComparison(\n      deviceItems,\n      profileItems,\n      'name',\n      'version',\n      null,\n      this.getAlert('firmware')\n    );\n  }\n\n  getSoftwareItems(\n    device: IManagedObject,\n    selectedProfile: Partial<DeviceProfile>\n  ): ComparisonResult[] {\n    const deviceSoftware = device.c8y_SoftwareList;\n    const profileSoftware = get(selectedProfile, 'c8y_DeviceProfile.software');\n    return this.createProfileComparison(\n      deviceSoftware,\n      profileSoftware,\n      'name',\n      'version',\n      'softwareType',\n      this.getAlert('software')\n    );\n  }\n\n  getConfigurationItems(\n    device: IManagedObject,\n    selectedProfile: Partial<DeviceProfile>\n  ): ComparisonResult[] {\n    const deviceConfiguration = [];\n    Object.keys(device).forEach(key => {\n      if (key.slice(0, 18) === 'c8y_Configuration_') {\n        deviceConfiguration.push(device[key]);\n      }\n    });\n    const profileConfiguration = get(selectedProfile, 'c8y_DeviceProfile.configuration');\n    return this.createProfileComparison(\n      deviceConfiguration,\n      profileConfiguration,\n      'url',\n      null,\n      'type',\n      this.getAlert('configuration')\n    );\n  }\n\n  /**\n   * Aligns device profile managed object's `softwareType!*` fragments to the software items\n   * included in the device profile. Removes obsolete software type fragments and adds new.\n   *\n   * @param profilePartial The device profile managed object which `softwareType!*` fragments will be adjusted.\n   * @returns The adjusted device profile managed object.\n   */\n  alignSoftwareTypeFragments(\n    profilePartial: Partial<DeviceProfile>,\n    profile: DeviceProfile\n  ): Partial<DeviceProfile> {\n    if (!profilePartial?.c8y_DeviceProfile?.software || !profile) {\n      return profilePartial;\n    }\n\n    const removedSoftwareTypes = mapValues(\n      omitBy(\n        profile,\n        (_: unknown, key: PropertyKey) =>\n          typeof key === 'string' && !key.startsWith('softwareType!')\n      ),\n      () => null\n    );\n    const softwareTypesToAdd: { [key: PropertyKey]: Record<PropertyKey, never> } = mapValues(\n      keyBy(\n        uniqBy(profilePartial.c8y_DeviceProfile.software, 'softwareType'),\n        (profile: DeviceProfileSoftware) => `softwareType!${profile.softwareType}`\n      ),\n      () => ({})\n    );\n\n    const result = { ...profilePartial, ...removedSoftwareTypes, ...softwareTypesToAdd };\n    return result;\n  }\n\n  getSoftwareTypes(profile: DeviceProfile): string[] {\n    return keys(\n      pickBy(\n        profile,\n        (_: unknown, key: PropertyKey) => typeof key === 'string' && key.startsWith('softwareType!')\n      )\n    ).map(softwareType => softwareType.substr('softwareType!'.length));\n  }\n\n  private getAlert(itemType: string): (comparisionResult: ComparisonResult) => string {\n    const notInstalled = (comparisionResult: ComparisonResult) => {\n      return !comparisionResult.device ? this.NOT_INSTALLED_WARNING : '';\n    };\n\n    switch (itemType) {\n      case 'firmware':\n      case 'software':\n        return (comparisionResult: ComparisonResult) => {\n          return comparisionResult.device &&\n            comparisionResult.profile &&\n            comparisionResult.device.itemDetails !== comparisionResult.profile.itemDetails\n            ? this.VERSION_MISSMATCH_WARNING\n            : notInstalled(comparisionResult);\n        };\n      case 'configuration':\n        return (comparisionResult: ComparisonResult) => {\n          return comparisionResult.device &&\n            comparisionResult.profile &&\n            (comparisionResult.device.itemName !== comparisionResult.profile.itemName ||\n              comparisionResult.device.itemDetails !== comparisionResult.profile.itemDetails)\n            ? this.SAME_URL_WARNING\n            : notInstalled(comparisionResult);\n        };\n      default:\n        return notInstalled;\n    }\n  }\n\n  private createProfileComparison(\n    deviceItems: any[] = [],\n    profileItems: Array<DeviceProfileSoftware | DeviceProfileFirmware> = [],\n    mergeByProperty: string,\n    propertyNameWithDetails: string,\n    propertyNameWithType: string,\n    getAlert: (comparisionResult: ComparisonResult) => string\n  ): ComparisonResult[] {\n    const comparisonObj = this.createProfileComparisonFromDeviceItems(\n      deviceItems,\n      mergeByProperty,\n      propertyNameWithDetails,\n      propertyNameWithType\n    );\n    const extendedComparisonObj = this.extendProfileComparisonWithProfileItems(\n      comparisonObj,\n      profileItems,\n      mergeByProperty,\n      propertyNameWithDetails,\n      propertyNameWithType,\n      getAlert\n    );\n    return sortBy(toArray(extendedComparisonObj), 'name');\n  }\n\n  private createProfileComparisonFromDeviceItems(\n    deviceItems: any[],\n    mergeByProperty: string,\n    propertyNameWithDetails: string,\n    propertyNameWithType: string\n  ): any {\n    return deviceItems.reduce(\n      (comapritionItem, deviceItem) =>\n        Object.assign(comapritionItem, {\n          [deviceItem[mergeByProperty]]: {\n            device: omitBy(\n              {\n                itemName: deviceItem.name,\n                itemDetails: deviceItem[propertyNameWithDetails],\n                itemType: deviceItem[propertyNameWithType],\n                itemUrl: deviceItem.url\n              },\n              isNil\n            ),\n            profile: undefined\n          }\n        }),\n      {}\n    );\n  }\n\n  private extendProfileComparisonWithProfileItems(\n    comparisonObj: object,\n    profileItems: Array<DeviceProfileSoftware | DeviceProfileFirmware>,\n    mergeByProperty: string,\n    propertyNameWithDetails: string,\n    propertyNameWithType: string,\n    getAlert: (comparisionResult: ComparisonResult) => string\n  ) {\n    profileItems.forEach(profileItem => {\n      const comparisionResult: ComparisonResult = {\n        profile: omitBy(\n          {\n            itemName: profileItem.name,\n            itemDetails: profileItem[propertyNameWithDetails],\n            itemType: profileItem[propertyNameWithType],\n            itemUrl: profileItem.url\n          },\n          isNil\n        ),\n        device: comparisonObj[profileItem[mergeByProperty]]\n          ? comparisonObj[profileItem[mergeByProperty]].device\n          : undefined\n      };\n      comparisionResult.comparisonAlert = getAlert(comparisionResult);\n      comparisonObj[profileItem[mergeByProperty]] = comparisionResult;\n    });\n    return comparisonObj;\n  }\n}\n","import { Component, EventEmitter, forwardRef } from '@angular/core';\nimport { IManagedObject, QueriesUtil } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  ISelectModalObject,\n  ISelectModalOption,\n  ModalLabels,\n  ProductExperienceEvent,\n  ProductExperienceEventSource,\n  PRODUCT_EXPERIENCE_EVENT_SOURCE,\n  SelectModalComponent,\n  ProductExperienceDirective\n} from '@c8y/ngx-components';\nimport {\n  PRODUCT_EXPERIENCE_REPOSITORY_SHARED,\n  RepositoryService,\n  RepositoryType\n} from '@c8y/ngx-components/repository/shared';\nimport { Observable, Subject } from 'rxjs';\nimport { map, switchMap } from 'rxjs/operators';\nimport { AsyncPipe } from '@angular/common';\n\n@Component({\n  selector: 'c8y-select-configuration-modal',\n  templateUrl: './select-configuration-modal.component.html',\n  providers: [\n    {\n      provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,\n      useExisting: forwardRef(() => SelectConfigurationModalComponent)\n    }\n  ],\n  imports: [SelectModalComponent, ProductExperienceDirective, AsyncPipe]\n})\nexport class SelectConfigurationModalComponent implements ProductExperienceEventSource {\n  PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_REPOSITORY_SHARED;\n  title: string = gettext('Select configuration');\n  load: Subject<void> = new Subject();\n  configurations: Observable<any[]> = this.load.pipe(\n    switchMap(() => this.getItems()),\n    map(({ data }) => this.aggregate(data))\n  );\n  resultEmitter: EventEmitter<any[]> = new EventEmitter<any>();\n  selected: any[];\n  deviceTypeQuery: any = {};\n  searchQuery: any = {};\n  labels: ModalLabels = { ok: gettext('Save') };\n  productExperienceEvent: ProductExperienceEvent;\n  private queriesUtil: QueriesUtil;\n\n  constructor(private repositoryService: RepositoryService) {\n    this.queriesUtil = new QueriesUtil();\n  }\n\n  search(searchTerm) {\n    if (!searchTerm) {\n      this.searchQuery = {};\n    } else {\n      this.searchQuery = this.queriesUtil.addOrFilter(\n        { name: `*${searchTerm}*` },\n        { configurationType: `*${searchTerm}*` }\n      );\n    }\n    this.load.next();\n  }\n\n  result(selectedItems) {\n    this.resultEmitter.emit(selectedItems);\n  }\n\n  getItems() {\n    return this.repositoryService.listRepositoryEntries(RepositoryType.CONFIGURATION, {\n      query: this.queriesUtil.addOrFilter(this.deviceTypeQuery, this.searchQuery),\n      params: { pageSize: 100 }\n    });\n  }\n\n  aggregate(mos: IManagedObject[]): ISelectModalObject[] {\n    const selectedItems: any[] = this.selected;\n    return mos.reduce((acc, curr) => {\n      curr.configurationType = curr.configurationType || curr.name;\n      const selected =\n        selectedItems && selectedItems.filter(val => val.url === curr.url).length > 0;\n      const selectModalOption: ISelectModalOption = {\n        body: [{ value: curr.name }],\n        obj: curr,\n        selected\n      };\n      let selectModalObject: ISelectModalObject = acc.find(\n        val => val.body[0].value === curr.configurationType\n      ) as ISelectModalObject;\n      if (selectModalObject) {\n        selectModalObject.options.push(selectModalOption);\n      } else {\n        selectModalObject = {\n          groupId: curr.id,\n          body: [{ value: curr.configurationType }],\n          options: [selectModalOption]\n        };\n        acc.push(selectModalObject);\n      }\n      return acc;\n    }, []);\n  }\n}\n","<c8y-select-modal\n  [icon]=\"'gears'\"\n  [title]=\"title\"\n  [items]=\"configurations | async\"\n  [mode]=\"'multi'\"\n  (result)=\"result($event)\"\n  (search)=\"search($event)\"\n  [disableSelected]=\"true\"\n  [labels]=\"labels\"\n  c8yProductExperience\n  inherit\n  suppressDataOverriding\n  [actionData]=\"{ component: PRODUCT_EXPERIENCE.SHARED.COMPONENTS.SELECT_CONFIGURATION_MODAL }\"\n></c8y-select-modal>\n","import { IManagedObject } from '@c8y/client';\n\nexport interface DeviceProfile extends Partial<IManagedObject> {\n  name?: string;\n  type: string;\n  c8y_Filter: {\n    type?: string;\n  };\n  c8y_DeviceProfile: {\n    firmware?: DeviceProfileFirmware;\n    software?: DeviceProfileSoftware[];\n    configuration?: DeviceProfileConfiguration[];\n  };\n}\n\nexport interface DeviceProfileFirmware {\n  name: string;\n  version: string;\n  url: string;\n  isPatch: boolean;\n  patchDependency?: string;\n}\n\nexport interface DeviceProfileSoftware {\n  name: string;\n  softwareType: string;\n  version: string;\n  url: string;\n  action: string;\n}\n\nexport interface DeviceProfileConfiguration {\n  url: string;\n  name: string;\n  type: string;\n}\n\nexport interface ComparisonResult {\n  profile: {\n    itemName: string;\n    itemDetails?: string;\n    itemType?: string;\n    itemUrl: string;\n  };\n  device: {\n    itemName: string;\n    itemDetails?: string;\n    itemType?: string;\n    itemUrl: string;\n  };\n  comparisonAlert?: string;\n}\n\nexport enum DeviceProfileOperation {\n  APPLY_PROFILE = 'c8y_DeviceProfile'\n}\n\nexport const PRODUCT_EXPERIENCE_DEVICE_PROFILE = {\n  EVENTS: {\n    REPOSITORY: 'deviceProfileRepository',\n    DEVICE_TAB: 'deviceProfileTab'\n  },\n  COMPONENTS: {\n    DEVICE_PROFILE_LIST: 'device-profile-list',\n    ADD_DEVICE_PROFILE: 'add-device-profile',\n    DEVICE_PROFILE: 'device-profile',\n    DEVICE_TAB_PROFILE: 'device-tab-profile'\n  },\n  ACTIONS: {\n    CANCEL: 'cancel',\n    CREATE: 'create',\n    REMOVE: 'remove',\n    ADD: 'add',\n    SAVE: 'save',\n    ASSIGN_DEVICE_PROFILE: 'assignDeviceProfile'\n  },\n  RESULTS: {\n    ADD_SOFTWARE: 'addSoftware'\n  },\n  FRAGMENTS: {\n    FIRMWARE: 'firmware',\n    SOFTWARE: 'software',\n    CONFGIURATION: 'configuration'\n  }\n} as const;\n","import { Component, forwardRef, OnInit } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { IManagedObject, InventoryService, QueriesUtil } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  AlertService,\n  ModalSelectionMode,\n  PRODUCT_EXPERIENCE_EVENT_SOURCE,\n  ProductExperienceEvent,\n  ProductExperienceEventSource,\n  TitleComponent,\n  BreadcrumbComponent,\n  BreadcrumbItemComponent,\n  FormGroupComponent,\n  C8yTranslateDirective,\n  RequiredInputPlaceholderDirective,\n  ProductExperienceDirective,\n  IconDirective,\n  ListGroupComponent,\n  ListItemComponent,\n  ListItemIconComponent,\n  ListItemBodyComponent,\n  EmptyStateComponent,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport {\n  FilterCriteria,\n  RepositorySelectModalComponent,\n  RepositoryService,\n  RepositoryType\n} from '@c8y/ngx-components/repository/shared';\nimport { assign, concat, has, isEmpty, isEqual, uniqWith } from 'lodash-es';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { BehaviorSubject, Observable } from 'rxjs';\nimport { distinctUntilChanged, map, shareReplay, switchMap, take } from 'rxjs/operators';\nimport {\n  DeviceProfile,\n  DeviceProfileConfiguration,\n  DeviceProfileFirmware,\n  DeviceProfileSoftware,\n  PRODUCT_EXPERIENCE_DEVICE_PROFILE\n} from './device-profile.model';\nimport { DeviceProfileService } from './device-profile.service';\nimport { SelectConfigurationModalComponent } from './select-configuration-modal.component';\nimport { NgIf, NgFor } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\nimport { TooltipDirective } from 'ngx-bootstrap/tooltip';\n\n@Component({\n  selector: 'c8y-device-profile',\n  templateUrl: './device-profile.component.html',\n  providers: [\n    {\n      provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,\n      useExisting: forwardRef(() => DeviceProfileComponent)\n    }\n  ],\n  imports: [\n    TitleComponent,\n    BreadcrumbComponent,\n    BreadcrumbItemComponent,\n    NgIf,\n    FormsModule,\n    FormGroupComponent,\n    C8yTranslateDirective,\n    RequiredInputPlaceholderDirective,\n    ProductExperienceDirective,\n    PopoverDirective,\n    IconDirective,\n    ListGroupComponent,\n    ListItemComponent,\n    ListItemIconComponent,\n    ListItemBodyComponent,\n    TooltipDirective,\n    EmptyStateComponent,\n    NgFor,\n    C8yTranslatePipe\n  ]\n})\nexport class DeviceProfileComponent implements OnInit, ProductExperienceEventSource {\n  DEVICE_TYPE_POPOVER = gettext(\n    'The device profile will be available for assignments on devices of the specified type. Otherwise, it will be available for all device types.'\n  );\n  DEVICE_TYPE_DISABLED_POPOVER = gettext(\n    'Device type cannot be changed on profiles with already defined firmware, software or configuration since they may not be applicable to devices of the new device type.'\n  );\n  PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_DEVICE_PROFILE;\n  deviceProfile: DeviceProfile;\n  profileName: string;\n  productExperienceEvent: ProductExperienceEvent = {\n    eventName: PRODUCT_EXPERIENCE_DEVICE_PROFILE.EVENTS.REPOSITORY,\n    data: {\n      component: PRODUCT_EXPERIENCE_DEVICE_PROFILE.COMPONENTS.DEVICE_PROFILE\n    }\n  };\n  private queriesUtil: QueriesUtil;\n\n  constructor(\n    private route: ActivatedRoute,\n    private alertService: AlertService,\n    private inventoryService: InventoryService,\n    private bsModal: BsModalService,\n    private repositoryService: RepositoryService,\n    private deviceProfileService: DeviceProfileService\n  ) {\n    this.queriesUtil = new QueriesUtil();\n  }\n\n  async ngOnInit() {\n    const profileId = this.route.snapshot.paramMap.get('id');\n    this.deviceProfile = (await this.getDeviceProfile(profileId)) as DeviceProfile;\n    if (this.deviceProfile) {\n      this.profileName = this.deviceProfile.name;\n      if (!this.deviceProfile.c8y_DeviceProfile.software) {\n        this.deviceProfile.c8y_DeviceProfile.software = [];\n      }\n      if (!this.deviceProfile.c8y_DeviceProfile.configuration) {\n        this.deviceProfile.c8y_DeviceProfile.configuration = [];\n      }\n    }\n  }\n\n  addFirmware() {\n    const initialState: Partial<RepositorySelectModalComponent> & {\n      repositoryEntriesWithVersionsFn$: (modal) => Observable<IManagedObject[]>;\n    } = {\n      deviceTypeQuery: this.getDeviceTypeQuery(RepositoryType.FIRMWARE),\n      repositoryType: RepositoryType.FIRMWARE,\n      repositoryEntriesWithVersionsFn$: modalDialog =>\n        this.getRepositoryEntriesWithVersions$(\n          modalDialog.content.searchTerm,\n          RepositoryType.FIRMWARE\n        ),\n      icon: 'c8y-firmware',\n      title: gettext('Select firmware'),\n      mode: ModalSelectionMode.SINGLE,\n      productExperienceEvent: this.productExperienceEvent\n    };\n    const modal = this.bsModal.show(RepositorySelectModalComponent, {\n      ignoreBackdropClick: true,\n      keyboard: false,\n      ariaLabelledBy: 'modal-title',\n      initialState\n    });\n\n    if (initialState.repositoryEntriesWithVersionsFn$) {\n      modal.content.repositoryEntriesWithVersions$ =\n        initialState.repositoryEntriesWithVersionsFn$(modal);\n    }\n\n    modal.content.load.next();\n    modal.content.resultEmitter.pipe(take(1)).subscribe(firmwareList => {\n      const [firmware] = firmwareList;\n      if (!firmware) {\n        return;\n      }\n      const deviceProfilePartial: Partial<IManagedObject> = {\n        c8y_DeviceProfile: this.deviceProfile.c8y_DeviceProfile || {}\n      };\n      assign(deviceProfilePartial.c8y_DeviceProfile, {\n        firmware: {\n          name: firmware.name,\n          version: firmware.version,\n          url: firmware.url,\n          isPatch: firmware.isPatch,\n          patchDependency: firmware.patchDependency\n        } as DeviceProfileFirmware\n      });\n      this.updateDeviceProfile(deviceProfilePartial);\n    });\n  }\n\n  getRepositoryEntriesWithVersions$(\n    searchTerm$: BehaviorSubject<FilterCriteria>,\n    repoType: RepositoryType\n  ) {\n    return searchTerm$.pipe(\n      distinctUntilChanged(),\n      switchMap(searchTerm =>\n        this.repositoryService.listRepositoryEntries(repoType, {\n          query: this.getDeviceTypeQuery(repoType),\n          partialName: searchTerm.name,\n          params: { pageSize: 100 },\n          skipLegacy: true\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.repositoryService.listBaseVersions(mo);\n    });\n    return mos;\n  }\n\n  addConfiguration() {\n    const modal = this.bsModal.show(SelectConfigurationModalComponent, {\n      ignoreBackdropClick: true,\n      keyboard: false,\n      ariaLabelledBy: 'modal-title',\n      initialState: {\n        productExperienceEvent: this.productExperienceEvent\n      }\n    });\n    modal.content.deviceTypeQuery = this.getDeviceTypeQuery(RepositoryType.CONFIGURATION);\n    modal.content.selected = this.deviceProfile.c8y_DeviceProfile.configuration;\n    modal.content.load.next();\n    modal.content.resultEmitter.pipe(take(1)).subscribe(selectedConfigurations => {\n      const selectedMapped: DeviceProfileConfiguration[] = selectedConfigurations.map(\n        selectedItem => {\n          return assign(\n            {\n              url: selectedItem.url,\n              name: selectedItem.name\n            },\n            selectedItem.configurationType ? { type: selectedItem.configurationType } : {}\n          );\n        }\n      );\n      const merged: DeviceProfileConfiguration = concat(\n        selectedMapped,\n        this.deviceProfile.c8y_DeviceProfile.configuration || []\n      );\n      const configuration: DeviceProfileConfiguration = uniqWith(merged, (arrVal, othVal) => {\n        return arrVal.type && othVal.type && arrVal.type === othVal.type;\n      });\n      const deviceProfilePartial: Partial<IManagedObject> = {\n        c8y_DeviceProfile: this.deviceProfile.c8y_DeviceProfile || {}\n      };\n      assign(deviceProfilePartial.c8y_DeviceProfile, { configuration });\n      this.updateDeviceProfile(deviceProfilePartial);\n    });\n  }\n\n  addSoftware() {\n    const initialState: Partial<RepositorySelectModalComponent> & {\n      repositoryEntriesWithVersionsFn$: (modal) => Observable<IManagedObject[]>;\n    } = {\n      deviceTypeQuery: this.getDeviceTypeQuery(RepositoryType.SOFTWARE),\n      repositoryType: RepositoryType.SOFTWARE,\n      repositoryEntriesWithVersionsFn$: modalDialog =>\n        this.getRepositoryEntriesWithVersions$(\n          modalDialog.content.searchTerm,\n          RepositoryType.SOFTWARE\n        ),\n      selected: this.deviceProfile.c8y_DeviceProfile.software,\n      icon: 'c8y-tools',\n      title: gettext('Select software'),\n      mode: ModalSelectionMode.MULTI,\n      productExperienceEvent: this.productExperienceEvent\n    };\n    const modal = this.bsModal.show(RepositorySelectModalComponent, {\n      ignoreBackdropClick: true,\n      keyboard: false,\n      ariaLabelledBy: 'modal-title',\n      initialState\n    });\n\n    if (initialState.repositoryEntriesWithVersionsFn$) {\n      modal.content.repositoryEntriesWithVersions$ =\n        initialState.repositoryEntriesWithVersionsFn$(modal);\n    }\n\n    modal.content.load.next();\n    modal.content.resultEmitter.pipe(take(1)).subscribe(selectedSoftware => {\n      const selectedMapped: DeviceProfileSoftware[] = selectedSoftware.map(selectedItem => {\n        return {\n          name: selectedItem.name,\n          version: selectedItem.version,\n          url: selectedItem.url,\n          softwareType: selectedItem.softwareType,\n          action: 'install'\n        };\n      });\n      const merged: DeviceProfileSoftware = concat(\n        selectedMapped,\n        this.deviceProfile.c8y_DeviceProfile.software || []\n      );\n      const software: DeviceProfileSoftware = uniqWith(merged, (arrVal, othVal) => {\n        return arrVal.name && othVal.name && arrVal.name === othVal.name;\n      });\n      const deviceProfilePartial: Partial<IManagedObject> = {\n        c8y_DeviceProfile: this.deviceProfile.c8y_DeviceProfile || {}\n      };\n      assign(deviceProfilePartial.c8y_DeviceProfile, { software });\n      this.updateDeviceProfile(deviceProfilePartial);\n    });\n  }\n\n  get isDeviceProfileEmpty() {\n    const isSoftware =\n      this.deviceProfile.c8y_DeviceProfile.software &&\n      this.deviceProfile.c8y_DeviceProfile.software.length > 0;\n    const isFirmware = Boolean(this.deviceProfile.c8y_DeviceProfile.firmware);\n    const isConfiguration =\n      this.deviceProfile.c8y_DeviceProfile.configuration &&\n      this.deviceProfile.c8y_DeviceProfile.configuration.length > 0;\n    return isSoftware || isFirmware || isConfiguration;\n  }\n\n  removeItem(removedItem, category) {\n    const deviceProfilePartial: Partial<IManagedObject> = {\n      c8y_DeviceProfile: this.deviceProfile.c8y_DeviceProfile\n    };\n    const filtered = deviceProfilePartial.c8y_DeviceProfile[category].filter(\n      item => !isEqual(removedItem, item)\n    );\n    deviceProfilePartial.c8y_DeviceProfile[category] = filtered;\n    this.updateDeviceProfile(deviceProfilePartial);\n  }\n\n  removeFirmware() {\n    delete this.deviceProfile.c8y_DeviceProfile.firmware;\n    this.updateDeviceProfile({ c8y_DeviceProfile: this.deviceProfile.c8y_DeviceProfile });\n  }\n\n  async updateDeviceProfile(partialDeviceProfile) {\n    if (partialDeviceProfile.c8y_Filter && partialDeviceProfile.c8y_Filter.type === '') {\n      delete partialDeviceProfile.c8y_Filter.type;\n    }\n    Object.assign(partialDeviceProfile, { id: this.deviceProfile.id });\n    try {\n      const profileWithSoftwareTypeFragments = this.deviceProfileService.alignSoftwareTypeFragments(\n        partialDeviceProfile,\n        this.deviceProfile\n      );\n      const { data } = await this.inventoryService.update(profileWithSoftwareTypeFragments);\n      this.deviceProfile = data as DeviceProfile;\n      this.profileName = this.deviceProfile.name;\n      this.alertService.success(gettext('Device profile changed.'));\n    } catch (ex) {\n      this.alertService.addServerFailure(ex);\n    }\n  }\n\n  private async getDeviceProfile(profileId) {\n    try {\n      const { data } = await this.inventoryService.detail(profileId);\n      return data;\n    } catch (ex) {\n      this.alertService.addServerFailure(ex);\n    }\n  }\n\n  private getDeviceTypeQuery(repositoryType) {\n    if (\n      has(this.deviceProfile, 'c8y_Filter.type') &&\n      !isEmpty(this.deviceProfile.c8y_Filter.type)\n    ) {\n      if (repositoryType === RepositoryType.CONFIGURATION) {\n        return this.queriesUtil.addOrFilter(\n          { deviceType: this.deviceProfile.c8y_Filter.type },\n          { __not: { __has: `deviceType` } }\n        );\n      } else {\n        return this.queriesUtil.addOrFilter(\n          { 'c8y_Filter.type': this.deviceProfile.c8y_Filter.type },\n          {\n            __or: [{ 'c8y_Filter.type': '' }, { __not: { __has: `c8y_Filter.type` } }]\n          }\n        );\n      }\n    }\n    return {};\n  }\n}\n","<c8y-title>{{ profileName }}</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-device-profile'\"\n    [label]=\"'Device profiles' | translate\"\n    [path]=\"'device-profiles'\"\n  ></c8y-breadcrumb-item>\n  <c8y-breadcrumb-item\n    icon=\"c8y-device-profile\"\n    label=\"{{ profileName }}\"\n  ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<div\n  class=\"row\"\n  *ngIf=\"deviceProfile\"\n>\n  <div class=\"col-lg-12 col-lg-max\">\n    <div\n      class=\"card card--fullpage\"\n      *ngIf=\"deviceProfile\"\n    >\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-device-profile\"></i>\n            <p>\n              <small class=\"label label-info\">{{ 'Device profile' | translate }}</small>\n            </p>\n          </div>\n          <div class=\"flex-grow col-10\">\n            <div class=\"row\">\n              <div class=\"col-md-4\">\n                <form #editNameForm=\"ngForm\">\n                  <c8y-form-group>\n                    <label\n                      class=\"control-label\"\n                      translate\n                    >\n                      Name\n                    </label>\n                    <div class=\"input-group input-group-editable\">\n                      <input\n                        class=\"form-control\"\n                        placeholder=\"{{ 'e.g. My device profile' | translate }}\"\n                        name=\"name\"\n                        type=\"text\"\n                        required\n                        [(ngModel)]=\"deviceProfile.name\"\n                        data-cy=\"device-profile--add-device-profile-name\"\n                        size=\"{{ deviceProfile.name?.length || 1 }}\"\n                      />\n                      <span></span>\n                      <div class=\"input-group-btn\">\n                        <button\n                          class=\"btn btn-primary\"\n                          title=\"{{ 'Save' | translate }}\"\n                          type=\"button\"\n                          data-cy=\"device-profile--save\"\n                          (click)=\"\n                            updateDeviceProfile({ name: deviceProfile.name });\n                            editNameForm.form.markAsPristine()\n                          \"\n                          [disabled]=\"editNameForm.form.invalid\"\n                          c8yProductExperience\n                          inherit\n                          [actionData]=\"{ action: PRODUCT_EXPERIENCE.ACTIONS.SAVE }\"\n                        >\n                          {{ 'Save' | translate }}\n                        </button>\n                      </div>\n                    </div>\n                  </c8y-form-group>\n                </form>\n              </div>\n              <div class=\"col-md-4\">\n                <form #editTypeForm=\"ngForm\">\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                          (DEVICE_TYPE_POPOVER | translate) +\n                          (isDeviceProfileEmpty\n                            ? ' ' + (DEVICE_TYPE_DISABLED_POPOVER | translate)\n                            : '')\n                        \"\n                        placement=\"right\"\n                        triggers=\"focus\"\n                        container=\"body\"\n                        type=\"button\"\n                      ></button>\n                    </label>\n                    <div class=\"input-group input-group-editable\">\n                      <input\n                        class=\"form-control\"\n                        placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n                        name=\"type\"\n                        type=\"text\"\n                        [(ngModel)]=\"deviceProfile.c8y_Filter.type\"\n                        data-cy=\"device-profile--device-type\"\n                        size=\"{{ deviceProfile.c8y_Filter.type?.length || 14 }}\"\n                        [disabled]=\"isDeviceProfileEmpty\"\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                            updateDeviceProfile({\n                              c8y_Filter: { type: deviceProfile.c8y_Filter.type }\n                            });\n                            editTypeForm.form.markAsPristine()\n                          \"\n                          [disabled]=\"isDeviceProfileEmpty\"\n                          c8yProductExperience\n                          inherit\n                          [actionData]=\"{ action: PRODUCT_EXPERIENCE.ACTIONS.SAVE }\"\n                        >\n                          {{ 'Save' | translate }}\n                        </button>\n                      </div>\n                    </div>\n                  </c8y-form-group>\n                </form>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <div class=\"inner-scroll\">\n        <div class=\"card-header separator-top-bottom bg-content sticky-top\">\n          <div class=\"card-icon\">\n            <i\n              class=\"c8y-icon-duocolor\"\n              [c8yIcon]=\"'c8y-firmware'\"\n            ></i>\n          </div>\n          <div\n            class=\"card-title\"\n            translate\n          >\n            Firmware\n          </div>\n        </div>\n        <div\n          class=\"card-block p-t-0\"\n          *ngIf=\"deviceProfile.c8y_DeviceProfile.firmware\"\n        >\n          <c8y-list-group>\n            <c8y-li>\n              <c8y-li-icon>\n                <i [c8yIcon]=\"'c8y-firmware'\"></i>\n              </c8y-li-icon>\n              <c8y-li-body class=\"content-flex-50 m-l-4\">\n                <div class=\"col-4\">\n                  <span\n                    class=\"text-truncate\"\n                    title=\"{{ deviceProfile.c8y_DeviceProfile.firmware.name }}\"\n                  >\n                    <span\n                      class=\"text-label-small m-r-8\"\n                      translate\n                    >\n                      Name\n                    </span>\n                    {{ deviceProfile.c8y_DeviceProfile.firmware.name }}\n                  </span>\n                </div>\n                <div class=\"col-4\"></div>\n                <div class=\"col-3 d-flex a-i-center\">\n                  <span\n                    class=\"text-truncate\"\n                    title=\"{{ deviceProfile.c8y_DeviceProfile.firmware.version }}\"\n                  >\n                    <span\n                      class=\"text-label-small m-r-4\"\n                      translate\n                    >\n                      Version\n                    </span>\n                    {{ deviceProfile.c8y_DeviceProfile.firmware.version }}\n                  </span>\n                  <button\n                    class=\"btn btn-danger btn-xs visible-xs m-l-auto m-r-8 m-t-8\"\n                    title=\"{{ 'Remove`firmware`' | translate }}\"\n                    type=\"button\"\n                    (click)=\"removeFirmware()\"\n                    c8yProductExperience\n                    inherit\n                    [actionData]=\"{\n                      action: PRODUCT_EXPERIENCE.ACTIONS.REMOVE,\n                      fragment: PRODUCT_EXPERIENCE.FRAGMENTS.FIRMWARE\n                    }\"\n                  >\n                    <i c8yIcon=\"minus-circle\"></i>\n                    {{ 'Remove`firmware`' | translate }}\n                  </button>\n                </div>\n                <div class=\"m-l-auto p-r-8 hidden-xs\">\n                  <button\n                    class=\"btn btn-dot showOnHover text-danger\"\n                    [attr.aria-label]=\"'Remove`firmware`' | translate\"\n                    tooltip=\"{{ 'Remove`firmware`' | translate }}\"\n                    placement=\"right\"\n                    type=\"button\"\n                    [delay]=\"500\"\n                    (click)=\"removeFirmware()\"\n                    c8yProductExperience\n                    inherit\n                    [actionData]=\"{\n                      action: PRODUCT_EXPERIENCE.ACTIONS.REMOVE,\n                      fragment: PRODUCT_EXPERIENCE.FRAGMENTS.FIRMWARE\n                    }\"\n                  >\n                    <i c8yIcon=\"minus-circle\"></i>\n                  </button>\n                </div>\n              </c8y-li-body>\n            </c8y-li>\n          </c8y-list-group>\n        </div>\n        <div\n          class=\"card-block p-t-16\"\n          *ngIf=\"!deviceProfile.c8y_DeviceProfile.firmware\"\n        >\n          <c8y-ui-empty-state\n            class=\"p-t-16 d-block\"\n            icon=\"c8y-firmware\"\n            [title]=\"'No firmware defined.' | translate\"\n            [horizontal]=\"true\"\n          ></c8y-ui-empty-state>\n        </div>\n        <div\n          class=\"card-footer p-t-0\"\n          *ngIf=\"!deviceProfile.c8y_DeviceProfile.firmware\"\n        >\n          <button\n            class=\"btn btn-default\"\n            title=\"{{ 'Add firmware' | translate }}\"\n            type=\"button\"\n            data-cy=\"device-profile--Add-firmware-button\"\n            (click)=\"addFirmware()\"\n            c8yProductExperience\n            inherit\n            [actionData]=\"{\n              action: PRODUCT_EXPERIENCE.ACTIONS.ADD,\n              fragment: PRODUCT_EXPERIENCE.FRAGMENTS.FIRMWARE\n            }\"\n          >\n            <i c8yIcon=\"plus-circle\"></i>\n            {{ 'Add firmware' | translate }}\n          </button>\n        </div>\n\n        <div class=\"card-header separator-top-bottom sticky-top bg-component\">\n          <div class=\"card-icon\">\n            <i\n              class=\"c8y-icon-duocolor\"\n              [c8yIcon]=\"'c8y-tools'\"\n            ></i>\n          </div>\n          <div\n            class=\"card-title\"\n            translate\n          >\n            Software\n          </div>\n        </div>\n        <div\n          class=\"card-block p-t-0\"\n          *ngIf=\"deviceProfile.c8y_DeviceProfile.software?.length > 0\"\n        >\n          <c8y-list-group>\n            <c8y-li *ngFor=\"let software of deviceProfile.c8y_DeviceProfile.software\">\n              <c8y-li-icon>\n                <i [c8yIcon]=\"'c8y-tools'\"></i>\n              </c8y-li-icon>\n              <c8y-li-body class=\"content-flex-50 m-l-4\">\n                <div class=\"col-4\">\n                  <span\n                    class=\"text-truncate-wrap\"\n                    title=\"{{ software.name }}\"\n                  >\n                    <span\n                      class=\"text-label-small m-r-8\"\n                      translate\n                    >\n                      Name\n                    </span>\n                    {{ software.name }}\n                  </span>\n                </div>\n                <div class=\"col-4\">\n                  <span\n                    class=\"text-truncate-wrap\"\n                    title=\"{{ software.name }}\"\n                  >\n                    <span\n                      class=\"text-label-small m-r-8\"\n                      translate\n                    >\n                      Type\n                    </span>\n                    <span\n                      class=\"label label-info m-l-4\"\n                      *ngIf=\"!!software.softwareType\"\n                    >\n                      {{ software.softwareType }}\n                    </span>\n                  </span>\n                </div>\n                <div class=\"col-3 d-flex a-i-center\">\n                  <span\n                    class=\"text-truncate-wrap\"\n                    title=\"{{ software.version }}\"\n                  >\n                    <span\n                      class=\"text-label-small m-r-8\"\n                      translate\n                    >\n                      Version\n                    </span>\n                    {{ software.version }}\n                  </span>\n                  <button\n                    class=\"btn btn-danger btn-xs visible-xs m-l-auto m-r-8 m-t-8\"\n                    title=\"{{ 'Remove`software`' | translate }}\"\n                    type=\"button\"\n                    ((click)=\"removeItem(software, 'software')\"\n                    c8yProductExperience\n                    inherit\n                    [actionData]=\"{\n                      action: PRODUCT_EXPERIENCE.ACTIONS.REMOVE,\n                      fragment: PRODUCT_EXPERIENCE.FRAGMENTS.SOFTWARE\n                    }\"\n                  >\n                    <i c8yIcon=\"minus-circle\"></i>\n                    {{ 'Remove`software`' | translate }}\n                  </button>\n                </div>\n                <div class=\"m-l-auto p-r-8 hidden-xs\">\n                  <button\n                    class=\"btn btn-dot showOnHover text-danger\"\n                    [attr.aria-label]=\"'Remove`software`' | translate\"\n                    tooltip=\"{{ 'Remove`software`' | translate }}\"\n                    placement=\"right\"\n                    type=\"button\"\n                    [delay]=\"500\"\n                    (click)=\"removeItem(software, 'software')\"\n                    c8yProductExperience\n                    inherit\n                    [actionData]=\"{\n                      action: PRODUCT_EXPERIENCE.ACTIONS.REMOVE,\n                      fragment: PRODUCT_EXPERIENCE.FRAGMENTS.SOFTWARE\n                    }\"\n                  >\n                    <i\n                      c8yIcon=\"minus-circle\"\n                      data-cy=\"device-profile--Remove-icon\"\n                    ></i>\n                  </button>\n                </div>\n              </c8y-li-body>\n            </c8y-li>\n          </c8y-list-group>\n        </div>\n        <div\n          class=\"card-block p-t-16\"\n          *ngIf=\"deviceProfile.c8y_DeviceProfile.software?.length === 0\"\n        >\n          <c8y-ui-empty-state\n            icon=\"c8y-tools\"\n            [title]=\"'No software defined.' | translate\"\n            [horizontal]=\"true\"\n          ></c8y-ui-empty-state>\n        </div>\n        <div class=\"card-footer p-t-0\">\n          <button\n            class=\"btn btn-default m-b-0\"\n            title=\"{{ 'Add software' | translate }}\"\n            type=\"button\"\n            data-cy=\"device-profile--Add-software-button\"\n            (click)=\"addSoftware()\"\n            c8yProductExperience\n            inherit\n            [actionData]=\"{\n              action: PRODUCT_EXPERIENCE.ACTIONS.ADD,\n              fragment: PRODUCT_EXPERIENCE.FRAGMENTS.SOFTWARE\n            }\"\n          >\n            <i c8yIcon=\"plus-circle\"></i>\n            {{ 'Add software' | translate }}\n          </button>\n        </div>\n\n        <div class=\"card-header separator-top-bottom bg-component sticky-top\">\n          <div class=\"card-icon\">\n            <i\n              class=\"c8y-icon-duocolor\"\n              [c8yIcon]=\"'gears'\"\n            ></i>\n          </div>\n          <div\n            class=\"card-title\"\n            translate\n          >\n            Configuration\n          </div>\n        </div>\n        <div\n          class=\"card-block p-t-0\"\n          *ngIf=\"deviceProfile.c8y_DeviceProfile.configuration?.length > 0\"\n        >\n          <c8y-list-group>\n            <c8y-li *ngFor=\"let configuration of deviceProfile.c8y_DeviceProfile.configuration\">\n              <c8y-li-icon>\n                <i [c8yIcon]=\"'gears'\"></i>\n              </c8y-li-icon>\n              <c8y-li-body class=\"content-flex-50\">\n                <div class=\"col-4\">\n                  <span\n                    class=\"text-truncate\"\n                    title=\"{{ configuration.name }}\"\n                  >\n                    <span\n                      class=\"text-label-small m-r-8\"\n                      translate\n                    >\n                      Name\n                    </span>\n                    {{ configuration.name }}\n                  </span>\n                </div>\n                <div class=\"col-4\">\n                  <span\n                    class=\"text-label-small m-r-8\"\n                    translate\n                  >\n                    Type\n                  </span>\n                  <span class=\"label label-info\">{{ configuration.type }}</span>\n                  <button\n                    class=\"btn btn-danger btn-xs visible-xs m-l-auto m-r-8 m-t-8\"\n                    title=\"{{ 'Remove`configuration`' | translate }}\"\n                    type=\"button\"\n                    (click)=\"removeItem(configuration, 'configuration')\"\n                    c8yProductExperience\n                    inherit\n                    [actionData]=\"{\n                      action: PRODUCT_EXPERIENCE.ACTIONS.REMOVE,\n                      fragment: PRODUCT_EXPERIENCE.FRAGMENTS.CONFGIURATION\n                    }\"\n                  >\n                    <i c8yIcon=\"minus-circle\"></i>\n                    {{ 'Remove`configuration`' | translate }}\n                  </button>\n                </div>\n                <div class=\"col-3 d-flex a-i-center\"></div>\n                <div class=\"m-l-auto p-r-8 hidden-xs\">\n                  <button\n                    class=\"btn btn-dot showOnHover text-danger\"\n                    [attr.aria-label]=\"'Remove`configuration`' | translate\"\n                    tooltip=\"{{ 'Remove`configuration`' | translate }}\"\n                    placement=\"top\"\n                    type=\"button\"\n                    (click)=\"removeItem(configuration, 'configuration')\"\n                    [delay]=\"500\"\n                    c8yProductExperience\n                    inherit\n                    [actionData]=\"{\n                      action: PRODUCT_EXPERIENCE.ACTIONS.REMOVE,\n                      fragment: PRODUCT_EXPERIENCE.FRAGMENTS.CONFGIURATION\n                    }\"\n                  >\n                    <i\n                      c8yIcon=\"minus-circle\"\n                      data-cy=\"device-profile--Remove-icon\"\n                    ></i>\n                  </button>\n                </div>\n              </c8y-li-body>\n            </c8y-li>\n          </c8y-list-group>\n        </div>\n        <div\n          class=\"card-block p-t-16\"\n          *ngIf=\"deviceProfile.c8y_DeviceProfile.configuration?.length === 0\"\n        >\n          <c8y-ui-empty-state\n            icon=\"gears\"\n            [title]=\"'No configuration defined.' | translate\"\n            [horizontal]=\"true\"\n          ></c8y-ui-empty-state>\n        </div>\n        <div class=\"card-footer p-t-0\">\n          <div class=\"p-t-8\">\n            <button\n              class=\"btn btn-default m-b-0\"\n              title=\"{{ 'Add configuration' | translate }}\"\n              type=\"button\"\n              data-cy=\"device-profile--Add-configuration-button\"\n              (click)=\"addConfiguration()\"\n              c8yProductExperience\n              inherit\n              [actionData]=\"{\n                action: PRODUCT_EXPERIENCE.ACTIONS.ADD,\n                fragment: PRODUCT_EXPERIENCE.FRAGMENTS.CONFGIURATION\n              }\"\n            >\n              <i c8yIcon=\"plus-circle\"></i>\n              {{ 'Add configuration' | translate }}\n            </button>\n          </div>\n        </div>\n      </div>\n    </div>\n  </div>\n</div>\n","import { Component, forwardRef } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  ProductExperienceEvent,\n  ProductExperienceEventSource,\n  PRODUCT_EXPERIENCE_EVENT_SOURCE,\n  IconDirective,\n  C8yTranslateDirective,\n  FormGroupComponent,\n  RequiredInputPlaceholderDirective,\n  ProductExperienceDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { DeviceProfile, PRODUCT_EXPERIENCE_DEVICE_PROFILE } from './device-profile.model';\nimport { DeviceProfileService } from './device-profile.service';\nimport { FormsModule } from '@angular/forms';\nimport { PopoverDirective } from 'ngx-bootstrap/popover';\n\n@Component({\n  selector: 'c8y-add-device-profile',\n  templateUrl: './add-device-profile-component.html',\n  providers: [\n    {\n      provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,\n      useExisting: forwardRef(() => AddDeviceProfileComponent)\n    }\n  ],\n  imports: [\n    IconDirective,\n    C8yTranslateDirective,\n    FormsModule,\n    FormGroupComponent,\n    RequiredInputPlaceholderDirective,\n    PopoverDirective,\n    ProductExperienceDirective,\n    C8yTranslatePipe\n  ]\n})\nexport class AddDeviceProfileComponent implements ProductExperienceEventSource {\n  DEVICE_TYPE_POPOVER = gettext(\n    'The device profile will be available for assignments on devices of the specified type. Otherwise, it will be available for all device types.'\n  );\n  PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_DEVICE_PROFILE;\n  deviceProfile: Partial<DeviceProfile> = {\n    name: '',\n    type: 'c8y_Profile',\n    c8y_Filter: {},\n    c8y_DeviceProfile: {}\n  };\n  result: Promise<any> = new Promise((resolve, reject) => {\n    this._save = resolve;\n    this._cancel = reject;\n  });\n  productExperienceEvent: ProductExperienceEvent;\n  private _save;\n  private _cancel;\n\n  constructor(\n    private modal: BsModalRef,\n    private deviceProfileService: DeviceProfileService\n  ) {}\n\n  async create() {\n    const mo = (await this.deviceProfileService.createDeviceProfile(this.deviceProfile)).data;\n    this._save(mo.id);\n  }\n\n  close() {\n    this._cancel();\n    this.modal.hide();\n  }\n}\n","<div class=\"viewport-modal\">\n  <div class=\"modal-header dialog-header\">\n    <i [c8yIcon]=\"'c8y-device-profile'\"></i>\n    <div\n      class=\"modal-title\"\n      id=\"addDeviceProfileModalTitle\"\n      translate\n    >\n      Add device profile\n    </div>\n  </div>\n\n  <form\n    #createDeviceProfile=\"ngForm\"\n    (ngSubmit)=\"createDeviceProfile.form.valid && create()\"\n  >\n    <div class=\"modal-inner-scroll\">\n      <div\n        class=\"modal-body\"\n        id=\"addDeviceProfileModalDescription\"\n      >\n        <c8y-form-group>\n          <label\n            for=\"name\"\n            translate\n          >\n            Name\n          </label>\n          <input\n            class=\"form-control\"\n            id=\"name\"\n            placeholder=\"{{ 'e.g. My device profile' | translate }}\"\n            name=\"name\"\n            type=\"text\"\n            autocomplete=\"off\"\n            required\n            [(ngModel)]=\"deviceProfile.name\"\n            data-cy=\"add-device-profile--device-profile-name\"\n          />\n        </c8y-form-group>\n        <c8y-form-group>\n          <label>\n            {{ 'Device type' | translate }}\n            <button\n              class=\"btn-help btn-help--sm\"\n              [attr.aria-label]=\"'Help' | translate\"\n              popover=\"{{ DEVICE_TYPE_POPOVER | translate }}\"\n              placement=\"right\"\n              triggers=\"focus\"\n              type=\"button\"\n            ></button>\n          </label>\n          <input\n            class=\"form-control\"\n            id=\"deviceType\"\n            placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n            name=\"deviceType\"\n            [(ngModel)]=\"deviceProfile.c8y_Filter.type\"\n            data-cy=\"add-device-profile--device-type\"\n          />\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)=\"close()\"\n        c8yProductExperience\n        inherit\n        suppressDataOverriding\n        [actionData]=\"{ action: PRODUCT_EXPERIENCE.ACTIONS.CANCEL }\"\n      >\n        {{ 'Cancel' | translate }}\n      </button>\n\n      <button\n        class=\"btn btn-primary\"\n        title=\"{{ 'Continue' | translate }}\"\n        type=\"submit\"\n        [disabled]=\"createDeviceProfile.form.invalid\"\n        c8yProductExperience\n        inherit\n        suppressDataOverriding\n        [actionData]=\"{ action: PRODUCT_EXPERIENCE.ACTIONS.CREATE }\"\n      >\n        {{ 'Continue' | translate }}\n      </button>\n    </div>\n  </form>\n</div>\n","import { Component, EventEmitter, forwardRef, 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  PRODUCT_EXPERIENCE_EVENT_SOURCE,\n  ProductExperienceEvent,\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  DeviceTypeGridColumn,\n  RepositoryItemNameGridColumn,\n  RepositoryService,\n  RepositoryType\n} from '@c8y/ngx-components/repository/shared';\nimport { TranslateService } from '@ngx-translate/core';\nimport { cloneDeep } from 'lodash-es';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { from, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport { AddDeviceProfileComponent } from './add-device-profile.component';\nimport { PRODUCT_EXPERIENCE_DEVICE_PROFILE } from './device-profile.model';\nimport { DeviceProfileService } from './device-profile.service';\n\n@Component({\n  selector: 'c8y-device-profile-list',\n  templateUrl: './device-profile-list.component.html',\n  providers: [\n    {\n      provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,\n      useExisting: forwardRef(() => DeviceProfileListComponent)\n    }\n  ],\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 DeviceProfileListComponent implements OnInit {\n  sizeRequest: Promise<number>;\n  sizeRequestDone = false;\n  refresh$: EventEmitter<void> = new EventEmitter();\n  isDataPresent$: Observable<boolean> = from(\n    this.repositoryService.listRepositoryEntries(RepositoryType.PROFILE, { skipLegacy: true })\n  ).pipe(map(({ data }) => data.length > 0));\n\n  columns: Column[] = [\n    new RepositoryItemNameGridColumn({\n      filterLabel: gettext('Filter device profile by name'),\n      placeholder: gettext('ubuntu core')\n    }),\n    new DeviceTypeGridColumn({ filterLabel: gettext('Filter device profile by device type') })\n  ];\n  actionControls: ActionControl[] = [];\n  serverSideDataCallback: ServerSideDataCallback;\n  pagination = {\n    pageSize: 50,\n    currentPage: 1\n  };\n  productExperienceEvent: ProductExperienceEvent = {\n    eventName: PRODUCT_EXPERIENCE_DEVICE_PROFILE.EVENTS.REPOSITORY,\n    data: {\n      component: PRODUCT_EXPERIENCE_DEVICE_PROFILE.COMPONENTS.DEVICE_PROFILE_LIST\n    }\n  };\n\n  noResultsMessage = gettext('No results to display.');\n  noDataMessage = gettext('No device profiles to display.');\n  noResultsSubtitle = gettext('Refine your search terms or check your spelling.');\n  noDataSubtitle = gettext('Add a new device profile 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    private deviceProfileService: DeviceProfileService\n  ) {\n    this.serverSideDataCallback = this.onDataSourceModifier.bind(this);\n  }\n\n  ngOnInit(): void {\n    this.actionControls.push({\n      type: BuiltInActionType.Edit,\n      callback: this.editDeviceProfile.bind(this)\n    });\n    this.actionControls.push({\n      type: 'duplicate',\n      icon: 'copy',\n      text: gettext('Duplicate'),\n      callback: this.duplicateDeviceProfile.bind(this)\n    });\n    this.actionControls.push({\n      type: BuiltInActionType.Delete,\n      callback: this.deleteDeviceProfile.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.PROFILE, {\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.PROFILE, {\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.PROFILE, {\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  editDeviceProfile(deviceProfile: Partial<IManagedObject>) {\n    this.router.navigate([deviceProfile.id], { relativeTo: this.activatedRoute });\n  }\n\n  async createDeviceProfile() {\n    const modal = this.bsModalService.show(AddDeviceProfileComponent, {\n      class: 'modal-sm',\n      ariaDescribedby: 'addDeviceProfileModalDescription',\n      ariaLabelledBy: 'addDeviceProfileModalTitle',\n      ignoreBackdropClick: true,\n      keyboard: false,\n      initialState: {\n        productExperienceEvent: {\n          ...this.productExperienceEvent,\n          data: {\n            ...this.productExperienceEvent.data,\n            component: PRODUCT_EXPERIENCE_DEVICE_PROFILE.COMPONENTS.ADD_DEVICE_PROFILE\n          }\n        }\n      }\n    }).content as AddDeviceProfileComponent;\n    try {\n      const profileId = await modal.result;\n      modal.close();\n      this.router.navigateByUrl(`/device-profiles/${profileId}`);\n    } catch (ex) {\n      // do nothing\n    }\n  }\n\n  async duplicateDeviceProfile(deviceProfile) {\n    const copy = cloneDeep(deviceProfile);\n    copy.id = null;\n    copy.name = 'Duplicate of ' + deviceProfile.name;\n    const mo = (await this.deviceProfileService.createDeviceProfile(copy)).data;\n    this.router.navigateByUrl(`/device-profiles/${mo.id}`);\n  }\n\n  async deleteDeviceProfile(deviceProfile) {\n    const deviceProfileName = deviceProfile.name;\n    const title = gettext('Delete device profile');\n    const confirmationText = this.translateService.instant(\n      gettext('You are about to delete a device profile \"{{ deviceProfileName }}\".'),\n      { deviceProfileName }\n    );\n    const finalQuestion = this.translateService.instant(gettext('Do you want to proceed?'));\n    try {\n      await this.modalService.confirm(\n        title,\n        `${confirmationText} ${finalQuestion}`,\n        Status.DANGER,\n        {\n          ok: gettext('Delete')\n        },\n        {},\n        this.productExperienceEvent\n      );\n      await this.delete(deviceProfile.id);\n      this.refresh$.next();\n    } catch (ex) {\n      // do nothing\n    }\n  }\n\n  trackByName(_index, column: Column): string {\n    return column.name;\n  }\n\n  private async delete(profileId) {\n    try {\n      await this.repositoryService.delete(profileId);\n      this.alertService.success(gettext('Device profile deleted.'));\n    } catch (ex) {\n      this.alertService.addServerFailure(ex);\n    }\n  }\n}\n","<c8y-title>{{ 'Device profiles' | translate }}</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-device-profile\"\n    label=\"{{ 'Device profiles' | 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 device profile' | translate }}\"\n    data-cy=\"device-profile-list--Add-device-profile\"\n    (click)=\"createDeviceProfile()\"\n  >\n    <i c8yIcon=\"plus-circle\"></i>\n    {{ 'Add device profile' | translate }}\n  </button>\n</c8y-action-bar-item>\n\n<c8y-help\n  src=\"/docs/device-management-application/managing-device-data/#managing-device-profiles\"\n></c8y-help>\n\n<div class=\"content-fullpage border-top border-bottom\">\n  <c8y-data-grid\n    [title]=\"'Device profiles' | 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 device profile' | translate }}\"\n            type=\"button\"\n            (click)=\"createDeviceProfile()\"\n          >\n            {{ 'Add device profile' | translate }}\n          </button>\n        </p>\n      }\n    </c8y-ui-empty-state>\n  </c8y-data-grid>\n</div>\n","import { Injectable } from '@angular/core';\nimport { ActivatedRouteSnapshot } from '@angular/router';\nimport { DeviceProfileOperation } from './device-profile.model';\nimport { IManagedObject } from '@c8y/client';\n\n@Injectable()\nexport class DeviceProfileGuard {\n  canActivate(route: ActivatedRouteSnapshot) {\n    const contextData = route.data.contextData || route.parent.data.contextData;\n    if (!contextData) {\n      return false;\n    }\n    return this.hasSupportedOperation(contextData, DeviceProfileOperation.APPLY_PROFILE);\n  }\n\n  private hasSupportedOperation(mo: IManagedObject, operation: DeviceProfileOperation) {\n    const supported = mo.c8y_SupportedOperations || [];\n    if (!supported) {\n      return false;\n    }\n    return !!supported.find(supportedOperation => supportedOperation === operation);\n  }\n}\n","import { Component, Input } from '@angular/core';\nimport { ComparisonResult } from '../device-profile.model';\nimport { NgFor, NgIf, NgTemplateOutlet, NgClass } from '@angular/common';\nimport {\n  IconDirective,\n  MessagesComponent,\n  MessageDirective,\n  C8yTranslateDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\n\n@Component({\n  selector: 'c8y-device-profile-item-list',\n  templateUrl: './device-profile-item-list.component.html',\n  imports: [\n    NgFor,\n    NgIf,\n    IconDirective,\n    NgTemplateOutlet,\n    NgClass,\n    MessagesComponent,\n    MessageDirective,\n    C8yTranslateDirective,\n    C8yTranslatePipe\n  ]\n})\nexport class DeviceProfileItemListComponent {\n  @Input() icon: string;\n  @Input() comparisonResults: ComparisonResult[];\n  @Input() showProfileItems: boolean;\n  @Input() showTextLabel: boolean;\n}\n","<div\n  class=\"d-contents\"\n  *ngFor=\"let comparisonResult of comparisonResults\"\n>\n  <div\n    class=\"p-l-16 p-r-16\"\n    *ngIf=\"showProfileItems\"\n  >\n    <div class=\"c8y-list__item fit-h\">\n      <div\n        class=\"c8y-list__item__block\"\n        *ngIf=\"comparisonResult.profile\"\n      >\n        <div class=\"c8y-list__item__icon\">\n          <i [c8yIcon]=\"icon\"></i>\n        </div>\n        <div class=\"c8y-list__item__body\">\n          <ng-container\n            *ngTemplateOutlet=\"comparisonResultInfo; context: comparisonResult.profile\"\n          ></ng-container>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div class=\"p-l-16 p-r-16 bg-level-1\">\n    <div\n      class=\"c8y-list__item bg-level-1\"\n      [ngClass]=\"{\n        'has-warning': !!comparisonResult.comparisonAlert\n      }\"\n    >\n      <div class=\"c8y-list__item__block\">\n        <div class=\"c8y-list__item__icon\">\n          <i [c8yIcon]=\"icon\"></i>\n        </div>\n        <div class=\"c8y-list__item__body\">\n          <ng-container\n            *ngTemplateOutlet=\"\n              comparisonResultInfo;\n              context: comparisonResult.device ? comparisonResult.device : comparisonResult.profile\n            \"\n          ></ng-container>\n          <c8y-messages\n            class=\"m-0\"\n            style=\"margin-bottom: calc(var(--margin-base, 8px) * -1)\"\n            *ngIf=\"comparisonResult.comparisonAlert\"\n          >\n            <c8y-message>\n              {{ comparisonResult.comparisonAlert | translate }}\n            </c8y-message>\n          </c8y-messages>\n        </div>\n      </div>\n    </div>\n  </div>\n  <div\n    class=\"p-l-16 p-r-16 bg-level-0 hidden-xs hidden-sm\"\n    *ngIf=\"!showProfileItems\"\n  ></div>\n</div>\n\n<ng-template\n  #comparisonResultInfo\n  let-name=\"itemName\"\n  let-details=\"itemDetails\"\n  let-type=\"itemType\"\n>\n  <div class=\"content-flex-40\">\n    <div class=\"col-5\">\n      <span class=\"text-truncate\">\n        <span class=\"text-label-small m-r-4\">Name</span>\n        <span title=\"{{ name }}\">\n          {{ name }}\n        </span>\n      </span>\n    </div>\n    <div class=\"col-3\">\n      <span\n        class=\"text-truncate\"\n        *ngIf=\"!!type\"\n      >\n        <span class=\"text-label-small m-r-4\">Type</span>\n        <span title=\"{{ type }}\">\n          <span class=\"label label-info m-l-4\">\n            {{ type }}\n          </span>\n        </span>\n      </span>\n    </div>\n    <div class=\"col-4\">\n      <span\n        class=\"text-truncate\"\n        *ngIf=\"showTextLabel && details; else showInfoLabel\"\n      >\n        <span\n          class=\"text-label-small m-r-4\"\n          translate\n        >\n          Version\n        </span>\n        <span title=\"{{ details }}\">{{ details }}</span>\n      </span>\n      <ng-template #showInfoLabel>\n        <span class=\"label label-info\">{{ details }}</span>\n      </ng-template>\n    </div>\n  </div>\n</ng-template>\n","import { Component, Input } from '@angular/core';\nimport { ComparisonResult } from '../device-profile.model';\nimport { NgIf } from '@angular/common';\nimport { IconDirective, C8yTranslateDirective, C8yTranslatePipe } from '@c8y/ngx-components';\nimport { DeviceProfileItemListComponent } from './device-profile-item-list.component';\n\n@Component({\n  selector: 'c8y-device-tab-profile-detail',\n  templateUrl: './device-tab-profile-detail.component.html',\n  imports: [\n    NgIf,\n    IconDirective,\n    C8yTranslateDirective,\n    DeviceProfileItemListComponent,\n    C8yTranslatePipe\n  ]\n})\nexport class DeviceTabProfileDetailComponent {\n  @Input() sectionTitle: string;\n  @Input() sectionIcon: string;\n  @Input() emptyStateText = '';\n  @Input() emptyStateDetails = '';\n  @Input() isProfileSelected: boolean;\n  @Input() isEmpty: boolean;\n  @Input() items: ComparisonResult[];\n  @Input() showTextLabel = true;\n}\n","<div class=\"card--grid grid__col--6-6--md\">\n  <div class=\"bg-level-0 card-block sticky-top\">\n    <h5 class=\"legend form-block\">{{ sectionTitle | translate }}</h5>\n  </div>\n  <div class=\"bg-level-1  card-block sticky-top hidden-xs hidden-sm\">\n    <h5 class=\"legend form-block\">{{ sectionTitle | translate }}</h5>\n  </div>\n  <div class=\"bg-level-0 p-l-16 p-r-16\">\n    <hr class=\"m-0\" />\n  </div>\n  <div class=\"bg-level-1 p-l-16 p-r-16\">\n    <hr class=\"m-0\" />\n  </div>\n  <div class=\"d-contents\" *ngIf=\"!isProfileSelected || isEmpty\">\n    <div class=\"p-l-16 p-r-16\">\n      <div class=\"c8y-empty-state text-left\">\n        <h1 [c8yIcon]=\"sectionIcon\" class=\"c8y-icon-duocolor\"></h1>\n        <p>\n          <span>{{ emptyStateText | translate }}</span\n          ><br />\n          <small *ngIf=\"isProfileSelected; else noItems\">\n            {{ emptyStateDetails | translate }}\n          </small>\n          <ng-template #noItems>\n            <small translate>No device profile selected</small>\n          </ng-template>\n        </p>\n      </div>\n    </div>\n  </div>\n  <div class=\"bg-level-1\" *ngIf=\"items.length === 0\"></div>\n  <c8y-device-profile-item-list\n    *ngIf=\"items.length > 0\"\n    [icon]=\"sectionIcon\"\n    [comparisonResults]=\"items\"\n    [showProfileItems]=\"isProfileSelected && !isEmpty\"\n    [showTextLabel]=\"showTextLabel\"\n    class=\"d-contents\"\n  ></c8y-device-profile-item-list>\n  <div class=\"bg-level-0 p-t-24\" *ngIf=\"isProfileSelected && !isEmpty\"></div>\n  <div class=\"bg-level-1 p-t-24\" *ngIf=\"isProfileSelected && !isEmpty\"></div>\n</div>\n","import { Component, DestroyRef, forwardRef, inject, OnInit } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute } from '@angular/router';\nimport { IManagedObject, IOperation, IResultList } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  AlertService,\n  ForOfFilterPipe,\n  ManagedObjectRealtimeService,\n  OperationRealtimeService,\n  PRODUCT_EXPERIENCE_EVENT_SOURCE,\n  ProductExperienceEvent,\n  ProductExperienceEventSource,\n  ActionBarItemComponent,\n  IconDirective,\n  RealtimeButtonComponent,\n  C8yTranslateDirective,\n  TypeaheadComponent,\n  ForOfDirective,\n  ListItemComponent,\n  HighlightComponent,\n  ProductExperienceDirective,\n  C8yTranslatePipe\n} from '@c8y/ngx-components';\nimport { has, pickBy } from 'lodash-es';\nimport { BehaviorSubject, combineLatest, Observable, pipe } from 'rxjs';\nimport { filter, map, switchMap, tap } from 'rxjs/operators';\nimport {\n  ComparisonResult,\n  DeviceProfile,\n  PRODUCT_EXPERIENCE_DEVICE_PROFILE\n} from '../device-profile.model';\nimport { DeviceProfileService } from '../device-profile.service';\nimport { NgClass } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { OperationDetailsComponent } from '@c8y/ngx-components/operations/operation-details';\nimport { DeviceTabProfileDetailComponent } from './device-tab-profile-detail.component';\n\n@Component({\n  selector: 'c8y-device-tab-profile',\n  templateUrl: './device-tab-profile.component.html',\n  providers: [\n    ManagedObjectRealtimeService,\n    {\n      provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,\n      useExisting: forwardRef(() => DeviceTabProfileComponent)\n    }\n  ],\n  imports: [\n    ActionBarItemComponent,\n    IconDirective,\n    NgClass,\n    RealtimeButtonComponent,\n    C8yTranslateDirective,\n    FormsModule,\n    TypeaheadComponent,\n    ForOfDirective,\n    ListItemComponent,\n    HighlightComponent,\n    ProductExperienceDirective,\n    OperationDetailsComponent,\n    DeviceTabProfileDetailComponent,\n    C8yTranslatePipe\n  ]\n})\nexport class DeviceTabProfileComponent implements OnInit, ProductExperienceEventSource {\n  PRODUCT_EXPERIENCE = PRODUCT_EXPERIENCE_DEVICE_PROFILE;\n  device: IManagedObject;\n  deviceProfiles$: Observable<IResultList<IManagedObject>>;\n  selectedProfile: Partial<DeviceProfile>;\n  operation: IOperation;\n  firmwareItems: ComparisonResult[] = [];\n  softwareItems: ComparisonResult[] = [];\n  configurationItems: ComparisonResult[] = [];\n\n  filterPipe: ForOfFilterPipe;\n  pattern$ = new BehaviorSubject<string>('');\n  reload$ = new BehaviorSubject<boolean>(true);\n  productExperienceEvent: ProductExperienceEvent = {\n    eventName: PRODUCT_EXPERIENCE_DEVICE_PROFILE.EVENTS.DEVICE_TAB,\n    data: {\n      component: PRODUCT_EXPERIENCE_DEVICE_PROFILE.COMPONENTS.DEVICE_TAB_PROFILE\n    }\n  };\n  private destroyRef = inject(DestroyRef);\n\n  constructor(\n    public deviceRealtime: ManagedObjectRealtimeService,\n    private deviceProfileService: DeviceProfileService,\n    private route: ActivatedRoute,\n    private operationRealtime: OperationRealtimeService,\n    private alertService: AlertService\n  ) {\n    this.device = this.route.snapshot.parent.data.contextData;\n  }\n\n  async ngOnInit() {\n    this.getDeviceProfilesAndUpdateProfileItems();\n    this.subscribeToManagedObjects();\n    const supportedSoftwareTypes = new Set(this.device.c8y_SupportedSoftwareTypes);\n    const isSubset = (profileTypes: string[]) => {\n      return profileTypes.every(type => supportedSoftwareTypes.has(type));\n    };\n    this.filterPipe = pipe(\n      map(data => {\n        if (supportedSoftwareTypes.size) {\n          return data.filter(mo =>\n            isSubset(this.deviceProfileService.getSoftwareTypes(mo as unknown as DeviceProfile))\n          );\n        } else {\n          return data;\n        }\n      })\n    );\n  }\n\n  async getDeviceProfilesAndUpdateProfileItems() {\n    this.deviceProfiles$ = combineLatest([this.reload$.pipe(filter(Boolean)), this.pattern$]).pipe(\n      switchMap(([_, name]) =>\n        this.deviceProfileService.getDeviceProfilesByDevice(this.device, name)\n      ),\n      tap(async profiles => {\n        if (this.device.c8y_Profile) {\n          const profileId = this.device.c8y_Profile.profileId;\n          this.selectedProfile = profiles.data.find(mo => mo.id === profileId);\n        }\n        this.updateProfileItems(this.device, this.selectedProfile);\n        this.operation = await this.deviceProfileService.getProfileOperation(this.device.id);\n        this.subscribeToOperations();\n      }),\n      tap(() => this.reload$.next(false)),\n      takeUntilDestroyed(this.destroyRef)\n    );\n  }\n\n  selectProfile(mo: DeviceProfile) {\n    this.selectedProfile = this.toProfileForDevice(mo);\n    this.updateProfileItems(this.device, this.selectedProfile);\n  }\n\n  async createOperation() {\n    this.operation = await this.deviceProfileService.createProfileOperation(\n      this.device,\n      this.selectedProfile\n    );\n  }\n\n  updateProfileItems(device, profile) {\n    this.firmwareItems = this.deviceProfileService.getFirmwareItems(device, profile);\n    this.softwareItems = this.deviceProfileService.getSoftwareItems(device, profile);\n    this.configurationItems = this.deviceProfileService.getConfigurationItems(device, profile);\n  }\n\n  private subscribeToManagedObjects() {\n    this.deviceRealtime\n      .onUpdate$(this.device.id)\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe((managedObject: IManagedObject) => {\n        this.updateProfileItems(managedObject, this.selectedProfile);\n      });\n    this.deviceRealtime\n      .onDelete$(this.device.id)\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(() => {\n        this.alertService.danger(\n          gettext(\n            'This device has just been deleted. You will be redirected to \"All devices\" page now.'\n          )\n        );\n        window.location.href = '#/device';\n      });\n  }\n\n  private subscribeToOperations() {\n    this.operationRealtime\n      .onAll$(this.device.id)\n      .pipe(\n        map(({ data }) => data as IOperation),\n        filter(operation => operation.c8y_DeviceProfile),\n        takeUntilDestroyed(this.destroyRef)\n      )\n      .subscribe(operation => {\n        this.operation = operation;\n      });\n  }\n\n  private toProfileForDevice(profile: DeviceProfile): DeviceProfile {\n    if (\n      Array.from(profile?.c8y_DeviceProfile?.software || []).length === 0 ||\n      has(this.device, 'c8y_SupportedSoftwareTypes')\n    ) {\n      return profile;\n    } else {\n      return {\n        ...profile,\n        c8y_DeviceProfile: {\n          ...profile.c8y_DeviceProfile,\n          software: profile.c8y_DeviceProfile.software.map(sw =>\n            pickBy(sw, (_, key) => key !== 'softwareType')\n          )\n        }\n      };\n    }\n  }\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(true)\"\n  >\n    <i\n      c8yIcon=\"refresh\"\n      [ngClass]=\"{ 'icon-spin': reload$.value }\"\n    ></i>\n    {{ 'Reload' | translate }}\n  </button>\n</c8y-action-bar-item>\n<c8y-action-bar-item [placement]=\"'right'\">\n  <c8y-realtime-btn [service]=\"deviceRealtime\"></c8y-realtime-btn>\n</c8y-action-bar-item>\n\n<div class=\"card card--grid--fullpage card--grid--fullpage card--grid grid__row--2-10--md\">\n  <div class=\"card--grid grid__col--6-6--md\">\n    <!-- AVAILABLE PROFILES -->\n    <div class=\"bg-level-0\">\n      <div class=\"card-header separator\">\n        <div\n          class=\"card-title\"\n          translate\n        >\n          Device profile\n        </div>\n      </div>\n      <div class=\"p-16\">\n        <form #deviceProfileForm=\"ngForm\">\n          <div class=\"input-group\">\n            <c8y-typeahead\n              class=\"flex-grow\"\n              placeholder=\"{{ 'Select device profile' | translate }}\"\n              name=\"selectProfile\"\n              data-cy=\"device-tab-profile--select-device-profile\"\n              [(ngModel)]=\"selectedProfile\"\n              (onSearch)=\"pattern$.next($event)\"\n              [allowFreeEntries]=\"false\"\n            >\n              <c8y-li\n                class=\"p-l-8 p-r-8 c8y-list__item--link\"\n                *c8yFor=\"let profile of deviceProfiles$; pipe: filterPipe\"\n                (click)=\"selectProfile(profile); pattern$.next('')\"\n              >\n                <c8y-highlight\n                  [text]=\"profile.name || '&#45;&#45;'\"\n                  [pattern]=\"pattern$.value\"\n                ></c8y-highlight>\n              </c8y-li>\n            </c8y-typeahead>\n            <div class=\"input-group-btn\">\n              <button\n                class=\"btn btn-primary\"\n                title=\"{{ 'Assign device profile' | translate }}\"\n                type=\"button\"\n                (click)=\"createOperation()\"\n                data-cy=\"device-tab-profile--Assign-device-profile-button\"\n                [disabled]=\"!selectedProfile?.id\"\n                c8yProductExperience\n                inherit\n                [actionData]=\"{ action: PRODUCT_EXPERIENCE.ACTIONS.ASSIGN_DEVICE_PROFILE }\"\n              >\n                <span>{{ 'Assign device profile' | translate }}</span>\n              </button>\n            </div>\n          </div>\n        </form>\n      </div>\n    </div>\n\n    <!-- INSTALL PROFILE OPERATION -->\n    <div class=\"bg-level-1\">\n      <div class=\"card-header separator\">\n        <div\n          class=\"card-title\"\n          translate\n        >\n          Currently installed\n        </div>\n      </div>\n      <div class=\"card-block\">\n        <c8y-operation-details\n          [operation]=\"operation\"\n          c8yProductExperience\n          inherit\n          suppressDataOverriding\n        ></c8y-operation-details>\n      </div>\n    </div>\n  </div>\n  <div class=\"card--grid__inner-scroll d-col no-align-items\">\n    <div class=\"d-contents\">\n      <!-- FIRMWARE -->\n      <c8y-device-tab-profile-detail\n        class=\"d-contents\"\n        [sectionIcon]=\"'c8y-firmware'\"\n        [sectionTitle]=\"'Firmware' | translate\"\n        [emptyStateText]=\"'No firmware to display.' | translate\"\n        [emptyStateDetails]=\"'No firmware assigned.' | translate\"\n        [isProfileSelected]=\"!!selectedProfile\"\n        [items]=\"firmwareItems\"\n        [isEmpty]=\"!selectedProfile?.c8y_DeviceProfile?.firmware?.name\"\n      ></c8y-device-tab-profile-detail>\n    </div>\n    <div class=\"d-contents\">\n      <!-- SOFTWARE -->\n      <c8y-device-tab-profile-detail\n        class=\"d-contents\"\n        [sectionIcon]=\"'c8y-tools'\"\n        [sectionTitle]=\"'Software' | translate\"\n        [emptyStateText]=\"'No software to display.' | translate\"\n        [emptyStateDetails]=\"'No software assigned.' | translate\"\n        [isProfileSelected]=\"!!selectedProfile\"\n        [items]=\"softwareItems\"\n        [isEmpty]=\"\n          !selectedProfile?.c8y_DeviceProfile?.software ||\n          selectedProfile?.c8y_DeviceProfile?.software?.length === 0\n        \"\n      ></c8y-device-tab-profile-detail>\n    </div>\n    <div class=\"d-contents\">\n      <!-- CONFIGURATION -->\n      <c8y-device-tab-profile-detail\n        class=\"d-contents\"\n        [sectionIcon]=\"'gears'\"\n        [sectionTitle]=\"'Configuration' | translate\"\n        [emptyStateText]=\"'No configuration to display' | translate\"\n        [emptyStateDetails]=\"'No configuration assigned' | translate\"\n        [isProfileSelected]=\"!!selectedProfile\"\n        [items]=\"configurationItems\"\n        [isEmpty]=\"\n          !selectedProfile?.c8y_DeviceProfile?.configuration ||\n          selectedProfile?.c8y_DeviceProfile?.configuration?.length === 0\n        \"\n      ></c8y-device-tab-profile-detail>\n    </div>\n    <!-- fill in the remanining vertical space when empty -->\n    <div class=\"card--grid grid__col--6-6--md flex-grow\">\n      <div class=\"bg-level-0\"></div>\n      <div class=\"bg-level-1\"></div>\n    </div>\n  </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { Route, RouterModule } from '@angular/router';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  CommonModule,\n  CoreModule,\n  hookNavigator,\n  hookRoute,\n  ViewContext\n} from '@c8y/ngx-components';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { ButtonsModule } from 'ngx-bootstrap/buttons';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { DeviceProfileComponent } from './device-profile.component';\nimport { DeviceProfileListComponent } from './device-profile-list.component';\nimport { DeviceProfileNavigationFactory } from './device-profile-navigation.factory';\nimport { DeviceProfileService } from './device-profile.service';\nimport { AddDeviceProfileComponent } from './add-device-profile.component';\nimport { DeviceProfileGuard } from './device-profile.guard';\nimport { SharedRepositoryModule } from '@c8y/ngx-components/repository/shared';\nimport { SelectConfigurationModalComponent } from './select-configuration-modal.component';\nimport { DeviceTabProfileComponent } from './device-tab-profile/device-tab-profile.component';\nimport { DeviceTabProfileDetailComponent } from './device-tab-profile/device-tab-profile-detail.component';\nimport { DeviceProfileItemListComponent } from './device-tab-profile/device-profile-item-list.component';\nimport { OperationDetailsModule } from '@c8y/ngx-components/operations/operation-details';\n\nconst deviceProfilesRoutes: Route[] = [\n  {\n    path: 'device-profiles/:id',\n    component: DeviceProfileComponent\n  },\n  {\n    path: 'device-profiles',\n    component: DeviceProfileListComponent\n  }\n];\n\nconst deviceTabProfileRoutes: any[] = [\n  {\n    context: ViewContext.Device,\n    path: 'device-profile',\n    component: DeviceTabProfileComponent,\n    label: gettext('Device profile'),\n    icon: 'c8y-device-profile',\n    canActivate: [DeviceProfileGuard]\n  }\n];\n\n@NgModule({\n  exports: [],\n  imports: [\n    CoreModule,\n    CommonModule,\n    SharedRepositoryModule,\n    RouterModule.forChild(deviceProfilesRoutes),\n    BsDropdownModule.forRoot(),\n    TooltipModule,\n    ReactiveFormsModule,\n    ButtonsModule,\n    PopoverModule,\n    OperationDetailsModule,\n    DeviceProfileComponent,\n    DeviceProfileListComponent,\n    AddDeviceProfileComponent,\n    SelectConfigurationModalComponent,\n    DeviceTabProfileComponent,\n    DeviceTabProfileDetailComponent,\n    DeviceProfileItemListComponent\n  ],\n  providers: [\n    hookNavigator(DeviceProfileNavigationFactory),\n    hookRoute(deviceTabProfileRoutes),\n    DeviceProfileService,\n    DeviceProfileGuard\n  ]\n})\nexport class DeviceProfileModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i3","i5","i6.DeviceProfileService","i2.DeviceProfileService","i4"],"mappings":"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"}