@c8y/ngx-components 1018.0.215 → 1018.0.222

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 (40) hide show
  1. package/assets-navigator/asset-node.service.d.ts +5 -2
  2. package/ecosystem/application-plugins/plugin-list.component.d.ts +1 -0
  3. package/esm2020/assets-navigator/asset-node.mjs +7 -2
  4. package/esm2020/assets-navigator/asset-node.service.mjs +14 -5
  5. package/esm2020/core/header/title/title-outlet.component.mjs +3 -3
  6. package/esm2020/device-grid/columns/registration-date.device-grid-column.mjs +4 -10
  7. package/esm2020/ecosystem/application-plugins/application-plugins.component.mjs +34 -13
  8. package/esm2020/ecosystem/application-plugins/plugin-list.component.mjs +27 -13
  9. package/esm2020/ecosystem/packages/deploy-application/deploy-application.component.mjs +14 -3
  10. package/esm2020/repository/shared/repository.service.mjs +4 -4
  11. package/esm2020/services/services-device-tab/columns/last-updated-date.device-grid-column.mjs +4 -10
  12. package/fesm2015/c8y-ngx-components-assets-navigator.mjs +24 -12
  13. package/fesm2015/c8y-ngx-components-assets-navigator.mjs.map +1 -1
  14. package/fesm2015/c8y-ngx-components-device-grid.mjs +3 -9
  15. package/fesm2015/c8y-ngx-components-device-grid.mjs.map +1 -1
  16. package/fesm2015/c8y-ngx-components-ecosystem-application-plugins.mjs +44 -25
  17. package/fesm2015/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
  18. package/fesm2015/c8y-ngx-components-ecosystem.mjs +55 -32
  19. package/fesm2015/c8y-ngx-components-ecosystem.mjs.map +1 -1
  20. package/fesm2015/c8y-ngx-components-repository-shared.mjs +3 -3
  21. package/fesm2015/c8y-ngx-components-repository-shared.mjs.map +1 -1
  22. package/fesm2015/c8y-ngx-components-services.mjs +3 -9
  23. package/fesm2015/c8y-ngx-components-services.mjs.map +1 -1
  24. package/fesm2015/c8y-ngx-components.mjs +2 -2
  25. package/fesm2015/c8y-ngx-components.mjs.map +1 -1
  26. package/fesm2020/c8y-ngx-components-assets-navigator.mjs +24 -12
  27. package/fesm2020/c8y-ngx-components-assets-navigator.mjs.map +1 -1
  28. package/fesm2020/c8y-ngx-components-device-grid.mjs +3 -9
  29. package/fesm2020/c8y-ngx-components-device-grid.mjs.map +1 -1
  30. package/fesm2020/c8y-ngx-components-ecosystem-application-plugins.mjs +58 -25
  31. package/fesm2020/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
  32. package/fesm2020/c8y-ngx-components-ecosystem.mjs +70 -27
  33. package/fesm2020/c8y-ngx-components-ecosystem.mjs.map +1 -1
  34. package/fesm2020/c8y-ngx-components-repository-shared.mjs +3 -3
  35. package/fesm2020/c8y-ngx-components-repository-shared.mjs.map +1 -1
  36. package/fesm2020/c8y-ngx-components-services.mjs +3 -9
  37. package/fesm2020/c8y-ngx-components-services.mjs.map +1 -1
  38. package/fesm2020/c8y-ngx-components.mjs +2 -2
  39. package/fesm2020/c8y-ngx-components.mjs.map +1 -1
  40. package/package.json +1 -1
@@ -8,12 +8,12 @@ import * as i1 from '@c8y/client';
8
8
  import { QueriesUtil } from '@c8y/client';
9
9
  import * as i2 from '@c8y/ngx-components/api';
10
10
  import { filter, mergeMap, takeUntil, tap } from 'rxjs/operators';
11
- import * as i5$1 from 'ngx-bootstrap/collapse';
11
+ import * as i5 from '@ngx-translate/core';
12
+ import * as i5$2 from 'ngx-bootstrap/collapse';
12
13
  import { CollapseModule } from 'ngx-bootstrap/collapse';
13
14
  import { BsDropdownModule } from 'ngx-bootstrap/dropdown';
14
- import * as i1$1 from '@ngx-translate/core';
15
15
  import { isArray, isNumber, isString, isObject } from 'lodash';
16
- import * as i5 from '@angular/common';
16
+ import * as i5$1 from '@angular/common';
17
17
  import * as i6 from '@angular/forms';
18
18
  import { NG_VALUE_ACCESSOR, NG_VALIDATORS, FormsModule } from '@angular/forms';
19
19
 
@@ -127,7 +127,12 @@ class AssetNode extends NavigatorNode {
127
127
  }
128
128
  }
129
129
  setLabel() {
130
- this.label = this.config.label || (this.root && gettext('Groups')) || this.mo.name || '--';
130
+ if (this.config.label || this.root) {
131
+ this.label = this.config.label || gettext('Groups');
132
+ }
133
+ else {
134
+ this.label = this.service.label(this.mo);
135
+ }
131
136
  }
132
137
  click(options = {}) {
133
138
  if (this.isDeviceOrProbablyChildDevice && !this.showChildDevices) {
@@ -435,7 +440,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
435
440
  }], ctorParameters: function () { return [{ type: i3.GroupService }]; } });
436
441
 
437
442
  class AssetNodeService {
438
- constructor(inventory, apiService, modal, alert, breadcrumbService, user, appState, optionsService, moduleConfig, deviceGroupService) {
443
+ constructor(inventory, apiService, modal, alert, breadcrumbService, user, appState, optionsService, moduleConfig, deviceGroupService, translateService) {
439
444
  this.inventory = inventory;
440
445
  this.apiService = apiService;
441
446
  this.modal = modal;
@@ -446,6 +451,7 @@ class AssetNodeService {
446
451
  this.optionsService = optionsService;
447
452
  this.moduleConfig = moduleConfig;
448
453
  this.deviceGroupService = deviceGroupService;
454
+ this.translateService = translateService;
449
455
  this.firstUrl = true;
450
456
  this.PAGE_SIZE = 20;
451
457
  this.moduleConfig = {
@@ -454,6 +460,12 @@ class AssetNodeService {
454
460
  };
455
461
  this.queriesUtil = new QueriesUtil();
456
462
  }
463
+ label(mo) {
464
+ return (mo.name ||
465
+ (this.isDevice(mo) &&
466
+ this.translateService.instant(gettext('Device {{id}}'), { id: mo.id })) ||
467
+ '--');
468
+ }
457
469
  icon(mo, open) {
458
470
  return this.deviceGroupService.icon(mo, open);
459
471
  }
@@ -693,7 +705,7 @@ class AssetNodeService {
693
705
  return combinedQuery;
694
706
  }
695
707
  }
696
- AssetNodeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: AssetNodeService, deps: [{ token: i1.InventoryService }, { token: i2.ApiService }, { token: i3.ModalService }, { token: i3.AlertService }, { token: i3.BreadcrumbService }, { token: i1.UserService }, { token: i3.AppStateService }, { token: i3.OptionsService }, { token: ASSET_NAVIGATOR_CONFIG, optional: true }, { token: DeviceGroupService }], target: i0.ɵɵFactoryTarget.Injectable });
708
+ AssetNodeService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: AssetNodeService, deps: [{ token: i1.InventoryService }, { token: i2.ApiService }, { token: i3.ModalService }, { token: i3.AlertService }, { token: i3.BreadcrumbService }, { token: i1.UserService }, { token: i3.AppStateService }, { token: i3.OptionsService }, { token: ASSET_NAVIGATOR_CONFIG, optional: true }, { token: DeviceGroupService }, { token: i5.TranslateService }], target: i0.ɵɵFactoryTarget.Injectable });
697
709
  AssetNodeService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: AssetNodeService, providedIn: 'root' });
698
710
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: AssetNodeService, decorators: [{
699
711
  type: Injectable,
@@ -705,7 +717,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
705
717
  }, {
706
718
  type: Inject,
707
719
  args: [ASSET_NAVIGATOR_CONFIG]
708
- }] }, { type: DeviceGroupService }]; } });
720
+ }] }, { type: DeviceGroupService }, { type: i5.TranslateService }]; } });
709
721
 
710
722
  class AssetNodeFactory {
711
723
  constructor(service, moduleConfig) {
@@ -1049,12 +1061,12 @@ class AssetSelectorNodeComponent {
1049
1061
  this.cd.markForCheck();
1050
1062
  }
1051
1063
  }
1052
- AssetSelectorNodeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: AssetSelectorNodeComponent, deps: [{ token: i1$1.TranslateService }, { token: i0.ChangeDetectorRef }, { token: AssetSelectorService }], target: i0.ɵɵFactoryTarget.Component });
1053
- AssetSelectorNodeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: AssetSelectorNodeComponent, selector: "c8y-asset-selector-node", inputs: { node: "node", rootNode: "rootNode", preselected: "preselected", showPath: "showPath", multi: "multi", view: "view", index: "index", active: "active", selectedItems: "selectedItems", handleNextMillerViewColumn: "handleNextMillerViewColumn" }, outputs: { isLoadingState: "isLoadingState", onSelect: "onSelect", onDeselect: "onDeselect" }, ngImport: i0, template: "<!-- Hierarchy tree -->\n<div\n *ngIf=\"view === 'tree'\"\n class=\"c8y-asset-selector__item\"\n [attr.role]=\"view === 'tree' ? 'tree' : 'list'\"\n [ngClass]=\"{\n 'c8y-asset-selector__item--more': node?.icon === 'plus',\n 'c8y-asset-selector__item--start': level === 0\n }\"\n [ngStyle]=\"{\n 'margin-left': level > 1 ? 16 + 'px' : '0'\n }\"\n>\n <div\n *ngIf=\"node && !node.root && !node.hidden\"\n class=\"c8y-asset-selector__node\"\n [attr.role]=\"view === 'tree' ? 'treeitem' : 'listitem'\"\n [ngClass]=\"{ 'c8y-asset-selector__node--open': node?.open }\"\n title=\"{{ breadcrumb | translate }}\"\n >\n <div class=\"d-flex a-i-center p-t-4 p-b-4 m-r-8\" *ngIf=\"node.toString() !== 'LoadMoreNode'\">\n <label [ngClass]=\"{ 'c8y-checkbox': multi, 'c8y-radio': !multi }\">\n <input\n id=\"nodeLabel\"\n [type]=\"multi ? 'checkbox' : 'radio'\"\n (change)=\"selected(node)\"\n [checked]=\"isSelected()\"\n [disabled]=\"!node.groupsSelectable && node.isGroup()\"\n />\n <span></span>\n <span for=\"nodeLabel\" class=\"sr-only\" translate>Node label</span>\n </label>\n </div>\n\n <!-- group button -->\n <button\n *ngIf=\"node.isGroup() || node.hasChildDevices()\"\n class=\"c8y-asset-selector__btn text-truncate\"\n (click)=\"click()\"\n [attr.aria-expanded]=\"!node.open\"\n >\n <i\n [c8yIcon]=\"node.icon\"\n *ngIf=\"node.icon === 'c8y-group-smart'\"\n [title]=\"'Smart group' | translate\"\n class=\"c8y-icon c8y-icon-duocolor m-r-4 text-16\"\n ></i>\n <i\n [c8yIcon]=\"node.icon\"\n *ngIf=\"node.icon !== 'c8y-group-smart'\"\n [title]=\"'Group' | translate\"\n class=\"c8y-icon c8y-icon-duocolor m-r-4 text-16\"\n ></i>\n <span title=\"{{ breadcrumb }}\">\n {{ node.label | translate }}\n <!-- use just for search results to display the path -->\n <p *ngIf=\"showPath\" class=\"text-truncate\">\n <small class=\"text-muted\" title=\"{{ breadcrumb }}\">\n <em>{{ breadcrumb }}</em>\n </small>\n </p>\n <!-- up to here -->\n </span>\n </button>\n <!-- not a group button -->\n <button\n *ngIf=\"!node.isGroup() && !node.hasChildDevices()\"\n class=\"flex-grow\"\n [ngClass]=\"{\n 'btn btn-default btn-sm m-b-8 d-flex j-c-center': node.icon === 'plus',\n 'c8y-asset-selector__btn text-truncate': node.icon != 'plus'\n }\"\n (click)=\"selected(node)\"\n type=\"button\"\n title=\"{{ breadcrumb }}\"\n >\n <i\n [c8yIcon]=\"node.icon\"\n *ngIf=\"node.icon === 'c8y-group-smart'\"\n [title]=\"'Smart group' | translate\"\n class=\"c8y-icon c8y-icon-duocolor m-r-4 text-16\"\n ></i>\n <i\n [c8yIcon]=\"node.icon\"\n *ngIf=\"node.icon !== 'c8y-group-smart'\"\n [title]=\"'Group' | translate\"\n [ngClass]=\"{ 'c8y-icon-duocolor text-16 ': node.icon != 'plus' }\"\n class=\"c8y-icon m-r-4\"\n ></i>\n <span title=\"{{ breadcrumb }}\">\n {{ node.label | translate }}\n <!-- use just for search results to display the path -->\n <p *ngIf=\"showPath\" class=\"text-truncate text-muted small\">\n <em>{{ breadcrumb }}</em>\n </p>\n <!-- up to here -->\n </span>\n </button>\n <!-- expand button (only for groups) -->\n <div *ngIf=\"node.isGroup() || node.hasChildDevices()\">\n <button\n [title]=\"expandTitle\"\n class=\"collapse-btn btn\"\n (click)=\"click()\"\n [attr.aria-expanded]=\"node.open\"\n >\n <i c8yIcon=\"angle-down\"></i>\n </button>\n </div>\n </div>\n <div\n *ngIf=\"node.countChildren()\"\n class=\"collapse\"\n [collapse]=\"!node.open\"\n [isAnimated]=\"true\"\n [attr.role]=\"'group'\"\n >\n <c8y-asset-selector-node\n *ngFor=\"let childNode of node.children\"\n [node]=\"childNode\"\n [preselected]=\"preselected || []\"\n [multi]=\"multi\"\n [active]=\"active\"\n [attr.role]=\"view === 'tree' ? 'treeitem' : 'listitem'\"\n (onSelect)=\"onSelect.emit($event)\"\n (onDeselect)=\"onDeselect.emit($event)\"\n ></c8y-asset-selector-node>\n </div>\n</div>\n\n<!-- Miller columns -->\n<div *ngIf=\"view === 'miller'\">\n <div\n *ngIf=\"node && !node.root && !node.hidden && node !== rootNode\"\n class=\"miller-column__item bg-inherit\"\n [ngClass]=\"{\n active: isActive(),\n 'miller-column__item--more': node.toString() === 'LoadMoreNode'\n }\"\n title=\"{{ breadcrumb | translate }}\"\n >\n <div\n class=\"m-l-4 m-r-4 miller-column__item__checkbox\"\n *ngIf=\"node.toString() !== 'LoadMoreNode'\"\n >\n <label [ngClass]=\"{ 'c8y-radio': !multi, 'c8y-checkbox': multi }\">\n <input\n id=\"nodeLabel2\"\n [type]=\"multi ? 'checkbox' : 'radio'\"\n (change)=\"selected(node)\"\n [checked]=\"isGroupSelected()\"\n [disabled]=\"!node.groupsSelectable && node.isGroup()\"\n />\n <span></span>\n <span for=\"nodeLabel2\" class=\"sr-only\" translate>Node label</span>\n </label>\n </div>\n\n <button\n [ngClass]=\"{\n 'btn btn-default btn-sm d-flex flex-grow j-c-center m-l-16 m-r-16 m-b-8':\n node.toString() === 'LoadMoreNode',\n 'miller-column__item__btn': node.toString() !== 'LoadMoreNode',\n 'btn-pending': node.loading && node.toString() === 'LoadMoreNode'\n }\"\n title=\"{{ breadcrumb | translate }}\"\n (click)=\"millerViewClick(node)\"\n type=\"button\"\n >\n <i\n [c8yIcon]=\"node.icon\"\n class=\"c8y-icon m-r-4\"\n [ngClass]=\"{ 'c8y-icon-duocolor text-16': node.toString() !== 'LoadMoreNode' }\"\n ></i>\n <div class=\"text-left text-truncate\">\n <p title=\"{{ node.label | translate }}\" class=\"text-truncate\">\n {{ node.label | translate }}\n </p>\n <!-- use just for search results to display the path -->\n <small *ngIf=\"showPath\" class=\"text-muted text-truncate\" title=\"{{ breadcrumb }}\">\n <em>{{ breadcrumb }}</em>\n </small>\n <!-- up to here -->\n </div>\n <span *ngIf=\"node.isGroup() || node.hasChildDevices()\" class=\"p-l-4 m-l-auto\">\n <i c8yIcon=\"angle-right\"></i>\n </span>\n </button>\n </div>\n\n <div *ngIf=\"node\" [ngClass]=\"{ hidden: node !== rootNode }\" role=\"list\">\n <c8y-asset-selector-node\n *ngFor=\"let childNode of node.children\"\n [node]=\"childNode\"\n [rootNode]=\"rootNode\"\n [preselected]=\"preselected || []\"\n [multi]=\"multi\"\n [view]=\"view\"\n [index]=\"index\"\n [selectedItems]=\"selectedItems\"\n [active]=\"active\"\n [handleNextMillerViewColumn]=\"handleNextMillerViewColumn\"\n (onSelect)=\"onSelect.emit($event)\"\n (onDeselect)=\"onDeselect.emit($event)\"\n role=\"listitem\"\n ></c8y-asset-selector-node>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5$1.CollapseDirective, selector: "[collapse]", inputs: ["display", "isAnimated", "collapse"], outputs: ["collapsed", "collapses", "expanded", "expands"], exportAs: ["bs-collapse"] }, { kind: "component", type: AssetSelectorNodeComponent, selector: "c8y-asset-selector-node", inputs: ["node", "rootNode", "preselected", "showPath", "multi", "view", "index", "active", "selectedItems", "handleNextMillerViewColumn"], outputs: ["isLoadingState", "onSelect", "onDeselect"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }] });
1064
+ AssetSelectorNodeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: AssetSelectorNodeComponent, deps: [{ token: i5.TranslateService }, { token: i0.ChangeDetectorRef }, { token: AssetSelectorService }], target: i0.ɵɵFactoryTarget.Component });
1065
+ AssetSelectorNodeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.6", type: AssetSelectorNodeComponent, selector: "c8y-asset-selector-node", inputs: { node: "node", rootNode: "rootNode", preselected: "preselected", showPath: "showPath", multi: "multi", view: "view", index: "index", active: "active", selectedItems: "selectedItems", handleNextMillerViewColumn: "handleNextMillerViewColumn" }, outputs: { isLoadingState: "isLoadingState", onSelect: "onSelect", onDeselect: "onDeselect" }, ngImport: i0, template: "<!-- Hierarchy tree -->\n<div\n *ngIf=\"view === 'tree'\"\n class=\"c8y-asset-selector__item\"\n [attr.role]=\"view === 'tree' ? 'tree' : 'list'\"\n [ngClass]=\"{\n 'c8y-asset-selector__item--more': node?.icon === 'plus',\n 'c8y-asset-selector__item--start': level === 0\n }\"\n [ngStyle]=\"{\n 'margin-left': level > 1 ? 16 + 'px' : '0'\n }\"\n>\n <div\n *ngIf=\"node && !node.root && !node.hidden\"\n class=\"c8y-asset-selector__node\"\n [attr.role]=\"view === 'tree' ? 'treeitem' : 'listitem'\"\n [ngClass]=\"{ 'c8y-asset-selector__node--open': node?.open }\"\n title=\"{{ breadcrumb | translate }}\"\n >\n <div class=\"d-flex a-i-center p-t-4 p-b-4 m-r-8\" *ngIf=\"node.toString() !== 'LoadMoreNode'\">\n <label [ngClass]=\"{ 'c8y-checkbox': multi, 'c8y-radio': !multi }\">\n <input\n id=\"nodeLabel\"\n [type]=\"multi ? 'checkbox' : 'radio'\"\n (change)=\"selected(node)\"\n [checked]=\"isSelected()\"\n [disabled]=\"!node.groupsSelectable && node.isGroup()\"\n />\n <span></span>\n <span for=\"nodeLabel\" class=\"sr-only\" translate>Node label</span>\n </label>\n </div>\n\n <!-- group button -->\n <button\n *ngIf=\"node.isGroup() || node.hasChildDevices()\"\n class=\"c8y-asset-selector__btn text-truncate\"\n (click)=\"click()\"\n [attr.aria-expanded]=\"!node.open\"\n >\n <i\n [c8yIcon]=\"node.icon\"\n *ngIf=\"node.icon === 'c8y-group-smart'\"\n [title]=\"'Smart group' | translate\"\n class=\"c8y-icon c8y-icon-duocolor m-r-4 text-16\"\n ></i>\n <i\n [c8yIcon]=\"node.icon\"\n *ngIf=\"node.icon !== 'c8y-group-smart'\"\n [title]=\"'Group' | translate\"\n class=\"c8y-icon c8y-icon-duocolor m-r-4 text-16\"\n ></i>\n <span title=\"{{ breadcrumb }}\">\n {{ node.label | translate }}\n <!-- use just for search results to display the path -->\n <p *ngIf=\"showPath\" class=\"text-truncate\">\n <small class=\"text-muted\" title=\"{{ breadcrumb }}\">\n <em>{{ breadcrumb }}</em>\n </small>\n </p>\n <!-- up to here -->\n </span>\n </button>\n <!-- not a group button -->\n <button\n *ngIf=\"!node.isGroup() && !node.hasChildDevices()\"\n class=\"flex-grow\"\n [ngClass]=\"{\n 'btn btn-default btn-sm m-b-8 d-flex j-c-center': node.icon === 'plus',\n 'c8y-asset-selector__btn text-truncate': node.icon != 'plus'\n }\"\n (click)=\"selected(node)\"\n type=\"button\"\n title=\"{{ breadcrumb }}\"\n >\n <i\n [c8yIcon]=\"node.icon\"\n *ngIf=\"node.icon === 'c8y-group-smart'\"\n [title]=\"'Smart group' | translate\"\n class=\"c8y-icon c8y-icon-duocolor m-r-4 text-16\"\n ></i>\n <i\n [c8yIcon]=\"node.icon\"\n *ngIf=\"node.icon !== 'c8y-group-smart'\"\n [title]=\"'Group' | translate\"\n [ngClass]=\"{ 'c8y-icon-duocolor text-16 ': node.icon != 'plus' }\"\n class=\"c8y-icon m-r-4\"\n ></i>\n <span title=\"{{ breadcrumb }}\">\n {{ node.label | translate }}\n <!-- use just for search results to display the path -->\n <p *ngIf=\"showPath\" class=\"text-truncate text-muted small\">\n <em>{{ breadcrumb }}</em>\n </p>\n <!-- up to here -->\n </span>\n </button>\n <!-- expand button (only for groups) -->\n <div *ngIf=\"node.isGroup() || node.hasChildDevices()\">\n <button\n [title]=\"expandTitle\"\n class=\"collapse-btn btn\"\n (click)=\"click()\"\n [attr.aria-expanded]=\"node.open\"\n >\n <i c8yIcon=\"angle-down\"></i>\n </button>\n </div>\n </div>\n <div\n *ngIf=\"node.countChildren()\"\n class=\"collapse\"\n [collapse]=\"!node.open\"\n [isAnimated]=\"true\"\n [attr.role]=\"'group'\"\n >\n <c8y-asset-selector-node\n *ngFor=\"let childNode of node.children\"\n [node]=\"childNode\"\n [preselected]=\"preselected || []\"\n [multi]=\"multi\"\n [active]=\"active\"\n [attr.role]=\"view === 'tree' ? 'treeitem' : 'listitem'\"\n (onSelect)=\"onSelect.emit($event)\"\n (onDeselect)=\"onDeselect.emit($event)\"\n ></c8y-asset-selector-node>\n </div>\n</div>\n\n<!-- Miller columns -->\n<div *ngIf=\"view === 'miller'\">\n <div\n *ngIf=\"node && !node.root && !node.hidden && node !== rootNode\"\n class=\"miller-column__item bg-inherit\"\n [ngClass]=\"{\n active: isActive(),\n 'miller-column__item--more': node.toString() === 'LoadMoreNode'\n }\"\n title=\"{{ breadcrumb | translate }}\"\n >\n <div\n class=\"m-l-4 m-r-4 miller-column__item__checkbox\"\n *ngIf=\"node.toString() !== 'LoadMoreNode'\"\n >\n <label [ngClass]=\"{ 'c8y-radio': !multi, 'c8y-checkbox': multi }\">\n <input\n id=\"nodeLabel2\"\n [type]=\"multi ? 'checkbox' : 'radio'\"\n (change)=\"selected(node)\"\n [checked]=\"isGroupSelected()\"\n [disabled]=\"!node.groupsSelectable && node.isGroup()\"\n />\n <span></span>\n <span for=\"nodeLabel2\" class=\"sr-only\" translate>Node label</span>\n </label>\n </div>\n\n <button\n [ngClass]=\"{\n 'btn btn-default btn-sm d-flex flex-grow j-c-center m-l-16 m-r-16 m-b-8':\n node.toString() === 'LoadMoreNode',\n 'miller-column__item__btn': node.toString() !== 'LoadMoreNode',\n 'btn-pending': node.loading && node.toString() === 'LoadMoreNode'\n }\"\n title=\"{{ breadcrumb | translate }}\"\n (click)=\"millerViewClick(node)\"\n type=\"button\"\n >\n <i\n [c8yIcon]=\"node.icon\"\n class=\"c8y-icon m-r-4\"\n [ngClass]=\"{ 'c8y-icon-duocolor text-16': node.toString() !== 'LoadMoreNode' }\"\n ></i>\n <div class=\"text-left text-truncate\">\n <p title=\"{{ node.label | translate }}\" class=\"text-truncate\">\n {{ node.label | translate }}\n </p>\n <!-- use just for search results to display the path -->\n <small *ngIf=\"showPath\" class=\"text-muted text-truncate\" title=\"{{ breadcrumb }}\">\n <em>{{ breadcrumb }}</em>\n </small>\n <!-- up to here -->\n </div>\n <span *ngIf=\"node.isGroup() || node.hasChildDevices()\" class=\"p-l-4 m-l-auto\">\n <i c8yIcon=\"angle-right\"></i>\n </span>\n </button>\n </div>\n\n <div *ngIf=\"node\" [ngClass]=\"{ hidden: node !== rootNode }\" role=\"list\">\n <c8y-asset-selector-node\n *ngFor=\"let childNode of node.children\"\n [node]=\"childNode\"\n [rootNode]=\"rootNode\"\n [preselected]=\"preselected || []\"\n [multi]=\"multi\"\n [view]=\"view\"\n [index]=\"index\"\n [selectedItems]=\"selectedItems\"\n [active]=\"active\"\n [handleNextMillerViewColumn]=\"handleNextMillerViewColumn\"\n (onSelect)=\"onSelect.emit($event)\"\n (onDeselect)=\"onDeselect.emit($event)\"\n role=\"listitem\"\n ></c8y-asset-selector-node>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i3.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "directive", type: i5$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i5$2.CollapseDirective, selector: "[collapse]", inputs: ["display", "isAnimated", "collapse"], outputs: ["collapsed", "collapses", "expanded", "expands"], exportAs: ["bs-collapse"] }, { kind: "component", type: AssetSelectorNodeComponent, selector: "c8y-asset-selector-node", inputs: ["node", "rootNode", "preselected", "showPath", "multi", "view", "index", "active", "selectedItems", "handleNextMillerViewColumn"], outputs: ["isLoadingState", "onSelect", "onDeselect"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }] });
1054
1066
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: AssetSelectorNodeComponent, decorators: [{
1055
1067
  type: Component,
1056
1068
  args: [{ selector: 'c8y-asset-selector-node', template: "<!-- Hierarchy tree -->\n<div\n *ngIf=\"view === 'tree'\"\n class=\"c8y-asset-selector__item\"\n [attr.role]=\"view === 'tree' ? 'tree' : 'list'\"\n [ngClass]=\"{\n 'c8y-asset-selector__item--more': node?.icon === 'plus',\n 'c8y-asset-selector__item--start': level === 0\n }\"\n [ngStyle]=\"{\n 'margin-left': level > 1 ? 16 + 'px' : '0'\n }\"\n>\n <div\n *ngIf=\"node && !node.root && !node.hidden\"\n class=\"c8y-asset-selector__node\"\n [attr.role]=\"view === 'tree' ? 'treeitem' : 'listitem'\"\n [ngClass]=\"{ 'c8y-asset-selector__node--open': node?.open }\"\n title=\"{{ breadcrumb | translate }}\"\n >\n <div class=\"d-flex a-i-center p-t-4 p-b-4 m-r-8\" *ngIf=\"node.toString() !== 'LoadMoreNode'\">\n <label [ngClass]=\"{ 'c8y-checkbox': multi, 'c8y-radio': !multi }\">\n <input\n id=\"nodeLabel\"\n [type]=\"multi ? 'checkbox' : 'radio'\"\n (change)=\"selected(node)\"\n [checked]=\"isSelected()\"\n [disabled]=\"!node.groupsSelectable && node.isGroup()\"\n />\n <span></span>\n <span for=\"nodeLabel\" class=\"sr-only\" translate>Node label</span>\n </label>\n </div>\n\n <!-- group button -->\n <button\n *ngIf=\"node.isGroup() || node.hasChildDevices()\"\n class=\"c8y-asset-selector__btn text-truncate\"\n (click)=\"click()\"\n [attr.aria-expanded]=\"!node.open\"\n >\n <i\n [c8yIcon]=\"node.icon\"\n *ngIf=\"node.icon === 'c8y-group-smart'\"\n [title]=\"'Smart group' | translate\"\n class=\"c8y-icon c8y-icon-duocolor m-r-4 text-16\"\n ></i>\n <i\n [c8yIcon]=\"node.icon\"\n *ngIf=\"node.icon !== 'c8y-group-smart'\"\n [title]=\"'Group' | translate\"\n class=\"c8y-icon c8y-icon-duocolor m-r-4 text-16\"\n ></i>\n <span title=\"{{ breadcrumb }}\">\n {{ node.label | translate }}\n <!-- use just for search results to display the path -->\n <p *ngIf=\"showPath\" class=\"text-truncate\">\n <small class=\"text-muted\" title=\"{{ breadcrumb }}\">\n <em>{{ breadcrumb }}</em>\n </small>\n </p>\n <!-- up to here -->\n </span>\n </button>\n <!-- not a group button -->\n <button\n *ngIf=\"!node.isGroup() && !node.hasChildDevices()\"\n class=\"flex-grow\"\n [ngClass]=\"{\n 'btn btn-default btn-sm m-b-8 d-flex j-c-center': node.icon === 'plus',\n 'c8y-asset-selector__btn text-truncate': node.icon != 'plus'\n }\"\n (click)=\"selected(node)\"\n type=\"button\"\n title=\"{{ breadcrumb }}\"\n >\n <i\n [c8yIcon]=\"node.icon\"\n *ngIf=\"node.icon === 'c8y-group-smart'\"\n [title]=\"'Smart group' | translate\"\n class=\"c8y-icon c8y-icon-duocolor m-r-4 text-16\"\n ></i>\n <i\n [c8yIcon]=\"node.icon\"\n *ngIf=\"node.icon !== 'c8y-group-smart'\"\n [title]=\"'Group' | translate\"\n [ngClass]=\"{ 'c8y-icon-duocolor text-16 ': node.icon != 'plus' }\"\n class=\"c8y-icon m-r-4\"\n ></i>\n <span title=\"{{ breadcrumb }}\">\n {{ node.label | translate }}\n <!-- use just for search results to display the path -->\n <p *ngIf=\"showPath\" class=\"text-truncate text-muted small\">\n <em>{{ breadcrumb }}</em>\n </p>\n <!-- up to here -->\n </span>\n </button>\n <!-- expand button (only for groups) -->\n <div *ngIf=\"node.isGroup() || node.hasChildDevices()\">\n <button\n [title]=\"expandTitle\"\n class=\"collapse-btn btn\"\n (click)=\"click()\"\n [attr.aria-expanded]=\"node.open\"\n >\n <i c8yIcon=\"angle-down\"></i>\n </button>\n </div>\n </div>\n <div\n *ngIf=\"node.countChildren()\"\n class=\"collapse\"\n [collapse]=\"!node.open\"\n [isAnimated]=\"true\"\n [attr.role]=\"'group'\"\n >\n <c8y-asset-selector-node\n *ngFor=\"let childNode of node.children\"\n [node]=\"childNode\"\n [preselected]=\"preselected || []\"\n [multi]=\"multi\"\n [active]=\"active\"\n [attr.role]=\"view === 'tree' ? 'treeitem' : 'listitem'\"\n (onSelect)=\"onSelect.emit($event)\"\n (onDeselect)=\"onDeselect.emit($event)\"\n ></c8y-asset-selector-node>\n </div>\n</div>\n\n<!-- Miller columns -->\n<div *ngIf=\"view === 'miller'\">\n <div\n *ngIf=\"node && !node.root && !node.hidden && node !== rootNode\"\n class=\"miller-column__item bg-inherit\"\n [ngClass]=\"{\n active: isActive(),\n 'miller-column__item--more': node.toString() === 'LoadMoreNode'\n }\"\n title=\"{{ breadcrumb | translate }}\"\n >\n <div\n class=\"m-l-4 m-r-4 miller-column__item__checkbox\"\n *ngIf=\"node.toString() !== 'LoadMoreNode'\"\n >\n <label [ngClass]=\"{ 'c8y-radio': !multi, 'c8y-checkbox': multi }\">\n <input\n id=\"nodeLabel2\"\n [type]=\"multi ? 'checkbox' : 'radio'\"\n (change)=\"selected(node)\"\n [checked]=\"isGroupSelected()\"\n [disabled]=\"!node.groupsSelectable && node.isGroup()\"\n />\n <span></span>\n <span for=\"nodeLabel2\" class=\"sr-only\" translate>Node label</span>\n </label>\n </div>\n\n <button\n [ngClass]=\"{\n 'btn btn-default btn-sm d-flex flex-grow j-c-center m-l-16 m-r-16 m-b-8':\n node.toString() === 'LoadMoreNode',\n 'miller-column__item__btn': node.toString() !== 'LoadMoreNode',\n 'btn-pending': node.loading && node.toString() === 'LoadMoreNode'\n }\"\n title=\"{{ breadcrumb | translate }}\"\n (click)=\"millerViewClick(node)\"\n type=\"button\"\n >\n <i\n [c8yIcon]=\"node.icon\"\n class=\"c8y-icon m-r-4\"\n [ngClass]=\"{ 'c8y-icon-duocolor text-16': node.toString() !== 'LoadMoreNode' }\"\n ></i>\n <div class=\"text-left text-truncate\">\n <p title=\"{{ node.label | translate }}\" class=\"text-truncate\">\n {{ node.label | translate }}\n </p>\n <!-- use just for search results to display the path -->\n <small *ngIf=\"showPath\" class=\"text-muted text-truncate\" title=\"{{ breadcrumb }}\">\n <em>{{ breadcrumb }}</em>\n </small>\n <!-- up to here -->\n </div>\n <span *ngIf=\"node.isGroup() || node.hasChildDevices()\" class=\"p-l-4 m-l-auto\">\n <i c8yIcon=\"angle-right\"></i>\n </span>\n </button>\n </div>\n\n <div *ngIf=\"node\" [ngClass]=\"{ hidden: node !== rootNode }\" role=\"list\">\n <c8y-asset-selector-node\n *ngFor=\"let childNode of node.children\"\n [node]=\"childNode\"\n [rootNode]=\"rootNode\"\n [preselected]=\"preselected || []\"\n [multi]=\"multi\"\n [view]=\"view\"\n [index]=\"index\"\n [selectedItems]=\"selectedItems\"\n [active]=\"active\"\n [handleNextMillerViewColumn]=\"handleNextMillerViewColumn\"\n (onSelect)=\"onSelect.emit($event)\"\n (onDeselect)=\"onDeselect.emit($event)\"\n role=\"listitem\"\n ></c8y-asset-selector-node>\n </div>\n</div>\n" }]
1057
- }], ctorParameters: function () { return [{ type: i1$1.TranslateService }, { type: i0.ChangeDetectorRef }, { type: AssetSelectorService }]; }, propDecorators: { node: [{
1069
+ }], ctorParameters: function () { return [{ type: i5.TranslateService }, { type: i0.ChangeDetectorRef }, { type: AssetSelectorService }]; }, propDecorators: { node: [{
1058
1070
  type: Input
1059
1071
  }], rootNode: [{
1060
1072
  type: Input
@@ -1540,7 +1552,7 @@ AssetSelectorComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0",
1540
1552
  useExisting: forwardRef(() => AssetSelectorComponent),
1541
1553
  multi: true
1542
1554
  }
1543
- ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"bg-inherit p-t-8 p-b-8 separator-bottom\"\n [ngClass]=\"{ 'p-l-16 p-absolute p-r-16': config.view === 'miller', 'sticky-top': config.multi }\"\n [ngStyle]=\"{ 'z-index': config.singleColumn && config.search ? '30' : '20' }\"\n *ngIf=\"!selectedDevice && index === 0 && (config.search || config.singleColumn)\"\n>\n <p class=\"text-medium\" [ngClass]=\"{ 'm-b-4': config.search && root }\">\n {{ config.label | translate }}\n </p>\n <c8y-search-input\n *ngIf=\"config.search && root\"\n (onClick)=\"onSearchResultClick($event)\"\n (reset)=\"onSearchResultReset($event)\"\n [mode]=\"'select'\"\n [container]=\"container\"\n [groupsOnly]=\"config.groupsOnly\"\n ></c8y-search-input>\n <div *ngIf=\"config.multi\" class=\"p-t-4\">\n <span class=\"label label-info chip\" *ngFor=\"let selectedItem of selected\">\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n type=\"button\"\n title=\"{{ selectedItem.name }}\"\n (click)=\"deselect(selectedItem)\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ selectedItem.name }}\n </span>\n </div>\n</div>\n\n<div *ngIf=\"selectedDevice\" class=\"p-r-16\">\n <div class=\"d-flex p-b-4\">\n <p *ngIf=\"selectedDevice; else multiAssets\" class=\"text-medium p-t-8 m-r-8\">\n {{ 'Selected asset' | translate }}\n </p>\n <ng-template #multiAssets>\n <p class=\"text-medium m-r-8\">{{ 'Selected assets' | translate }}</p>\n </ng-template>\n <button\n class=\"btn btn-default btn-xs a-s-center m-t-4 m-l-auto\"\n type=\"button\"\n title=\"{{ 'Change' | translate }}\"\n (click)=\"clearSelectedDevices()\"\n >\n {{ 'Change' | translate }}\n </button>\n </div>\n <div class=\"d-flex\">\n <i [c8yIcon]=\"'check-circle'\" class=\"text-success p-l-0 p-r-8\"></i>\n <i\n c8yIcon=\"{{ selectedDevice.type === 'c8y_DeviceGroup' ? 'c8y-group' : 'exchange' }}\"\n class=\"m-r-4 icon-20\"\n ></i>\n <span>{{ selectedDevice.name }}</span>\n </div>\n</div>\n\n<!-- miller columns header -->\n<div\n *ngIf=\"\n config.view === 'miller' &&\n ((config.showFilter && !rootNode.root) || config.columnHeaders || config.singleColumn) &&\n !selectedDevice\n \"\n class=\"miller-column__header sticky-top bg-inherit separator-bottom\"\n [ngClass]=\"{ 'm-t-72 p-t-8': config.search, 'm-t-32': !config.search && config.singleColumn }\"\n [ngStyle]=\"{ top: config.search && !config.singleColumn ? '72px' : '0' }\"\n>\n <p\n class=\"text-12 text-muted text-truncate m-b-4\"\n *ngIf=\"config.singleColumn && index !== 0\"\n title=\"{{ rootNode.breadcrumb || rootNode.label | translate }}\"\n >\n <i c8yIcon=\"home\" class=\"m-r-4\"></i>\n {{ rootNode.breadcrumb || rootNode.label | translate }}\n </p>\n <div *ngIf=\"config.columnHeaders || config.singleColumn\" class=\"d-flex a-i-center\">\n <button\n class=\"btn btn-default btn-xs m-r-8 p-t-0 p-b-0 p-l-4 p-r-4 l-h-1\"\n type=\"button\"\n title=\"{{ 'Back' | translate }}\"\n *ngIf=\"config.singleColumn && !rootNode.root && index !== 0\"\n (click)=\"back()\"\n >\n <i c8yIcon=\"angle-left\"></i>\n </button>\n <label\n *ngIf=\"!rootNode.root && index === 0 && (config.groupsSelectable || !rootNode.isGroup())\"\n class=\"c8y-radio checkbox-inline m-r-8\"\n >\n <input\n type=\"radio\"\n (change)=\"select(rootNode.mo)\"\n [checked]=\"isGroupSelected()\"\n title=\"{{ 'Select group' | translate }}\"\n />\n <span></span>\n </label>\n\n <i\n *ngIf=\"config.columnHeaders && (config.singleColumn || (!rootNode.root && index === 0))\"\n c8yIcon=\"c8y-group-open\"\n class=\"icon-20 c8y-icon-duocolor m-r-4\"\n ></i>\n <p\n class=\"text-truncate\"\n title=\"{{ rootNode.label | translate }}\"\n *ngIf=\"config.columnHeaders\"\n [ngClass]=\"{\n 'text-label-small': !config.singleColumn,\n 'text-medium': config.singleColumn\n }\"\n >\n {{ rootNode.label | translate }}\n </p>\n </div>\n\n <div *ngIf=\"!rootNode.root && config.showFilter\" [ngClass]=\"{ 'p-t-4': config.columnHeaders }\">\n <div class=\"input-group input-group-sm input-group-search\">\n <input\n [(ngModel)]=\"filterText\"\n placeholder=\"{{ 'Filter this column\u2026' | translate }}\"\n class=\"form-control\"\n (keyup.enter)=\"applyFilter('*' + filterText + '*')\"\n />\n <span class=\"input-group-btn\">\n <button\n title=\"{{ 'Apply filter' | translate }}\"\n type=\"button\"\n class=\"btn btn-dot p-r-8 p-l-4\"\n (click)=\"applyFilter('*' + filterText + '*')\"\n >\n <i c8yIcon=\"filter\"></i>\n </button>\n <button\n title=\" {{ 'Clear filters' | translate }}\"\n type=\"button\"\n class=\"btn btn-dot p-r-8 p-l-4\"\n (click)=\"clearFilters()\"\n *ngIf=\"filterText.length\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n </span>\n </div>\n </div>\n</div>\n\n<c8y-asset-selector-node\n *ngIf=\"rootNode && !selectedDevice\"\n [node]=\"rootNode\"\n [rootNode]=\"rootNode\"\n [preselected]=\"selected\"\n [multi]=\"config.multi\"\n [view]=\"config.view\"\n [index]=\"index\"\n [selectedItems]=\"selectedItems\"\n [active]=\"active\"\n [handleNextMillerViewColumn]=\"handleNextMillerViewColumn.bind(this)\"\n (isLoadingState)=\"onLoading($event)\"\n (onSelect)=\"onSelect($event)\"\n (onDeselect)=\"onDeselect($event)\"\n class=\"d-block bg-inherit p-relative\"\n [ngClass]=\"{ 'collapse show': !rootNode.root && !rootNode.hidden && config.view !== 'miller' }\"\n style=\"z-index: 9\"\n></c8y-asset-selector-node>\n", dependencies: [{ kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.SearchInputComponent, selector: "c8y-search-input", inputs: ["mode", "enableCustomTemplatePlaceholder", "customPlaceholder", "externalTerm", "customDataQuery", "container", "groupsOnly"], outputs: ["filter", "search", "reset", "onClick"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: AssetSelectorNodeComponent, selector: "c8y-asset-selector-node", inputs: ["node", "rootNode", "preselected", "showPath", "multi", "view", "index", "active", "selectedItems", "handleNextMillerViewColumn"], outputs: ["isLoadingState", "onSelect", "onDeselect"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }] });
1555
+ ], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"bg-inherit p-t-8 p-b-8 separator-bottom\"\n [ngClass]=\"{ 'p-l-16 p-absolute p-r-16': config.view === 'miller', 'sticky-top': config.multi }\"\n [ngStyle]=\"{ 'z-index': config.singleColumn && config.search ? '30' : '20' }\"\n *ngIf=\"!selectedDevice && index === 0 && (config.search || config.singleColumn)\"\n>\n <p class=\"text-medium\" [ngClass]=\"{ 'm-b-4': config.search && root }\">\n {{ config.label | translate }}\n </p>\n <c8y-search-input\n *ngIf=\"config.search && root\"\n (onClick)=\"onSearchResultClick($event)\"\n (reset)=\"onSearchResultReset($event)\"\n [mode]=\"'select'\"\n [container]=\"container\"\n [groupsOnly]=\"config.groupsOnly\"\n ></c8y-search-input>\n <div *ngIf=\"config.multi\" class=\"p-t-4\">\n <span class=\"label label-info chip\" *ngFor=\"let selectedItem of selected\">\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n type=\"button\"\n title=\"{{ selectedItem.name }}\"\n (click)=\"deselect(selectedItem)\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ selectedItem.name }}\n </span>\n </div>\n</div>\n\n<div *ngIf=\"selectedDevice\" class=\"p-r-16\">\n <div class=\"d-flex p-b-4\">\n <p *ngIf=\"selectedDevice; else multiAssets\" class=\"text-medium p-t-8 m-r-8\">\n {{ 'Selected asset' | translate }}\n </p>\n <ng-template #multiAssets>\n <p class=\"text-medium m-r-8\">{{ 'Selected assets' | translate }}</p>\n </ng-template>\n <button\n class=\"btn btn-default btn-xs a-s-center m-t-4 m-l-auto\"\n type=\"button\"\n title=\"{{ 'Change' | translate }}\"\n (click)=\"clearSelectedDevices()\"\n >\n {{ 'Change' | translate }}\n </button>\n </div>\n <div class=\"d-flex\">\n <i [c8yIcon]=\"'check-circle'\" class=\"text-success p-l-0 p-r-8\"></i>\n <i\n c8yIcon=\"{{ selectedDevice.type === 'c8y_DeviceGroup' ? 'c8y-group' : 'exchange' }}\"\n class=\"m-r-4 icon-20\"\n ></i>\n <span>{{ selectedDevice.name }}</span>\n </div>\n</div>\n\n<!-- miller columns header -->\n<div\n *ngIf=\"\n config.view === 'miller' &&\n ((config.showFilter && !rootNode.root) || config.columnHeaders || config.singleColumn) &&\n !selectedDevice\n \"\n class=\"miller-column__header sticky-top bg-inherit separator-bottom\"\n [ngClass]=\"{ 'm-t-72 p-t-8': config.search, 'm-t-32': !config.search && config.singleColumn }\"\n [ngStyle]=\"{ top: config.search && !config.singleColumn ? '72px' : '0' }\"\n>\n <p\n class=\"text-12 text-muted text-truncate m-b-4\"\n *ngIf=\"config.singleColumn && index !== 0\"\n title=\"{{ rootNode.breadcrumb || rootNode.label | translate }}\"\n >\n <i c8yIcon=\"home\" class=\"m-r-4\"></i>\n {{ rootNode.breadcrumb || rootNode.label | translate }}\n </p>\n <div *ngIf=\"config.columnHeaders || config.singleColumn\" class=\"d-flex a-i-center\">\n <button\n class=\"btn btn-default btn-xs m-r-8 p-t-0 p-b-0 p-l-4 p-r-4 l-h-1\"\n type=\"button\"\n title=\"{{ 'Back' | translate }}\"\n *ngIf=\"config.singleColumn && !rootNode.root && index !== 0\"\n (click)=\"back()\"\n >\n <i c8yIcon=\"angle-left\"></i>\n </button>\n <label\n *ngIf=\"!rootNode.root && index === 0 && (config.groupsSelectable || !rootNode.isGroup())\"\n class=\"c8y-radio checkbox-inline m-r-8\"\n >\n <input\n type=\"radio\"\n (change)=\"select(rootNode.mo)\"\n [checked]=\"isGroupSelected()\"\n title=\"{{ 'Select group' | translate }}\"\n />\n <span></span>\n </label>\n\n <i\n *ngIf=\"config.columnHeaders && (config.singleColumn || (!rootNode.root && index === 0))\"\n c8yIcon=\"c8y-group-open\"\n class=\"icon-20 c8y-icon-duocolor m-r-4\"\n ></i>\n <p\n class=\"text-truncate\"\n title=\"{{ rootNode.label | translate }}\"\n *ngIf=\"config.columnHeaders\"\n [ngClass]=\"{\n 'text-label-small': !config.singleColumn,\n 'text-medium': config.singleColumn\n }\"\n >\n {{ rootNode.label | translate }}\n </p>\n </div>\n\n <div *ngIf=\"!rootNode.root && config.showFilter\" [ngClass]=\"{ 'p-t-4': config.columnHeaders }\">\n <div class=\"input-group input-group-sm input-group-search\">\n <input\n [(ngModel)]=\"filterText\"\n placeholder=\"{{ 'Filter this column\u2026' | translate }}\"\n class=\"form-control\"\n (keyup.enter)=\"applyFilter('*' + filterText + '*')\"\n />\n <span class=\"input-group-btn\">\n <button\n title=\"{{ 'Apply filter' | translate }}\"\n type=\"button\"\n class=\"btn btn-dot p-r-8 p-l-4\"\n (click)=\"applyFilter('*' + filterText + '*')\"\n >\n <i c8yIcon=\"filter\"></i>\n </button>\n <button\n title=\" {{ 'Clear filters' | translate }}\"\n type=\"button\"\n class=\"btn btn-dot p-r-8 p-l-4\"\n (click)=\"clearFilters()\"\n *ngIf=\"filterText.length\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n </span>\n </div>\n </div>\n</div>\n\n<c8y-asset-selector-node\n *ngIf=\"rootNode && !selectedDevice\"\n [node]=\"rootNode\"\n [rootNode]=\"rootNode\"\n [preselected]=\"selected\"\n [multi]=\"config.multi\"\n [view]=\"config.view\"\n [index]=\"index\"\n [selectedItems]=\"selectedItems\"\n [active]=\"active\"\n [handleNextMillerViewColumn]=\"handleNextMillerViewColumn.bind(this)\"\n (isLoadingState)=\"onLoading($event)\"\n (onSelect)=\"onSelect($event)\"\n (onDeselect)=\"onDeselect($event)\"\n class=\"d-block bg-inherit p-relative\"\n [ngClass]=\"{ 'collapse show': !rootNode.root && !rootNode.hidden && config.view !== 'miller' }\"\n style=\"z-index: 9\"\n></c8y-asset-selector-node>\n", dependencies: [{ kind: "directive", type: i3.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i5$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5$1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i3.SearchInputComponent, selector: "c8y-search-input", inputs: ["mode", "enableCustomTemplatePlaceholder", "customPlaceholder", "externalTerm", "customDataQuery", "container", "groupsOnly"], outputs: ["filter", "search", "reset", "onClick"] }, { kind: "directive", type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: AssetSelectorNodeComponent, selector: "c8y-asset-selector-node", inputs: ["node", "rootNode", "preselected", "showPath", "multi", "view", "index", "active", "selectedItems", "handleNextMillerViewColumn"], outputs: ["isLoadingState", "onSelect", "onDeselect"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }] });
1544
1556
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: AssetSelectorComponent, decorators: [{
1545
1557
  type: Component,
1546
1558
  args: [{ selector: 'c8y-asset-selector', providers: [
@@ -1713,7 +1725,7 @@ MillerViewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", ve
1713
1725
  useExisting: forwardRef(() => MillerViewComponent),
1714
1726
  multi: true
1715
1727
  }
1716
- ], viewQueries: [{ propertyName: "millerViewWrapper", first: true, predicate: ["millerViewWrapper"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n #millerViewWrapper\n class=\"miller-view-wrapper\"\n [ngClass]=\"{ 'single-column': config.singleColumn }\"\n>\n <div *ngFor=\"let column of columns; index as i\" class=\"miller-column bg-inherit\">\n <c8y-asset-selector\n [config]=\"config\"\n [index]=\"i\"\n [active]=\"columns[i + 1]\"\n [rootNode]=\"column\"\n [selectedItems]=\"selected || []\"\n [selectedDevice]=\"selectedDevice\"\n (onSelected)=\"onSelectionChange($event)\"\n (onClearSelected)=\"onClearSelected.emit()\"\n (onRowSelected)=\"addNewColumn($event)\"\n (onLoad)=\"onLoad($event)\"\n [container]=\"container\"\n class=\"bg-inherit\"\n >\n </c8y-asset-selector>\n\n <div class=\"p-relative p-b-64\" *ngIf=\"isLoading && columnIndex === i && !selectedDevice\">\n <c8y-loading></c8y-loading>\n </div>\n\n <div *ngIf=\"!column.children.length && !isLoading\" class=\"p-l-8 p-r-8\">\n <c8y-ui-empty-state\n *ngIf=\"!filterText; else noSearchResults\"\n [icon]=\"'folder-open'\"\n [title]=\"'No results to display.' | translate\"\n [subtitle]=\"'The selected asset has no children.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n <ng-template #noSearchResults>\n <c8y-ui-empty-state\n [icon]=\"'folder-open'\"\n [title]=\"'No results to display for the current filter.' | translate\"\n [subtitle]=\"'There are no assets matching the filter.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </ng-template>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: i3.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.LoadingComponent, selector: "c8y-loading" }, { kind: "component", type: AssetSelectorComponent, selector: "c8y-asset-selector", inputs: ["config", "active", "index", "asset", "selectedDevice", "selected", "rootNode", "selectedItems", "container"], outputs: ["onSelected", "onClearSelected", "onRowSelected", "onLoad"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }] });
1728
+ ], viewQueries: [{ propertyName: "millerViewWrapper", first: true, predicate: ["millerViewWrapper"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n #millerViewWrapper\n class=\"miller-view-wrapper\"\n [ngClass]=\"{ 'single-column': config.singleColumn }\"\n>\n <div *ngFor=\"let column of columns; index as i\" class=\"miller-column bg-inherit\">\n <c8y-asset-selector\n [config]=\"config\"\n [index]=\"i\"\n [active]=\"columns[i + 1]\"\n [rootNode]=\"column\"\n [selectedItems]=\"selected || []\"\n [selectedDevice]=\"selectedDevice\"\n (onSelected)=\"onSelectionChange($event)\"\n (onClearSelected)=\"onClearSelected.emit()\"\n (onRowSelected)=\"addNewColumn($event)\"\n (onLoad)=\"onLoad($event)\"\n [container]=\"container\"\n class=\"bg-inherit\"\n >\n </c8y-asset-selector>\n\n <div class=\"p-relative p-b-64\" *ngIf=\"isLoading && columnIndex === i && !selectedDevice\">\n <c8y-loading></c8y-loading>\n </div>\n\n <div *ngIf=\"!column.children.length && !isLoading\" class=\"p-l-8 p-r-8\">\n <c8y-ui-empty-state\n *ngIf=\"!filterText; else noSearchResults\"\n [icon]=\"'folder-open'\"\n [title]=\"'No results to display.' | translate\"\n [subtitle]=\"'The selected asset has no children.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n <ng-template #noSearchResults>\n <c8y-ui-empty-state\n [icon]=\"'folder-open'\"\n [title]=\"'No results to display for the current filter.' | translate\"\n [subtitle]=\"'There are no assets matching the filter.' | translate\"\n [horizontal]=\"true\"\n ></c8y-ui-empty-state>\n </ng-template>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "component", type: i3.EmptyStateComponent, selector: "c8y-ui-empty-state", inputs: ["icon", "title", "subtitle", "horizontal"] }, { kind: "directive", type: i5$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.LoadingComponent, selector: "c8y-loading" }, { kind: "component", type: AssetSelectorComponent, selector: "c8y-asset-selector", inputs: ["config", "active", "index", "asset", "selectedDevice", "selected", "rootNode", "selectedItems", "container"], outputs: ["onSelected", "onClearSelected", "onRowSelected", "onLoad"] }, { kind: "pipe", type: i3.C8yTranslatePipe, name: "translate" }] });
1717
1729
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: MillerViewComponent, decorators: [{
1718
1730
  type: Component,
1719
1731
  args: [{ selector: 'c8y-asset-selector-miller', providers: [