@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
@@ -614,7 +614,7 @@ var AssetNodeService = /** @class */ (function () {
614
614
  var defaultFilter = {
615
615
  pageSize: this.PAGE_SIZE,
616
616
  withChildren: false,
617
- query: this.queriesUtil.buildQuery(this.rootQueryFilter())
617
+ query: this.queriesUtil.buildQuery(this.navRootQueryFilter())
618
618
  };
619
619
  var groupFilter = customFilter ? customFilter : defaultFilter;
620
620
  // due to BE performance limitations we do not allow filtering and sorting for a user without inventory roles
@@ -655,13 +655,18 @@ var AssetNodeService = /** @class */ (function () {
655
655
  AssetNodeService.prototype.groupQueryFilter = function (moId) {
656
656
  return "$filter=(bygroupid(" + moId + "))$orderby=name";
657
657
  };
658
+ AssetNodeService.prototype.navRootQueryFilter = function () {
659
+ var navRootFilter = this.rootQueryFilter();
660
+ navRootFilter.__orderby = [{ name: 1 }];
661
+ return navRootFilter;
662
+ };
658
663
  AssetNodeService.prototype.rootQueryFilter = function () {
659
664
  var moduleConfig = this.moduleConfig;
660
665
  var rootFilter = {
661
666
  __filter: {
662
667
  type: "" + GroupFragment.groupType
663
668
  },
664
- __orderby: [{ name: 1 }]
669
+ __orderby: []
665
670
  };
666
671
  if (moduleConfig.smartGroups) {
667
672
  var 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.__extends","tslib_1.__values","tslib_1.__param","tslib_1.__decorate"],"mappings":"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"}
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.__extends","tslib_1.__values","tslib_1.__param","tslib_1.__decorate"],"mappings":"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"}
@@ -1328,6 +1328,7 @@ var AddFirmwareModalComponent = /** @class */ (function () {
1328
1328
  };
1329
1329
  this.saving = false;
1330
1330
  this.firmwarePreselected = false;
1331
+ this.textForFirmwareUrlPopover = gettext("Path for binaries can vary depending on device agent implementation, e.g.:\n /firmware/binaries/firmware1.bin\n https://firmware/binary/123\n ftp://firmware/binary/123.tar.gz\n ");
1331
1332
  }
1332
1333
  AddFirmwareModalComponent.prototype.ngOnInit = function () {
1333
1334
  this.setInitialState();
@@ -1433,7 +1434,7 @@ var AddFirmwareModalComponent = /** @class */ (function () {
1433
1434
  AddFirmwareModalComponent = __decorate([
1434
1435
  Component({
1435
1436
  selector: 'c8y-add-firmware-software-modal',
1436
- 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"
1437
+ 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"
1437
1438
  })
1438
1439
  ], AddFirmwareModalComponent);
1439
1440
  return AddFirmwareModalComponent;
@@ -1446,6 +1447,7 @@ var AddFirmwarePatchModalComponent = /** @class */ (function () {
1446
1447
  this.repository = repository;
1447
1448
  this.alert = alert;
1448
1449
  this.saved = new EventEmitter();
1450
+ this.textForFirmwareUrlPopover = gettext("Path for binaries can vary depending on device agent implementation, e.g.:\n /firmware/binaries/firmware1.bin\n https://firmware/binary/123\n ftp://firmware/binary/123.tar.gz\n ");
1449
1451
  this.model = {
1450
1452
  selected: undefined,
1451
1453
  dependency: null,
@@ -1564,7 +1566,7 @@ var AddFirmwarePatchModalComponent = /** @class */ (function () {
1564
1566
  AddFirmwarePatchModalComponent = __decorate([
1565
1567
  Component({
1566
1568
  selector: 'c8y-add-firmware-patch-modal.component',
1567
- 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"
1569
+ 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"
1568
1570
  })
1569
1571
  ], AddFirmwarePatchModalComponent);
1570
1572
  return AddFirmwarePatchModalComponent;
@@ -1886,6 +1888,7 @@ var AddSoftwareModalComponent = /** @class */ (function () {
1886
1888
  };
1887
1889
  this.saving = false;
1888
1890
  this.softwarePreselected = false;
1891
+ this.textForSoftwareUrlPopover = gettext("Path for binaries can vary depending on device agent implementation, e.g.:\n /software/binaries/software1.bin\n https://software/binary/123\n ftp://software/binary/123.tar.gz\n ");
1889
1892
  }
1890
1893
  AddSoftwareModalComponent.prototype.ngOnInit = function () {
1891
1894
  this.setInitialState();
@@ -1991,7 +1994,7 @@ var AddSoftwareModalComponent = /** @class */ (function () {
1991
1994
  AddSoftwareModalComponent = __decorate([
1992
1995
  Component({
1993
1996
  selector: 'c8y-add-software-software-modal',
1994
- 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"
1997
+ 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"
1995
1998
  })
1996
1999
  ], AddSoftwareModalComponent);
1997
2000
  return AddSoftwareModalComponent;
@@ -2223,6 +2226,7 @@ var ConfigurationDetailComponent = /** @class */ (function () {
2223
2226
  this.mo = {};
2224
2227
  this.saving = false;
2225
2228
  this.uploadChoice = 'uploadBinary';
2229
+ this.textForConfigurationUrlPopover = gettext("Path for binaries can vary depending on device agent implementation, e.g.:\n /configuration/binaries/configuration1.bin\n https://configuration/binary/123\n ftp://configuration/binary/123.tar.gz\n ");
2226
2230
  this.result = new Promise(function (resolve, reject) {
2227
2231
  _this._save = resolve;
2228
2232
  _this._cancel = reject;
@@ -2328,7 +2332,7 @@ var ConfigurationDetailComponent = /** @class */ (function () {
2328
2332
  ConfigurationDetailComponent = __decorate([
2329
2333
  Component({
2330
2334
  selector: 'c8y-configuration-detail',
2331
- 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"
2335
+ 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"
2332
2336
  })
2333
2337
  ], ConfigurationDetailComponent);
2334
2338
  return ConfigurationDetailComponent;