{"version":3,"file":"c8y-ngx-components-assets-navigator.mjs","sources":["../../assets-navigator/action.enum.ts","../../assets-navigator/load-more-node.ts","../../assets-navigator/asset-node.ts","../../assets-navigator/dynamic-group-node.ts","../../assets-navigator/asset-node-config.model.ts","../../assets-navigator/group.service.ts","../../assets-navigator/asset-node.service.ts","../../assets-navigator/asset-node.factory.ts","../../assets-navigator/asset-selector/group-node.ts","../../assets-navigator/asset-selector/group-node.service.ts","../../assets-navigator/asset-selector/asset-selector.service.ts","../../assets-navigator/asset-selector/asset-selector-node.component.ts","../../assets-navigator/asset-selector/asset-selector-node.component.html","../../assets-navigator/asset-selector/asset-selector-base.ts","../../assets-navigator/asset-selector/asset-selector.model.ts","../../assets-navigator/asset-selector/unassigned-devices-node.ts","../../assets-navigator/asset-selector/asset-selector.component.ts","../../assets-navigator/asset-selector/asset-selector.component.html","../../assets-navigator/asset-selector/miller-view.component.ts","../../assets-navigator/asset-selector/miller-view.component.html","../../assets-navigator/asset-selector/asset-selector.module.ts","../../assets-navigator/assets-navigator.module.ts","../../assets-navigator/c8y-ngx-components-assets-navigator.ts"],"sourcesContent":["export enum AssetsNavigatorAction {\n  FETCH,\n  NEXT,\n  REFRESH,\n  LOADING_DONE\n}\n","import { gettext } from '@c8y/ngx-components/gettext';\nimport { NavigatorNode } from '@c8y/ngx-components';\n\nexport class LoadMoreNode extends NavigatorNode {\n  static NAME = 'LoadMoreNode';\n  label = gettext('Load more');\n  icon = 'plus';\n  droppable = true;\n\n  constructor() {\n    super();\n    this.priority = -Infinity;\n  }\n\n  toString() {\n    return LoadMoreNode.NAME;\n  }\n\n  isGroup() {\n    return false;\n  }\n}\n","import { IIdentified, Paging } from '@c8y/client';\nimport {\n  ClickOptions,\n  DeviceStatusComponent,\n  GroupFragment,\n  NavigatorNode,\n  NavigatorNodeData\n} from '@c8y/ngx-components';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { debounce } from 'lodash-es';\nimport { BehaviorSubject, Subject, Subscription } from 'rxjs';\nimport { AssetsNavigatorAction } from './action.enum';\nimport { AssetNodeMo, AssetNodeService } from './asset-node.service';\nimport { LoadMoreNode } from './load-more-node';\n\nexport class AssetNode extends NavigatorNode {\n  static NAME = 'AssetNode';\n  root: boolean;\n  mo: any;\n  hideDevices = false;\n  filterQuery$ = new BehaviorSubject<string>('');\n  showChildDevices = false;\n\n  /**\n   * Asset node children (subentries).\n   */\n  children: AssetNode[] = [];\n\n  get hasChildren() {\n    return this.root || this.service.isGroup(this.mo);\n  }\n\n  get isDevice() {\n    return !!this.mo.c8y_IsDevice;\n  }\n\n  get isDeviceOrProbablyChildDevice() {\n    return this.isDevice || this.isNeitherDeviceOrGroup;\n  }\n\n  get isNeitherDeviceOrGroup() {\n    return (\n      !this.service.isGroup(this.mo) &&\n      !this.service.isDynamicGroup(this.mo) &&\n      !this.isDevice &&\n      !this.root\n    );\n  }\n\n  events: Subject<AssetsNavigatorAction>;\n  nodesFetched: Subject<void> = new Subject();\n  protected paging: Paging<AssetNodeMo>;\n  protected loadMoreNode: LoadMoreNode;\n  private onUpdateSubscription: Subscription;\n\n  constructor(\n    protected service: AssetNodeService,\n    protected config: NavigatorNodeData = {}\n  ) {\n    super(config);\n\n    this.root = this.root || false;\n    this.hideDevices = config.hideDevices ?? this.hideDevices;\n    this.mo = this.mo || {};\n    this.path = this.getPath();\n    this.draggable = !this.service?.moduleConfig?.disableDragAndDrop && !this.root;\n    this.droppable =\n      !this.service?.moduleConfig?.disableDragAndDrop && !this.isDeviceOrProbablyChildDevice;\n    this.routerLinkExact = this.root;\n    this.updateIcon(false);\n    this.onUpdateSubscription = this.service\n      .onUpdate(this)\n      .subscribe(({ data, method }) => this.refresh(data, method));\n    this.setLabel();\n    this.iconComponent = this.isDeviceOrProbablyChildDevice ? DeviceStatusComponent : undefined;\n  }\n\n  getPath() {\n    if (this.config.path) {\n      return this.config.path;\n    }\n\n    return this.root\n      ? 'group'\n      : this.isDeviceOrProbablyChildDevice\n        ? `device/${this.mo.id}`\n        : `group/${this.mo.id}`;\n  }\n\n  refresh(mo: any = {}, method = 'GET') {\n    if (mo?.id === this.mo.id) {\n      this.mo = mo;\n      this.setLabel();\n      if (this.refreshCallback) {\n        this.refreshCallback();\n      }\n    } else if (method === 'DELETE') {\n      this.parents.forEach((node: AssetNode) => node.refresh());\n      return;\n    }\n    if (this.events) {\n      this.events.next(AssetsNavigatorAction.REFRESH);\n    }\n  }\n\n  setLabel() {\n    if (this.config.label || this.root) {\n      this.label = this.config.label || gettext('Groups');\n      this.translateLabel = true;\n    } else {\n      this.label = this.service.label(this.mo);\n      this.translateLabel = false;\n    }\n  }\n\n  click(options: ClickOptions = {}) {\n    if (this.isDeviceOrProbablyChildDevice && !this.showChildDevices) {\n      return;\n    }\n    this.hookEvents();\n    this.updateIcon(options.open);\n    if (options.open) {\n      this.events.next(AssetsNavigatorAction.FETCH);\n    }\n  }\n\n  sort() {\n    this.children.sort((a, b) => {\n      if (a.priority > b.priority) {\n        return -1;\n      } else if (a.priority < b.priority) {\n        return 1;\n      } else {\n        return 0;\n      }\n    });\n  }\n\n  addManagedObject(mo) {\n    const { childAdditions } = this.mo;\n    if (!this.isChildAddition(childAdditions, mo)) {\n      this.add(this.service.createChildNode(mo, { hideDevices: this.hideDevices }));\n    }\n  }\n\n  isChildAddition(childAdditions, mo) {\n    return (\n      childAdditions && childAdditions.references.some(({ managedObject: { id } }) => id === mo.id)\n    );\n  }\n\n  destroy() {\n    this.onUpdateSubscription.unsubscribe();\n  }\n\n  get canDrop() {\n    const nodeToMove = this.service.draggedData;\n    if (nodeToMove) {\n      const shouldGetChildOfItsOwn = !!nodeToMove.find(child => child === this);\n      const isAlreadyChild = (this.children as AssetNode[]).some(\n        child => child.mo && child.mo.id === nodeToMove.mo.id\n      );\n      const preventMove = this === nodeToMove || shouldGetChildOfItsOwn || isAlreadyChild;\n      return this.droppable && !preventMove && this.service.canDropNode(this.root);\n    }\n    return this.droppable;\n  }\n\n  dragStart($event) {\n    super.dragStart($event);\n    this.service.draggedData = this;\n    this.service.rootNode.droppable = !this.isDeviceOrProbablyChildDevice;\n  }\n\n  dragEnd($event) {\n    super.dragEnd($event);\n  }\n\n  async drop($event) {\n    const nodeToMove = this.service.draggedData;\n\n    // TODO remove when asset type node can be used on the root level.\n    if (this.root && this.isAsset(nodeToMove)) {\n      this.service.alert.info(gettext('Asset type node cannot become root node.'));\n      this.draggedHover = false;\n      this.service.draggedData = undefined;\n      return;\n    }\n\n    super.drop($event);\n    if (this.canDrop) {\n      await this.moveNode(nodeToMove);\n    } else {\n      this.draggedHover = false;\n      this.service.draggedData = undefined;\n    }\n  }\n\n  hookEvents() {\n    if (!this.events) {\n      this.events = new Subject();\n      this.events.subscribe(evt => {\n        if (!this.loading) {\n          this.handleEvent(evt);\n        }\n      });\n    }\n  }\n\n  toString() {\n    return AssetNode.NAME;\n  }\n\n  /**\n   * Checks if the current node has child devices.\n   */\n  hasChildDevices() {\n    return this.mo && this.mo.childDevices.references.length > 0;\n  }\n\n  protected fetch() {\n    return this.root\n      ? this.service.getRootNodes()\n      : this.service.getGroupItems(\n          this.mo.id,\n          this.hideDevices\n            ? {\n                query: `$filter=(has(${GroupFragment.groupFragmentType}))$orderby=name`\n              }\n            : {}\n        );\n  }\n\n  protected async updateIcon(open) {\n    this.icon = await this.service.icon(\n      // if it's root we are going to pass a fake mo to get the same icon as groups\n      this.root ? { c8y_IsDeviceGroup: {} } : this.mo,\n      open\n    );\n  }\n\n  protected countChildren() {\n    return this.children.length;\n  }\n\n  protected async handleEvent(evt: AssetsNavigatorAction) {\n    if (!this.countChildren() && evt === AssetsNavigatorAction.FETCH) {\n      this.loading = true;\n      this.addNodes(await this.fetch());\n      this.loading = false;\n    } else if (evt === AssetsNavigatorAction.NEXT) {\n      this.loadMoreNode.loading = true;\n      this.addNodes(await this.paging.next());\n      this.loadMoreNode.loading = false;\n    } else if (evt === AssetsNavigatorAction.REFRESH) {\n      this.loading = false;\n      this.paging = undefined;\n      this.loadMoreNode = undefined;\n      this.empty();\n      this.events.next(AssetsNavigatorAction.FETCH);\n    }\n  }\n\n  protected addNodes(res) {\n    if (res.paging) {\n      const { currentPage, nextPage, pageSize } = (this.paging = res.paging);\n      if (currentPage === 1) {\n        this.empty();\n      }\n      const itemsCount = res.data.length;\n      const moreItemsAvailable = !!nextPage && itemsCount === pageSize;\n      this.toggleLoadMore(moreItemsAvailable);\n    }\n    (res.data || res).map(mo => {\n      return this.addManagedObject(mo);\n    });\n    this.events.next(AssetsNavigatorAction.LOADING_DONE);\n    this.nodesFetched.next();\n  }\n\n  protected toggleLoadMore(show: boolean) {\n    if (!this.loadMoreNode && show) {\n      this.loadMoreNode = new LoadMoreNode();\n      this.add(this.loadMoreNode);\n      this.loadMoreNode.click = debounce(() => this.events.next(AssetsNavigatorAction.NEXT), 300, {\n        leading: true,\n        trailing: false\n      });\n    }\n\n    if (this.loadMoreNode) {\n      this.loadMoreNode.hidden = !show;\n    }\n  }\n\n  private async moveNode(nodeToMove: AssetNode) {\n    try {\n      const isCopy = await this.showDropConfirm(nodeToMove);\n      await this.verifyNodeAccess(nodeToMove);\n      await this.addMovedNode(nodeToMove);\n      if (!isCopy) {\n        await this.removeMovedNode(nodeToMove);\n      }\n      this.expand();\n    } catch (ex) {\n      if (ex) {\n        this.service.alert.addServerFailure(ex);\n      }\n    } finally {\n      this.draggedHover = false;\n      this.service.draggedData = undefined;\n    }\n  }\n\n  private async showDropConfirm(nodeToMove: AssetNode) {\n    this.confirm.title = gettext('Move');\n    this.confirm.message = gettext('Do you want to move the group?');\n    const buttons: any = [\n      {\n        label: gettext('Cancel'),\n        action: () => Promise.reject()\n      },\n      {\n        label: gettext('Move'),\n        status: 'default',\n        action: () => Promise.resolve(false)\n      }\n    ];\n    if (nodeToMove.isDeviceOrProbablyChildDevice) {\n      this.confirm.title = gettext('Move or add');\n      this.confirm.message = gettext('Do you want to move or add the device?');\n      buttons.push({\n        label: gettext('Add'),\n        status: 'primary',\n        action: () => Promise.resolve(true)\n      });\n    }\n    return this.confirm.show(buttons);\n  }\n\n  private async verifyNodeAccess(nodeToMove: AssetNode) {\n    return this.service.inventory.update({ id: nodeToMove.mo.id });\n  }\n\n  private async addMovedNode(nodeToMove: AssetNode) {\n    let mo: IIdentified;\n\n    if (this.root && !this.isAsset(nodeToMove)) {\n      mo = (\n        await this.service.inventory.update({\n          id: nodeToMove.mo.id,\n          type: GroupFragment.groupType\n        })\n      ).data;\n\n      this.addManagedObject(mo);\n      return;\n    }\n\n    mo = (await this.service.inventory.childAssetsAdd(nodeToMove.mo, this.mo)).data;\n    this.addManagedObject(mo);\n  }\n\n  private isAsset(nodeToMove: AssetNode) {\n    // TODO use isAsset check when https://github.com/Cumulocity-IoT/cumulocity-ui/pull/690 is merged.\n    // Do not override asset type!\n    return nodeToMove.mo?.c8y_IsAsset;\n  }\n\n  private async removeMovedNode(nodeToMove: AssetNode) {\n    for (const parent of nodeToMove.parents as AssetNode[]) {\n      if (parent.mo && parent.mo.type === GroupFragment.dynamicGroupType) {\n        break; // smart groups don't need to be changed\n      }\n\n      if (parent.root && !this.isAsset(nodeToMove)) {\n        await this.service.inventory.update({\n          id: nodeToMove.mo.id,\n          type: GroupFragment.subGroupType\n        });\n      }\n\n      if (!parent.root) {\n        await this.service.inventory.childAssetsRemove(nodeToMove.mo, parent.mo);\n      }\n      parent.remove(nodeToMove);\n    }\n  }\n}\n","import { AssetNode } from './asset-node';\nimport { AssetNodeService } from './asset-node.service';\n\nexport class DynamicGroupNode extends AssetNode {\n  constructor(protected service: AssetNodeService, config = {}) {\n    super(service, config);\n    this.draggable = false;\n    this.droppable = false;\n  }\n\n  get hasChildren() {\n    return true;\n  }\n\n  get query() {\n    return this.mo.c8y_DeviceQueryString;\n  }\n\n  protected fetch(): any {\n    return this.service.getDynamicGroupItems(this.query);\n  }\n}\n","import { InjectionToken } from '@angular/core';\r\nimport { NavigatorNode } from '@c8y/ngx-components';\r\nimport { AssetNode } from './asset-node';\r\nexport const ASSET_NAVIGATOR_CONFIG = new InjectionToken<AssetNavigatorConfig>('AssetNodeConfig');\r\n\r\n/**\r\n * Configuration object of the AssetsNavigatorModule.\r\n */\r\nexport interface AssetNavigatorConfig {\r\n  /**\r\n   * Allows to enable smart groups in the module.\r\n   * Default value: false.\r\n   */\r\n  smartGroups?: boolean;\r\n  /**\r\n   * Expands the root navigator node when the navigator is initialized.\r\n   * Default value: false\r\n   */\r\n  openOnStart?: boolean;\r\n  /**\r\n   * Allows to change the position of the root group in the navigator.\r\n   * The higher the value, the higher the position in navigation.\r\n   * Default value: 2000.\r\n   */\r\n  rootNodePriority?: number;\r\n  /**\r\n   * Allows to drag and drop items in the asset navigator.\r\n   * Default value: true.\r\n   */\r\n  disableDragAndDrop?: boolean;\r\n  /**\r\n   * Allows to override properies of the root group or hide it.\r\n   * Setup examples:\r\n   * - `rootNavigatorNode: true` - shows the default navigator node (default),\r\n   * - `rootNavigatorNode: false` - hides the navigator node,\r\n   * - `rootNavigatorNode: { label: 'New name', ... }` - overrides default navigator node,\r\n   * - `rootNavigatorNode: new NavigatorNode({ label: 'New name', ... })` - overrides default navigator node,\r\n   */\r\n  rootNavigatorNode?: boolean | Partial<NavigatorNode | AssetNode>;\r\n}\r\n","import { Injectable } from '@angular/core';\nimport { IManagedObject } from '@c8y/client';\nimport { GroupService as MigratedDeviceGroupService } from '@c8y/ngx-components';\n\n@Injectable({\n  providedIn: 'root'\n})\n\n/**\n * @deprecated\n * Original service was moved to core/common.\n * This service is deprecated and serves as a proxy to maintain backward compatibility.\n */\nexport class DeviceGroupService {\n  constructor(private migratedDeviceGroupService: MigratedDeviceGroupService) {}\n\n  icon(mo: IManagedObject, open = false): Promise<string> {\n    return this.migratedDeviceGroupService.getIcon(mo, open);\n  }\n\n  isGroup(mo: IManagedObject): boolean {\n    return this.migratedDeviceGroupService.isGroup(mo);\n  }\n\n  isDynamicGroup(mo: IManagedObject): boolean {\n    return this.migratedDeviceGroupService.isDynamicGroup(mo);\n  }\n\n  isDataBroker(mo: IManagedObject): boolean {\n    return this.migratedDeviceGroupService.isDataBroker(mo);\n  }\n\n  isDataBrokerActive(mo: IManagedObject) {\n    return this.migratedDeviceGroupService.isDataBrokerActive(mo);\n  }\n\n  isAsset(mo: IManagedObject) {\n    return this.migratedDeviceGroupService.isAsset(mo);\n  }\n\n  isAnyGroup(mo: IManagedObject) {\n    return this.migratedDeviceGroupService.isAnyGroup(mo);\n  }\n\n  isDevice(mo: IManagedObject) {\n    return this.migratedDeviceGroupService.isDevice(mo);\n  }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { ActivatedRouteSnapshot, ActivationEnd, Router } from '@angular/router';\nimport { IManagedObject, IResult, InventoryService, QueriesUtil, UserService } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  AlertService,\n  AppStateService,\n  BreadcrumbService,\n  GroupFragment,\n  ModalService,\n  NavigatorNode,\n  NavigatorNodeData,\n  OptionsService,\n  ViewContext,\n  Permissions\n} from '@c8y/ngx-components';\nimport { ApiService } from '@c8y/ngx-components/api';\nimport { BehaviorSubject, empty, firstValueFrom, Observable } from 'rxjs';\nimport { filter, first, mergeMap, shareReplay, skip, switchMap } from 'rxjs/operators';\nimport { AssetsNavigatorAction } from './action.enum';\nimport { AssetNode } from './asset-node';\nimport { ASSET_NAVIGATOR_CONFIG, AssetNavigatorConfig } from './asset-node-config.model';\nimport { DynamicGroupNode } from './dynamic-group-node';\nimport { DeviceGroupService } from './group.service';\nimport { TranslateService } from '@ngx-translate/core';\n\nexport interface AssetNodeMo {\n  id: string;\n  type: string;\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class AssetNodeService {\n  rootNode: AssetNode;\n  firstUrl = true;\n  draggedData: AssetNode;\n  queriesUtil: QueriesUtil;\n  protected PAGE_SIZE = 20;\n  private refreshTrigger$ = new BehaviorSubject<void>(undefined);\n  private rootGroupsFetched = false;\n\n  rootGroups$: Observable<any> = this.refreshTrigger$.pipe(\n    switchMap(() => this.fetchRootGroups()),\n    shareReplay({ bufferSize: 1, refCount: false })\n  );\n\n  inventory = inject(InventoryService);\n  apiService = inject(ApiService);\n  modal = inject(ModalService);\n  alert = inject(AlertService);\n  translateService = inject(TranslateService);\n\n  protected breadcrumbService = inject(BreadcrumbService);\n  protected user = inject(UserService);\n  protected appState = inject(AppStateService);\n  protected optionsService = inject(OptionsService);\n  moduleConfig: AssetNavigatorConfig;\n  protected deviceGroupService = inject(DeviceGroupService);\n  protected router = inject(Router);\n\n  constructor() {\n    this.moduleConfig = {\n      rootNodePriority: 2000,\n      ...(inject(ASSET_NAVIGATOR_CONFIG, { optional: true }) || {})\n    };\n    this.queriesUtil = new QueriesUtil();\n\n    this.router.events\n      .pipe(\n        filter(\n          (event: ActivationEnd) =>\n            event instanceof ActivationEnd && event.snapshot.data?.contextData\n        ),\n        first()\n      )\n      .subscribe(({ snapshot }) => {\n        this.expandNodesOnStart(snapshot);\n      });\n  }\n\n  /**\n   * Expands the navigator nodes on first navigation.\n   * @param snapshot The current navigation snapshot.\n   */\n  async expandNodesOnStart(snapshot: ActivatedRouteSnapshot): Promise<void> {\n    if (!this.rootNode) {\n      return;\n    }\n    if (\n      snapshot.data?.context === ViewContext.Group ||\n      snapshot.data?.context === ViewContext.Device\n    ) {\n      const { data } = await this.inventory.detail(snapshot.data.contextData, {\n        withParents: true\n      });\n\n      const allManagedObjectParentIds = [\n        ...data.assetParents.references.map(({ managedObject }) => {\n          return managedObject.id;\n        }),\n        data.id\n      ];\n      this.expandAll(this.rootNode, allManagedObjectParentIds);\n      return;\n    }\n\n    if (this.moduleConfig.openOnStart) {\n      this.expandAll(this.rootNode, []);\n    }\n  }\n\n  /**\n   * Expands all the given ids recursively. Stops if it does not find any.\n   * @param node The node where the expanding should be started\n   * @param ids The ids that should be expanded.\n   */\n  expandAll(node: AssetNode, ids: string[]) {\n    node.open = true;\n    node.click({ open: true });\n    if (node.events) {\n      node.events\n        .pipe(\n          filter(action => action === AssetsNavigatorAction.LOADING_DONE),\n          first()\n        )\n        .subscribe(() => {\n          const nodeToExpand = node.children.find(\n            childNode => childNode.mo?.id && ids.includes(childNode.mo.id)\n          );\n          if (nodeToExpand) {\n            this.expandAll(\n              nodeToExpand,\n              ids.filter(id => id !== nodeToExpand.mo.id)\n            );\n          }\n        });\n    }\n  }\n\n  label(mo: IManagedObject): string {\n    return (\n      mo.name ||\n      (this.isDevice(mo) &&\n        this.translateService.instant(gettext('Device {{id}}'), { id: mo.id })) ||\n      '--'\n    );\n  }\n\n  icon(mo: IManagedObject, open?: boolean): Promise<string> {\n    return this.deviceGroupService.icon(mo, open);\n  }\n\n  isGroup(mo: IManagedObject) {\n    return this.deviceGroupService.isGroup(mo);\n  }\n\n  isDynamicGroup(mo: IManagedObject) {\n    return this.deviceGroupService.isDynamicGroup(mo);\n  }\n\n  isDataBroker(mo: IManagedObject) {\n    return this.deviceGroupService.isDataBroker(mo);\n  }\n\n  isDataBrokerActive(mo: IManagedObject) {\n    return this.deviceGroupService.isDataBrokerActive(mo);\n  }\n\n  isAsset(mo: IManagedObject) {\n    return this.deviceGroupService.isAsset(mo);\n  }\n\n  isAnyGroup(mo: IManagedObject) {\n    return this.deviceGroupService.isAnyGroup(mo);\n  }\n\n  isDevice(mo: IManagedObject) {\n    return this.deviceGroupService.isDevice(mo);\n  }\n\n  createRootNode(config: NavigatorNodeData = {}) {\n    this.rootNode = this.createAssetNode({\n      root: true,\n      ...config,\n      priority: this.moduleConfig.rootNodePriority,\n      featureId: 'groups'\n    });\n    return this.rootNode;\n  }\n\n  createDynamicGroupNode(config) {\n    return new DynamicGroupNode(this, config);\n  }\n\n  createAssetNode(config: Partial<AssetNode>) {\n    return new AssetNode(this, config);\n  }\n\n  createChildNode(managedObject, config: Partial<AssetNode>) {\n    const { type } = managedObject;\n    config.mo = managedObject;\n    if (type === GroupFragment.dynamicGroupType) {\n      return this.createDynamicGroupNode(config);\n    }\n    return this.createAssetNode(config);\n  }\n\n  async getRootNodes(customFilter?: any): Promise<any> {\n    if (!customFilter) {\n      if (this.rootGroupsFetched) {\n        const resultPromise = firstValueFrom(this.rootGroups$.pipe(skip(1))); // skip first (current) value on refresh to get fresh value\n        this.refresh();\n        return resultPromise;\n      } else {\n        this.rootGroupsFetched = true;\n        return firstValueFrom(this.rootGroups$);\n      }\n    }\n    return this.fetchRootGroups(customFilter);\n  }\n\n  refresh(): void {\n    this.refreshTrigger$.next();\n  }\n\n  async fetchRootGroups(customFilter?: any): Promise<any> {\n    const defaultFilter = {\n      pageSize: this.PAGE_SIZE,\n      withChildren: false,\n      onlyRoots: !this.optionsService.disableOnlyRootsQuery,\n      query: this.queriesUtil.buildQuery(this.navRootQueryFilter())\n    };\n    const groupFilter = { ...defaultFilter, ...customFilter };\n\n    // due to BE performance limitations we do not allow filtering and sorting for a user without inventory roles\n    if (\n      this.appState?.currentUser?.value &&\n      !this.user.hasAnyRole(this.appState.currentUser.value, [\n        Permissions.ROLE_INVENTORY_READ,\n        Permissions.ROLE_MANAGED_OBJECT_READ\n      ])\n    ) {\n      delete groupFilter.query;\n      Object.assign(groupFilter, {\n        fragmentType: GroupFragment.groupFragmentType,\n        onlyRoots: true\n      });\n    }\n    return this.inventory.list(this.createFilter(groupFilter));\n  }\n\n  getAllInventories(customFilter?: any): Promise<any> {\n    const defaultFilter = {\n      pageSize: this.PAGE_SIZE,\n      withChildren: false\n    };\n    const groupFilter = { ...defaultFilter, ...customFilter };\n    return this.inventory.list(this.createFilter(groupFilter));\n  }\n\n  getGroupItems(moId: string, extraFilter: object = {}, withChildren = false, filterQuery = '') {\n    const queryFilter = {\n      withChildren,\n      pageSize: this.PAGE_SIZE,\n      query: this.groupQueryFilter(moId, filterQuery)\n    };\n    return this.inventory.childAssetsList(moId, { ...queryFilter, ...extraFilter });\n  }\n\n  getUnassignedDevices(withChildren = false, filterQuery = '') {\n    const queryFilter: any = {\n      fragmentType: 'c8y_IsDevice',\n      onlyRoots: true,\n      withChildren,\n      pageSize: this.PAGE_SIZE,\n      q: this.getUnassignedDevicesQueryStr(filterQuery)\n    };\n    return this.inventory.list(this.createFilter(queryFilter));\n  }\n\n  getDynamicGroupItems(groupQuery: string, filterObj: any = {}) {\n    const { query, ...queryParams } = filterObj;\n    const orderByQuery = query;\n    const queryFilter = {\n      q: this.buildCombinedQuery(groupQuery, orderByQuery),\n      ...queryParams\n    };\n    return this.inventory.list(this.createFilter(queryFilter));\n  }\n\n  getDeviceChildren(\n    moId: string,\n    extraFilter: object = {},\n    filterQuery = '',\n    withChildren = false\n  ) {\n    const queryFilter = {\n      withChildren,\n      pageSize: this.PAGE_SIZE,\n      query: this.groupQueryFilter(moId, filterQuery)\n    };\n    return this.inventory.childDevicesList(moId, { ...queryFilter, ...extraFilter });\n  }\n\n  getUnassignedDevicesQueryStr(filterQuery): string {\n    const hasGroupId = filterQuery.includes('bygroupid');\n    // Fetch all unassigned devices.\n    const defaultQueryStr = '$orderby=name';\n\n    // filterQuery is a custom query to fetch unassigned devices filtered by name.\n    return hasGroupId || !filterQuery ? defaultQueryStr : filterQuery;\n  }\n\n  groupQueryFilter(moId: string, filterQuery?: string) {\n    if (!filterQuery) {\n      return `$filter=(bygroupid(${moId}))$orderby=name`;\n    }\n    return filterQuery;\n  }\n\n  navRootQueryFilter() {\n    const navRootFilter = this.rootQueryFilter();\n    navRootFilter.__orderby = [{ name: 1 }];\n    return navRootFilter;\n  }\n\n  rootQueryFilter() {\n    const { moduleConfig } = this;\n    const rootFilter = this.optionsService.disableOnlyRootsQuery\n      ? {\n          __filter: {\n            type: GroupFragment.groupType\n          },\n          __orderby: []\n        }\n      : {\n          __filter: {\n            __has: GroupFragment.groupFragmentType\n          },\n          __orderby: []\n        };\n    if (moduleConfig.smartGroups) {\n      const queryFilter = {\n        __filter: {\n          __and: [\n            {\n              type: GroupFragment.dynamicGroupType\n            },\n            {\n              __has: GroupFragment.dynamicGroupFragment\n            },\n            { __not: { __has: `${GroupFragment.dynamicGroupFragment}.invisible` } }\n          ]\n        }\n      };\n      this.queriesUtil.addOrFilter(rootFilter, queryFilter);\n    }\n    return rootFilter;\n  }\n\n  onUpdate({ mo, root }) {\n    if (mo.id) {\n      return this.apiService\n        .hookResponse(\n          ({ url, method }) =>\n            ['PUT', 'DELETE', 'POST'].includes(method) &&\n            RegExp(`inventory/managedObjects/${mo.id}`).test(url)\n        )\n        .pipe(\n          filter(() => !this.draggedData),\n          this.apiService.excludePermissionCall(),\n          mergeMap(this.apiService.resolveData<IManagedObject>),\n          filter(response => !response?.data?.c8y_Dashboard)\n        );\n    } else if (root) {\n      return this.apiService\n        .hookResponse(\n          ({ url, method }) => RegExp('inventory/managedObjects/?$').test(url) && method === 'POST'\n        )\n        .pipe(\n          mergeMap(this.apiService.resolveData<IManagedObject>),\n          filter(response => this.isNewManagedObjectRoot(response))\n        );\n    } else {\n      return empty();\n    }\n  }\n\n  isNewManagedObjectRoot(response: Partial<IResult<IManagedObject>> = {}) {\n    const { data } = response;\n    let isRootAsset = false;\n\n    if (typeof data === 'object') {\n      isRootAsset = !!data[GroupFragment.groupFragmentType];\n      if (!isRootAsset && this.moduleConfig.smartGroups) {\n        isRootAsset = !!data[GroupFragment.dynamicGroupFragment];\n      }\n    }\n    return isRootAsset;\n  }\n\n  /**\n   * Check if it is possible to drop a node after dragging.\n   * @param dropOnRoot Is the drop performed on the root node\n   */\n  canDropNode(dropOnRoot: boolean): boolean {\n    return (\n      !dropOnRoot ||\n      this.user.hasAnyRole(this.appState.currentUser.value, [\n        Permissions.ROLE_INVENTORY_ADMIN,\n        Permissions.ROLE_MANAGED_OBJECT_ADMIN\n      ])\n    );\n  }\n\n  /**\n   * There could be multiple breadcrumbs for devices,\n   * so we set a preferred one on click on a device.\n   * @param parents The parent nodes of the device to select the prefered one.\n   */\n  preferBreadcrumb(parents: NavigatorNode[]) {\n    if (parents.length === 1) {\n      this.breadcrumbService.selectPreferredByPath(parents[0].path);\n    }\n  }\n\n  protected createFilter(extraParams: any = {}) {\n    const params = {\n      currentPage: 1,\n      withTotalPages: true,\n      pageSize: 10\n    };\n    return { ...params, ...extraParams };\n  }\n\n  private buildCombinedQuery(queryA, queryB) {\n    let combinedQuery;\n    if (queryA && queryB) {\n      const filterQuery = this.queriesUtil.buildQuery([\n        {\n          __useFilterQueryString: queryA\n        },\n        {\n          __useFilterQueryString: queryB\n        }\n      ]);\n      const orberByQuery = this.queriesUtil.extractAndMergeOrderBys([queryA, queryB]);\n      combinedQuery = `${filterQuery} ${orberByQuery}`;\n    } else {\n      combinedQuery = queryA || queryB || '';\n    }\n    return combinedQuery;\n  }\n}\n","import { Inject, Injectable, Optional } from '@angular/core';\nimport { get as getProp } from 'lodash-es';\nimport { AssetNode } from './asset-node';\nimport { AssetNavigatorConfig, ASSET_NAVIGATOR_CONFIG } from './asset-node-config.model';\nimport { AssetNodeService } from './asset-node.service';\n\n@Injectable()\nexport class AssetNodeFactory {\n  constructor(\n    private service: AssetNodeService,\n    @Optional() @Inject(ASSET_NAVIGATOR_CONFIG) public moduleConfig: AssetNavigatorConfig\n  ) {}\n\n  get(): AssetNode {\n    const rootNavigatorNode = getProp(this.moduleConfig, 'rootNavigatorNode') ?? true;\n    let { rootNode } = this.service;\n\n    if (rootNavigatorNode === false) {\n      return;\n    }\n\n    if (!rootNode) {\n      rootNode = this.service.createRootNode(rootNavigatorNode === true ? {} : rootNavigatorNode);\n    }\n    return rootNode;\n  }\n}\n","import { GroupFragment } from '@c8y/ngx-components';\nimport { GroupNodeService } from './group-node.service';\nimport { AssetNode } from '../asset-node';\nimport { GroupNodeConfig } from './asset-selector.model';\n\nexport class GroupNode extends AssetNode {\n  static NAME = 'GroupNode';\n\n  /**\n   * Set this true, if only groups should be shown.\n   */\n  groupsOnly = false;\n\n  /**\n   * Set this true, if it groups are also selectable.\n   */\n  groupsSelectable = false;\n  /**\n   * Devices with children can be selected to show their child devices.\n   */\n  showChildDevices = false;\n\n  /**\n   * Group node children (subentries).\n   */\n  children: GroupNode[] = [];\n\n  /**\n   * Creates a new node which shows only groups.\n   *\n   * @param service The service to use.\n   * @param config  The default configuration of the node.\n   * @param groupsOnly Set this true, if only groups should be shown.\n   * @param selectable Set this true, if it is selectable.\n   */\n\n  constructor(\n    protected service: GroupNodeService,\n    config: GroupNodeConfig = {}\n  ) {\n    super(service, config);\n    this.groupsOnly = config.groupsOnly || false;\n    this.groupsSelectable = config.groupsSelectable || false;\n    this.showChildDevices = config.showChildDevices || false;\n  }\n\n  /**\n   * Adds the MO as a child node.\n   * @param mo ManagedObject\n   */\n  addManagedObject(mo) {\n    const { childAdditions } = this.mo;\n    if (!this.isChildAddition(childAdditions, mo)) {\n      this.add(\n        this.service.createChildNode({\n          mo,\n          groupsOnly: this.groupsOnly,\n          groupsSelectable: this.groupsSelectable,\n          showChildDevices: this.showChildDevices\n        })\n      );\n    }\n  }\n\n  /**\n   * Counts the number of children for the current node (with the exception of the UnassignedDevicesNode).\n   */\n  countChildren(): number {\n    return this.children.filter(value => value.toString() !== 'UnassignedDevicesNode').length;\n  }\n\n  /**\n   * Removes all child nodes except the UnassignedDevicesNode.\n   */\n  empty() {\n    this.children = this.children.filter(value => value.toString() === 'UnassignedDevicesNode');\n  }\n\n  fetch() {\n    const isRoot = this.root;\n    const isDevice = this.mo.c8y_IsDevice;\n\n    // for the case of a child device (does not have the `c8y_IsDevice` fragment) having further child devices, but no child assets, we want to show the child devices.\n    const hasChildDevicesButNoChildAssets =\n      this.mo.childDevices?.references?.length > 0 && this.mo.childAssets?.references?.length === 0;\n    return isRoot\n      ? this.service.getRootNodes()\n      : isDevice || hasChildDevicesButNoChildAssets\n        ? this.service.getDeviceChildren(\n            this.mo.id,\n            {},\n            this.filterQuery$.value,\n            this.showChildDevices\n          )\n        : this.service.getGroupItems(\n            this.mo.id,\n            this.groupsOnly\n              ? {\n                  query: `$filter=(has(${GroupFragment.groupFragmentType}))`\n                }\n              : {},\n            this.showChildDevices,\n            this.filterQuery$.value\n          );\n  }\n\n  toString() {\n    return GroupNode.NAME;\n  }\n\n  isGroup() {\n    return this.mo && this.service.isGroup(this.mo);\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { AssetNodeService } from '../asset-node.service';\nimport { GroupNodeConfig } from './asset-selector.model';\nimport { GroupNode } from './group-node';\n\n@Injectable({ providedIn: 'root' })\nexport class GroupNodeService extends AssetNodeService {\n  protected PAGE_SIZE = 5;\n\n  createGroupNode(config: GroupNodeConfig) {\n    return new GroupNode(this, config);\n  }\n\n  createChildNode(config: GroupNodeConfig): GroupNode {\n    return this.createGroupNode(config);\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { IIdentified, IManagedObject } from '@c8y/client';\nimport { AssetNodeService } from '../asset-node.service';\nimport { isArray, isNumber, isObject, isString } from 'lodash';\nimport { GroupNode } from './group-node';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class AssetSelectorService extends AssetNodeService {\n  /**\n   * Function which will check if the node is selectable.\n   */\n  private isNodeSelectableFn: boolean | ((node: GroupNode) => boolean) = true;\n\n  /**\n   * Sets the function that will decide if the node is selectable.\n   * @param fn A boolean or a function that will decide if the node is selectable.\n   */\n  setIsNodeSelectable(fn: boolean | ((node: GroupNode) => boolean)): void {\n    this.isNodeSelectableFn = fn;\n  }\n\n  /**\n   * Checks if the node is selectable.\n   * @param node The node to check.\n   */\n  isNodeSelectable(node: GroupNode): boolean {\n    if (typeof this.isNodeSelectableFn === 'boolean') {\n      return this.isNodeSelectableFn;\n    } else if (typeof this.isNodeSelectableFn === 'function') {\n      return this.isNodeSelectableFn(node);\n    }\n    return true;\n  }\n  /**\n   * Simplifies the object model based on the selected mode.\n   * @param obj The selected asset.\n   * @param mode The mode which will decide what type of model will be returned.\n   */\n  normalizeValue(\n    obj: Partial<IManagedObject>,\n    modelMode: 'simple' | 'full'\n  ): Partial<IManagedObject> | IIdentified {\n    return this.simplifyModel(this.normalizeModelValue(obj), modelMode);\n  }\n\n  simplifyModel(\n    model: Partial<IManagedObject> | IIdentified[],\n    mode: 'simple' | 'full'\n  ): Partial<IManagedObject> | IIdentified {\n    const mapModel = model => {\n      const { id, name, c8y_DeviceQueryString } = model as IIdentified;\n      return { id, name, ...(c8y_DeviceQueryString ? { c8y_DeviceQueryString } : {}) };\n    };\n\n    if (mode === 'full') {\n      return model;\n    }\n    if (!isArray(model)) {\n      return mapModel(model);\n    }\n    return model.map(mapModel);\n  }\n\n  /**\n   * Returns the index of the currently selected item.\n   * @param selected All selected items\n   * @param selectedMo The new selected item-\n   * @returns An index, or -1 if not found.\n   */\n  getIndexOfSelected(\n    selected: Array<Partial<IIdentified>> | Partial<IIdentified>,\n    selectedMo: IIdentified\n  ) {\n    return selected.findIndex(mo => mo.id === selectedMo.id);\n  }\n\n  private normalizeModelValue(value: any): IIdentified[] {\n    if (isNumber(value) || isString(value)) {\n      return [{ id: value }];\n    }\n    if (isArray(value)) {\n      return value;\n    }\n    if (isObject(value)) {\n      return [value];\n    }\n    return [];\n  }\n}\n","import { ChangeDetectorRef, Component, EventEmitter, Input, OnInit, Output } from '@angular/core';\nimport { IIdentified, IManagedObject } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport { IconDirective, C8yTranslateDirective, C8yTranslatePipe } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { Subject } from 'rxjs';\nimport { filter, takeUntil } from 'rxjs/operators';\nimport { AssetsNavigatorAction } from '../action.enum';\nimport { AssetSelectorService } from './asset-selector.service';\nimport { GroupNode } from './group-node';\nimport { NgIf, NgStyle, NgClass, NgFor } from '@angular/common';\nimport { CollapseDirective } from 'ngx-bootstrap/collapse';\n\n@Component({\n  selector: 'c8y-asset-selector-node',\n  templateUrl: './asset-selector-node.component.html',\n  imports: [\n    NgIf,\n    NgStyle,\n    NgClass,\n    IconDirective,\n    C8yTranslateDirective,\n    CollapseDirective,\n    NgFor,\n    C8yTranslatePipe\n  ]\n})\nexport class AssetSelectorNodeComponent implements OnInit {\n  /**\n   * The current node.\n   */\n  @Input() node: GroupNode;\n  /**\n   * Root node. Node found at the top of the hierarchy.\n   */\n  @Input() rootNode: GroupNode;\n  /**\n   * All preselected items.\n   */\n  @Input() preselected: IIdentified | IIdentified[] = [];\n  /**\n   * Should the path be shown.\n   */\n  @Input() showPath = false;\n  /**\n   * Can the user select multiple assets.\n   */\n  @Input() multi = false;\n  /**\n   * The current path to the node.\n   */\n  @Input() view: 'tree' | 'miller' = 'tree';\n  /**\n   * Used only for miller-view, displays the column level for the current node.\n   * E.g if the index is one, this will be second column.\n   */\n  @Input() index;\n  /**\n   * Sets the active node.\n   */\n  @Input() active: GroupNode;\n  /**\n   * A function that should verify the need to add a column when a node is clicked.\n   */\n  @Input() handleNextMillerViewColumn: (node: GroupNode, index: number) => boolean;\n\n  @Input() disabled = false;\n  /**\n   * Event, which indicates whether the loading of the node has completed.\n   */\n  @Output() isLoadingState: EventEmitter<boolean> = new EventEmitter();\n  /**\n   * Event that emits when a node is selected.\n   */\n  @Output() onSelect: EventEmitter<IManagedObject> = new EventEmitter();\n  /**\n   * Event that emits when a node is deselected.\n   */\n  @Output() onDeselect: EventEmitter<{ deselectMode: 'single' | 'all'; mo: IManagedObject }> =\n    new EventEmitter();\n\n  breadcrumb: string;\n  /**\n   * @ignore\n   */\n  level = 0;\n  /**\n   * @ignore\n   */\n  unsubscribe$ = new Subject<void>();\n  isNodeSelectable = true;\n\n  /** sets the `btn-pending` class in the load more button */\n  isLoading = false;\n  /**\n   * @ignore\n   */\n  get expandTitle() {\n    return !this.node.open ? gettext('Expand') : gettext('Collapse');\n  }\n\n  /**\n   * @ignore only di\n   */\n  constructor(\n    private translateService: TranslateService,\n    private cd: ChangeDetectorRef,\n    public assetSelectorService: AssetSelectorService\n  ) {}\n\n  /**\n   * @ignore\n   */\n  async ngOnInit() {\n    this.isNodeSelectable = this.assetSelectorService.isNodeSelectable(this.node);\n    this.breadcrumb = this.node.label;\n    this.setupBreadcrumbsAndLevel(this.node);\n\n    if (this.node instanceof GroupNode) {\n      this.node.hookEvents();\n    }\n\n    // open on startup\n    if (this.node.root) {\n      this.click();\n    }\n\n    // used for loading and to trigger change detection when the node is no longer loading.\n    if (this.node.events) {\n      this.node.events\n        .pipe(\n          takeUntil(this.unsubscribe$),\n          filter((a: AssetsNavigatorAction) => a === AssetsNavigatorAction.LOADING_DONE)\n        )\n        .subscribe(() => {\n          this.isLoadingState.emit(false);\n          this.cd.markForCheck();\n        });\n    }\n  }\n\n  /**\n   * Opens a node.\n   */\n  click() {\n    this.node.open = !this.node.open;\n    this.node.click({ open: this.node.open });\n  }\n\n  setupBreadcrumbsAndLevel(node: GroupNode) {\n    if (node.parents && node.parents.length) {\n      const parent = node.parents[0] as GroupNode;\n      this.breadcrumb =\n        this.translateService.instant(parent.label) +\n        ' > ' +\n        this.translateService.instant(this.breadcrumb);\n      this.level++;\n\n      this.setupBreadcrumbsAndLevel(parent);\n    }\n  }\n\n  /**\n   * Selects the node and emits a change on the parent component.\n   * @param node The node to select.\n   */\n  selected(node: GroupNode) {\n    if (node.mo) {\n      this.updateSelection(node.mo);\n      return;\n    }\n    this.click();\n  }\n\n  /**\n   * Handles clicks on a item in Miller View.\n   * @param node The node that was clicked.\n   */\n  millerViewClick(node: GroupNode) {\n    node.breadcrumb = this.breadcrumb;\n\n    if (!this.handleNextMillerViewColumn) {\n      return;\n    }\n    const shouldHandleDefault = this.handleNextMillerViewColumn(node, this.index);\n    if (shouldHandleDefault) {\n      this.selected(node);\n    }\n  }\n\n  /**\n   * @ignore\n   */\n  ngOnDestroy(): void {\n    this.unsubscribe$.next();\n    this.unsubscribe$.complete();\n  }\n\n  isSelected() {\n    if (!this.node.mo) {\n      return false;\n    }\n    return this.assetSelectorService.getIndexOfSelected(this.preselected, this.node.mo) > -1;\n  }\n\n  isActive() {\n    if (this.active && this.node.mo) {\n      return this.active.mo?.id === this.node.mo.id;\n    }\n    return false;\n  }\n\n  private updateSelection(selectedMo: IManagedObject) {\n    if (!this.multi) {\n      this.onDeselect.emit({ deselectMode: 'all', mo: selectedMo });\n      return;\n    }\n    if (this.isSelected()) {\n      this.onDeselect.emit({ deselectMode: 'single', mo: selectedMo });\n      return;\n    }\n    this.onSelect.emit(selectedMo);\n    this.cd.markForCheck();\n  }\n}\n","<!-- Hierarchy tree -->\n<div\n  class=\"c8y-asset-selector__item\"\n  [ngStyle]=\"{\n    'margin-left': level > 1 ? 16 + 'px' : '0'\n  }\"\n  *ngIf=\"view === 'tree'\"\n  [attr.role]=\"view === 'tree' ? 'tree' : 'list'\"\n  [ngClass]=\"{\n    'c8y-asset-selector__item--more': node?.icon === 'plus',\n    'c8y-asset-selector__item--start': level === 0\n  }\"\n>\n  <div\n    class=\"c8y-asset-selector__node\"\n    title=\"{{ breadcrumb | translate }}\"\n    *ngIf=\"node && !node.root && !node.hidden\"\n    [attr.role]=\"view === 'tree' ? 'treeitem' : 'listitem'\"\n    [ngClass]=\"{ 'c8y-asset-selector__node--open': node?.open }\"\n  >\n    <!-- expand button -->\n    <div class=\"c8y-asset-selector__node__btn-spacer\">\n      <button\n        class=\"collapse-btn btn-dot\"\n        [title]=\"expandTitle | translate\"\n        [attr.aria-expanded]=\"node.open\"\n        (click)=\"click()\"\n        *ngIf=\"node.isGroup() || node.hasChildDevices()\"\n      >\n        <i c8yIcon=\"angle-right\"></i>\n      </button>\n    </div>\n    <div\n      class=\"d-flex a-i-center p-t-4 p-b-4\"\n      *ngIf=\"node.toString() !== 'LoadMoreNode' && isNodeSelectable\"\n    >\n      <label [ngClass]=\"{ 'c8y-checkbox': multi, 'c8y-radio': !multi }\">\n        <input\n          id=\"nodeLabel\"\n          [type]=\"multi ? 'checkbox' : 'radio'\"\n          (change)=\"selected(node)\"\n          [checked]=\"isSelected()\"\n          [disabled]=\"disabled || !node.groupsSelectable && node.isGroup()\"\n        />\n        <span></span>\n        <span\n          class=\"sr-only\"\n          for=\"nodeLabel\"\n          translate\n        >\n          Node label\n        </span>\n      </label>\n    </div>\n\n    <!-- group button -->\n    <button\n      class=\"c8y-asset-selector__btn text-truncate\"\n      [attr.aria-expanded]=\"!node.open\"\n      *ngIf=\"node.isGroup() || node.hasChildDevices()\"\n      (click)=\"click()\"\n    >\n      <i\n        class=\"c8y-icon c8y-icon-duocolor m-r-4 text-16\"\n        [c8yIcon]=\"node.icon\"\n        [title]=\"'Smart group' | translate\"\n        *ngIf=\"node.icon === 'c8y-group-smart'\"\n      ></i>\n      <i\n        class=\"c8y-icon c8y-icon-duocolor m-r-4 text-16\"\n        [c8yIcon]=\"node.icon\"\n        [title]=\"'Group' | translate\"\n        *ngIf=\"node.icon !== 'c8y-group-smart'\"\n      ></i>\n      <span title=\"{{ breadcrumb }}\">\n        {{ node.translateLabel ? (node.label | translate) : node.label }}\n        <!-- use just for search results to display the path -->\n        <p\n          class=\"text-truncate\"\n          *ngIf=\"showPath\"\n        >\n          <small\n            class=\"text-muted\"\n            title=\"{{ breadcrumb }}\"\n          >\n            <em>{{ breadcrumb }}</em>\n          </small>\n        </p>\n        <!-- up to here -->\n      </span>\n    </button>\n    <!-- not a group button -->\n    <button\n      class=\"flex-grow\"\n      title=\"{{ breadcrumb }}\"\n      type=\"button\"\n      *ngIf=\"!node.isGroup() && !node.hasChildDevices()\"\n      [ngClass]=\"{\n        'btn btn-default btn-sm m-b-8 m-r-8 d-flex j-c-center': node.icon === 'plus',\n        'c8y-asset-selector__btn text-truncate': node.icon != 'plus'\n      }\"\n      (click)=\"selected(node)\"\n    >\n      <i\n        class=\"c8y-icon c8y-icon-duocolor m-r-4 text-16\"\n        [c8yIcon]=\"node.icon\"\n        [title]=\"'Smart group' | translate\"\n        *ngIf=\"node.icon === 'c8y-group-smart'\"\n      ></i>\n      <i\n        class=\"c8y-icon m-r-4\"\n        [c8yIcon]=\"node.icon\"\n        [title]=\"'Group' | translate\"\n        *ngIf=\"node.icon !== 'c8y-group-smart'\"\n        [ngClass]=\"{ 'c8y-icon-duocolor text-16 ': node.icon != 'plus' }\"\n      ></i>\n      <span title=\"{{ breadcrumb }}\">\n        {{ node.translateLabel ? (node.label | translate) : node.label }}\n        <!-- use just for search results to display the path -->\n        <p\n          class=\"text-truncate text-muted small\"\n          *ngIf=\"showPath\"\n        >\n          <em>{{ breadcrumb }}</em>\n        </p>\n        <!-- up to here -->\n      </span>\n    </button>\n  </div>\n  <div\n    class=\"collapse\"\n    *ngIf=\"node.countChildren()\"\n    [collapse]=\"!node.open\"\n    [isAnimated]=\"true\"\n    [attr.role]=\"'group'\"\n  >\n    <c8y-asset-selector-node\n      *ngFor=\"let childNode of node.children\"\n      [node]=\"childNode\"\n      [preselected]=\"preselected || []\"\n      [disabled]=\"disabled\"\n      [multi]=\"multi\"\n      [active]=\"active\"\n      [attr.role]=\"view === 'tree' ? 'treeitem' : 'listitem'\"\n      (onSelect)=\"onSelect.emit($event)\"\n      (onDeselect)=\"onDeselect.emit($event)\"\n    ></c8y-asset-selector-node>\n  </div>\n</div>\n\n<!-- Miller columns -->\n<div *ngIf=\"view === 'miller'\">\n  <div\n    class=\"miller-column__item bg-inherit\"\n    title=\"{{ breadcrumb | translate }}\"\n    *ngIf=\"node && !node.root && !node.hidden && node !== rootNode\"\n    [ngClass]=\"{\n      active: isActive(),\n      'miller-column__item--more': node.toString() === 'LoadMoreNode'\n    }\"\n  >\n    <div\n      class=\"m-l-4 m-r-4 miller-column__item__checkbox\"\n      *ngIf=\"node.toString() !== 'LoadMoreNode'\"\n    >\n      <label [ngClass]=\"{ 'c8y-radio': !multi, 'c8y-checkbox': multi }\">\n        <input\n          id=\"nodeLabel2\"\n          [type]=\"multi ? 'checkbox' : 'radio'\"\n          (change)=\"selected(node)\"\n          [checked]=\"isSelected()\"\n          [disabled]=\"disabled || !node.groupsSelectable && node.isGroup()\"\n        />\n        <span></span>\n        <span\n          class=\"sr-only\"\n          for=\"nodeLabel2\"\n          translate\n        >\n          Node label\n        </span>\n      </label>\n    </div>\n\n    <button\n      title=\"{{ breadcrumb | translate }}\"\n      type=\"button\"\n      [ngClass]=\"{\n        'btn btn-default btn-sm d-flex flex-grow j-c-center m-l-16 m-r-16 m-b-4 m-t-4':\n          node.toString() === 'LoadMoreNode',\n        'miller-column__item__btn': node.toString() !== 'LoadMoreNode',\n        'btn-pending': node.loading && node.toString() === 'LoadMoreNode'\n      }\"\n      (click)=\"millerViewClick(node)\"\n    >\n      <i\n        class=\"c8y-icon m-r-4\"\n        [c8yIcon]=\"node.icon\"\n        [ngClass]=\"{ 'c8y-icon-duocolor text-16': node.toString() !== 'LoadMoreNode' }\"\n      ></i>\n      <div class=\"text-left text-truncate\">\n        <p\n          class=\"text-truncate\"\n          title=\"{{ node.translateLabel ? (node.label | translate) : node.label }}\"\n        >\n          {{ node.translateLabel ? (node.label | translate) : node.label }}\n        </p>\n        <!-- use just for search results to display the path -->\n        <small\n          class=\"text-muted text-truncate\"\n          title=\"{{ breadcrumb }}\"\n          *ngIf=\"showPath\"\n        >\n          <em>{{ breadcrumb }}</em>\n        </small>\n        <!-- up to here -->\n      </div>\n      <span\n        class=\"p-l-4 m-l-auto\"\n        *ngIf=\"node.isGroup() || node.hasChildDevices()\"\n      >\n        <i c8yIcon=\"angle-right\"></i>\n      </span>\n    </button>\n  </div>\n\n  <div\n    role=\"list\"\n    *ngIf=\"node\"\n    [ngClass]=\"{ hidden: node !== rootNode }\"\n  >\n    <c8y-asset-selector-node\n      role=\"listitem\"\n      *ngFor=\"let childNode of node.children\"\n      [node]=\"childNode\"\n      [rootNode]=\"rootNode\"\n      [preselected]=\"preselected || []\"\n      [multi]=\"multi\"\n      [view]=\"view\"\n      [index]=\"index\"\n      [active]=\"active\"\n      [disabled]=\"disabled\"\n      [handleNextMillerViewColumn]=\"handleNextMillerViewColumn\"\n      (onSelect)=\"onSelect.emit($event)\"\n      (onDeselect)=\"onDeselect.emit($event)\"\n    ></c8y-asset-selector-node>\n  </div>\n</div>\n","import { EventEmitter } from '@angular/core';\nimport { IIdentified, IManagedObject, InventoryService } from '@c8y/client';\nimport { GroupNodeService } from './group-node.service';\nimport { AssetSelectorService } from './asset-selector.service';\nimport { AssetSelectionChangeEvent, AssetSelectorOptions } from './asset-selector.model';\nimport { AbstractControl, ValidationErrors } from '@angular/forms';\n\nexport class AssetSelectorBase {\n  /**\n   * Config object containing all options for the asset selector.\n   */\n  config: AssetSelectorOptions = {};\n  /**\n   * An array of predefined nodes.\n   */\n  selected: Array<Partial<IManagedObject>> | IIdentified[] | IIdentified;\n  /**\n   * The loading state of the current node.\n   */\n  isLoading = false;\n  /**\n   * Emit the selected asset or assets.\n   */\n  onSelected = new EventEmitter<AssetSelectionChangeEvent>();\n  /**\n   * Emits if the currently selected asset is cleared.\n   */\n  onClearSelected = new EventEmitter<void>();\n\n  private onChange: (mo: IIdentified[] | IIdentified) => void;\n  private onTouched: () => void;\n\n  constructor(\n    protected groupNodeService: GroupNodeService,\n    protected inventory: InventoryService,\n    protected assetSelectorService: AssetSelectorService\n  ) {}\n\n  /**\n   * @ignore\n   */\n  validate(control: AbstractControl): ValidationErrors {\n    if (this.config.required && (!control.value || control.value.length === 0)) {\n      return { required: true };\n    }\n    return null;\n  }\n\n  /**\n   * @ignore\n   */\n  writeValue(obj: any): void {\n    this.selected = this.assetSelectorService.normalizeValue(obj, this.config.modelMode);\n  }\n\n  /**\n   * @ignore\n   */\n  registerOnChange(fn: any): void {\n    this.onChange = fn;\n  }\n\n  /**\n   * @ignore\n   */\n  registerOnTouched(fn: any): void {\n    this.onTouched = fn;\n  }\n\n  /**\n   * @ignore\n   */\n  doBlur() {\n    if (this.onTouched) {\n      this.onTouched();\n    }\n  }\n\n  /**\n   * Deselects all expect the given one.\n   * @param selectedMo The selected asset (optional, if empty -> just deselect all).\n   */\n  deselectAll(selectedMo?: IManagedObject) {\n    this.selected = [];\n    if (selectedMo) {\n      this.selected = [this.assetSelectorService.simplifyModel(selectedMo, this.config.modelMode)];\n    }\n    this.emitChange(this.selected, selectedMo, !!selectedMo);\n    this.doBlur();\n  }\n\n  /**\n   * Adds an managed object to the selected array and emits the change.\n   * @param selectedMo The selected asset.\n   */\n  select(selectedMo: IManagedObject) {\n    if (!this.config.multi) {\n      this.selected = [];\n    }\n    const index = this.getIndexOfSelected(this.selected, selectedMo);\n    if (index === -1) {\n      this.selected.push(\n        this.assetSelectorService.simplifyModel(selectedMo, this.config.modelMode)\n      );\n    }\n    this.emitChange(this.selected, selectedMo, true);\n    this.doBlur();\n  }\n\n  /**\n   * Removes a managed object from the selected array and emits the change.\n   * @param selectedMo The selected asset.\n   */\n  deselect(selectedMo: IManagedObject) {\n    const index = this.getIndexOfSelected(this.selected, selectedMo);\n    if (index > -1) {\n      this.selected.splice(index, 1);\n    }\n    this.emitChange(this.selected, selectedMo, false);\n    this.doBlur();\n  }\n\n  /**\n   * Returns the index of the currently selected item.\n   * @param selected All selected items\n   * @param selectedMo The new selected item-\n   * @returns An index, or -1 if not found.\n   */\n  getIndexOfSelected(\n    selected: Array<Partial<IIdentified>> | Partial<IIdentified>,\n    selectedMo: IIdentified\n  ) {\n    return selected.findIndex(mo => mo.id === selectedMo.id);\n  }\n\n  emitChange(selected: IIdentified | IIdentified[], item: IManagedObject, isSelected: boolean) {\n    const changes = this.config.multi ? selected : selected[0];\n    if (this.onChange) {\n      this.onChange(changes);\n    }\n    this.onSelected.emit({ items: changes, change: { item, isSelected } });\n  }\n\n  createDefaultRootNode() {\n    return this.groupNodeService.createGroupNode({\n      root: true,\n      groupsSelectable: this.config.groupsSelectable,\n      groupsOnly: this.config.groupsOnly,\n      showChildDevices: this.config.showChildDevices\n    });\n  }\n  async createManagedObjectRootNode(asset: IIdentified) {\n    if ((asset as IIdentified).id) {\n      return this.groupNodeService.createGroupNode({\n        mo: asset as IManagedObject,\n        groupsSelectable: this.config.groupsSelectable,\n        groupsOnly: this.config.groupsOnly,\n        showChildDevices: this.config.showChildDevices\n      });\n    }\n    const { data: mo } = await this.inventory.detail(asset);\n    return this.groupNodeService.createGroupNode({\n      mo,\n      groupsSelectable: this.config.groupsSelectable,\n      groupsOnly: this.config.groupsOnly,\n      showChildDevices: this.config.showChildDevices\n    });\n  }\n}\n","import { IManagedObject, IIdentified } from '@c8y/client';\nimport { gettext } from '@c8y/ngx-components/gettext';\n\nexport interface AssetSelectionChangeEvent {\n  items: IIdentified | IIdentified[];\n  change: { item: IManagedObject; isSelected: boolean };\n}\n\nexport interface GroupNodeConfig {\n  root?: boolean;\n  mo?: IManagedObject;\n  groupsOnly?: boolean;\n  groupsSelectable?: boolean;\n  showChildDevices?: boolean;\n}\n\nexport const CONFIG_OPTIONS_DEFAULT: AssetSelectorOptions = {\n  label: gettext('Asset selection'),\n  multi: false,\n  showFilter: false,\n  columnHeaders: false,\n  singleColumn: false,\n  modelMode: 'simple',\n  groupsOnly: false,\n  groupsSelectable: false,\n  search: false,\n  showUnassignedDevices: false,\n  view: 'tree',\n  showChildDevices: false,\n  showSelected: true\n};\n\nexport interface AssetSelectorOptions {\n  /**\n   * Already selected devices.\n   */\n  selectedDevices?: IIdentified | IIdentified[];\n  /**\n   * Defines a label to be shown to the user.\n   */\n  label?: string;\n  /**\n   * Can the user select multiple assets.\n   */\n  multi?: boolean;\n  /**\n   * displays a filter input on every column when using the miller view.\n   */\n  showFilter?: boolean;\n  /**\n   * displays a column header on every column when using the miller view.\n   */\n  columnHeaders?: boolean;\n  /**\n   * Displays only the select column.\n   */\n  singleColumn?: boolean;\n  /**\n   * Set to true to mark it as required on a form.\n   */\n  required?: boolean;\n  /**\n   * In simple model-mode the result will only contain the IDs and name of the selected\n   * assets. In full mode, everything is contained.\n   */\n  modelMode?: 'simple' | 'full';\n  /**\n   * Set this to true, if the selector should only show groups.\n   */\n  groupsOnly?;\n  /**\n   * Set this true, if groups should be selectable.\n   */\n  groupsSelectable?;\n  /**\n   * Enable to display global search in the asset-selector (only possible whithout device context).\n   */\n  search?: boolean;\n  /**\n   * Displays all unassigned devices in a custom root group.\n   */\n  showUnassignedDevices?: boolean;\n  /**\n   * Set the view of the asset selector with tree view as default.\n   */\n  view?: 'tree' | 'miller';\n  /**\n   * Used only for miller-view, displays the column level for the current node.\n   * E.g if the index is one, this will be second column.\n   */\n  index?: number;\n  /**\n   * Used only for single column, the array contains all selected columns.\n   */\n  selectedColumns?: IIdentified[] | IIdentified;\n  /**\n   * Devices with children can be selected to show their child devices.\n   */\n  showChildDevices?: boolean;\n  /**\n   * Allows to show chips at the top with the currently selected asset for multi select.\n   * For single select it shows the currently selected asset.\n   */\n  showSelected?: boolean;\n  /**\n   * Prevents automatic asset selection on component initialization.\n   */\n  preventInitialSelect?: boolean;\n}\n","import { gettext } from '@c8y/ngx-components/gettext';\nimport { ClickOptions } from '@c8y/ngx-components';\nimport { AssetsNavigatorAction } from '../action.enum';\nimport { GroupNodeConfig } from './asset-selector.model';\nimport { GroupNode } from './group-node';\nimport { GroupNodeService } from './group-node.service';\n\nexport class UnassignedDevicesNode extends GroupNode {\n  static NAME = 'UnassignedDevicesNode';\n  label = gettext('Unassigned devices');\n  icon = 'delete-folder';\n  groupsSelectable = false;\n  groupsOnly = false;\n  showChildDevices = false;\n  mo = {};\n\n  constructor(\n    protected service: GroupNodeService,\n    config: GroupNodeConfig = {}\n  ) {\n    super(service, config);\n    this.priority = Infinity;\n    this.showChildDevices = config.showChildDevices || false;\n  }\n\n  click(options: ClickOptions = {}) {\n    this.hookEvents();\n    if (options.open) {\n      this.events.next(AssetsNavigatorAction.FETCH);\n    }\n  }\n\n  addManagedObject(mo) {\n    this.add(this.service.createChildNode({ mo, showChildDevices: this.showChildDevices }));\n  }\n\n  fetch() {\n    return this.service.getUnassignedDevices(this.showChildDevices, this.filterQuery$.value);\n  }\n\n  isGroup() {\n    return true;\n  }\n\n  toString() {\n    return UnassignedDevicesNode.NAME;\n  }\n\n  setLabel() {\n    // do nothing, as this item has a hardcoded label.\n    // This is only to overwrite the default inherited method.\n    this.label = this.label;\n  }\n\n  async updateIcon() {\n    // do nothing, as this item has a hardcoded label.\n    // This is only to overwrite the default inherited method.\n    this.icon = this.icon;\n  }\n}\n","import {\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  Input,\n  OnInit,\n  Output,\n  SimpleChanges,\n  ViewChild,\n  forwardRef\n} from '@angular/core';\nimport { NG_VALIDATORS, NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';\nimport { IIdentified, IManagedObject, InventoryService } from '@c8y/client';\nimport { BehaviorSubject, Subject } from 'rxjs';\nimport { takeUntil, tap } from 'rxjs/operators';\nimport { AssetSelectorBase } from './asset-selector-base';\nimport {\n  AssetSelectionChangeEvent,\n  AssetSelectorOptions,\n  CONFIG_OPTIONS_DEFAULT\n} from './asset-selector.model';\nimport { AssetSelectorService } from './asset-selector.service';\nimport { GroupNode } from './group-node';\nimport { GroupNodeService } from './group-node.service';\nimport { UnassignedDevicesNode } from './unassigned-devices-node';\nimport { gettext } from '@c8y/ngx-components/gettext';\nimport {\n  SearchInputComponent,\n  IconDirective,\n  C8yTranslatePipe,\n  GetGroupIconPipe\n} from '@c8y/ngx-components';\nimport { NgIf, NgStyle, NgClass, NgFor, AsyncPipe } from '@angular/common';\nimport { AssetSelectorNodeComponent } from './asset-selector-node.component';\n\n/**\n * Displays a hierarchical tree selector for assets.\n */\n@Component({\n  selector: 'c8y-asset-selector',\n  templateUrl: './asset-selector.component.html',\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      multi: true,\n      useExisting: forwardRef(() => AssetSelectorComponent)\n    },\n    {\n      provide: NG_VALIDATORS,\n      useExisting: forwardRef(() => AssetSelectorComponent),\n      multi: true\n    },\n    AssetSelectorService\n  ],\n  imports: [\n    NgIf,\n    NgStyle,\n    NgClass,\n    SearchInputComponent,\n    NgFor,\n    IconDirective,\n    FormsModule,\n    AssetSelectorNodeComponent,\n    C8yTranslatePipe,\n    AsyncPipe,\n    GetGroupIconPipe\n  ]\n})\nexport class AssetSelectorComponent extends AssetSelectorBase implements OnInit {\n  /**\n   * Config object containing all options for the asset selector.\n   */\n  @Input() config: AssetSelectorOptions = {};\n  /**\n   * Defines the node, which should be displayed as active.\n   */\n  @Input() active: GroupNode;\n  /**\n   * Used only for miller-view, displays the column level for the current node.\n   * E.g if the index is one, this will be second column.\n   */\n  @Input() index = 0;\n  /**\n   * The asset to use as root.\n   */\n  @Input() asset: IIdentified = undefined;\n  /**\n   * The selected device.\n   */\n  @Input() selectedDevice: IManagedObject = undefined;\n  /**\n   * An array of predefined nodes.\n   */\n  @Input() selected: Array<Partial<IManagedObject>> | IIdentified[] | IIdentified = [];\n  /**\n   * The node to use as root. You can either set this, or the asset to start from.\n   */\n  @Input() rootNode: GroupNode;\n  /**\n   * All currently selected assets.\n   */\n  @Input() selectedItems: IIdentified[] | IIdentified = [];\n  @Input() container: '' | 'body' = 'body';\n  @Input() isNodeSelectable: boolean | ((node: IIdentified) => boolean) = true;\n  @Input() disabled = false;\n  /**\n   * Emits if one item was selected (all currently selected nodes).\n   */\n  @Output() onSelected = new EventEmitter<AssetSelectionChangeEvent>();\n  /**\n   * Emits if the currently selected asset is cleared.\n   */\n  @Output() onClearSelected = new EventEmitter<void>();\n  /**\n   * Used only for miller view. Emit the selected node and use it as a 'rootNode' for the new column.\n   */\n  @Output() onRowSelected = new EventEmitter<any>();\n  /**\n   * Emits the current loading state of the node.\n   */\n  @Output() onLoad = new EventEmitter<any>();\n  /**\n   * The current filter applied.\n   */\n  filterText = '';\n  /**\n   * Displays the global search at all times if the miller view is used\n   * on root group level.\n   */\n  root = false;\n  /**\n   * @ignore\n   */\n  unsubscribe$ = new Subject<void>();\n  /**\n   * Returns the current header hight in pixel.\n   */\n  getHeaderHeight$ = new BehaviorSubject(0);\n  readonly ASSET_CONST = gettext('Asset {{ assetId }}');\n\n  @ViewChild('header')\n  private header: ElementRef;\n\n  /**\n   * @ignore only DI\n   */\n  constructor(\n    protected groupNodeService: GroupNodeService,\n    protected inventory: InventoryService,\n    protected assetSelectorService: AssetSelectorService,\n    protected cd: ChangeDetectorRef\n  ) {\n    super(groupNodeService, inventory, assetSelectorService);\n  }\n\n  /**\n   * Checks when a node was selected, if a new column needs to be added.\n   * @param node The node that was clicked.\n   * @param index The current index of this node.\n   * @returns True if the click was handled and a new column was added.\n   */\n  handleNextMillerViewColumn(node: GroupNode, index: number) {\n    const nodeCopy = Object.create(node);\n    const isSameAsRoot = this.rootNode === node;\n    const isUnassignedDevicesNode = node.toString() === UnassignedDevicesNode.NAME;\n    const isNewColumnNeeded =\n      !isSameAsRoot && (node.isGroup() || isUnassignedDevicesNode || node.hasChildDevices());\n\n    if (isNewColumnNeeded) {\n      this.onRowSelected.emit({ nodeCopy, index });\n      return false;\n    }\n    return true;\n  }\n\n  /**\n   * @ignore\n   */\n  async ngOnInit() {\n    this.assetSelectorService.setIsNodeSelectable(this.isNodeSelectable);\n    if (this.index === 0) {\n      this.config = { ...CONFIG_OPTIONS_DEFAULT, ...this.config };\n    }\n    const shouldResetNameFilter =\n      this.rootNode && this.rootNode.mo && this.config.view === 'miller';\n    if (shouldResetNameFilter) {\n      await this.applyFilter('');\n    }\n\n    const isOnlyAssetNodeDefined = this.asset;\n    if (isOnlyAssetNodeDefined) {\n      this.rootNode = await this.createManagedObjectRootNode(this.asset);\n    }\n\n    const isAnyNodeDefined =\n      !this.rootNode && (!this.asset || Object.keys(this.asset).length === 0);\n    if (isAnyNodeDefined) {\n      this.rootNode = this.createDefaultRootNode();\n    }\n\n    if (\n      this.config.showUnassignedDevices &&\n      (!this.asset || Object.keys(this.asset).length === 0) &&\n      this.rootNode.root\n    ) {\n      this.rootNode.add(\n        new UnassignedDevicesNode(this.groupNodeService, {\n          showChildDevices: this.config.showChildDevices\n        })\n      );\n    }\n    this.root = this.rootNode.root;\n  }\n\n  async ngOnChanges(changes: SimpleChanges) {\n    if (changes.isNodeSelectable) {\n      this.assetSelectorService.setIsNodeSelectable(this.isNodeSelectable);\n    }\n    if (\n      changes.asset &&\n      changes.asset.currentValue &&\n      Object.keys(changes.asset.currentValue).length !== 0\n    ) {\n      this.rootNode = await this.createManagedObjectRootNode(changes.asset.currentValue);\n    }\n  }\n\n  /**\n   * @ignore\n   */\n  ngAfterViewInit(): void {\n    this.updateHeaderHeight();\n  }\n\n  /**\n   * Changes the current root to one level back.\n   */\n  back() {\n    const index = this.index - 1;\n    const nodeCopy = Object.create(this.rootNode.parents[0]);\n    this.onRowSelected.emit({ nodeCopy, index });\n  }\n\n  /**\n   * Clears the current filter.\n   */\n  clearFilters() {\n    this.filterText = '';\n    this.applyFilter('');\n  }\n\n  /**\n   * Clears the currently selected device.\n   */\n  clearSelectedDevices() {\n    this.selectedDevice = undefined;\n    this.applyFilter('');\n    this.onClearSelected.emit();\n  }\n\n  isGroupSelected() {\n    if (this.selected.some(selectedNode => selectedNode.id === this.rootNode.mo?.id)) {\n      return true;\n    }\n    return false;\n  }\n\n  /**\n   * @param nameFilter The name filter to apply.\n   * @param moId The managed object ID to filter by.\n   * @param showUnassignedDevices If true, it will show unassigned devices.\n   * @return The filter query to apply.\n   * @description\n   * This method builds a filter query based on the provided name filter and managed object ID.\n   */\n  groupNameFilter(nameFilter: string, moId, showUnassignedDevices?: boolean) {\n    if (nameFilter) {\n      const filterByName = showUnassignedDevices\n        ? {\n            __filter: {\n              name: nameFilter\n            },\n            __orderby: [{ name: 1 }]\n          }\n        : {\n            __filter: {\n              name: nameFilter,\n              __bygroupid: moId\n            }\n          };\n      return this.assetSelectorService.queriesUtil.buildQuery(filterByName);\n    }\n    const defaultFilter = {\n      __filter: {\n        __bygroupid: moId\n      },\n      __orderby: [{ name: 1 }]\n    };\n    return this.assetSelectorService.queriesUtil.buildQuery(defaultFilter);\n  }\n\n  /**\n   * Applies a filter.\n   * @param filter The filter to apply.\n   */\n  async applyFilter(filter: string) {\n    this.rootNode.filterQuery$.next(\n      this.groupNameFilter(\n        filter,\n        this.rootNode.mo.id,\n        this.isUnassignedDevicesNode() ? true : false\n      )\n    );\n    this.rootNode.refresh();\n    this.onLoad.emit({\n      loading: true,\n      filterText: this.filterText,\n      index: this.index,\n      selectedDevice: this.selectedDevice\n    });\n    this.cd.detectChanges();\n  }\n\n  /**\n   * Check if the UnassignedDevice node is the rootNode.\n   */\n  isUnassignedDevicesNode() {\n    return this.rootNode.toString() === UnassignedDevicesNode.NAME;\n  }\n\n  /**\n   * Called when the user resets the search result.\n   */\n  onSearchResultReset(selectedItem) {\n    if (selectedItem) {\n      this.rootNode = this.createDefaultRootNode();\n      if (this.config.showUnassignedDevices) {\n        this.rootNode.add(\n          new UnassignedDevicesNode(this.groupNodeService, {\n            showChildDevices: this.config.showChildDevices\n          })\n        );\n      }\n      if (this.config.view === 'miller') {\n        this.onRowSelected.emit({ root: true });\n      }\n\n      this.rootNode.click({ open: true });\n      this.rootNode.nodesFetched\n        .pipe(\n          tap(() => this.cd.detectChanges()),\n          takeUntil(this.unsubscribe$)\n        )\n        .subscribe();\n\n      if (this.config.view === 'tree') {\n        this.rootNode.open = true;\n      }\n    }\n  }\n\n  /**\n   * Called if the user clicks on a search result.\n   */\n  async onSearchResultClick(mo: IManagedObject) {\n    const canSelectNode = this.config.groupsSelectable || !this.groupNodeService.isGroup(mo);\n    if (this.config.view === 'miller') {\n      this.rootNode = await this.createManagedObjectRootNode(mo);\n      this.rootNode.click({ open: true });\n      const nodeCopy = Object.create(this.rootNode);\n      this.onRowSelected.emit({\n        nodeCopy,\n        index: 0,\n        selectedDevices: this.selectedDevice,\n        root: true\n      });\n    }\n    if (!this.config.multi) {\n      this.deselectAll();\n    }\n    if (canSelectNode) {\n      this.select(mo);\n    }\n  }\n\n  onLoading(isLoading: boolean) {\n    this.onLoad.emit({ loading: isLoading, filterText: this.filterText });\n    this.cd.markForCheck();\n  }\n\n  onSelect(mo: IManagedObject) {\n    this.select(mo);\n  }\n\n  onDeselect(config: { deselectMode: 'single' | 'all'; mo: IManagedObject }) {\n    switch (config?.deselectMode) {\n      case 'single':\n        this.deselect(config.mo);\n        this.cd.markForCheck();\n        break;\n      case 'all':\n        this.deselectAll(config.mo);\n        break;\n    }\n  }\n\n  private updateHeaderHeight() {\n    // An observer is used to detect if the header is visible or not.\n    // If the header is not visible, the height is 0 and the observer is\n    // used to detect when it becomes visible, to recalculate the height.\n    const observer = new IntersectionObserver(entries => {\n      entries.forEach(entry => {\n        if (entry.isIntersecting) {\n          this.updateHeaderHeight();\n          observer.unobserve(entry.target);\n        }\n      });\n    });\n\n    requestAnimationFrame(() => {\n      if (this.header?.nativeElement) {\n        const { clientHeight } = this.header.nativeElement;\n        if (clientHeight === 0 && this.isElementOrParentHidden(this.header.nativeElement)) {\n          observer.observe(this.header.nativeElement);\n          return;\n        }\n        this.getHeaderHeight$.next(clientHeight);\n      } else {\n        this.getHeaderHeight$.next(0);\n      }\n    });\n  }\n\n  private isElementOrParentHidden(element: HTMLElement): boolean {\n    while (element) {\n      const style = window.getComputedStyle(element);\n      if (style.display === 'none' || style.visibility === 'hidden') {\n        return true;\n      }\n      element = element.parentElement;\n    }\n    return false;\n  }\n}\n","<div\n  class=\"bg-inherit p-t-8 p-b-8 separator-bottom p-r-16 p-l-16 sticky-top\"\n  [ngStyle]=\"{ 'z-index': config.singleColumn && config.search ? '30' : '20' }\"\n  #header\n  [ngClass]=\"{\n    'p-absolute miller-column__selection d-flex flex-wrap a-i-center': config.view === 'miller',\n    'miller-column__search': config.search,\n    'miller-column__show-selected': config.showSelected\n  }\"\n  *ngIf=\"\n    !selectedDevice &&\n    index === 0 &&\n    (config.search || config.multi || config.label?.length || config.showSelected)\n  \"\n>\n  <p\n    class=\"text-medium flex-no-shrink a-s-center\"\n    [ngClass]=\"{\n      'm-b-4': config.search && root && config.singleColumn,\n      'm-r-8': !config.singleColumn && !config.search,\n      'fit-w': config.singleColumn\n    }\"\n    *ngIf=\"config.label?.length\"\n  >\n    {{ config.label | translate }}\n  </p>\n  <c8y-search-input\n    [ngStyle]=\"{ 'min-width': !config.singleColumn && config.label.length ? '50%' : 'inherit' }\"\n    *ngIf=\"config.search && root\"\n    (onClick)=\"onSearchResultClick($event)\"\n    (reset)=\"onSearchResultReset($event)\"\n    [mode]=\"'select'\"\n    [container]=\"container\"\n    class=\"input-group-sm\"\n    [groupsOnly]=\"config.groupsOnly\"\n    [ngClass]=\"{\n      'm-l-auto': !config.singleColumn && config.label.length,\n      'fit-w': config.singleColumn || !config.label.length\n    }\"\n  ></c8y-search-input>\n  <div\n    class=\"bg-inherit d-flex gap-4 fit-w\"\n    *ngIf=\"config.showSelected\"\n    [ngClass]=\"{ 'm-t-4': config.search }\"\n  >\n    <span class=\"text-label-small m-r-4 a-s-center l-h-1\">{{ 'Selected' | translate }}</span>\n    <div class=\"flex-grow inner-scroll d-flex gap-4 a-i-center\">\n      <ng-container *ngIf=\"!selected.length\">\n        <em class=\"text-12 text-muted d-flex a-i-center fit-h-20\">{{ 'None' | translate }}</em>\n      </ng-container>\n      <span\n        class=\"tag tag--info chip flex-no-shrink\"\n        *ngFor=\"let selectedItem of selected\"\n      >\n        <button\n          class=\"btn btn-xs btn-clean text-10\"\n          title=\"{{ selectedItem.name }}\"\n          [disabled]=\"disabled\"\n          type=\"button\"\n          (click)=\"config.multi ? deselect(selectedItem) : deselectAll()\"\n        >\n          <i c8yIcon=\"times\"></i>\n        </button>\n        {{ selectedItem.name || (ASSET_CONST | translate: { assetId: selectedItem.id }) }}\n      </span>\n    </div>\n  </div>\n</div>\n\n<div\n  class=\"p-r-16\"\n  *ngIf=\"selectedDevice\"\n>\n  <div class=\"d-flex p-b-4\">\n    <p\n      class=\"text-medium p-t-8 m-r-8\"\n      *ngIf=\"selectedDevice; else multiAssets\"\n    >\n      {{ 'Selected asset' | translate }}\n    </p>\n    <ng-template #multiAssets>\n      <p class=\"text-medium m-r-8\">{{ 'Selected assets' | translate }}</p>\n    </ng-template>\n    <button\n      class=\"btn btn-default btn-xs a-s-center m-t-4 m-l-auto\"\n      title=\"{{ 'Change' | translate }}\"\n      type=\"button\"\n      (click)=\"$event.stopPropagation(); clearSelectedDevices()\"\n    >\n      {{ 'Change' | translate }}\n    </button>\n  </div>\n  <div class=\"d-flex\">\n    <i\n      class=\"text-success p-l-0 p-r-8\"\n      [c8yIcon]=\"'check-circle'\"\n    ></i>\n    <i\n      class=\"m-r-4 icon-20\"\n      [c8yIcon]=\"selectedDevice | getGroupIcon | async\"\n    ></i>\n    <span>{{ selectedDevice.name }}</span>\n  </div>\n</div>\n\n<!-- miller columns header -->\n<div\n  class=\"miller-column__header sticky-top bg-inherit separator-bottom\"\n  *ngIf=\"\n    config.view === 'miller' &&\n    ((config.showFilter && !rootNode.root) || config.columnHeaders) &&\n    !selectedDevice\n  \"\n  [ngClass]=\"{ 'p-t-8': config.search }\"\n>\n  <div class=\"d-flex\" *ngIf=\"config.singleColumn && index !== 0\">\n    <i\n      class=\"m-r-4\"\n      c8yIcon=\"home\"\n    ></i>\n    <p\n      class=\"text-12 text-muted text-truncate text-rtl m-b-4\"\n      title=\"{{ rootNode.breadcrumb || rootNode.label | translate }}\"\n    >\n      {{ rootNode.breadcrumb || rootNode.label | translate }}\n    </p>\n  </div>\n  <div\n    class=\"d-flex a-i-center\"\n    *ngIf=\"config.columnHeaders || config.singleColumn\"\n  >\n    <button\n      class=\"btn btn-default btn-xs m-r-8 p-t-0 p-b-0 p-l-4 p-r-4 l-h-1\"\n      title=\"{{ 'Back' | translate }}\"\n      type=\"button\"\n      *ngIf=\"config.singleColumn && !rootNode.root && index !== 0\"\n      (click)=\"$event.stopPropagation(); back()\"\n    >\n      <i c8yIcon=\"angle-left\"></i>\n    </button>\n    <label\n      class=\"c8y-radio checkbox-inline m-r-8\"\n      *ngIf=\"!rootNode.root && index === 0 && (config.groupsSelectable || !rootNode.isGroup())\"\n    >\n      <input\n        title=\"{{ 'Select group' | translate }}\"\n        type=\"radio\"\n        (change)=\"select(rootNode.mo)\"\n        [checked]=\"isGroupSelected()\"\n      />\n      <span></span>\n    </label>\n\n    <i\n      class=\"icon-20 c8y-icon-duocolor m-r-4\"\n      [c8yIcon]=\"this.rootNode.mo | getGroupIcon: true : this.rootNode.icon | async\"\n      *ngIf=\"config.columnHeaders && (config.singleColumn || (!rootNode.root && index === 0))\"\n    ></i>\n    <p\n      class=\"text-truncate\"\n      title=\"{{ rootNode.label | translate }}\"\n      *ngIf=\"config.columnHeaders\"\n      [ngClass]=\"{\n        'text-label-small': !config.singleColumn,\n        'text-medium': config.singleColumn\n      }\"\n    >\n      {{ rootNode.label | translate }}\n    </p>\n  </div>\n\n  <div\n    *ngIf=\"!rootNode.root && config.showFilter\"\n    [ngClass]=\"{ 'p-t-4': config.columnHeaders }\"\n  >\n    <div class=\"input-group input-group-sm input-group-search\">\n      <input\n        class=\"form-control text-truncate\"\n        placeholder=\"{{ 'Filter this column…' | translate }}\"\n        [(ngModel)]=\"filterText\"\n        (keyup.enter)=\"applyFilter('*' + filterText + '*')\"\n      />\n      <span class=\"input-group-btn\">\n        <button\n          class=\"btn btn-dot p-l-4\"\n          title=\"{{ 'Apply filter' | translate }}\"\n          type=\"button\"\n          (click)=\"applyFilter('*' + filterText + '*')\"\n        >\n          <i c8yIcon=\"filter\"></i>\n        </button>\n        <button\n          class=\"btn btn-dot p-l-4\"\n          title=\" {{ 'Clear filters' | translate }}\"\n          type=\"button\"\n          (click)=\"clearFilters()\"\n          *ngIf=\"filterText.length\"\n        >\n          <i c8yIcon=\"times\"></i>\n        </button>\n      </span>\n    </div>\n  </div>\n</div>\n\n<c8y-asset-selector-node\n  class=\"d-block bg-inherit p-relative\"\n  style=\"z-index: 9\"\n  *ngIf=\"rootNode && !selectedDevice\"\n  [node]=\"rootNode\"\n  [rootNode]=\"rootNode\"\n  [preselected]=\"selected\"\n  [multi]=\"config.multi\"\n  [view]=\"config.view\"\n  [index]=\"index\"\n  [active]=\"active\"\n  [disabled]=\"disabled\"\n  [handleNextMillerViewColumn]=\"handleNextMillerViewColumn.bind(this)\"\n  (isLoadingState)=\"onLoading($event)\"\n  (onSelect)=\"onSelect($event)\"\n  (onDeselect)=\"onDeselect($event)\"\n  [ngClass]=\"{ 'collapse show': !rootNode.root && !rootNode.hidden && config.view !== 'miller' }\"\n></c8y-asset-selector-node>\n","import { NgClass, NgFor, NgIf, NgStyle } from '@angular/common';\nimport {\n  ChangeDetectorRef,\n  Component,\n  ElementRef,\n  EventEmitter,\n  Input,\n  OnInit,\n  Output,\n  SimpleChanges,\n  ViewChild,\n  forwardRef\n} from '@angular/core';\nimport { NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { IIdentified, IManagedObject, InventoryService } from '@c8y/client';\nimport { C8yTranslatePipe, EmptyStateComponent, LoadingComponent } from '@c8y/ngx-components';\nimport { AssetSelectorBase } from './asset-selector-base';\nimport { AssetSelectorComponent } from './asset-selector.component';\nimport {\n  AssetSelectionChangeEvent,\n  AssetSelectorOptions,\n  CONFIG_OPTIONS_DEFAULT\n} from './asset-selector.model';\nimport { AssetSelectorService } from './asset-selector.service';\nimport { GroupNode } from './group-node';\nimport { GroupNodeService } from './group-node.service';\n\n@Component({\n  selector: 'c8y-asset-selector-miller',\n  templateUrl: './miller-view.component.html',\n  providers: [\n    {\n      provide: NG_VALUE_ACCESSOR,\n      useExisting: forwardRef(() => MillerViewComponent),\n      multi: true\n    }\n  ],\n  imports: [\n    NgStyle,\n    NgClass,\n    NgFor,\n    AssetSelectorComponent,\n    NgIf,\n    LoadingComponent,\n    EmptyStateComponent,\n    C8yTranslatePipe\n  ]\n})\nexport class MillerViewComponent extends AssetSelectorBase implements OnInit {\n  /**\n   * Config object containing all options for the asset selector.\n   */\n  @Input() config: AssetSelectorOptions = {};\n  /**\n   * The asset to use as root.\n   */\n  @Input() asset: IIdentified = undefined;\n  /**\n   * The selected devices.\n   */\n  @Input() selectedDevice: IManagedObject = undefined;\n  /**\n   * The node to use as root. You can either set this, or the asset to start from.\n   */\n  @Input() rootNode: GroupNode;\n  /**\n   * Emits if the selection changes\n   */\n  @Output() onSelected = new EventEmitter<AssetSelectionChangeEvent>();\n  /**\n   * Emits if the currently selected asset is cleared.\n   */\n  @Output() onClearSelected = new EventEmitter<void>();\n  /**\n   * @ignore\n   */\n  @ViewChild('millerViewWrapper') millerViewWrapper: ElementRef;\n  /**\n   * The column array will contain all currently selected nodes\n   *  which will form the miller view columns (only one per level).\n   */\n  columns = [];\n  /**\n   * The current filter applied. Used for the empty state text in the view.\n   */\n  filterText = '';\n  /**\n   * Index of the column used to check where to show the loading state.\n   */\n  columnIndex: number;\n  @Input() container: '' | 'body' = 'body';\n\n  configOptionsDefault: AssetSelectorOptions = {\n    ...CONFIG_OPTIONS_DEFAULT,\n    view: 'miller'\n  };\n\n  /**\n   * Cached padding top value to avoid recalculating on every change detection cycle.\n   */\n  private _cachedPaddingTop: string | null = null;\n\n  constructor(\n    protected groupNodeService: GroupNodeService,\n    protected inventory: InventoryService,\n    protected assetSelectorService: AssetSelectorService,\n    protected cd: ChangeDetectorRef\n  ) {\n    super(groupNodeService, inventory, assetSelectorService);\n  }\n\n  /**\n   * @ignore\n   */\n  async ngOnInit() {\n    this.config = { ...this.configOptionsDefault, ...this.config };\n    this._calculatePaddingTop();\n\n    const isAnyNodeDefined =\n      !this.rootNode && (!this.asset || Object.keys(this.asset).length === 0);\n    if (isAnyNodeDefined) {\n      this.rootNode = this.createDefaultRootNode();\n    }\n\n    const isOnlyAssetNodeDefined = this.asset && Object.keys(this.asset).length !== 0;\n    if (isOnlyAssetNodeDefined) {\n      this.rootNode = await this.createManagedObjectRootNode(this.asset);\n      this.rootNode.click();\n      if (!this.config.preventInitialSelect) {\n        const selected = this.selectedDevice || this.asset;\n        this.selected = [selected];\n        this.emitChange(this.selected, selected as IManagedObject, true);\n      }\n    }\n\n    this.columns.push(this.rootNode);\n  }\n\n  /**\n   * @ignore\n   */\n  async ngOnChanges(changes: SimpleChanges) {\n    if (changes.config) {\n      this._calculatePaddingTop();\n    }\n\n    if (changes.asset && changes.asset.currentValue && !this.asset) {\n      this.columns = [];\n      this.columns.push(await this.createManagedObjectRootNode(changes.asset.currentValue));\n    }\n\n    if (changes.selectedDevice && changes.selectedDevice.currentValue) {\n      this.selected = [this.selectedDevice];\n      this.emitChange(this.selected, this.selectedDevice as IManagedObject, true);\n    }\n  }\n\n  /**\n   * Returns the cached padding top value for the miller view header.\n   * The value is calculated once during initialization and when config changes.\n   *\n   * @returns A unit value (as string) that is multiplied by --c8y-unit-base CSS custom property\n   */\n  getPaddingTop(): string {\n    return this._cachedPaddingTop || '0';\n  }\n\n  /**\n   * Create a new column with the selected node as root.\n   */\n  addNewColumn(node): void {\n    const level = node.index;\n    this.selectedDevice = node.selectedDevices || undefined;\n    if (node.root) {\n      window.requestAnimationFrame(() => (this.millerViewWrapper.nativeElement.scrollLeft = 0));\n      this.columns.length = 1;\n    }\n\n    const isLevelLowerThanColumnNumber = level < this.columns.length - 1;\n    let goBack = false;\n    if (isLevelLowerThanColumnNumber) {\n      this.columns.length = level + 1;\n      goBack = true;\n    }\n    if (!node.root && !(this.config.singleColumn && goBack)) {\n      this.columns.push(node.nodeCopy);\n      // eslint-disable-next-line @typescript-eslint/no-this-alias\n      const col = this;\n      window.requestAnimationFrame(() => (col.millerViewWrapper.nativeElement.scrollLeft = 50000));\n      /* triggered twice with a small delay as a workaround for dealing with Safari's bug:\n       \"Safari doesn’t update the scrollTop / scrollLeft properties of an element its any of its\n        ancestors has overflow set to hidden.\"\n        This was reported on customer portal with the ticket SI-488573\n      */\n      setTimeout(function () {\n        window.requestAnimationFrame(\n          () => (col.millerViewWrapper.nativeElement.scrollLeft = 55000)\n        );\n      }, 700);\n    }\n  }\n\n  /**\n   * Change the loading state of the asset selector.\n   */\n  onLoad(event) {\n    this.isLoading = event.loading;\n    this.filterText = event.filterText;\n    this.columnIndex = event.index;\n    this.selectedDevice = event.selectedDevice;\n    this.cd.detectChanges();\n  }\n\n  /**\n   * Add the selected node to the selected array.\n   */\n  onSelectionChange(event: AssetSelectionChangeEvent): void {\n    if (!this.config.multi) {\n      this.deselectAll(event.change.item);\n      return;\n    }\n    if (event.change.isSelected) {\n      this.select(event.change.item);\n      return;\n    }\n    this.deselect(event.change.item);\n  }\n\n  /**\n   * Calculates and caches the padding top value based on configuration options.\n   *\n   * The method determines the appropriate header height by considering:\n   * - Whether selected items are shown (showSelected)\n   * - Whether search functionality is enabled (search)\n   * - Whether single column mode is active (singleColumn)\n   * - Whether a label is present (label length > 0)\n   */\n  private _calculatePaddingTop(): void {\n    const PADDING = {\n      NONE: '0',\n      BASE: '5',\n      WITH_SEARCH: '6',\n      WITH_LABEL: '7',\n      WITH_SEARCH_AND_SELECTED: '9',\n      WITH_SEARCH_LABEL_SELECTED_SINGLE: '11'\n    };\n\n    const { showSelected = false, search = false, singleColumn = false, label } = this.config;\n    const hasLabel = label?.length > 0;\n\n    const state = { showSelected, search, singleColumn, hasLabel };\n\n    if (state.showSelected && state.search && state.singleColumn && state.hasLabel) {\n      this._cachedPaddingTop = PADDING.WITH_SEARCH_LABEL_SELECTED_SINGLE;\n    } else if (state.showSelected && state.search) {\n      this._cachedPaddingTop = PADDING.WITH_SEARCH_AND_SELECTED;\n    } else if (state.showSelected && state.hasLabel) {\n      this._cachedPaddingTop = PADDING.WITH_LABEL;\n    } else if (state.showSelected) {\n      this._cachedPaddingTop = PADDING.BASE;\n    } else if (state.search && state.singleColumn && state.hasLabel) {\n      this._cachedPaddingTop = PADDING.WITH_SEARCH_AND_SELECTED;\n    } else if (state.search) {\n      this._cachedPaddingTop = PADDING.WITH_SEARCH;\n    } else if (state.hasLabel) {\n      this._cachedPaddingTop = PADDING.BASE;\n    } else {\n      this._cachedPaddingTop = PADDING.NONE;\n    }\n  }\n}\n","<div\n  class=\"miller-view-wrapper {{ config.label }}\"\n  [ngStyle]=\"{\n    'padding-top': 'calc('+ getPaddingTop() +' * var(--c8y-unit-base))',\n  }\"\n  #millerViewWrapper\n  [ngClass]=\"{\n    'single-column': config.singleColumn,\n  }\"\n>\n  <div\n    class=\"miller-column bg-inherit\"\n    *ngFor=\"let column of columns; index as i\"\n  >\n    <c8y-asset-selector\n      class=\"bg-inherit\"\n      #assetSelector\n      [config]=\"config\"\n      [index]=\"i\"\n      [active]=\"columns[i + 1]\"\n      [rootNode]=\"column\"\n      [selected]=\"selected || []\"\n      [selectedDevice]=\"selectedDevice\"\n      (onSelected)=\"onSelectionChange($event)\"\n      (onClearSelected)=\"onClearSelected.emit()\"\n      (onRowSelected)=\"addNewColumn($event)\"\n      (onLoad)=\"onLoad($event)\"\n      [container]=\"container\"\n    ></c8y-asset-selector>\n    <div\n      class=\"p-relative p-b-64\"\n      *ngIf=\"isLoading && columnIndex === i && !selectedDevice\"\n    >\n      <c8y-loading></c8y-loading>\n    </div>\n\n    <div\n      class=\"p-l-8 p-r-8\"\n      *ngIf=\"!column.children.length && !isLoading\"\n    >\n      <c8y-ui-empty-state\n        [icon]=\"'folder-open'\"\n        [title]=\"'No results to display.' | translate\"\n        [subtitle]=\"'The selected asset has no children.' | translate\"\n        *ngIf=\"!filterText; else noSearchResults\"\n        [horizontal]=\"true\"\n      ></c8y-ui-empty-state>\n      <ng-template #noSearchResults>\n        <c8y-ui-empty-state\n          [icon]=\"'folder-open'\"\n          [title]=\"'No results to display for the current filter.' | translate\"\n          [subtitle]=\"'There are no assets matching the filter.' | translate\"\n          [horizontal]=\"true\"\n        ></c8y-ui-empty-state>\n      </ng-template>\n    </div>\n  </div>\n</div>\n","import { NgModule } from '@angular/core';\nimport { CoreModule, CommonModule, CoreSearchModule } from '@c8y/ngx-components';\nimport { CollapseModule } from 'ngx-bootstrap/collapse';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { GroupNodeService } from './group-node.service';\n\nimport { AssetSelectorNodeComponent } from './asset-selector-node.component';\nimport { AssetSelectorComponent } from './asset-selector.component';\nimport { FormsModule } from '@angular/forms';\nimport { MillerViewComponent } from './miller-view.component';\nimport { AssetSelectorService } from './asset-selector.service';\n\n@NgModule({\n  imports: [\n    CoreModule,\n    CommonModule,\n    CollapseModule,\n    BsDropdownModule,\n    CoreSearchModule,\n    FormsModule,\n    AssetSelectorNodeComponent,\n    AssetSelectorComponent,\n    MillerViewComponent\n  ],\n  exports: [AssetSelectorNodeComponent, AssetSelectorComponent, MillerViewComponent],\n  providers: [GroupNodeService, AssetSelectorService]\n})\nexport class AssetSelectorModule {}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { DeviceStatusModule, hookNavigator, ModalModule, ModalService } from '@c8y/ngx-components';\nimport { AssetNavigatorConfig, ASSET_NAVIGATOR_CONFIG } from './asset-node-config.model';\nimport { AssetNodeFactory } from './asset-node.factory';\nimport { AssetSelectorModule } from './asset-selector/asset-selector.module';\n\n@NgModule({\n  declarations: [],\n  imports: [ModalModule, AssetSelectorModule, DeviceStatusModule],\n  providers: [ModalService, hookNavigator(AssetNodeFactory)]\n})\nexport class AssetsNavigatorModule {\n  static config(config: AssetNavigatorConfig = {}): ModuleWithProviders<AssetsNavigatorModule> {\n    return {\n      ngModule: AssetsNavigatorModule,\n      providers: [\n        {\n          provide: ASSET_NAVIGATOR_CONFIG,\n          useValue: config\n        }\n      ]\n    };\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["getProp","i1","i2.AssetSelectorService","i1.GroupNodeService","i3.AssetSelectorService"],"mappings":"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"}