@c8y/ngx-components 1010.0.30 → 1010.0.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/assets-navigator/asset-node.service.d.ts +7 -3
  2. package/assets-navigator/c8y-ngx-components-assets-navigator.metadata.json +1 -1
  3. package/bundles/c8y-ngx-components-assets-navigator.umd.js +7 -2
  4. package/bundles/c8y-ngx-components-assets-navigator.umd.js.map +1 -1
  5. package/bundles/c8y-ngx-components-assets-navigator.umd.min.js +1 -1
  6. package/bundles/c8y-ngx-components-assets-navigator.umd.min.js.map +1 -1
  7. package/bundles/c8y-ngx-components-repository.umd.js +8 -4
  8. package/bundles/c8y-ngx-components-repository.umd.js.map +1 -1
  9. package/bundles/c8y-ngx-components-repository.umd.min.js +1 -1
  10. package/bundles/c8y-ngx-components-repository.umd.min.js.map +1 -1
  11. package/bundles/c8y-ngx-components-sensor-phone.umd.js +1 -1
  12. package/bundles/c8y-ngx-components-sensor-phone.umd.js.map +1 -1
  13. package/bundles/c8y-ngx-components-sensor-phone.umd.min.js +1 -1
  14. package/bundles/c8y-ngx-components-sensor-phone.umd.min.js.map +1 -1
  15. package/bundles/c8y-ngx-components.umd.js +14 -8
  16. package/bundles/c8y-ngx-components.umd.js.map +1 -1
  17. package/bundles/c8y-ngx-components.umd.min.js +1 -1
  18. package/bundles/c8y-ngx-components.umd.min.js.map +1 -1
  19. package/c8y-ngx-components.metadata.json +1 -1
  20. package/core/file-picker/file-picker.component.d.ts +8 -0
  21. package/esm2015/assets-navigator/asset-node.service.js +8 -3
  22. package/esm2015/core/file-picker/file-picker.component.js +12 -2
  23. package/esm2015/core/file-picker/file-picker.module.js +6 -8
  24. package/esm2015/repository/configuration/configuration-detail.component.js +7 -2
  25. package/esm2015/repository/firmware/add-firmware-modal.component.js +7 -2
  26. package/esm2015/repository/firmware/add-firmware-patch-modal.component.js +7 -2
  27. package/esm2015/repository/software/add-software-modal.component.js +7 -2
  28. package/esm2015/sensor-phone/sensor-phone-modal.component.js +2 -2
  29. package/esm5/assets-navigator/asset-node.service.js +8 -3
  30. package/esm5/core/file-picker/file-picker.component.js +12 -2
  31. package/esm5/core/file-picker/file-picker.module.js +6 -8
  32. package/esm5/repository/configuration/configuration-detail.component.js +3 -2
  33. package/esm5/repository/firmware/add-firmware-modal.component.js +3 -2
  34. package/esm5/repository/firmware/add-firmware-patch-modal.component.js +3 -2
  35. package/esm5/repository/software/add-software-modal.component.js +3 -2
  36. package/esm5/sensor-phone/sensor-phone-modal.component.js +2 -2
  37. package/fesm2015/c8y-ngx-components-assets-navigator.js +7 -2
  38. package/fesm2015/c8y-ngx-components-assets-navigator.js.map +1 -1
  39. package/fesm2015/c8y-ngx-components-repository.js +24 -4
  40. package/fesm2015/c8y-ngx-components-repository.js.map +1 -1
  41. package/fesm2015/c8y-ngx-components-sensor-phone.js +1 -1
  42. package/fesm2015/c8y-ngx-components-sensor-phone.js.map +1 -1
  43. package/fesm2015/c8y-ngx-components.js +14 -8
  44. package/fesm2015/c8y-ngx-components.js.map +1 -1
  45. package/fesm5/c8y-ngx-components-assets-navigator.js +7 -2
  46. package/fesm5/c8y-ngx-components-assets-navigator.js.map +1 -1
  47. package/fesm5/c8y-ngx-components-repository.js +8 -4
  48. package/fesm5/c8y-ngx-components-repository.js.map +1 -1
  49. package/fesm5/c8y-ngx-components-sensor-phone.js +1 -1
  50. package/fesm5/c8y-ngx-components-sensor-phone.js.map +1 -1
  51. package/fesm5/c8y-ngx-components.js +14 -8
  52. package/fesm5/c8y-ngx-components.js.map +1 -1
  53. package/locales/locales.pot +30 -9
  54. package/package.json +2 -2
  55. package/repository/c8y-ngx-components-repository.metadata.json +1 -1
  56. package/repository/configuration/configuration-detail.component.d.ts +1 -0
  57. package/repository/firmware/add-firmware-modal.component.d.ts +1 -0
  58. package/repository/firmware/add-firmware-patch-modal.component.d.ts +1 -0
  59. package/repository/software/add-software-modal.component.d.ts +1 -0
  60. package/sensor-phone/c8y-ngx-components-sensor-phone.metadata.json +1 -1
@@ -464,7 +464,7 @@ let AssetNodeService = class AssetNodeService {
464
464
  const defaultFilter = {
465
465
  pageSize: this.PAGE_SIZE,
466
466
  withChildren: false,
467
- query: this.queriesUtil.buildQuery(this.rootQueryFilter())
467
+ query: this.queriesUtil.buildQuery(this.navRootQueryFilter())
468
468
  };
469
469
  const groupFilter = customFilter ? customFilter : defaultFilter;
470
470
  // due to BE performance limitations we do not allow filtering and sorting for a user without inventory roles
@@ -502,13 +502,18 @@ let AssetNodeService = class AssetNodeService {
502
502
  groupQueryFilter(moId) {
503
503
  return `$filter=(bygroupid(${moId}))$orderby=name`;
504
504
  }
505
+ navRootQueryFilter() {
506
+ const navRootFilter = this.rootQueryFilter();
507
+ navRootFilter.__orderby = [{ name: 1 }];
508
+ return navRootFilter;
509
+ }
505
510
  rootQueryFilter() {
506
511
  const { moduleConfig } = this;
507
512
  const rootFilter = {
508
513
  __filter: {
509
514
  type: `${GroupFragment.groupType}`
510
515
  },
511
- __orderby: [{ name: 1 }]
516
+ __orderby: []
512
517
  };
513
518
  if (moduleConfig.smartGroups) {
514
519
  const queryFilter = {
@@ -1 +1 @@
1
- {"version":3,"file":"c8y-ngx-components-assets-navigator.js","sources":["ng://@c8y/ngx-components/assets-navigator/load-more-node.ts","ng://@c8y/ngx-components/assets-navigator/group-fragment.model.ts","ng://@c8y/ngx-components/assets-navigator/action.enum.ts","ng://@c8y/ngx-components/assets-navigator/asset-node.ts","ng://@c8y/ngx-components/assets-navigator/dynamic-group-node.ts","ng://@c8y/ngx-components/assets-navigator/asset-node-config.model.ts","ng://@c8y/ngx-components/assets-navigator/group.service.ts","ng://@c8y/ngx-components/assets-navigator/asset-node.service.ts","ng://@c8y/ngx-components/assets-navigator/asset-node.factory.ts","ng://@c8y/ngx-components/assets-navigator/assets-navigator.module.ts","ng://@c8y/ngx-components/assets-navigator/asset-selector/group-node.ts","ng://@c8y/ngx-components/assets-navigator/asset-selector/group-node.service.ts","ng://@c8y/ngx-components/assets-navigator/asset-selector/asset-selector.component.ts","ng://@c8y/ngx-components/assets-navigator/asset-selector/asset-selector-node.component.ts","ng://@c8y/ngx-components/assets-navigator/asset-selector/asset-selector.module.ts","ng://@c8y/ngx-components/assets-navigator/c8y-ngx-components-assets-navigator.ts"],"sourcesContent":["import { NavigatorNode, gettext } from '@c8y/ngx-components';\n\nexport class LoadMoreNode extends NavigatorNode {\n priority = -Infinity;\n label = gettext('Load more');\n icon = 'plus';\n droppable = true;\n}\n","export enum GroupFragment {\n groupType = 'c8y_DeviceGroup',\n subGroupType = 'c8y_DeviceSubgroup',\n groupFragmentType = 'c8y_IsDeviceGroup',\n dataBrokerSourceFragment = 'c8y_BrokerSource',\n dynamicGroupType = 'c8y_DynamicGroup',\n dynamicGroupFragment = 'c8y_IsDynamicGroup',\n dynamicGroupColumnConfig = 'c8y_UIDeviceFilterConfig',\n dynamicGroupQueryString = 'c8y_DeviceQueryString',\n}\n","export enum Action {\n FETCH,\n NEXT,\n REFRESH,\n LOADING_DONE\n}\n","import { Paging } from '@c8y/client';\nimport { ClickOptions, gettext, NavigatorNode, DeviceStatusComponent } from '@c8y/ngx-components';\nimport { get, has } from 'lodash-es';\nimport { Subject, Subscription } from 'rxjs';\nimport { AssetNodeMo, AssetNodeService } from './asset-node.service';\nimport { LoadMoreNode } from './load-more-node';\nimport { GroupFragment } from './group-fragment.model';\nimport { Action } from './action.enum';\n\nexport class AssetNode extends NavigatorNode {\n root: boolean;\n mo: any;\n\n get label() {\n return (this.root && gettext('Groups')) || this.mo.name || '--';\n }\n\n get hasChildren() {\n return this.root || this.service.groups.isGroup(this.mo);\n }\n\n get iconComponent() {\n return this.isDeviceOrProbablyChildDevice ? DeviceStatusComponent : undefined;\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 const { isGroup, isDynamicGroup } = this.service.groups;\n return !isGroup(this.mo) && !isDynamicGroup(this.mo) && !this.isDevice && !this.root;\n }\n\n events: Subject<Action>;\n protected paging: Paging<AssetNodeMo>;\n protected loadMoreNode: LoadMoreNode;\n private onUpdateSubscription: Subscription;\n\n constructor(protected service: AssetNodeService, config = {}) {\n super(config);\n this.root = this.root || false;\n this.mo = this.mo || {};\n this.path = this.root\n ? 'group'\n : this.isDeviceOrProbablyChildDevice\n ? `device/${this.mo.id}`\n : `group/${this.mo.id}`;\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 }\n\n openOnStart(url) {\n const urlRegex = /^\\/group\\//;\n if (this.root) {\n if (this.service.moduleConfig.openOnStart || urlRegex.test(url)) {\n return true;\n }\n }\n const matches = url.match(/\\/(group)\\/(\\d+)/);\n let isMatch = false;\n if (matches) {\n const id = matches[2];\n isMatch = []\n .concat(get(this.mo, 'childAssets.references', []))\n .some(({ managedObject }) => managedObject.id === id);\n return isMatch;\n }\n return false;\n }\n\n refresh(mo: any = {}, method = 'GET') {\n if (mo.id === this.mo.id) {\n this.mo = mo;\n } else if (method === 'DELETE') {\n this.parents.forEach((node: AssetNode) => node.refresh());\n return;\n }\n if (this.events) {\n this.events.next(Action.REFRESH);\n }\n }\n\n click(options: ClickOptions = {}) {\n if (this.isDeviceOrProbablyChildDevice) {\n this.service.preferBreadcrumb(this.parents);\n return;\n }\n this.hookEvents();\n\n this.updateIcon(options.open);\n if (options.open) {\n this.events.next(Action.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));\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;\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 super.drop($event);\n const nodeToMove = this.service.draggedData;\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 protected fetch() {\n return this.root ? this.service.getRootNodes() : this.service.getGroupItems(this.mo.id);\n }\n\n protected async handleEvent(evt: Action) {\n if (!this.children.length && evt === Action.FETCH) {\n this.loading = true;\n this.addNodes(await this.fetch());\n this.loading = false;\n } else if (evt === Action.NEXT) {\n this.loadMoreNode.loading = true;\n this.addNodes(await this.paging.next());\n this.loadMoreNode.loading = false;\n } else if (evt === Action.REFRESH) {\n this.loading = false;\n this.paging = undefined;\n this.loadMoreNode = undefined;\n this.empty();\n this.events.next(Action.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 => this.addManagedObject(mo));\n this.events.next(Action.LOADING_DONE);\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 = () => this.events.next(Action.NEXT);\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;\n if (this.root) {\n const { data } = await this.service.inventory.update({\n id: nodeToMove.mo.id,\n type: GroupFragment.groupType\n });\n mo = data;\n } else {\n const { data } = await this.service.inventory.childAssetsAdd(nodeToMove.mo, this.mo);\n mo = data;\n }\n this.addManagedObject(mo);\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 if (parent.root) {\n await this.service.inventory.update({\n id: nodeToMove.mo.id,\n type: GroupFragment.subGroupType\n });\n } else {\n await this.service.inventory.childAssetsRemove(nodeToMove.mo, parent.mo);\n }\n parent.remove(nodeToMove);\n }\n }\n\n private updateIcon(open) {\n this.icon = this.service.groups.icon(\n // if it's root we are going to pass a fake mo to get the same icon as groups\n this.root ? { type: GroupFragment.groupType } : this.mo,\n open\n );\n }\n}\n","\nimport { AssetNode } from './asset-node';\nimport { AssetNodeService } from './asset-node.service';\n\nexport class DynamicGroupNode extends AssetNode {\n constructor(\n protected service: AssetNodeService,\n config = {}\n ) {\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\nexport const ASSET_NAVIGATOR_CONFIG = new InjectionToken<AssetNavigatorConfig>('AssetNodeConfig');\r\n\r\nexport interface AssetNavigatorConfig {\r\n smartGroups?: boolean;\r\n openOnStart?: boolean;\r\n rootNodePriority?: number;\r\n disableDragAndDrop?: boolean;\r\n}\r\n","import { Injectable } from '@angular/core';\nimport { GroupFragment } from './group-fragment.model';\nimport { IManagedObject } from '@c8y/client';\n\n@Injectable()\nexport class DeviceGroupService {\n icons = {\n brokerSourceInactive: {\n icon: 'c8y-group-remote-inactive'\n },\n brokerSource: {\n icon: 'c8y-group-remote',\n iconOpen: 'c8y-group-remote-open'\n },\n group: {\n icon: 'c8y-group',\n iconOpen: 'c8y-group-open'\n },\n dynamicGroup: {\n icon: 'c8y-group-smart',\n iconOpen: 'c8y-group-smart-open'\n },\n other: {\n icon: 'circle',\n iconClass: 'statusUnknown'\n }\n };\n dataBrokerSourceFragmentInactive = `_${GroupFragment.dataBrokerSourceFragment}`;\n\n isGroup(mo) {\n return (\n !!mo[GroupFragment.groupFragmentType] ||\n mo.type === GroupFragment.groupType ||\n mo.type === GroupFragment.subGroupType\n );\n }\n\n isDynamicGroup(mo) {\n return !!mo[GroupFragment.dynamicGroupFragment] || mo.type === GroupFragment.dynamicGroupType;\n }\n\n isDataBroker(mo) {\n return (\n !!mo[GroupFragment.dataBrokerSourceFragment] || !!mo[this.dataBrokerSourceFragmentInactive]\n );\n }\n\n isDataBrokerActive(mo) {\n return (\n !!mo[GroupFragment.dataBrokerSourceFragment] && !mo[this.dataBrokerSourceFragmentInactive]\n );\n }\n\n isDevice(mo) {\n return !!mo.c8y_IsDevice;\n }\n\n icon(mo, open = false) {\n let type = 'other';\n if (this.isDynamicGroup(mo)) {\n type = 'dynamicGroup';\n } else if (this.isDataBrokerActive(mo)) {\n type = 'brokerSource';\n } else if (this.isDataBroker(mo)) {\n type = 'brokerSourceInactive';\n } else if (this.isGroup(mo)) {\n type = 'group';\n }\n const icon = this.icons[type];\n return (open && icon.iconOpen) || icon.icon;\n }\n\n isAnyGroup(mo: IManagedObject) {\n return (\n this.isGroup(mo) ||\n this.isDynamicGroup(mo) ||\n this.isDataBroker(mo) ||\n this.isDataBrokerActive(mo)\n );\n }\n}\n","import { Inject, Injectable, Optional } from '@angular/core';\nimport { InventoryService, QueriesUtil, UserService, IManagedObject, IResult } from '@c8y/client';\nimport {\n AlertService,\n BreadcrumbService,\n ModalService,\n NavigatorNode,\n AppStateService\n} from '@c8y/ngx-components';\nimport { ApiService } from '@c8y/ngx-components/api';\nimport { empty } from 'rxjs';\nimport { filter, mergeMap } from 'rxjs/operators';\nimport { AssetNode } from './asset-node';\nimport { AssetNavigatorConfig, ASSET_NAVIGATOR_CONFIG } from './asset-node-config.model';\nimport { DynamicGroupNode } from './dynamic-group-node';\nimport { GroupFragment } from './group-fragment.model';\nimport { DeviceGroupService } from './group.service';\n\nexport interface AssetNodeMo {\n id: string;\n type: string;\n}\n\n@Injectable()\nexport class AssetNodeService {\n rootNode: AssetNode;\n firstUrl = true;\n draggedData: AssetNode;\n queriesUtil: QueriesUtil;\n protected PAGE_SIZE = 20;\n\n constructor(\n public inventory: InventoryService,\n public groups: DeviceGroupService,\n public apiService: ApiService,\n public modal: ModalService,\n public alert: AlertService,\n protected breadcrumbService: BreadcrumbService,\n protected user: UserService,\n protected appState: AppStateService,\n @Optional() @Inject(ASSET_NAVIGATOR_CONFIG) public moduleConfig: AssetNavigatorConfig\n ) {\n this.moduleConfig = {\n rootNodePriority: 2000,\n ...(moduleConfig || {})\n };\n this.queriesUtil = new QueriesUtil();\n }\n\n createRootNode() {\n this.rootNode = this.createAssetNode({\n root: true,\n priority: this.moduleConfig.rootNodePriority\n });\n return this.rootNode;\n }\n\n createDynamicGroupNode(config) {\n return new DynamicGroupNode(this, config);\n }\n\n createAssetNode(config) {\n return new AssetNode(this, config);\n }\n\n createChildNode(managedObject) {\n const { type } = managedObject;\n const config: Partial<AssetNode> = { mo: managedObject };\n if (type === GroupFragment.dynamicGroupType) {\n return this.createDynamicGroupNode(config);\n }\n return this.createAssetNode(config);\n }\n\n getRootNodes(customFilter?: any): Promise<any> {\n const defaultFilter = {\n pageSize: this.PAGE_SIZE,\n withChildren: false,\n query: this.queriesUtil.buildQuery(this.rootQueryFilter())\n };\n const groupFilter = customFilter ? customFilter : defaultFilter;\n\n // due to BE performance limitations we do not allow filtering and sorting for a user without inventory roles\n if (!this.user.hasRole(this.appState.currentUser.value, 'ROLE_INVENTORY_READ')) {\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 getGroupItems(moId: string, extraFilter: object = {}) {\n const queryFilter = {\n withChildren: false,\n pageSize: this.PAGE_SIZE,\n query: this.groupQueryFilter(moId)\n };\n return this.inventory.childAssetsList(moId, { ...queryFilter, ...extraFilter });\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(moId: string, extraFilter: object = {}) {\n const queryFilter = {\n withChildren: false,\n pageSize: this.PAGE_SIZE,\n query: this.groupQueryFilter(moId)\n };\n return this.inventory.childDevicesList(moId, { ...queryFilter, ...extraFilter });\n }\n\n groupQueryFilter(moId: string) {\n return `$filter=(bygroupid(${moId}))$orderby=name`;\n }\n\n rootQueryFilter() {\n const { moduleConfig } = this;\n const rootFilter = {\n __filter: {\n type: `${GroupFragment.groupType}`\n },\n __orderby: [{ name: 1 }]\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)|(service/smartgroup/smartgroups))/${mo.id}`).test(\n url\n )\n )\n .pipe(\n filter(() => !this.draggedData),\n mergeMap(this.apiService.resolveData),\n filter(response => !response.data.c8y_Dashboard)\n );\n } else if (root) {\n return this.apiService\n .hookResponse(\n ({ url, method }) =>\n RegExp('((inventory/managedObjects)|(service/smartgroup/smartgroups))/?$').test(url) &&\n method === 'POST'\n )\n .pipe(\n mergeMap(this.apiService.resolveData),\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 * 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(query, orderByQuery) {\n let combinedQuery;\n if (query && orderByQuery) {\n const filterQuery = this.queriesUtil.buildQuery({\n __useFilterQueryString: query\n });\n combinedQuery = `${filterQuery} ${orderByQuery}`;\n } else {\n combinedQuery = query || orderByQuery || '';\n }\n return combinedQuery;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AssetNodeService } from './asset-node.service';\nimport { NavigatorNode } from '@c8y/ngx-components';\n\n@Injectable()\nexport class AssetNodeFactory {\n constructor(private service: AssetNodeService) {}\n\n get(): NavigatorNode {\n if (!this.service.rootNode) {\n this.service.createRootNode();\n }\n return this.service.rootNode;\n }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { HOOK_NAVIGATOR_NODES, ModalModule, ModalService, DeviceStatusComponent, DeviceStatusModule} from '@c8y/ngx-components';\nimport { ASSET_NAVIGATOR_CONFIG} from './asset-node-config.model';\nimport { AssetNodeFactory } from './asset-node.factory';\nimport { AssetNodeService } from './asset-node.service';\nimport { AssetNavigatorConfig } from './asset-node-config.model';\nimport { DeviceGroupService } from './group.service';\n\n@NgModule({\n declarations: [],\n imports: [\n ModalModule,\n DeviceStatusModule\n ],\n providers: [\n ModalService,\n AssetNodeService,\n DeviceGroupService,\n {\n provide: HOOK_NAVIGATOR_NODES, useClass: AssetNodeFactory, multi: true\n }\n ],\n entryComponents: [DeviceStatusComponent]\n})\nexport class AssetsNavigatorModule {\n static config(config: AssetNavigatorConfig): ModuleWithProviders {\n return {\n ngModule: AssetsNavigatorModule,\n providers: [\n {\n provide: ASSET_NAVIGATOR_CONFIG, useValue: config\n }\n ],\n };\n }\n\n}\n","import { GroupNodeService } from './group-node.service';\nimport { AssetNode } from '../asset-node';\n\nexport class GroupNode extends AssetNode {\n // FIXME: Currently hasChildren returns true if it is a group,\n // Issue is, that we disable the children in the API\n // getGroupItems service call due to performance. This leads\n // to that the dropdown chevron is shown always. Issue is,\n // that even if we return the chevrons, we have no way to determine\n // if the childAssets contain groups or other assets (like dashboards).\n // get hasChildren() {\n // return this.root || this.service.groups.isGroup(this.mo) && (this.mo as IManagedObject).childAssets.references.length > 0;\n // }\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 */\n constructor(protected service: GroupNodeService, config = {}) {\n super(service, config);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AssetNodeService } from '../asset-node.service';\nimport { GroupNode } from './group-node';\nimport { GroupFragment } from '../group-fragment.model';\n\n@Injectable()\nexport class GroupNodeService extends AssetNodeService {\n protected PAGE_SIZE = 5;\n\n createGroupNode(config) {\n return new GroupNode(this, config);\n }\n\n createChildNode(managedObject): GroupNode {\n const config: Partial<GroupNode> = { mo: managedObject };\n return this.createGroupNode(config);\n }\n\n subAssetsQueryFilter() {\n const rootQueryFilter = this.rootQueryFilter();\n const filter = this.queriesUtil.addOrFilter(rootQueryFilter, {\n type: GroupFragment.subGroupType\n });\n return this.queriesUtil.buildQuery(filter);\n }\n\n getGroupItems(moId: string): Promise<any> {\n return this.inventory.childAssetsList(moId, {\n query: this.subAssetsQueryFilter(),\n withChildren: false,\n pageSize: this.PAGE_SIZE,\n withTotalPages: true\n });\n }\n}\n","import { Component, Output, Input, EventEmitter, OnInit } from '@angular/core';\nimport { GroupNodeService } from './group-node.service';\nimport { GroupNode } from './group-node';\nimport { IManagedObject } from '@c8y/client';\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})\nexport class AssetSelectorComponent implements OnInit {\n /**\n * An array of predefined nodes.\n */\n @Input() selected: IManagedObject[] = [];\n /**\n * Emits if one item was selected (all currently selected nodes).\n */\n @Output() onChange = new EventEmitter<IManagedObject[]>();\n /**\n * @ignore\n */\n rootNode: GroupNode;\n\n /**\n * @ignore only DI\n */\n constructor(private groupNodeService: GroupNodeService) {}\n\n /**\n * @ignore\n */\n ngOnInit(): void {\n this.rootNode = this.groupNodeService.createGroupNode({ root: true });\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 const index = this.getIndexOfSelected(this.selected, selectedMo);\n if (index === -1) {\n this.selected.push(selectedMo);\n }\n this.onChange.emit(this.selected);\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.onChange.emit(this.selected);\n }\n\n getIndexOfSelected(selected: Array<Partial<IManagedObject>>, selectedMo: IManagedObject) {\n return selected.findIndex(mo => mo.id === selectedMo.id);\n }\n}\n","import { Component, Input, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { GroupNode } from './group-node';\nimport { Subject } from 'rxjs';\nimport { takeUntil, filter } from 'rxjs/operators';\nimport { AssetSelectorComponent } from './asset-selector.component';\nimport { IManagedObject } from '@c8y/client';\nimport { Action } from '../action.enum';\n\n@Component({\n selector: 'c8y-asset-selector-node',\n templateUrl: './asset-selector-node.component.html'\n})\nexport class AssetSelectorNodeComponent implements OnInit {\n /**\n * The current node.\n */\n @Input() node: GroupNode;\n /**\n * All preselected items\n */\n @Input() preselected: Array<Partial<IManagedObject>> = [];\n /**\n * Should the path be shown\n */\n @Input() showPath: boolean = false;\n /**\n * The current path to the node\n */\n breadcrumb: string;\n /**\n * @ignore\n */\n level: number = 0;\n /**\n * The selection status of the node\n */\n checked: boolean = false;\n /**\n * @ignore\n */\n unsubscribe$ = new Subject<any>();\n\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 private parentNode: AssetSelectorComponent\n ) {}\n\n /**\n * @ignore\n */\n async ngOnInit() {\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 if (this.node.events) {\n this.node.events\n .pipe(\n takeUntil(this.unsubscribe$),\n filter((a: Action) => a === Action.LOADING_DONE)\n )\n .subscribe(() => {\n this.cd.markForCheck();\n });\n }\n\n this.checked = this.isPreselected();\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 /**\n * TODO: Only level used. Breadcrumbs needs to be implemented.\n */\n setupBreadcrumbsAndLevel(node: GroupNode) {\n if (node.parents && node.parents.length) {\n const parent = node.parents[0] as GroupNode;\n this.breadcrumb = this.translateService.instant(parent.label) + ' > ' + 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 this.checked = !this.checked;\n this.updateSelection(node.mo);\n }\n\n /**\n * @ignore\n */\n ngOnDestroy(): void {\n this.unsubscribe$.next(true);\n this.unsubscribe$.complete();\n }\n\n private isPreselected() {\n if (this.node.root || !this.node.mo) {\n return false;\n }\n return this.parentNode.getIndexOfSelected(this.preselected, this.node.mo) > -1;\n }\n\n private updateSelection(selectedMo: IManagedObject) {\n if (this.checked) {\n this.parentNode.select(selectedMo);\n return;\n }\n this.parentNode.deselect(selectedMo);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } 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';\n\n@NgModule({\n imports: [CommonModule, CollapseModule, BsDropdownModule ],\n exports: [AssetSelectorNodeComponent, AssetSelectorComponent],\n providers: [GroupNodeService],\n declarations: [AssetSelectorNodeComponent, AssetSelectorComponent]\n})\nexport class AssetSelectorModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["tslib_1.__param","tslib_1.__decorate"],"mappings":";;;;;;;;;;;;MAEa,YAAa,SAAQ,aAAa;IAA/C;;QACE,aAAQ,GAAG,CAAC,QAAQ,CAAC;QACrB,UAAK,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAC7B,SAAI,GAAG,MAAM,CAAC;QACd,cAAS,GAAG,IAAI,CAAC;KAClB;CAAA;;ICPW,aASX;AATD,WAAY,aAAa;IACvB,8CAA6B,CAAA;IAC7B,oDAAmC,CAAA;IACnC,wDAAuC,CAAA;IACvC,8DAA6C,CAAA;IAC7C,sDAAqC,CAAA;IACrC,4DAA2C,CAAA;IAC3C,sEAAqD,CAAA;IACrD,kEAAiD,CAAA;CAClD,EATW,aAAa,KAAb,aAAa,QASxB;;ICTW,MAKX;AALD,WAAY,MAAM;IAChB,qCAAK,CAAA;IACL,mCAAI,CAAA;IACJ,yCAAO,CAAA;IACP,mDAAY,CAAA;CACb,EALW,MAAM,KAAN,MAAM,QAKjB;;MCIY,SAAU,SAAQ,aAAa;IAkC1C,YAAsB,OAAyB,EAAE,MAAM,GAAG,EAAE;QAC1D,KAAK,CAAC,MAAM,CAAC,CAAC;QADM,YAAO,GAAP,OAAO,CAAkB;QAE7C,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;QAC/B,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI;cACjB,OAAO;cACP,IAAI,CAAC,6BAA6B;kBAClC,UAAU,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;kBACtB,SAAS,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC7E,IAAI,CAAC,SAAS;YACZ,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC;QACvF,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,OAAO;aACrC,QAAQ,CAAC,IAAI,CAAC;aACd,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;KAChE;IA/CD,IAAI,KAAK;QACP,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC;KACjE;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KAC1D;IAED,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,6BAA6B,GAAG,qBAAqB,GAAG,SAAS,CAAC;KAC/E;IAED,IAAI,QAAQ;QACV,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC;KAC/B;IAED,IAAI,6BAA6B;QAC/B,OAAO,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,sBAAsB,CAAC;KACrD;IAED,IAAI,sBAAsB;QACxB,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACxD,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;KACtF;IA0BD,WAAW,CAAC,GAAG;QACb,MAAM,QAAQ,GAAG,YAAY,CAAC;QAC9B,IAAI,IAAI,CAAC,IAAI,EAAE;YACb,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,WAAW,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAC/D,OAAO,IAAI,CAAC;aACb;SACF;QACD,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC9C,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,IAAI,OAAO,EAAE;YACX,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACtB,OAAO,GAAG,EAAE;iBACT,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,wBAAwB,EAAE,EAAE,CAAC,CAAC;iBAClD,IAAI,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,aAAa,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YACxD,OAAO,OAAO,CAAC;SAChB;QACD,OAAO,KAAK,CAAC;KACd;IAED,OAAO,CAAC,KAAU,EAAE,EAAE,MAAM,GAAG,KAAK;QAClC,IAAI,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE;YACxB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;SACd;aAAM,IAAI,MAAM,KAAK,QAAQ,EAAE;YAC9B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAe,KAAK,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1D,OAAO;SACR;QACD,IAAI,IAAI,CAAC,MAAM,EAAE;YACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;SAClC;KACF;IAED,KAAK,CAAC,UAAwB,EAAE;QAC9B,IAAI,IAAI,CAAC,6BAA6B,EAAE;YACtC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC5C,OAAO;SACR;QACD,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,OAAO,CAAC,IAAI,EAAE;YAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SAChC;KACF;IAED,IAAI;QACF,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE;gBAC3B,OAAO,CAAC,CAAC,CAAC;aACX;iBAAM,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,EAAE;gBAClC,OAAO,CAAC,CAAC;aACV;iBAAM;gBACL,OAAO,CAAC,CAAC;aACV;SACF,CAAC,CAAC;KACJ;IAED,gBAAgB,CAAC,EAAE;QACjB,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,EAAE,CAAC,EAAE;YAC7C,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC;SAC5C;KACF;IAED,eAAe,CAAC,cAAc,EAAE,EAAE;QAChC,QACE,cAAc,IAAI,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAC7F;KACH;IAED,OAAO;QACL,IAAI,CAAC,oBAAoB,CAAC,WAAW,EAAE,CAAC;KACzC;IAED,IAAI,OAAO;QACT,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;QAC5C,IAAI,UAAU,EAAE;YACd,MAAM,sBAAsB,GAAG,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC;YAC1E,MAAM,cAAc,GAAI,IAAI,CAAC,QAAwB,CAAC,IAAI,CACxD,KAAK,IAAI,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,EAAE,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC,EAAE,CACtD,CAAC;YACF,MAAM,WAAW,GAAG,IAAI,KAAK,UAAU,IAAI,sBAAsB,IAAI,cAAc,CAAC;YACpF,OAAO,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW,CAAC;SACvC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC;KACvB;IAED,SAAS,CAAC,MAAM;QACd,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,6BAA6B,CAAC;KACvE;IAED,OAAO,CAAC,MAAM;QACZ,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;KACvB;IAEK,IAAI,CAAC,MAAM;;;;;YACf,OAAM,IAAI,YAAC,MAAM,EAAE;YACnB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC;YAC5C,IAAI,IAAI,CAAC,OAAO,EAAE;gBAChB,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;aACjC;iBAAM;gBACL,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC1B,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;aACtC;SACF;KAAA;IAED,UAAU;QACR,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;YAChB,IAAI,CAAC,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG;gBACvB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;oBACjB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;iBACvB;aACF,CAAC,CAAC;SACJ;KACF;IAES,KAAK;QACb,OAAO,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;KACzF;IAEe,WAAW,CAAC,GAAW;;YACrC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,GAAG,KAAK,MAAM,CAAC,KAAK,EAAE;gBACjD,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;gBACpB,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gBAClC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;aACtB;iBAAM,IAAI,GAAG,KAAK,MAAM,CAAC,IAAI,EAAE;gBAC9B,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;gBACjC,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;gBACxC,IAAI,CAAC,YAAY,CAAC,OAAO,GAAG,KAAK,CAAC;aACnC;iBAAM,IAAI,GAAG,KAAK,MAAM,CAAC,OAAO,EAAE;gBACjC,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;gBACrB,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;gBACxB,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;gBAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;gBACb,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;aAChC;SACF;KAAA;IAES,QAAQ,CAAC,GAAG;QACpB,IAAI,GAAG,CAAC,MAAM,EAAE;YACd,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;YACvE,IAAI,WAAW,KAAK,CAAC,EAAE;gBACrB,IAAI,CAAC,KAAK,EAAE,CAAC;aACd;YACD,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;YACnC,MAAM,kBAAkB,GAAG,CAAC,CAAC,QAAQ,IAAI,UAAU,KAAK,QAAQ,CAAC;YACjE,IAAI,CAAC,cAAc,CAAC,kBAAkB,CAAC,CAAC;SACzC;QACD,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;KACvC;IAES,cAAc,CAAC,IAAa;QACpC,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,EAAE;YAC9B,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;YACvC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC5B,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;SAC/D;QAED,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC;SAClC;KACF;IAEa,QAAQ,CAAC,UAAqB;;YAC1C,IAAI;gBACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;gBACtD,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;gBACxC,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;gBACpC,IAAI,CAAC,MAAM,EAAE;oBACX,MAAM,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;iBACxC;gBACD,IAAI,CAAC,MAAM,EAAE,CAAC;aACf;YAAC,OAAO,EAAE,EAAE;gBACX,IAAI,EAAE,EAAE;oBACN,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;iBACzC;aACF;oBAAS;gBACR,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC1B,IAAI,CAAC,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC;aACtC;SACF;KAAA;IAEa,eAAe,CAAC,UAAqB;;YACjD,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;YACrC,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,gCAAgC,CAAC,CAAC;YACjE,MAAM,OAAO,GAAQ;gBACnB;oBACE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC;oBACxB,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE;iBAC/B;gBACD;oBACE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC;oBACtB,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;iBACrC;aACF,CAAC;YACF,IAAI,UAAU,CAAC,6BAA6B,EAAE;gBAC5C,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;gBAC5C,IAAI,CAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,wCAAwC,CAAC,CAAC;gBACzE,OAAO,CAAC,IAAI,CAAC;oBACX,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC;oBACrB,MAAM,EAAE,SAAS;oBACjB,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;iBACpC,CAAC,CAAC;aACJ;YACD,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACnC;KAAA;IAEa,gBAAgB,CAAC,UAAqB;;YAClD,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,UAAU,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;SAChE;KAAA;IAEa,YAAY,CAAC,UAAqB;;YAC9C,IAAI,EAAE,CAAC;YACP,IAAI,IAAI,CAAC,IAAI,EAAE;gBACb,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC;oBACnD,EAAE,EAAE,UAAU,CAAC,EAAE,CAAC,EAAE;oBACpB,IAAI,EAAE,aAAa,CAAC,SAAS;iBAC9B,CAAC,CAAC;gBACH,EAAE,GAAG,IAAI,CAAC;aACX;iBAAM;gBACL,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,cAAc,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;gBACrF,EAAE,GAAG,IAAI,CAAC;aACX;YACD,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;SAC3B;KAAA;IAEa,eAAe,CAAC,UAAqB;;YACjD,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,OAAsB,EAAE;gBACtD,IAAI,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,aAAa,CAAC,gBAAgB,EAAE;oBAClE,MAAM;iBACP;gBACD,IAAI,MAAM,CAAC,IAAI,EAAE;oBACf,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC;wBAClC,EAAE,EAAE,UAAU,CAAC,EAAE,CAAC,EAAE;wBACpB,IAAI,EAAE,aAAa,CAAC,YAAY;qBACjC,CAAC,CAAC;iBACJ;qBAAM;oBACL,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;iBAC1E;gBACD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;aAC3B;SACF;KAAA;IAEO,UAAU,CAAC,IAAI;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI;;QAElC,IAAI,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,aAAa,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,EAAE,EACvD,IAAI,CACL,CAAC;KACH;CACF;;MCxTY,gBAAiB,SAAQ,SAAS;IAC7C,YACY,OAAyB,EACnC,MAAM,GAAG,EAAE;QAEX,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAHb,YAAO,GAAP,OAAO,CAAkB;QAInC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;KACxB;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC;KACb;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,EAAE,CAAC,qBAAqB,CAAC;KACtC;IAES,KAAK;QACb,OAAO,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACtD;CACF;;MCxBY,sBAAsB,GAAG,IAAI,cAAc,CAAuB,iBAAiB,CAAC;;ICIpF,kBAAkB,GAA/B,MAAa,kBAAkB;IAD/B;QAEE,UAAK,GAAG;YACN,oBAAoB,EAAE;gBACpB,IAAI,EAAE,2BAA2B;aAClC;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,kBAAkB;gBACxB,QAAQ,EAAE,uBAAuB;aAClC;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,WAAW;gBACjB,QAAQ,EAAE,gBAAgB;aAC3B;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,iBAAiB;gBACvB,QAAQ,EAAE,sBAAsB;aACjC;YACD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,SAAS,EAAE,eAAe;aAC3B;SACF,CAAC;QACF,qCAAgC,GAAG,IAAI,aAAa,CAAC,wBAAwB,EAAE,CAAC;KAqDjF;IAnDC,OAAO,CAAC,EAAE;QACR,QACE,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,iBAAiB,CAAC;YACrC,EAAE,CAAC,IAAI,KAAK,aAAa,CAAC,SAAS;YACnC,EAAE,CAAC,IAAI,KAAK,aAAa,CAAC,YAAY,EACtC;KACH;IAED,cAAc,CAAC,EAAE;QACf,OAAO,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,aAAa,CAAC,gBAAgB,CAAC;KAC/F;IAED,YAAY,CAAC,EAAE;QACb,QACE,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,gCAAgC,CAAC,EAC3F;KACH;IAED,kBAAkB,CAAC,EAAE;QACnB,QACE,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,wBAAwB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,gCAAgC,CAAC,EAC1F;KACH;IAED,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC;KAC1B;IAED,IAAI,CAAC,EAAE,EAAE,IAAI,GAAG,KAAK;QACnB,IAAI,IAAI,GAAG,OAAO,CAAC;QACnB,IAAI,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,EAAE;YAC3B,IAAI,GAAG,cAAc,CAAC;SACvB;aAAM,IAAI,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,EAAE;YACtC,IAAI,GAAG,cAAc,CAAC;SACvB;aAAM,IAAI,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE;YAChC,IAAI,GAAG,sBAAsB,CAAC;SAC/B;aAAM,IAAI,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;YAC3B,IAAI,GAAG,OAAO,CAAC;SAChB;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,IAAI,CAAC;KAC7C;IAED,UAAU,CAAC,EAAkB;QAC3B,QACE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAChB,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,EAC3B;KACH;CACF,CAAA;AA3EY,kBAAkB;IAD9B,UAAU,EAAE;GACA,kBAAkB,CA2E9B;;ICxDY,gBAAgB,GAA7B,MAAa,gBAAgB;IAO3B,YACS,SAA2B,EAC3B,MAA0B,EAC1B,UAAsB,EACtB,KAAmB,EACnB,KAAmB,EAChB,iBAAoC,EACpC,IAAiB,EACjB,QAAyB,EACgB,YAAkC;QAR9E,cAAS,GAAT,SAAS,CAAkB;QAC3B,WAAM,GAAN,MAAM,CAAoB;QAC1B,eAAU,GAAV,UAAU,CAAY;QACtB,UAAK,GAAL,KAAK,CAAc;QACnB,UAAK,GAAL,KAAK,CAAc;QAChB,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,SAAI,GAAJ,IAAI,CAAa;QACjB,aAAQ,GAAR,QAAQ,CAAiB;QACgB,iBAAY,GAAZ,YAAY,CAAsB;QAdvF,aAAQ,GAAG,IAAI,CAAC;QAGN,cAAS,GAAG,EAAE,CAAC;QAavB,IAAI,CAAC,YAAY,mBACf,gBAAgB,EAAE,IAAI,KAClB,YAAY,IAAI,EAAE,EACvB,CAAC;QACF,IAAI,CAAC,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;KACtC;IAED,cAAc;QACZ,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC;YACnC,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,gBAAgB;SAC7C,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,QAAQ,CAAC;KACtB;IAED,sBAAsB,CAAC,MAAM;QAC3B,OAAO,IAAI,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;KAC3C;IAED,eAAe,CAAC,MAAM;QACpB,OAAO,IAAI,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;KACpC;IAED,eAAe,CAAC,aAAa;QAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC;QAC/B,MAAM,MAAM,GAAuB,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC;QACzD,IAAI,IAAI,KAAK,aAAa,CAAC,gBAAgB,EAAE;YAC3C,OAAO,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;SAC5C;QACD,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;KACrC;IAED,YAAY,CAAC,YAAkB;QAC7B,MAAM,aAAa,GAAG;YACpB,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,YAAY,EAAE,KAAK;YACnB,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;SAC3D,CAAC;QACF,MAAM,WAAW,GAAG,YAAY,GAAG,YAAY,GAAG,aAAa,CAAC;;QAGhE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,EAAE,qBAAqB,CAAC,EAAE;YAC9E,OAAO,WAAW,CAAC,KAAK,CAAC;YACzB,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE;gBACzB,YAAY,EAAE,aAAa,CAAC,iBAAiB;gBAC7C,SAAS,EAAE,IAAI;aAChB,CAAC,CAAC;SACJ;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;KAC5D;IAED,aAAa,CAAC,IAAY,EAAE,cAAsB,EAAE;QAClD,MAAM,WAAW,GAAG;YAClB,YAAY,EAAE,KAAK;YACnB,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;SACnC,CAAC;QACF,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,oBAAO,WAAW,EAAK,WAAW,EAAG,CAAC;KACjF;IAED,oBAAoB,CAAC,UAAkB,EAAE,YAAiB,EAAE;QAC1D,MAAM,EAAE,KAAK,KAAqB,SAAS,EAA5B,0CAA4B,CAAC;QAC5C,MAAM,YAAY,GAAG,KAAK,CAAC;QAC3B,MAAM,WAAW,mBACf,CAAC,EAAE,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,YAAY,CAAC,IACjD,WAAW,CACf,CAAC;QACF,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;KAC5D;IAED,iBAAiB,CAAC,IAAY,EAAE,cAAsB,EAAE;QACtD,MAAM,WAAW,GAAG;YAClB,YAAY,EAAE,KAAK;YACnB,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,KAAK,EAAE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;SACnC,CAAC;QACF,OAAO,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,oBAAO,WAAW,EAAK,WAAW,EAAG,CAAC;KAClF;IAED,gBAAgB,CAAC,IAAY;QAC3B,OAAO,sBAAsB,IAAI,iBAAiB,CAAC;KACpD;IAED,eAAe;QACb,MAAM,EAAE,YAAY,EAAE,GAAG,IAAI,CAAC;QAC9B,MAAM,UAAU,GAAG;YACjB,QAAQ,EAAE;gBACR,IAAI,EAAE,GAAG,aAAa,CAAC,SAAS,EAAE;aACnC;YACD,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;SACzB,CAAC;QACF,IAAI,YAAY,CAAC,WAAW,EAAE;YAC5B,MAAM,WAAW,GAAG;gBAClB,QAAQ,EAAE;oBACR,KAAK,EAAE;wBACL;4BACE,IAAI,EAAE,GAAG,aAAa,CAAC,gBAAgB,EAAE;yBAC1C;wBACD;4BACE,KAAK,EAAE,GAAG,aAAa,CAAC,oBAAoB,EAAE;yBAC/C;wBACD,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,aAAa,CAAC,oBAAoB,YAAY,EAAE,EAAE;qBACxE;iBACF;aACF,CAAC;YACF,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;SACvD;QACD,OAAO,UAAU,CAAC;KACnB;IAED,QAAQ,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE;QACnB,IAAI,EAAE,CAAC,EAAE,EAAE;YACT,OAAO,IAAI,CAAC,UAAU;iBACnB,YAAY,CACX,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KACd,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC1C,MAAM,CAAC,iEAAiE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CACnF,GAAG,CACJ,CACJ;iBACA,IAAI,CACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAC/B,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EACrC,MAAM,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CACjD,CAAC;SACL;aAAM,IAAI,IAAI,EAAE;YACf,OAAO,IAAI,CAAC,UAAU;iBACnB,YAAY,CACX,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KACd,MAAM,CAAC,kEAAkE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBACpF,MAAM,KAAK,MAAM,CACpB;iBACA,IAAI,CACH,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EACrC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC,CAC1D,CAAC;SACL;aAAM;YACL,OAAO,KAAK,EAAE,CAAC;SAChB;KACF;IAED,sBAAsB,CAAC,WAA6C,EAAE;QACpE,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAC;QAC1B,IAAI,WAAW,GAAG,KAAK,CAAC;QAExB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;YAC5B,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC;YACtD,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;gBACjD,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;aAC1D;SACF;QACD,OAAO,WAAW,CAAC;KACpB;;;;;;IAOD,gBAAgB,CAAC,OAAwB;QACvC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YACxB,IAAI,CAAC,iBAAiB,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAC/D;KACF;IAES,YAAY,CAAC,cAAmB,EAAE;QAC1C,MAAM,MAAM,GAAG;YACb,WAAW,EAAE,CAAC;YACd,cAAc,EAAE,IAAI;YACpB,QAAQ,EAAE,EAAE;SACb,CAAC;QACF,yBAAY,MAAM,EAAK,WAAW,EAAG;KACtC;IAEO,kBAAkB,CAAC,KAAK,EAAE,YAAY;QAC5C,IAAI,aAAa,CAAC;QAClB,IAAI,KAAK,IAAI,YAAY,EAAE;YACzB,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;gBAC9C,sBAAsB,EAAE,KAAK;aAC9B,CAAC,CAAC;YACH,aAAa,GAAG,GAAG,WAAW,IAAI,YAAY,EAAE,CAAC;SAClD;aAAM;YACL,aAAa,GAAG,KAAK,IAAI,YAAY,IAAI,EAAE,CAAC;SAC7C;QACD,OAAO,aAAa,CAAC;KACtB;CACF,CAAA;;YApMqB,gBAAgB;YACnB,kBAAkB;YACd,UAAU;YACf,YAAY;YACZ,YAAY;YACG,iBAAiB;YAC9B,WAAW;YACP,eAAe;4CAClC,QAAQ,YAAI,MAAM,SAAC,sBAAsB;;AAhBjC,gBAAgB;IAD5B,UAAU,EAAE;IAiBRA,WAAA,QAAQ,EAAE,CAAA,EAAEA,WAAA,MAAM,CAAC,sBAAsB,CAAC,CAAA;GAhBlC,gBAAgB,CA4M5B;;IC/NY,gBAAgB,GAA7B,MAAa,gBAAgB;IAC3B,YAAoB,OAAyB;QAAzB,YAAO,GAAP,OAAO,CAAkB;KAAI;IAEjD,GAAG;QACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;YAC1B,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;SAC/B;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;KAC9B;CACF,CAAA;;YAR8B,gBAAgB;;AADlC,gBAAgB;IAD5B,UAAU,EAAE;GACA,gBAAgB,CAS5B;;;ICUY,qBAAqB,6BAAlC,MAAa,qBAAqB;IAChC,OAAO,MAAM,CAAC,MAA4B;QACxC,OAAO;YACL,QAAQ,EAAE,uBAAqB;YAC/B,SAAS,EAAE;gBACT;oBACE,OAAO,EAAE,sBAAsB,EAAE,QAAQ,EAAE,MAAM;iBAClD;aACF;SACF,CAAC;KACH;CAEF,CAAA;AAZY,qBAAqB;IAhBjC,QAAQ,CAAC;QACR,YAAY,EAAE,EAAE;QAChB,OAAO,EAAE;YACP,WAAW;YACX,kBAAkB;SACnB;QACD,SAAS,EAAE;YACT,YAAY;YACZ,gBAAgB;YAChB,kBAAkB;YAClB;gBACE,OAAO,EAAE,oBAAoB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,KAAK,EAAE,IAAI;aACvE;SACF;QACD,eAAe,EAAE,CAAC,qBAAqB,CAAC;KACzC,CAAC;GACW,qBAAqB,CAYjC;;MCjCY,SAAU,SAAQ,SAAS;;;;;;;;;;;;;;;;IAiBtC,YAAsB,OAAyB,EAAE,MAAM,GAAG,EAAE;QAC1D,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QADH,YAAO,GAAP,OAAO,CAAkB;KAE9C;CACF;;ICjBY,gBAAgB,GAA7B,MAAa,gBAAiB,SAAQ,gBAAgB;IADtD;;QAEY,cAAS,GAAG,CAAC,CAAC;KA2BzB;IAzBC,eAAe,CAAC,MAAM;QACpB,OAAO,IAAI,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;KACpC;IAED,eAAe,CAAC,aAAa;QAC3B,MAAM,MAAM,GAAuB,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC;QACzD,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;KACrC;IAED,oBAAoB;QAClB,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,eAAe,EAAE;YAC3D,IAAI,EAAE,aAAa,CAAC,YAAY;SACjC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;KAC5C;IAED,aAAa,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,IAAI,EAAE;YAC1C,KAAK,EAAE,IAAI,CAAC,oBAAoB,EAAE;YAClC,YAAY,EAAE,KAAK;YACnB,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,cAAc,EAAE,IAAI;SACrB,CAAC,CAAC;KACJ;CACF,CAAA;AA5BY,gBAAgB;IAD5B,UAAU,EAAE;GACA,gBAAgB,CA4B5B;;AC7BD;;;AAOA,IAAa,sBAAsB,GAAnC,MAAa,sBAAsB;;;;IAiBjC,YAAoB,gBAAkC;QAAlC,qBAAgB,GAAhB,gBAAgB,CAAkB;;;;QAb7C,aAAQ,GAAqB,EAAE,CAAC;;;;QAI/B,aAAQ,GAAG,IAAI,YAAY,EAAoB,CAAC;KASA;;;;IAK1D,QAAQ;QACN,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;KACvE;;;;;IAMD,MAAM,CAAC,UAA0B;QAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACjE,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;YAChB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;SAChC;QACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACnC;;;;;IAMD,QAAQ,CAAC,UAA0B;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QACjE,IAAI,KAAK,GAAG,CAAC,CAAC,EAAE;YACd,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;SAChC;QACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACnC;IAED,kBAAkB,CAAC,QAAwC,EAAE,UAA0B;QACrF,OAAO,QAAQ,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE,CAAC,CAAC;KAC1D;CACF,CAAA;;YApCuC,gBAAgB;;AAb7CC;IAAR,KAAK,EAAE;wDAAiC;AAI/BA;IAAT,MAAM,EAAE;wDAAiD;AAR/C,sBAAsB;IAJlC,SAAS,CAAC;QACT,QAAQ,EAAE,oBAAoB;QAC9B,gHAA8C;KAC/C,CAAC;GACW,sBAAsB,CAqDlC;;ICnDY,0BAA0B,GAAvC,MAAa,0BAA0B;;;;IAwCrC,YACU,gBAAkC,EAClC,EAAqB,EACrB,UAAkC;QAFlC,qBAAgB,GAAhB,gBAAgB,CAAkB;QAClC,OAAE,GAAF,EAAE,CAAmB;QACrB,eAAU,GAAV,UAAU,CAAwB;;;;QAnCnC,gBAAW,GAAmC,EAAE,CAAC;;;;QAIjD,aAAQ,GAAY,KAAK,CAAC;;;;QAQnC,UAAK,GAAW,CAAC,CAAC;;;;QAIlB,YAAO,GAAY,KAAK,CAAC;;;;QAIzB,iBAAY,GAAG,IAAI,OAAO,EAAO,CAAC;KAgB9B;;;;IAXJ,IAAI,WAAW;QACb,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;KAClE;;;;IAcK,QAAQ;;YACZ,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;YAClC,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEzC,IAAI,IAAI,CAAC,IAAI,YAAY,SAAS,EAAE;gBAClC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;aACxB;;YAGD,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBAClB,IAAI,CAAC,KAAK,EAAE,CAAC;aACd;YAED,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBACpB,IAAI,CAAC,IAAI,CAAC,MAAM;qBACb,IAAI,CACH,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,EAC5B,MAAM,CAAC,CAAC,CAAS,KAAK,CAAC,KAAK,MAAM,CAAC,YAAY,CAAC,CACjD;qBACA,SAAS,CAAC;oBACT,IAAI,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC;iBACxB,CAAC,CAAC;aACN;YAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;SACrC;KAAA;;;;IAKD,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;KAC3C;;;;IAKD,wBAAwB,CAAC,IAAe;QACtC,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACvC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAc,CAAC;YAC5C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;YACxF,IAAI,CAAC,KAAK,EAAE,CAAC;YAEb,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,CAAC;SACvC;KACF;;;;;IAMD,QAAQ,CAAC,IAAe;QACtB,IAAI,CAAC,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KAC/B;;;;IAKD,WAAW;QACT,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC;KAC9B;IAEO,aAAa;QACnB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE;YACnC,OAAO,KAAK,CAAC;SACd;QACD,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;KAChF;IAEO,eAAe,CAAC,UAA0B;QAChD,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACnC,OAAO;SACR;QACD,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;KACtC;CACF,CAAA;;YAvF6B,gBAAgB;YAC9B,iBAAiB;YACT,sBAAsB;;AAvCnCA;IAAR,KAAK,EAAE;wDAAiB;AAIhBA;IAAR,KAAK,EAAE;+DAAkD;AAIjDA;IAAR,KAAK,EAAE;4DAA2B;AAZxB,0BAA0B;IAJtC,SAAS,CAAC;QACT,QAAQ,EAAE,yBAAyB;QACnC,yjEAAmD;KACpD,CAAC;GACW,0BAA0B,CAgItC;;IC/HY,mBAAmB,GAAhC,MAAa,mBAAmB;CAAG,CAAA;AAAtB,mBAAmB;IAN/B,QAAQ,CAAC;QACR,OAAO,EAAE,CAAC,YAAY,EAAE,cAAc,EAAE,gBAAgB,CAAE;QAC1D,OAAO,EAAE,CAAC,0BAA0B,EAAE,sBAAsB,CAAC;QAC7D,SAAS,EAAE,CAAC,gBAAgB,CAAC;QAC7B,YAAY,EAAE,CAAC,0BAA0B,EAAE,sBAAsB,CAAC;KACnE,CAAC;GACW,mBAAmB,CAAG;;ACfnC;;GAEG;;;;"}
1
+ {"version":3,"file":"c8y-ngx-components-assets-navigator.js","sources":["ng://@c8y/ngx-components/assets-navigator/load-more-node.ts","ng://@c8y/ngx-components/assets-navigator/group-fragment.model.ts","ng://@c8y/ngx-components/assets-navigator/action.enum.ts","ng://@c8y/ngx-components/assets-navigator/asset-node.ts","ng://@c8y/ngx-components/assets-navigator/dynamic-group-node.ts","ng://@c8y/ngx-components/assets-navigator/asset-node-config.model.ts","ng://@c8y/ngx-components/assets-navigator/group.service.ts","ng://@c8y/ngx-components/assets-navigator/asset-node.service.ts","ng://@c8y/ngx-components/assets-navigator/asset-node.factory.ts","ng://@c8y/ngx-components/assets-navigator/assets-navigator.module.ts","ng://@c8y/ngx-components/assets-navigator/asset-selector/group-node.ts","ng://@c8y/ngx-components/assets-navigator/asset-selector/group-node.service.ts","ng://@c8y/ngx-components/assets-navigator/asset-selector/asset-selector.component.ts","ng://@c8y/ngx-components/assets-navigator/asset-selector/asset-selector-node.component.ts","ng://@c8y/ngx-components/assets-navigator/asset-selector/asset-selector.module.ts","ng://@c8y/ngx-components/assets-navigator/c8y-ngx-components-assets-navigator.ts"],"sourcesContent":["import { NavigatorNode, gettext } from '@c8y/ngx-components';\n\nexport class LoadMoreNode extends NavigatorNode {\n priority = -Infinity;\n label = gettext('Load more');\n icon = 'plus';\n droppable = true;\n}\n","export enum GroupFragment {\n groupType = 'c8y_DeviceGroup',\n subGroupType = 'c8y_DeviceSubgroup',\n groupFragmentType = 'c8y_IsDeviceGroup',\n dataBrokerSourceFragment = 'c8y_BrokerSource',\n dynamicGroupType = 'c8y_DynamicGroup',\n dynamicGroupFragment = 'c8y_IsDynamicGroup',\n dynamicGroupColumnConfig = 'c8y_UIDeviceFilterConfig',\n dynamicGroupQueryString = 'c8y_DeviceQueryString',\n}\n","export enum Action {\n FETCH,\n NEXT,\n REFRESH,\n LOADING_DONE\n}\n","import { Paging } from '@c8y/client';\nimport { ClickOptions, gettext, NavigatorNode, DeviceStatusComponent } from '@c8y/ngx-components';\nimport { get, has } from 'lodash-es';\nimport { Subject, Subscription } from 'rxjs';\nimport { AssetNodeMo, AssetNodeService } from './asset-node.service';\nimport { LoadMoreNode } from './load-more-node';\nimport { GroupFragment } from './group-fragment.model';\nimport { Action } from './action.enum';\n\nexport class AssetNode extends NavigatorNode {\n root: boolean;\n mo: any;\n\n get label() {\n return (this.root && gettext('Groups')) || this.mo.name || '--';\n }\n\n get hasChildren() {\n return this.root || this.service.groups.isGroup(this.mo);\n }\n\n get iconComponent() {\n return this.isDeviceOrProbablyChildDevice ? DeviceStatusComponent : undefined;\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 const { isGroup, isDynamicGroup } = this.service.groups;\n return !isGroup(this.mo) && !isDynamicGroup(this.mo) && !this.isDevice && !this.root;\n }\n\n events: Subject<Action>;\n protected paging: Paging<AssetNodeMo>;\n protected loadMoreNode: LoadMoreNode;\n private onUpdateSubscription: Subscription;\n\n constructor(protected service: AssetNodeService, config = {}) {\n super(config);\n this.root = this.root || false;\n this.mo = this.mo || {};\n this.path = this.root\n ? 'group'\n : this.isDeviceOrProbablyChildDevice\n ? `device/${this.mo.id}`\n : `group/${this.mo.id}`;\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 }\n\n openOnStart(url) {\n const urlRegex = /^\\/group\\//;\n if (this.root) {\n if (this.service.moduleConfig.openOnStart || urlRegex.test(url)) {\n return true;\n }\n }\n const matches = url.match(/\\/(group)\\/(\\d+)/);\n let isMatch = false;\n if (matches) {\n const id = matches[2];\n isMatch = []\n .concat(get(this.mo, 'childAssets.references', []))\n .some(({ managedObject }) => managedObject.id === id);\n return isMatch;\n }\n return false;\n }\n\n refresh(mo: any = {}, method = 'GET') {\n if (mo.id === this.mo.id) {\n this.mo = mo;\n } else if (method === 'DELETE') {\n this.parents.forEach((node: AssetNode) => node.refresh());\n return;\n }\n if (this.events) {\n this.events.next(Action.REFRESH);\n }\n }\n\n click(options: ClickOptions = {}) {\n if (this.isDeviceOrProbablyChildDevice) {\n this.service.preferBreadcrumb(this.parents);\n return;\n }\n this.hookEvents();\n\n this.updateIcon(options.open);\n if (options.open) {\n this.events.next(Action.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));\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;\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 super.drop($event);\n const nodeToMove = this.service.draggedData;\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 protected fetch() {\n return this.root ? this.service.getRootNodes() : this.service.getGroupItems(this.mo.id);\n }\n\n protected async handleEvent(evt: Action) {\n if (!this.children.length && evt === Action.FETCH) {\n this.loading = true;\n this.addNodes(await this.fetch());\n this.loading = false;\n } else if (evt === Action.NEXT) {\n this.loadMoreNode.loading = true;\n this.addNodes(await this.paging.next());\n this.loadMoreNode.loading = false;\n } else if (evt === Action.REFRESH) {\n this.loading = false;\n this.paging = undefined;\n this.loadMoreNode = undefined;\n this.empty();\n this.events.next(Action.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 => this.addManagedObject(mo));\n this.events.next(Action.LOADING_DONE);\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 = () => this.events.next(Action.NEXT);\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;\n if (this.root) {\n const { data } = await this.service.inventory.update({\n id: nodeToMove.mo.id,\n type: GroupFragment.groupType\n });\n mo = data;\n } else {\n const { data } = await this.service.inventory.childAssetsAdd(nodeToMove.mo, this.mo);\n mo = data;\n }\n this.addManagedObject(mo);\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 if (parent.root) {\n await this.service.inventory.update({\n id: nodeToMove.mo.id,\n type: GroupFragment.subGroupType\n });\n } else {\n await this.service.inventory.childAssetsRemove(nodeToMove.mo, parent.mo);\n }\n parent.remove(nodeToMove);\n }\n }\n\n private updateIcon(open) {\n this.icon = this.service.groups.icon(\n // if it's root we are going to pass a fake mo to get the same icon as groups\n this.root ? { type: GroupFragment.groupType } : this.mo,\n open\n );\n }\n}\n","\nimport { AssetNode } from './asset-node';\nimport { AssetNodeService } from './asset-node.service';\n\nexport class DynamicGroupNode extends AssetNode {\n constructor(\n protected service: AssetNodeService,\n config = {}\n ) {\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\nexport const ASSET_NAVIGATOR_CONFIG = new InjectionToken<AssetNavigatorConfig>('AssetNodeConfig');\r\n\r\nexport interface AssetNavigatorConfig {\r\n smartGroups?: boolean;\r\n openOnStart?: boolean;\r\n rootNodePriority?: number;\r\n disableDragAndDrop?: boolean;\r\n}\r\n","import { Injectable } from '@angular/core';\nimport { GroupFragment } from './group-fragment.model';\nimport { IManagedObject } from '@c8y/client';\n\n@Injectable()\nexport class DeviceGroupService {\n icons = {\n brokerSourceInactive: {\n icon: 'c8y-group-remote-inactive'\n },\n brokerSource: {\n icon: 'c8y-group-remote',\n iconOpen: 'c8y-group-remote-open'\n },\n group: {\n icon: 'c8y-group',\n iconOpen: 'c8y-group-open'\n },\n dynamicGroup: {\n icon: 'c8y-group-smart',\n iconOpen: 'c8y-group-smart-open'\n },\n other: {\n icon: 'circle',\n iconClass: 'statusUnknown'\n }\n };\n dataBrokerSourceFragmentInactive = `_${GroupFragment.dataBrokerSourceFragment}`;\n\n isGroup(mo) {\n return (\n !!mo[GroupFragment.groupFragmentType] ||\n mo.type === GroupFragment.groupType ||\n mo.type === GroupFragment.subGroupType\n );\n }\n\n isDynamicGroup(mo) {\n return !!mo[GroupFragment.dynamicGroupFragment] || mo.type === GroupFragment.dynamicGroupType;\n }\n\n isDataBroker(mo) {\n return (\n !!mo[GroupFragment.dataBrokerSourceFragment] || !!mo[this.dataBrokerSourceFragmentInactive]\n );\n }\n\n isDataBrokerActive(mo) {\n return (\n !!mo[GroupFragment.dataBrokerSourceFragment] && !mo[this.dataBrokerSourceFragmentInactive]\n );\n }\n\n isDevice(mo) {\n return !!mo.c8y_IsDevice;\n }\n\n icon(mo, open = false) {\n let type = 'other';\n if (this.isDynamicGroup(mo)) {\n type = 'dynamicGroup';\n } else if (this.isDataBrokerActive(mo)) {\n type = 'brokerSource';\n } else if (this.isDataBroker(mo)) {\n type = 'brokerSourceInactive';\n } else if (this.isGroup(mo)) {\n type = 'group';\n }\n const icon = this.icons[type];\n return (open && icon.iconOpen) || icon.icon;\n }\n\n isAnyGroup(mo: IManagedObject) {\n return (\n this.isGroup(mo) ||\n this.isDynamicGroup(mo) ||\n this.isDataBroker(mo) ||\n this.isDataBrokerActive(mo)\n );\n }\n}\n","import { Inject, Injectable, Optional } from '@angular/core';\nimport { InventoryService, QueriesUtil, UserService, IManagedObject, IResult } from '@c8y/client';\nimport {\n AlertService,\n BreadcrumbService,\n ModalService,\n NavigatorNode,\n AppStateService\n} from '@c8y/ngx-components';\nimport { ApiService } from '@c8y/ngx-components/api';\nimport { empty } from 'rxjs';\nimport { filter, mergeMap } from 'rxjs/operators';\nimport { AssetNode } from './asset-node';\nimport { AssetNavigatorConfig, ASSET_NAVIGATOR_CONFIG } from './asset-node-config.model';\nimport { DynamicGroupNode } from './dynamic-group-node';\nimport { GroupFragment } from './group-fragment.model';\nimport { DeviceGroupService } from './group.service';\n\nexport interface AssetNodeMo {\n id: string;\n type: string;\n}\n\n@Injectable()\nexport class AssetNodeService {\n rootNode: AssetNode;\n firstUrl = true;\n draggedData: AssetNode;\n queriesUtil: QueriesUtil;\n protected PAGE_SIZE = 20;\n\n constructor(\n public inventory: InventoryService,\n public groups: DeviceGroupService,\n public apiService: ApiService,\n public modal: ModalService,\n public alert: AlertService,\n protected breadcrumbService: BreadcrumbService,\n protected user: UserService,\n protected appState: AppStateService,\n @Optional() @Inject(ASSET_NAVIGATOR_CONFIG) public moduleConfig: AssetNavigatorConfig\n ) {\n this.moduleConfig = {\n rootNodePriority: 2000,\n ...(moduleConfig || {})\n };\n this.queriesUtil = new QueriesUtil();\n }\n\n createRootNode() {\n this.rootNode = this.createAssetNode({\n root: true,\n priority: this.moduleConfig.rootNodePriority\n });\n return this.rootNode;\n }\n\n createDynamicGroupNode(config) {\n return new DynamicGroupNode(this, config);\n }\n\n createAssetNode(config) {\n return new AssetNode(this, config);\n }\n\n createChildNode(managedObject) {\n const { type } = managedObject;\n const config: Partial<AssetNode> = { mo: managedObject };\n if (type === GroupFragment.dynamicGroupType) {\n return this.createDynamicGroupNode(config);\n }\n return this.createAssetNode(config);\n }\n\n getRootNodes(customFilter?: any): Promise<any> {\n const defaultFilter = {\n pageSize: this.PAGE_SIZE,\n withChildren: false,\n query: this.queriesUtil.buildQuery(this.navRootQueryFilter())\n };\n const groupFilter = customFilter ? customFilter : defaultFilter;\n\n // due to BE performance limitations we do not allow filtering and sorting for a user without inventory roles\n if (!this.user.hasRole(this.appState.currentUser.value, 'ROLE_INVENTORY_READ')) {\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 getGroupItems(moId: string, extraFilter: object = {}) {\n const queryFilter = {\n withChildren: false,\n pageSize: this.PAGE_SIZE,\n query: this.groupQueryFilter(moId)\n };\n return this.inventory.childAssetsList(moId, { ...queryFilter, ...extraFilter });\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(moId: string, extraFilter: object = {}) {\n const queryFilter = {\n withChildren: false,\n pageSize: this.PAGE_SIZE,\n query: this.groupQueryFilter(moId)\n };\n return this.inventory.childDevicesList(moId, { ...queryFilter, ...extraFilter });\n }\n\n groupQueryFilter(moId: string) {\n return `$filter=(bygroupid(${moId}))$orderby=name`;\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 = {\n __filter: {\n type: `${GroupFragment.groupType}`\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)|(service/smartgroup/smartgroups))/${mo.id}`).test(\n url\n )\n )\n .pipe(\n filter(() => !this.draggedData),\n mergeMap(this.apiService.resolveData),\n filter(response => !response.data.c8y_Dashboard)\n );\n } else if (root) {\n return this.apiService\n .hookResponse(\n ({ url, method }) =>\n RegExp('((inventory/managedObjects)|(service/smartgroup/smartgroups))/?$').test(url) &&\n method === 'POST'\n )\n .pipe(\n mergeMap(this.apiService.resolveData),\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 * 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(query, orderByQuery) {\n let combinedQuery;\n if (query && orderByQuery) {\n const filterQuery = this.queriesUtil.buildQuery({\n __useFilterQueryString: query\n });\n combinedQuery = `${filterQuery} ${orderByQuery}`;\n } else {\n combinedQuery = query || orderByQuery || '';\n }\n return combinedQuery;\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AssetNodeService } from './asset-node.service';\nimport { NavigatorNode } from '@c8y/ngx-components';\n\n@Injectable()\nexport class AssetNodeFactory {\n constructor(private service: AssetNodeService) {}\n\n get(): NavigatorNode {\n if (!this.service.rootNode) {\n this.service.createRootNode();\n }\n return this.service.rootNode;\n }\n}\n","import { NgModule, ModuleWithProviders } from '@angular/core';\nimport { HOOK_NAVIGATOR_NODES, ModalModule, ModalService, DeviceStatusComponent, DeviceStatusModule} from '@c8y/ngx-components';\nimport { ASSET_NAVIGATOR_CONFIG} from './asset-node-config.model';\nimport { AssetNodeFactory } from './asset-node.factory';\nimport { AssetNodeService } from './asset-node.service';\nimport { AssetNavigatorConfig } from './asset-node-config.model';\nimport { DeviceGroupService } from './group.service';\n\n@NgModule({\n declarations: [],\n imports: [\n ModalModule,\n DeviceStatusModule\n ],\n providers: [\n ModalService,\n AssetNodeService,\n DeviceGroupService,\n {\n provide: HOOK_NAVIGATOR_NODES, useClass: AssetNodeFactory, multi: true\n }\n ],\n entryComponents: [DeviceStatusComponent]\n})\nexport class AssetsNavigatorModule {\n static config(config: AssetNavigatorConfig): ModuleWithProviders {\n return {\n ngModule: AssetsNavigatorModule,\n providers: [\n {\n provide: ASSET_NAVIGATOR_CONFIG, useValue: config\n }\n ],\n };\n }\n\n}\n","import { GroupNodeService } from './group-node.service';\nimport { AssetNode } from '../asset-node';\n\nexport class GroupNode extends AssetNode {\n // FIXME: Currently hasChildren returns true if it is a group,\n // Issue is, that we disable the children in the API\n // getGroupItems service call due to performance. This leads\n // to that the dropdown chevron is shown always. Issue is,\n // that even if we return the chevrons, we have no way to determine\n // if the childAssets contain groups or other assets (like dashboards).\n // get hasChildren() {\n // return this.root || this.service.groups.isGroup(this.mo) && (this.mo as IManagedObject).childAssets.references.length > 0;\n // }\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 */\n constructor(protected service: GroupNodeService, config = {}) {\n super(service, config);\n }\n}\n","import { Injectable } from '@angular/core';\nimport { AssetNodeService } from '../asset-node.service';\nimport { GroupNode } from './group-node';\nimport { GroupFragment } from '../group-fragment.model';\n\n@Injectable()\nexport class GroupNodeService extends AssetNodeService {\n protected PAGE_SIZE = 5;\n\n createGroupNode(config) {\n return new GroupNode(this, config);\n }\n\n createChildNode(managedObject): GroupNode {\n const config: Partial<GroupNode> = { mo: managedObject };\n return this.createGroupNode(config);\n }\n\n subAssetsQueryFilter() {\n const rootQueryFilter = this.rootQueryFilter();\n const filter = this.queriesUtil.addOrFilter(rootQueryFilter, {\n type: GroupFragment.subGroupType\n });\n return this.queriesUtil.buildQuery(filter);\n }\n\n getGroupItems(moId: string): Promise<any> {\n return this.inventory.childAssetsList(moId, {\n query: this.subAssetsQueryFilter(),\n withChildren: false,\n pageSize: this.PAGE_SIZE,\n withTotalPages: true\n });\n }\n}\n","import { Component, Output, Input, EventEmitter, OnInit } from '@angular/core';\nimport { GroupNodeService } from './group-node.service';\nimport { GroupNode } from './group-node';\nimport { IManagedObject } from '@c8y/client';\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})\nexport class AssetSelectorComponent implements OnInit {\n /**\n * An array of predefined nodes.\n */\n @Input() selected: IManagedObject[] = [];\n /**\n * Emits if one item was selected (all currently selected nodes).\n */\n @Output() onChange = new EventEmitter<IManagedObject[]>();\n /**\n * @ignore\n */\n rootNode: GroupNode;\n\n /**\n * @ignore only DI\n */\n constructor(private groupNodeService: GroupNodeService) {}\n\n /**\n * @ignore\n */\n ngOnInit(): void {\n this.rootNode = this.groupNodeService.createGroupNode({ root: true });\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 const index = this.getIndexOfSelected(this.selected, selectedMo);\n if (index === -1) {\n this.selected.push(selectedMo);\n }\n this.onChange.emit(this.selected);\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.onChange.emit(this.selected);\n }\n\n getIndexOfSelected(selected: Array<Partial<IManagedObject>>, selectedMo: IManagedObject) {\n return selected.findIndex(mo => mo.id === selectedMo.id);\n }\n}\n","import { Component, Input, OnInit, ChangeDetectorRef } from '@angular/core';\nimport { gettext } from '@c8y/ngx-components';\nimport { TranslateService } from '@ngx-translate/core';\nimport { GroupNode } from './group-node';\nimport { Subject } from 'rxjs';\nimport { takeUntil, filter } from 'rxjs/operators';\nimport { AssetSelectorComponent } from './asset-selector.component';\nimport { IManagedObject } from '@c8y/client';\nimport { Action } from '../action.enum';\n\n@Component({\n selector: 'c8y-asset-selector-node',\n templateUrl: './asset-selector-node.component.html'\n})\nexport class AssetSelectorNodeComponent implements OnInit {\n /**\n * The current node.\n */\n @Input() node: GroupNode;\n /**\n * All preselected items\n */\n @Input() preselected: Array<Partial<IManagedObject>> = [];\n /**\n * Should the path be shown\n */\n @Input() showPath: boolean = false;\n /**\n * The current path to the node\n */\n breadcrumb: string;\n /**\n * @ignore\n */\n level: number = 0;\n /**\n * The selection status of the node\n */\n checked: boolean = false;\n /**\n * @ignore\n */\n unsubscribe$ = new Subject<any>();\n\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 private parentNode: AssetSelectorComponent\n ) {}\n\n /**\n * @ignore\n */\n async ngOnInit() {\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 if (this.node.events) {\n this.node.events\n .pipe(\n takeUntil(this.unsubscribe$),\n filter((a: Action) => a === Action.LOADING_DONE)\n )\n .subscribe(() => {\n this.cd.markForCheck();\n });\n }\n\n this.checked = this.isPreselected();\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 /**\n * TODO: Only level used. Breadcrumbs needs to be implemented.\n */\n setupBreadcrumbsAndLevel(node: GroupNode) {\n if (node.parents && node.parents.length) {\n const parent = node.parents[0] as GroupNode;\n this.breadcrumb = this.translateService.instant(parent.label) + ' > ' + 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 this.checked = !this.checked;\n this.updateSelection(node.mo);\n }\n\n /**\n * @ignore\n */\n ngOnDestroy(): void {\n this.unsubscribe$.next(true);\n this.unsubscribe$.complete();\n }\n\n private isPreselected() {\n if (this.node.root || !this.node.mo) {\n return false;\n }\n return this.parentNode.getIndexOfSelected(this.preselected, this.node.mo) > -1;\n }\n\n private updateSelection(selectedMo: IManagedObject) {\n if (this.checked) {\n this.parentNode.select(selectedMo);\n return;\n }\n this.parentNode.deselect(selectedMo);\n }\n}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } 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';\n\n@NgModule({\n imports: [CommonModule, CollapseModule, BsDropdownModule ],\n exports: [AssetSelectorNodeComponent, AssetSelectorComponent],\n providers: [GroupNodeService],\n declarations: [AssetSelectorNodeComponent, AssetSelectorComponent]\n})\nexport class AssetSelectorModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["tslib_1.__param","tslib_1.__decorate"],"mappings":"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"}
@@ -1063,6 +1063,11 @@ let AddFirmwareModalComponent = class AddFirmwareModalComponent {
1063
1063
  };
1064
1064
  this.saving = false;
1065
1065
  this.firmwarePreselected = false;
1066
+ this.textForFirmwareUrlPopover = gettext(`Path for binaries can vary depending on device agent implementation, e.g.:
1067
+ /firmware/binaries/firmware1.bin
1068
+ https://firmware/binary/123
1069
+ ftp://firmware/binary/123.tar.gz
1070
+ `);
1066
1071
  }
1067
1072
  ngOnInit() {
1068
1073
  this.setInitialState();
@@ -1164,7 +1169,7 @@ __decorate([
1164
1169
  AddFirmwareModalComponent = __decorate([
1165
1170
  Component({
1166
1171
  selector: 'c8y-add-firmware-software-modal',
1167
- template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-firmware'\"></i>\n <h4 translate>\n Add firmware\n </h4>\n </div>\n <div class=\"p-16 text-center separator-bottom\" *ngIf=\"!firmwarePreselected\">\n <p class=\"lead m-0\" translate>\n Select or create new firmware\n </p>\n </div>\n <form\n class=\"d-contents\"\n autocomplete=\"off\"\n #firmwareForm=\"ngForm\"\n (ngSubmit)=\"firmwareForm.form.valid && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\">\n <div [hidden]=\"firmwarePreselected\">\n <c8y-form-group>\n <label for=\"firmwareName\" translate>Firmware</label>\n <c8y-typeahead\n [(ngModel)]=\"model.selected\"\n name=\"firmwareName\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n (onSearch)=\"onInput.next($event)\"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"\n let firmware of firmwaresResult;\n loadMore: 'auto';\n notFound: notFoundTemplate\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"onFirmwareSelect(firmware)\"\n [active]=\"model.selected === firmware\"\n >\n <c8y-highlight\n [text]=\"firmware.name || '--'\"\n [pattern]=\"onInput | async\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li class=\"bg-gray-lighter p-8\" *ngIf=\"(onInput | async)?.length > 0\">\n <span translate>No match found, add new`firmware`? </span>\n <button\n title=\"{{ 'Create new`firmware`' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary btn-xs m-l-16\"\n translate\n >\n Create new`firmware`\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"firmwareDescription\" translate>Description</label>\n <input\n id=\"firmwareDescription\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"model.description\"\n placeholder=\"{{ 'e.g. Firmware for hardware revision b' | translate }}\"\n [disabled]=\"model.selected?.id\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"firmwareDeviceTypeFilter\" translate>Device type filter</label>\n <input\n id=\"firmwareDeviceTypeFilter\"\n class=\"form-control\"\n name=\"firmwareDeviceTypeFilter\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n [(ngModel)]=\"model.deviceType\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n [disabled]=\"model.selected?.id\"\n />\n </c8y-form-group>\n </div>\n\n <c8y-form-group>\n <label for=\"firmwareVersion\" translate>Version</label>\n <input\n id=\"firmwareVersion\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"version\"\n [(ngModel)]=\"model.version\"\n placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Firmware file</div>\n <c8y-file-picker [maxAllowedFiles]=\"1\" (onFilesPicked)=\"onFile($event)\">\n </c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n translate\n >\n Cancel\n </button>\n\n <button\n title=\"{{ 'Add firmware' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !firmwareForm.form.valid ||\n firmwareForm.form.pristine ||\n saving ||\n (!model.binary?.url && !model.binary?.file)\n \"\n translate\n >\n Add firmware\n </button>\n </div>\n </form>\n</div>\n"
1172
+ template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-firmware'\"></i>\n <h4 translate>\n Add firmware\n </h4>\n </div>\n <div class=\"p-16 text-center separator-bottom\" *ngIf=\"!firmwarePreselected\">\n <p class=\"lead m-0\" translate>\n Select or create new firmware\n </p>\n </div>\n <form\n class=\"d-contents\"\n autocomplete=\"off\"\n #firmwareForm=\"ngForm\"\n (ngSubmit)=\"firmwareForm.form.valid && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\">\n <div [hidden]=\"firmwarePreselected\">\n <c8y-form-group>\n <label for=\"firmwareName\" translate>Firmware</label>\n <c8y-typeahead\n [(ngModel)]=\"model.selected\"\n name=\"firmwareName\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n (onSearch)=\"onInput.next($event)\"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"\n let firmware of firmwaresResult;\n loadMore: 'auto';\n notFound: notFoundTemplate\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"onFirmwareSelect(firmware)\"\n [active]=\"model.selected === firmware\"\n >\n <c8y-highlight\n [text]=\"firmware.name || '--'\"\n [pattern]=\"onInput | async\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li class=\"bg-gray-lighter p-8\" *ngIf=\"(onInput | async)?.length > 0\">\n <span translate>No match found, add new`firmware`? </span>\n <button\n title=\"{{ 'Create new`firmware`' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary btn-xs m-l-16\"\n translate\n >\n Create new`firmware`\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"firmwareDescription\" translate>Description</label>\n <input\n id=\"firmwareDescription\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"model.description\"\n placeholder=\"{{ 'e.g. Firmware for hardware revision b' | translate }}\"\n [disabled]=\"model.selected?.id\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"firmwareDeviceTypeFilter\" translate>Device type filter</label>\n <input\n id=\"firmwareDeviceTypeFilter\"\n class=\"form-control\"\n name=\"firmwareDeviceTypeFilter\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n [(ngModel)]=\"model.deviceType\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n [disabled]=\"model.selected?.id\"\n />\n </c8y-form-group>\n </div>\n\n <c8y-form-group>\n <label for=\"firmwareVersion\" translate>Version</label>\n <input\n id=\"firmwareVersion\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"version\"\n [(ngModel)]=\"model.version\"\n placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Firmware file</div>\n <c8y-file-picker [maxAllowedFiles]=\"1\" (onFilesPicked)=\"onFile($event)\" [fileUrlPopover]=\"textForFirmwareUrlPopover\">\n </c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n translate\n >\n Cancel\n </button>\n\n <button\n title=\"{{ 'Add firmware' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !firmwareForm.form.valid ||\n firmwareForm.form.pristine ||\n saving ||\n (!model.binary?.url && !model.binary?.file)\n \"\n translate\n >\n Add firmware\n </button>\n </div>\n </form>\n</div>\n"
1168
1173
  })
1169
1174
  ], AddFirmwareModalComponent);
1170
1175
 
@@ -1174,6 +1179,11 @@ let AddFirmwarePatchModalComponent = class AddFirmwarePatchModalComponent {
1174
1179
  this.repository = repository;
1175
1180
  this.alert = alert;
1176
1181
  this.saved = new EventEmitter();
1182
+ this.textForFirmwareUrlPopover = gettext(`Path for binaries can vary depending on device agent implementation, e.g.:
1183
+ /firmware/binaries/firmware1.bin
1184
+ https://firmware/binary/123
1185
+ ftp://firmware/binary/123.tar.gz
1186
+ `);
1177
1187
  this.model = {
1178
1188
  selected: undefined,
1179
1189
  dependency: null,
@@ -1278,7 +1288,7 @@ __decorate([
1278
1288
  AddFirmwarePatchModalComponent = __decorate([
1279
1289
  Component({
1280
1290
  selector: 'c8y-add-firmware-patch-modal.component',
1281
- template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-firmware'\"></i>\n <h4 translate>\n Add firmware patch\n </h4>\n </div>\n <div class=\"p-16 text-center separator-bottom\">\n <p class=\"lead m-0\" translate>\n Select a firmware version\n </p>\n </div>\n\n <form class=\"d-contents\" autocomplete=\"off\" #firmwarePatchForm=\"ngForm\" (ngSubmit)=\"save()\">\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\">\n <div [hidden]=\"firmwarePreselected\">\n <c8y-form-group>\n <label for=\"firmwareName\" translate>Firmware</label>\n <c8y-typeahead\n [ngModel]=\"model.selected\"\n name=\"firmwareName\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n (onSearch)=\"firmwareInput$.next($event)\"\n [allowFreeEntries]=\"false\"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"let firmware of firmwares$ | async; loadMore: 'auto'\"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"model.selected = firmware; firmwareSelected$.next(firmware)\"\n [active]=\"model.selected === firmware\"\n >\n <c8y-highlight\n [text]=\"firmware.name || '--'\"\n [pattern]=\"firmwareInput$ | async\"\n ></c8y-highlight>\n </c8y-li>\n </c8y-typeahead>\n <c8y-messages\n ><c8y-message\n name=\"notExisting\"\n [text]=\"'Select one of the existing firmwares.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <c8y-form-group>\n <label for=\"patchDependency\" class=\"m-r-8\" translate>Version</label>\n <c8y-typeahead\n [ngModel]=\"model.dependency\"\n name=\"patchDependency\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n (onSearch)=\"patchDependencyInput$.next($event)\"\n [displayProperty]=\"'c8y_Firmware.version'\"\n [allowFreeEntries]=\"false\"\n [disabled]=\"\n (baseVersions$ | async) === null || (baseVersions$ | async)?.data.length === 0\n \"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"\n let baseVersion of baseVersions$;\n loadMore: 'auto';\n pipe: baseVersionsFilterPipe\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"model.dependency = baseVersion\"\n [active]=\"model.dependency === baseVersion\"\n >\n <c8y-highlight\n [text]=\"baseVersion.c8y_Firmware.version || '--'\"\n [pattern]=\"patchDependencyInput$ | async\"\n ></c8y-highlight>\n </c8y-li>\n </c8y-typeahead>\n <c8y-messages\n ><c8y-message\n name=\"notExisting\"\n [text]=\"'Select one of the existing versions.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"patchVersion\" translate>Patch</label>\n <input\n id=\"patchVersion\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"patchVersion\"\n [(ngModel)]=\"model.patchVersion\"\n placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n required\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Patch file</div>\n <c8y-file-picker [maxAllowedFiles]=\"1\" (onFilesPicked)=\"onFile($event)\">\n </c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n translate\n >\n Cancel\n </button>\n <button\n title=\"{{ 'Add firmware patch' | translate }}\"\n class=\"btn btn-primary\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n type=\"submit\"\n [disabled]=\"\n !firmwarePatchForm.form.valid ||\n firmwarePatchForm.form.pristine ||\n (!model.binary?.url && !model.binary?.file) ||\n saving\n \"\n translate\n >\n Add firmware patch\n </button>\n </div>\n </form>\n</div>\n"
1291
+ template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-firmware'\"></i>\n <h4 translate>\n Add firmware patch\n </h4>\n </div>\n <div class=\"p-16 text-center separator-bottom\">\n <p class=\"lead m-0\" translate>\n Select a firmware version\n </p>\n </div>\n\n <form\n class=\"d-contents\"\n autocomplete=\"off\"\n #firmwarePatchForm=\"ngForm\"\n (ngSubmit)=\"firmwarePatchForm.form.valid && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\">\n <div [hidden]=\"firmwarePreselected\">\n <c8y-form-group>\n <label for=\"firmwareName\" translate>Firmware</label>\n <c8y-typeahead\n [ngModel]=\"model.selected\"\n name=\"firmwareName\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n (onSearch)=\"firmwareInput$.next($event)\"\n [allowFreeEntries]=\"false\"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"let firmware of firmwares$ | async; loadMore: 'auto'\"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"model.selected = firmware; firmwareSelected$.next(firmware)\"\n [active]=\"model.selected === firmware\"\n >\n <c8y-highlight\n [text]=\"firmware.name || '--'\"\n [pattern]=\"firmwareInput$ | async\"\n ></c8y-highlight>\n </c8y-li>\n </c8y-typeahead>\n <c8y-messages\n ><c8y-message\n name=\"notExisting\"\n [text]=\"'Select one of the existing firmwares.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n </div>\n\n <c8y-form-group>\n <label for=\"patchDependency\" class=\"m-r-8\" translate>Version</label>\n <c8y-typeahead\n [ngModel]=\"model.dependency\"\n name=\"patchDependency\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n (onSearch)=\"patchDependencyInput$.next($event)\"\n [displayProperty]=\"'c8y_Firmware.version'\"\n [allowFreeEntries]=\"false\"\n [disabled]=\"\n (baseVersions$ | async) === null || (baseVersions$ | async)?.data.length === 0\n \"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"\n let baseVersion of baseVersions$;\n loadMore: 'auto';\n pipe: baseVersionsFilterPipe\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"model.dependency = baseVersion\"\n [active]=\"model.dependency === baseVersion\"\n >\n <c8y-highlight\n [text]=\"baseVersion.c8y_Firmware.version || '--'\"\n [pattern]=\"patchDependencyInput$ | async\"\n ></c8y-highlight>\n </c8y-li>\n </c8y-typeahead>\n <c8y-messages\n ><c8y-message\n name=\"notExisting\"\n [text]=\"'Select one of the existing versions.' | translate\"\n ></c8y-message>\n </c8y-messages>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"patchVersion\" translate>Patch</label>\n <input\n id=\"patchVersion\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"patchVersion\"\n [(ngModel)]=\"model.patchVersion\"\n placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n required\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Patch file</div>\n <c8y-file-picker [maxAllowedFiles]=\"1\" (onFilesPicked)=\"onFile($event)\" [fileUrlPopover]=\"textForFirmwareUrlPopover\">\n </c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n translate\n >\n Cancel\n </button>\n <button\n title=\"{{ 'Add firmware patch' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !firmwarePatchForm.form.valid ||\n firmwarePatchForm.form.pristine ||\n (!model.binary?.url && !model.binary?.file) ||\n saving\n \"\n translate\n >\n Add firmware patch\n </button>\n </div>\n </form>\n</div>\n"
1282
1292
  })
1283
1293
  ], AddFirmwarePatchModalComponent);
1284
1294
 
@@ -1544,6 +1554,11 @@ let AddSoftwareModalComponent = class AddSoftwareModalComponent {
1544
1554
  };
1545
1555
  this.saving = false;
1546
1556
  this.softwarePreselected = false;
1557
+ this.textForSoftwareUrlPopover = gettext(`Path for binaries can vary depending on device agent implementation, e.g.:
1558
+ /software/binaries/software1.bin
1559
+ https://software/binary/123
1560
+ ftp://software/binary/123.tar.gz
1561
+ `);
1547
1562
  }
1548
1563
  ngOnInit() {
1549
1564
  this.setInitialState();
@@ -1645,7 +1660,7 @@ __decorate([
1645
1660
  AddSoftwareModalComponent = __decorate([
1646
1661
  Component({
1647
1662
  selector: 'c8y-add-software-software-modal',
1648
- template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-tools'\"></i>\n <h4 translate>\n Add software\n </h4>\n </div>\n <div class=\"p-16 text-center separator-bottom\" *ngIf=\"!softwarePreselected\">\n <p class=\"lead m-0\" translate>\n Select or create new software\n </p>\n </div>\n <form\n class=\"d-contents\"\n autocomplete=\"off\"\n #softwareForm=\"ngForm\"\n (ngSubmit)=\"softwareForm.form.valid && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\">\n <div [hidden]=\"softwarePreselected\">\n <c8y-form-group>\n <label for=\"softwareName\" translate>Software</label>\n <c8y-typeahead\n [(ngModel)]=\"model.selected\"\n name=\"softwareName\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n (onSearch)=\"onInput.next($event)\"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"\n let software of softwaresResult;\n loadMore: 'auto';\n notFound: notFoundTemplate\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"onSoftwareSelect(software)\"\n [active]=\"model.selected === software\"\n >\n <c8y-highlight\n [text]=\"software.name || '--'\"\n [pattern]=\"onInput | async\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li class=\"bg-gray-lighter p-8\" *ngIf=\"(onInput | async)?.length > 0\">\n <span translate>No match found, add new`software`? </span>\n <button\n title=\"{{ 'Create new`software`' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary btn-xs m-l-16\"\n translate\n >\n Create new`software`\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"softwareDescription\" translate>Description</label>\n <input\n id=\"softwareDescription\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"model.description\"\n placeholder=\"{{ 'e.g. Cloud connectivity software' | translate }}\"\n [disabled]=\"model.selected?.id\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"softwareDeviceTypeFilter\" translate>Device type filter</label>\n <input\n id=\"softwareDeviceTypeFilter\"\n class=\"form-control\"\n name=\"softwareDeviceTypeFilter\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n [(ngModel)]=\"model.deviceType\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n [disabled]=\"model.selected?.id\"\n />\n </c8y-form-group>\n </div>\n\n <c8y-form-group>\n <label for=\"softwareVersion\" translate>Version</label>\n <input\n id=\"softwareVersion\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"version\"\n [(ngModel)]=\"model.version\"\n placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Software file</div>\n <c8y-file-picker [maxAllowedFiles]=\"1\" (onFilesPicked)=\"onFile($event)\">\n </c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n translate\n >\n Cancel\n </button>\n\n <button\n title=\"{{ 'Add software' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !softwareForm.form.valid ||\n softwareForm.form.pristine ||\n saving ||\n (!model.binary?.url && !model.binary?.file)\n \"\n translate\n >\n Add software\n </button>\n </div>\n </form>\n</div>\n"
1663
+ template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'c8y-tools'\"></i>\n <h4 translate>\n Add software\n </h4>\n </div>\n <div class=\"p-16 text-center separator-bottom\" *ngIf=\"!softwarePreselected\">\n <p class=\"lead m-0\" translate>\n Select or create new software\n </p>\n </div>\n <form\n class=\"d-contents\"\n autocomplete=\"off\"\n #softwareForm=\"ngForm\"\n (ngSubmit)=\"softwareForm.form.valid && save()\"\n >\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\">\n <div [hidden]=\"softwarePreselected\">\n <c8y-form-group>\n <label for=\"softwareName\" translate>Software</label>\n <c8y-typeahead\n [(ngModel)]=\"model.selected\"\n name=\"softwareName\"\n placeholder=\"{{ 'Select or enter' | translate }}\"\n (onSearch)=\"onInput.next($event)\"\n [required]=\"true\"\n >\n <c8y-li\n *c8yFor=\"\n let software of softwaresResult;\n loadMore: 'auto';\n notFound: notFoundTemplate\n \"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"onSoftwareSelect(software)\"\n [active]=\"model.selected === software\"\n >\n <c8y-highlight\n [text]=\"software.name || '--'\"\n [pattern]=\"onInput | async\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li class=\"bg-gray-lighter p-8\" *ngIf=\"(onInput | async)?.length > 0\">\n <span translate>No match found, add new`software`? </span>\n <button\n title=\"{{ 'Create new`software`' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary btn-xs m-l-16\"\n translate\n >\n Create new`software`\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"softwareDescription\" translate>Description</label>\n <input\n id=\"softwareDescription\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"description\"\n [(ngModel)]=\"model.description\"\n placeholder=\"{{ 'e.g. Cloud connectivity software' | translate }}\"\n [disabled]=\"model.selected?.id\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label for=\"softwareDeviceTypeFilter\" translate>Device type filter</label>\n <input\n id=\"softwareDeviceTypeFilter\"\n class=\"form-control\"\n name=\"softwareDeviceTypeFilter\"\n popover=\"{{\n 'If the filter is set, the firmware will show up for installation only for devices of that type. If no filter is set, it will be available for all devices.'\n | translate\n }}\"\n [(ngModel)]=\"model.deviceType\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n [disabled]=\"model.selected?.id\"\n />\n </c8y-form-group>\n </div>\n\n <c8y-form-group>\n <label for=\"softwareVersion\" translate>Version</label>\n <input\n id=\"softwareVersion\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"version\"\n [(ngModel)]=\"model.version\"\n placeholder=\"{{ 'e.g.' | translate }} 1.0.0\"\n [required]=\"true\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Software file</div>\n <c8y-file-picker [maxAllowedFiles]=\"1\" (onFilesPicked)=\"onFile($event)\" [fileUrlPopover]=\"textForSoftwareUrlPopover\">\n </c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n class=\"btn btn-default\"\n type=\"button\"\n (click)=\"cancel()\"\n [disabled]=\"saving\"\n translate\n >\n Cancel\n </button>\n\n <button\n title=\"{{ 'Add software' | translate }}\"\n class=\"btn btn-primary\"\n type=\"submit\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !softwareForm.form.valid ||\n softwareForm.form.pristine ||\n saving ||\n (!model.binary?.url && !model.binary?.file)\n \"\n translate\n >\n Add software\n </button>\n </div>\n </form>\n</div>\n"
1649
1664
  })
1650
1665
  ], AddSoftwareModalComponent);
1651
1666
 
@@ -1841,6 +1856,11 @@ let ConfigurationDetailComponent = class ConfigurationDetailComponent {
1841
1856
  this.mo = {};
1842
1857
  this.saving = false;
1843
1858
  this.uploadChoice = 'uploadBinary';
1859
+ this.textForConfigurationUrlPopover = gettext(`Path for binaries can vary depending on device agent implementation, e.g.:
1860
+ /configuration/binaries/configuration1.bin
1861
+ https://configuration/binary/123
1862
+ ftp://configuration/binary/123.tar.gz
1863
+ `);
1844
1864
  this.result = new Promise((resolve, reject) => {
1845
1865
  this._save = resolve;
1846
1866
  this._cancel = reject;
@@ -1925,7 +1945,7 @@ __decorate([
1925
1945
  ConfigurationDetailComponent = __decorate([
1926
1946
  Component({
1927
1947
  selector: 'c8y-configuration-detail',
1928
- template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'cogs'\"></i>\n <h4 translate *ngIf=\"mo.id\">Update configuration</h4>\n <h4 translate *ngIf=\"!mo.id\">Add configuration</h4>\n </div>\n\n <form class=\"d-contents\" #configurationForm=\"ngForm\" (ngSubmit)=\"configurationForm.form.valid && save()\">\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\">\n <c8y-form-group>\n <label translate>Name</label>\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} hosts\"\n autocomplete=\"off\"\n required\n maxlength=\"254\"\n [(ngModel)]=\"version\"\n name=\"version\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Device type</label>\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n maxlength=\"254\"\n autocomplete=\"off\"\n [(ngModel)]=\"deviceType\"\n name=\"deviceType\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Description</label>\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g. Host configuration' | translate }} c8y_Linux\"\n maxlength=\"254\"\n autocomplete=\"off\"\n [(ngModel)]=\"description\"\n name=\"description\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Configuration type</label>\n <c8y-typeahead\n [(ngModel)]=\"selected\"\n name=\"confType\"\n placeholder=\"{{ 'e.g.' | translate }} ssh\"\n (onSearch)=\"setPipe($event)\"\n displayProperty=\"configurationType\"\n >\n <c8y-li\n *c8yFor=\"let config of configs; pipe: filterPipe; notFound: notFoundTemplate\"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"selected = config; setPipe('')\"\n [active]=\"selected === config\"\n >\n <c8y-highlight\n [text]=\"config.configurationType || '--'\"\n [pattern]=\"pattern\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li class=\"bg-gray-lighter p-8\" *ngIf=\"pattern.length > 0\">\n <span translate>No match found, add new`configuration`?</span>\n <button title=\"Create new`configuration`\" type=\"button\" class=\"btn btn-primary btn-xs m-l-16\" translate>\n Create new`configuration`\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Configuration file</div>\n <c8y-file-picker\n [maxAllowedFiles]=\"1\"\n (onFilesPicked)=\"onFile($event)\"\n [uploadChoice]=\"uploadChoice\"\n [fileUrl]=\"binary.url\"\n [fileBinary]=\"binary.file\"\n >\n </c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button\n (click)=\"cancel()\"\n type=\"button\"\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n [disabled]=\"saving\"\n >\n <span translate>Cancel</span>\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"submit\"\n title=\"{{ submitButtonTitle | translate }}\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !configurationForm.valid ||\n configurationForm.pristine ||\n (!binary?.url && !binary?.file) ||\n saving\n \"\n >\n {{ submitButtonTitle | translate }}\n </button>\n </div>\n </form>\n</div>\n"
1948
+ template: "<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i [c8yIcon]=\"'cogs'\"></i>\n <h4 translate *ngIf=\"mo.id\">Update configuration</h4>\n <h4 translate *ngIf=\"!mo.id\">Add configuration</h4>\n </div>\n\n <form class=\"d-contents\" #configurationForm=\"ngForm\" (ngSubmit)=\"configurationForm.form.valid && save()\">\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\">\n <c8y-form-group>\n <label translate>Name</label>\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} hosts\"\n autocomplete=\"off\"\n required\n maxlength=\"254\"\n [(ngModel)]=\"version\"\n name=\"version\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Device type</label>\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g.' | translate }} c8y_Linux\"\n maxlength=\"254\"\n autocomplete=\"off\"\n [(ngModel)]=\"deviceType\"\n name=\"deviceType\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Description</label>\n <input\n type=\"text\"\n class=\"form-control\"\n placeholder=\"{{ 'e.g. Host configuration' | translate }} c8y_Linux\"\n maxlength=\"254\"\n autocomplete=\"off\"\n [(ngModel)]=\"description\"\n name=\"description\"\n />\n </c8y-form-group>\n\n <c8y-form-group>\n <label translate>Configuration type</label>\n <c8y-typeahead\n [(ngModel)]=\"selected\"\n name=\"confType\"\n placeholder=\"{{ 'e.g.' | translate }} ssh\"\n (onSearch)=\"setPipe($event)\"\n displayProperty=\"configurationType\"\n >\n <c8y-li\n *c8yFor=\"let config of configs; pipe: filterPipe; notFound: notFoundTemplate\"\n class=\"p-l-8 p-r-8 c8y-list__item--link\"\n (click)=\"selected = config; setPipe('')\"\n [active]=\"selected === config\"\n >\n <c8y-highlight\n [text]=\"config.configurationType || '--'\"\n [pattern]=\"pattern\"\n ></c8y-highlight>\n </c8y-li>\n <ng-template #notFoundTemplate>\n <c8y-li class=\"bg-gray-lighter p-8\" *ngIf=\"pattern.length > 0\">\n <span translate>No match found, add new`configuration`?</span>\n <button title=\"Create new`configuration`\" type=\"button\" class=\"btn btn-primary btn-xs m-l-16\" translate>\n Create new`configuration`\n </button>\n </c8y-li>\n </ng-template>\n </c8y-typeahead>\n </c8y-form-group>\n\n <c8y-form-group>\n <div class=\"legend form-block m-t-40\" translate>Configuration file</div>\n <c8y-file-picker\n [maxAllowedFiles]=\"1\"\n (onFilesPicked)=\"onFile($event)\"\n [uploadChoice]=\"uploadChoice\"\n [fileUrl]=\"binary.url\"\n [fileBinary]=\"binary.file\"\n [fileUrlPopover]=\"textForConfigurationUrlPopover\"\n >\n </c8y-file-picker>\n </c8y-form-group>\n </div>\n </div>\n\n <div class=\"modal-footer\">\n <button\n (click)=\"cancel()\"\n type=\"button\"\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n [disabled]=\"saving\"\n >\n <span translate>Cancel</span>\n </button>\n <button\n class=\"btn btn-primary\"\n type=\"submit\"\n title=\"{{ submitButtonTitle | translate }}\"\n [ngClass]=\"{ 'btn-pending': saving }\"\n [disabled]=\"\n !configurationForm.valid ||\n configurationForm.pristine ||\n (!binary?.url && !binary?.file) ||\n saving\n \"\n >\n {{ submitButtonTitle | translate }}\n </button>\n </div>\n </form>\n</div>\n"
1929
1949
  })
1930
1950
  ], ConfigurationDetailComponent);
1931
1951