@c8y/ngx-components 1021.80.1 → 1021.81.0

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 (88) hide show
  1. package/core/data-grid/column/tree-node-column/tree-node.cell-renderer.component.d.ts +23 -0
  2. package/core/data-grid/column/tree-node-column/tree-node.cell-renderer.component.d.ts.map +1 -0
  3. package/core/data-grid/column/tree-node-column/tree-node.data-grid-column.d.ts +23 -0
  4. package/core/data-grid/column/tree-node-column/tree-node.data-grid-column.d.ts.map +1 -0
  5. package/core/data-grid/column/tree-node-column/tree-node.header-cell-renderer.component.d.ts +6 -0
  6. package/core/data-grid/column/tree-node-column/tree-node.header-cell-renderer.component.d.ts.map +1 -0
  7. package/core/data-grid/data-grid.component.d.ts +29 -1
  8. package/core/data-grid/data-grid.component.d.ts.map +1 -1
  9. package/core/data-grid/data-grid.model.d.ts +13 -1
  10. package/core/data-grid/data-grid.model.d.ts.map +1 -1
  11. package/core/data-grid/grid-data-source.d.ts +11 -2
  12. package/core/data-grid/grid-data-source.d.ts.map +1 -1
  13. package/core/data-grid/index.d.ts +4 -1
  14. package/core/data-grid/index.d.ts.map +1 -1
  15. package/esm2022/branding/shared/lazy/branding/branding.component.mjs +2 -2
  16. package/esm2022/context-dashboard/dashboard-manager/type-dashboard-target-assets-grid/type-dashboard-target-assets-grid.component.mjs +1 -1
  17. package/esm2022/context-dashboard/dashboard-manager/type-dashboards-list/type-dashboards-list.component.mjs +1 -1
  18. package/esm2022/core/data-grid/column/tree-node-column/tree-node.cell-renderer.component.mjs +87 -0
  19. package/esm2022/core/data-grid/column/tree-node-column/tree-node.data-grid-column.mjs +15 -0
  20. package/esm2022/core/data-grid/column/tree-node-column/tree-node.header-cell-renderer.component.mjs +15 -0
  21. package/esm2022/core/data-grid/configure-custom-column/asset-property-grid.component.mjs +1 -1
  22. package/esm2022/core/data-grid/data-grid.component.mjs +68 -11
  23. package/esm2022/core/data-grid/data-grid.model.mjs +1 -1
  24. package/esm2022/core/data-grid/grid-data-source.mjs +92 -22
  25. package/esm2022/core/data-grid/index.mjs +5 -2
  26. package/esm2022/device-grid/device-grid.component.mjs +1 -1
  27. package/esm2022/device-profile/device-profile-list.component.mjs +1 -1
  28. package/esm2022/device-provisioned-certificates/device-tab-provisioned-certificates.component.mjs +1 -1
  29. package/esm2022/ecosystem/application-plugins/application-plugins.component.mjs +1 -1
  30. package/esm2022/files-repository/files-repository.component.mjs +1 -1
  31. package/esm2022/messaging-management/messaging/topic/topic-list-view.component.mjs +2 -2
  32. package/esm2022/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-view.component.mjs +2 -2
  33. package/esm2022/operations/bulk-single-operations-list/single-operations-list.component.mjs +2 -2
  34. package/esm2022/remote-access/configurations/remote-access-configuration-list/remote-access-configuration-list.component.mjs +2 -2
  35. package/esm2022/repository/configuration/list/configuration-list.component.mjs +1 -1
  36. package/esm2022/repository/firmware/list/firmware-list.component.mjs +1 -1
  37. package/esm2022/repository/software/list/software-list.component.mjs +1 -1
  38. package/esm2022/search/search-grid.component.mjs +1 -1
  39. package/esm2022/services/services-device-tab/services-device-tab.component.mjs +1 -1
  40. package/esm2022/sub-assets/sub-assets-grid.component.mjs +1 -1
  41. package/esm2022/tenants/tenant-list/tenant-list.component.mjs +1 -1
  42. package/esm2022/translation-editor/lazy/translation-editor/translation-editor.component.mjs +2 -2
  43. package/fesm2022/{c8y-ngx-components-asset-property-grid.component-CmhkghTo.mjs → c8y-ngx-components-asset-property-grid.component-xQgHuomT.mjs} +3 -3
  44. package/fesm2022/{c8y-ngx-components-asset-property-grid.component-CmhkghTo.mjs.map → c8y-ngx-components-asset-property-grid.component-xQgHuomT.mjs.map} +1 -1
  45. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs +1 -1
  46. package/fesm2022/c8y-ngx-components-branding-shared-lazy.mjs.map +1 -1
  47. package/fesm2022/{c8y-ngx-components-c8y-ngx-components-D-YOjLHK.mjs → c8y-ngx-components-c8y-ngx-components-D2rmddmn.mjs} +455 -228
  48. package/fesm2022/c8y-ngx-components-c8y-ngx-components-D2rmddmn.mjs.map +1 -0
  49. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +2 -2
  50. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  51. package/fesm2022/c8y-ngx-components-device-grid.mjs +1 -1
  52. package/fesm2022/c8y-ngx-components-device-grid.mjs.map +1 -1
  53. package/fesm2022/c8y-ngx-components-device-profile.mjs +1 -1
  54. package/fesm2022/c8y-ngx-components-device-profile.mjs.map +1 -1
  55. package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs +1 -1
  56. package/fesm2022/c8y-ngx-components-device-provisioned-certificates.mjs.map +1 -1
  57. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs +1 -1
  58. package/fesm2022/c8y-ngx-components-ecosystem-application-plugins.mjs.map +1 -1
  59. package/fesm2022/c8y-ngx-components-ecosystem.mjs +1 -1
  60. package/fesm2022/c8y-ngx-components-ecosystem.mjs.map +1 -1
  61. package/fesm2022/c8y-ngx-components-files-repository.mjs +1 -1
  62. package/fesm2022/c8y-ngx-components-files-repository.mjs.map +1 -1
  63. package/fesm2022/c8y-ngx-components-messaging-management.mjs +2 -2
  64. package/fesm2022/c8y-ngx-components-messaging-management.mjs.map +1 -1
  65. package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs +1 -1
  66. package/fesm2022/c8y-ngx-components-operations-bulk-single-operations-list.mjs.map +1 -1
  67. package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs +1 -1
  68. package/fesm2022/c8y-ngx-components-remote-access-configurations.mjs.map +1 -1
  69. package/fesm2022/c8y-ngx-components-repository-configuration.mjs +1 -1
  70. package/fesm2022/c8y-ngx-components-repository-configuration.mjs.map +1 -1
  71. package/fesm2022/c8y-ngx-components-repository-firmware.mjs +1 -1
  72. package/fesm2022/c8y-ngx-components-repository-firmware.mjs.map +1 -1
  73. package/fesm2022/c8y-ngx-components-repository-software.mjs +1 -1
  74. package/fesm2022/c8y-ngx-components-repository-software.mjs.map +1 -1
  75. package/fesm2022/c8y-ngx-components-search.mjs +1 -1
  76. package/fesm2022/c8y-ngx-components-search.mjs.map +1 -1
  77. package/fesm2022/c8y-ngx-components-services.mjs +1 -1
  78. package/fesm2022/c8y-ngx-components-services.mjs.map +1 -1
  79. package/fesm2022/c8y-ngx-components-sub-assets.mjs +1 -1
  80. package/fesm2022/c8y-ngx-components-sub-assets.mjs.map +1 -1
  81. package/fesm2022/c8y-ngx-components-tenants.mjs +1 -1
  82. package/fesm2022/c8y-ngx-components-tenants.mjs.map +1 -1
  83. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs +1 -1
  84. package/fesm2022/c8y-ngx-components-translation-editor-lazy.mjs.map +1 -1
  85. package/fesm2022/c8y-ngx-components.mjs +1 -1
  86. package/locales/locales.pot +6 -0
  87. package/package.json +1 -1
  88. package/fesm2022/c8y-ngx-components-c8y-ngx-components-D-YOjLHK.mjs.map +0 -1
@@ -1,10 +1,10 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Directive, Input, Injector, InjectionToken, Injectable, Optional, Inject, isDevMode, inject, Pipe, EventEmitter, NgModule, LOCALE_ID, EnvironmentInjector, HostListener, NgModuleRef, createNgModule, Component, Output, HostBinding, forwardRef, DestroyRef, ViewChild, SecurityContext, TemplateRef, APP_INITIALIZER, Self, SkipSelf, Attribute, ContentChild, ViewContainerRef, ContentChildren, ElementRef, ViewChildren, createComponent, runInInjectionContext, importProvidersFrom, ChangeDetectionStrategy, SimpleChange, reflectComponentType, signal, effect, Type } from '@angular/core';
2
+ import { Directive, Input, Injector, InjectionToken, Injectable, Optional, Inject, isDevMode, inject, Pipe, EventEmitter, NgModule, LOCALE_ID, EnvironmentInjector, HostListener, NgModuleRef, createNgModule, Component, Output, HostBinding, forwardRef, DestroyRef, ViewChild, SecurityContext, TemplateRef, APP_INITIALIZER, Self, SkipSelf, Attribute, ContentChild, ViewContainerRef, ContentChildren, ElementRef, ViewChildren, createComponent, runInInjectionContext, importProvidersFrom, ChangeDetectionStrategy, SimpleChange, reflectComponentType, signal, effect, Type, computed } from '@angular/core';
3
3
  import * as i1$3 from 'ngx-bootstrap/dropdown';
4
4
  import { BsDropdownModule, BsDropdownDirective } from 'ngx-bootstrap/dropdown';
5
5
  import * as i3 from '@angular/cdk/a11y';
6
6
  import { A11yModule, CdkTrapFocus } from '@angular/cdk/a11y';
7
- import { castArray, flatten, uniq, sortBy, groupBy, camelCase, isEqual, isUndefined, throttle as throttle$1, keys, get, isNaN as isNaN$1, isFinite, each, mapValues, mapKeys, forEach, reduce, union, cloneDeep, uniqBy, assign, min, every, first, map as map$2, find, negate, upperFirst, memoize as memoize$1, property, some, entries, omitBy, isDate, pick, flatMap, orderBy, isEmpty, filter as filter$2, snakeCase, matches, isString, clone, toNumber, isEqualWith, escape as escape$1, escapeRegExp, assignWith, set, omit, has, transform, identity, flow, isNil, chunk, values, without, indexOf, parseInt as parseInt$1, kebabCase, forOwn } from 'lodash-es';
7
+ import { castArray, flatten, uniq, sortBy, groupBy, camelCase, isEqual, isUndefined, throttle as throttle$1, keys, get, isNaN as isNaN$1, isFinite, each, mapValues, mapKeys, forEach, reduce, union, cloneDeep, uniqBy, assign, min, every, first, map as map$2, find, negate, upperFirst, memoize as memoize$1, property, some, entries, omitBy, isDate, pick, flatMap, orderBy, isEmpty, filter as filter$2, snakeCase, matches, isString, clone, toNumber, isEqualWith, escape as escape$1, escapeRegExp, assignWith, set, omit, has, transform, identity, flow, findIndex as findIndex$1, isNil, chunk, values, without, indexOf, parseInt as parseInt$1, kebabCase, forOwn } from 'lodash-es';
8
8
  import { merge, of, defer, combineLatest, race, isObservable, from, Subject, BehaviorSubject, NEVER, Observable, firstValueFrom, map as map$1, distinctUntilChanged as distinctUntilChanged$1, fromEvent, pipe, throwError, concat, filter as filter$1, tap as tap$1, EMPTY, timer, fromEventPattern, startWith as startWith$1, switchMap as switchMap$1, takeUntil as takeUntil$1, empty, forkJoin, ReplaySubject, interval, shareReplay as shareReplay$1, mergeMap as mergeMap$1 } from 'rxjs';
9
9
  import { map, distinctUntilChanged, filter, startWith, switchMap, take, shareReplay, scan, debounceTime, share, takeUntil, tap, catchError, first as first$1, retryWhen, delay, concatMap, debounce, sample, withLatestFrom, mergeMap, every as every$1, toArray, merge as merge$1, expand, skip, mapTo, finalize, reduce as reduce$1, combineLatestWith } from 'rxjs/operators';
10
10
  import * as i1 from '@c8y/client';
@@ -31604,6 +31604,83 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31604
31604
  }]
31605
31605
  }], ctorParameters: () => [{ type: i0.Injector }, { type: PluginsResolveService }, { type: i1$4.Router }] });
31606
31606
 
31607
+ class BaseColumn {
31608
+ constructor(config = {}) {
31609
+ this.filteringFormRendererComponent = BaseFilteringFormRendererComponent;
31610
+ Object.assign(this, config);
31611
+ if (config.filter?.externalFilterQuery) {
31612
+ this.externalFilterQuery = config.filter.externalFilterQuery;
31613
+ }
31614
+ }
31615
+ /**
31616
+ * Gets a label template to be used in the schema-form's `type: 'template'` form item.
31617
+ * @param label The label to be displayed.
31618
+ * @param options Additional options:
31619
+ * - `showWildcardTooltip`: `boolean` - appends a tooltip explaining wildcard usage
31620
+ * @returns The string with the template.
31621
+ */
31622
+ getLabelTemplate(label, options = {}) {
31623
+ const wildcardTooltip = `
31624
+ <i
31625
+ class="text-info"
31626
+ c8y-icon="info-circle"
31627
+ title="{{ 'Use * as a wildcard character' | translate }}"
31628
+ ></i>
31629
+ `;
31630
+ return `
31631
+ <label>
31632
+ <span>
31633
+ {{ '${label}' | translate }}
31634
+ </span>
31635
+ ${options.showWildcardTooltip ? wildcardTooltip : ''}
31636
+ </label>
31637
+ `;
31638
+ }
31639
+ }
31640
+
31641
+ class CustomColumn extends BaseColumn {
31642
+ constructor(initialColumnConfig) {
31643
+ super(initialColumnConfig);
31644
+ this.name = this.name || 'custom';
31645
+ this.header = this.header || gettext('Custom');
31646
+ this.filterable = true;
31647
+ this.filteringConfig = {
31648
+ fields: [
31649
+ {
31650
+ key: 'exists',
31651
+ type: 'switch',
31652
+ defaultValue: false,
31653
+ templateOptions: {
31654
+ label: gettext('Only rows where value is defined')
31655
+ }
31656
+ },
31657
+ ...getBasicInputArrayFormFieldConfig({
31658
+ key: 'equals',
31659
+ label: gettext('Only rows where value equals to'),
31660
+ addText: gettext('Add next`value`'),
31661
+ tooltip: gettext('Use * as a wildcard character'),
31662
+ placeholder: '10300',
31663
+ optional: true
31664
+ })
31665
+ ],
31666
+ getFilter: (model) => {
31667
+ const filter = {};
31668
+ if (model.exists) {
31669
+ filter.__has = this.path;
31670
+ }
31671
+ if (model.equals) {
31672
+ filter[this.path] = { __in: model.equals };
31673
+ }
31674
+ return filter;
31675
+ }
31676
+ };
31677
+ this.sortable = true;
31678
+ this.sortingConfig = {
31679
+ pathSortingConfigs: [{ path: this.path }]
31680
+ };
31681
+ }
31682
+ }
31683
+
31607
31684
  class ExpandableHeaderCellRendererComponent {
31608
31685
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ExpandableHeaderCellRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
31609
31686
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: ExpandableHeaderCellRendererComponent, selector: "c8y-expandable-header-cell-renderer", ngImport: i0, template: `&nbsp;`, isInline: true }); }
@@ -31698,6 +31775,226 @@ class ExpandableRowColumn {
31698
31775
  }
31699
31776
  }
31700
31777
 
31778
+ class TreeNodeCellRendererComponent {
31779
+ constructor(context, dataGridComponent // forwardRef is needed because of circular dependency
31780
+ ) {
31781
+ this.context = context;
31782
+ this.dataGridComponent = dataGridComponent;
31783
+ this.collapse = gettext('Collapse');
31784
+ this.expand = gettext('Expand');
31785
+ this.isExpanded = signal(false);
31786
+ this.loading = signal(false);
31787
+ this.level = this.getLevel(this.context.item);
31788
+ this.btnClass = computed(() => ({
31789
+ active: this.isExpanded(),
31790
+ [`level-${this.level}`]: this.level > 0
31791
+ }));
31792
+ this.context.item.level = this.level;
31793
+ this.dataGridComponent.dataSource.nodesLoading$
31794
+ .pipe(takeUntilDestroyed())
31795
+ .subscribe(loading => this.loading.set(loading.includes(this.context.item)));
31796
+ }
31797
+ toggleExpand() {
31798
+ if (this.isExpanded()) {
31799
+ this.dataGridComponent.collapseNode(this.context.item);
31800
+ this.isExpanded.set(false);
31801
+ }
31802
+ else {
31803
+ this.dataGridComponent.expandNode(this.context.item);
31804
+ this.isExpanded.set(true);
31805
+ }
31806
+ }
31807
+ getLevel(row) {
31808
+ return !!row.parentRow ? this.getLevel(row.parentRow) + 1 : 0;
31809
+ }
31810
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TreeNodeCellRendererComponent, deps: [{ token: CellRendererContext }, { token: forwardRef(() => DataGridComponent) }], target: i0.ɵɵFactoryTarget.Component }); }
31811
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TreeNodeCellRendererComponent, isStandalone: true, selector: "c8y-tree-node-cell-renderer", ngImport: i0, template: `
31812
+ <button
31813
+ class="data-grid-collapse-btn"
31814
+ title="{{ (isExpanded() ? collapse : expand) | translate }}"
31815
+ [attr.aria-label]="(isExpanded() ? collapse : expand) | translate"
31816
+ [attr.aria-controls]="context.item.id"
31817
+ [attr.aria-expanded]="isExpanded()"
31818
+ *ngIf="context.item.hasChildren"
31819
+ [ngClass]="btnClass()"
31820
+ (click)="toggleExpand()"
31821
+ >
31822
+ <i c8yIcon="chevron-right" *ngIf="!loading()"></i>
31823
+ <i class="icon-spin" c8yIcon="circle-o-notch" *ngIf="loading()"></i>
31824
+ </button>
31825
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
31826
+ }
31827
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TreeNodeCellRendererComponent, decorators: [{
31828
+ type: Component,
31829
+ args: [{
31830
+ template: `
31831
+ <button
31832
+ class="data-grid-collapse-btn"
31833
+ title="{{ (isExpanded() ? collapse : expand) | translate }}"
31834
+ [attr.aria-label]="(isExpanded() ? collapse : expand) | translate"
31835
+ [attr.aria-controls]="context.item.id"
31836
+ [attr.aria-expanded]="isExpanded()"
31837
+ *ngIf="context.item.hasChildren"
31838
+ [ngClass]="btnClass()"
31839
+ (click)="toggleExpand()"
31840
+ >
31841
+ <i c8yIcon="chevron-right" *ngIf="!loading()"></i>
31842
+ <i class="icon-spin" c8yIcon="circle-o-notch" *ngIf="loading()"></i>
31843
+ </button>
31844
+ `,
31845
+ selector: 'c8y-tree-node-cell-renderer',
31846
+ standalone: true,
31847
+ imports: [NgClass, NgIf, IconDirective, C8yTranslatePipe]
31848
+ }]
31849
+ }], ctorParameters: () => [{ type: CellRendererContext }, { type: DataGridComponent, decorators: [{
31850
+ type: Inject,
31851
+ args: [forwardRef(() => DataGridComponent)]
31852
+ }] }] });
31853
+
31854
+ class TreeNodeHeaderCellRendererComponent {
31855
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TreeNodeHeaderCellRendererComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
31856
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: TreeNodeHeaderCellRendererComponent, isStandalone: true, selector: "c8y-tree-node-header-cell-renderer", ngImport: i0, template: `&nbsp;`, isInline: true }); }
31857
+ }
31858
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: TreeNodeHeaderCellRendererComponent, decorators: [{
31859
+ type: Component,
31860
+ args: [{
31861
+ template: `&nbsp;`,
31862
+ selector: 'c8y-tree-node-header-cell-renderer',
31863
+ standalone: true
31864
+ }]
31865
+ }] });
31866
+
31867
+ class TreeNodeColumn {
31868
+ constructor() {
31869
+ this.name = 'tree-node';
31870
+ this.header = gettext('Tree node toggle');
31871
+ this.dataType = "icon" /* ColumnDataType.Icon */;
31872
+ this.headerCellRendererComponent = TreeNodeHeaderCellRendererComponent;
31873
+ this.cellRendererComponent = TreeNodeCellRendererComponent;
31874
+ this.filterable = false;
31875
+ this.sortable = false;
31876
+ }
31877
+ }
31878
+
31879
+ class AssetPropertyService extends Service {
31880
+ constructor(client, appState) {
31881
+ super(client);
31882
+ this.appState = appState;
31883
+ this.baseUrl = 'service/dtm';
31884
+ this.listUrl = '/definitions/properties';
31885
+ this.propertyName = 'definitions';
31886
+ }
31887
+ async canRetrieveAssetProperties() {
31888
+ const isAppAvailable = await this.appState.isApplicationAvailable('dtm');
31889
+ if (!isAppAvailable) {
31890
+ return false;
31891
+ }
31892
+ try {
31893
+ const result = await this.list({ currentPage: 1, pageSize: 1 });
31894
+ return result?.data?.length > 0;
31895
+ }
31896
+ catch (error) {
31897
+ return false;
31898
+ }
31899
+ }
31900
+ async list(filterInput = {}) {
31901
+ const headers = { accept: 'application/json' };
31902
+ const filter = this.buildFilter(filterInput);
31903
+ const res = await this.fetch(this.listUrl, this.changeFetchOptions({ headers, params: filter }, this.listUrl));
31904
+ const json = (await res.json());
31905
+ const data = json.definitions;
31906
+ const paging = this.getPaging(json, filter);
31907
+ return { res, data, paging };
31908
+ }
31909
+ async getByIdentifier(identifier) {
31910
+ const url = `${this.listUrl}/${encodeURIComponent(identifier)}`;
31911
+ const headers = { accept: 'application/json' };
31912
+ const res = await this.fetch(url, this.changeFetchOptions({ headers }, url));
31913
+ if (res.status === 404) {
31914
+ throw new Error(`Property Definition with identifier '${identifier}' not found (404).`);
31915
+ }
31916
+ if (!res.ok) {
31917
+ throw new Error(`Error fetching Property Definition '${identifier}': ${res.status} ${res.statusText}`);
31918
+ }
31919
+ return (await res.json());
31920
+ }
31921
+ search(searchTerm) {
31922
+ return this.list({ titles: [searchTerm] });
31923
+ }
31924
+ buildFilter(filter) {
31925
+ const newFilter = { ...filter };
31926
+ ['identifiers', 'titles', 'tags'].forEach(key => {
31927
+ if (Array.isArray(newFilter[key])) {
31928
+ newFilter[key] = newFilter[key].join(',');
31929
+ }
31930
+ });
31931
+ return newFilter;
31932
+ }
31933
+ getPaging(json, filter) {
31934
+ if (json.pageStatistics) {
31935
+ const { currentPage, hasMorePages } = json.pageStatistics;
31936
+ const statistics = {
31937
+ ...json.pageStatistics,
31938
+ nextPage: hasMorePages ? currentPage + 1 : null,
31939
+ prevPage: currentPage > 1 ? currentPage - 1 : null,
31940
+ totalPages: json.pageStatistics.pageCount,
31941
+ totalElements: json.totalCount
31942
+ };
31943
+ return new Paging(this, statistics, filter);
31944
+ }
31945
+ return null;
31946
+ }
31947
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AssetPropertyService, deps: [{ token: i1.FetchClient }, { token: AppStateService }], target: i0.ɵɵFactoryTarget.Injectable }); }
31948
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AssetPropertyService, providedIn: 'root' }); }
31949
+ }
31950
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AssetPropertyService, decorators: [{
31951
+ type: Injectable,
31952
+ args: [{
31953
+ providedIn: 'root'
31954
+ }]
31955
+ }], ctorParameters: () => [{ type: i1.FetchClient }, { type: AppStateService }] });
31956
+
31957
+ class CustomColumnService {
31958
+ constructor(assetPropertiesService, bottomDrawerService, bsModalService) {
31959
+ this.assetPropertiesService = assetPropertiesService;
31960
+ this.bottomDrawerService = bottomDrawerService;
31961
+ this.bsModalService = bsModalService;
31962
+ }
31963
+ async openCustomColumns(existingColumns, onAdd) {
31964
+ const dtmAvailable = await this.assetPropertiesService.canRetrieveAssetProperties();
31965
+ if (dtmAvailable) {
31966
+ this.openDrawer(onAdd);
31967
+ }
31968
+ else {
31969
+ this.openModal(existingColumns, onAdd);
31970
+ }
31971
+ }
31972
+ openModal(columns, onAdd) {
31973
+ const modalRef = this.bsModalService.show(ConfigureCustomColumnComponent, {
31974
+ class: 'modal-sm',
31975
+ ignoreBackdropClick: true,
31976
+ initialState: { columns }
31977
+ });
31978
+ modalRef.content.onAddCustomColumn
31979
+ .pipe(tap((cfg) => onAdd(cfg)), takeUntil(modalRef.onHidden))
31980
+ .subscribe();
31981
+ }
31982
+ async openDrawer(onAdd) {
31983
+ // Importing here because otherwise introducing a circular dependency between data-grid and asset-property-grid compponents.
31984
+ const { AssetPropertyGridComponent } = await import('./c8y-ngx-components-asset-property-grid.component-xQgHuomT.mjs');
31985
+ const drawerRef = this.bottomDrawerService.openDrawer(AssetPropertyGridComponent);
31986
+ drawerRef.instance.onAddCustomColumn
31987
+ .pipe(tap((cfg) => onAdd(cfg)))
31988
+ .subscribe();
31989
+ }
31990
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomColumnService, deps: [{ token: AssetPropertyService }, { token: BottomDrawerService }, { token: i1$5.BsModalService }], target: i0.ɵɵFactoryTarget.Injectable }); }
31991
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomColumnService, providedIn: 'root' }); }
31992
+ }
31993
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomColumnService, decorators: [{
31994
+ type: Injectable,
31995
+ args: [{ providedIn: 'root' }]
31996
+ }], ctorParameters: () => [{ type: AssetPropertyService }, { type: BottomDrawerService }, { type: i1$5.BsModalService }] });
31997
+
31701
31998
  /**
31702
31999
  * Injection token used to provide a configuration strategy service for data-grid component.
31703
32000
  */
@@ -31746,83 +32043,6 @@ var BuiltInActionType;
31746
32043
  BuiltInActionType["Export"] = "EXPORT";
31747
32044
  })(BuiltInActionType || (BuiltInActionType = {}));
31748
32045
 
31749
- class BaseColumn {
31750
- constructor(config = {}) {
31751
- this.filteringFormRendererComponent = BaseFilteringFormRendererComponent;
31752
- Object.assign(this, config);
31753
- if (config.filter?.externalFilterQuery) {
31754
- this.externalFilterQuery = config.filter.externalFilterQuery;
31755
- }
31756
- }
31757
- /**
31758
- * Gets a label template to be used in the schema-form's `type: 'template'` form item.
31759
- * @param label The label to be displayed.
31760
- * @param options Additional options:
31761
- * - `showWildcardTooltip`: `boolean` - appends a tooltip explaining wildcard usage
31762
- * @returns The string with the template.
31763
- */
31764
- getLabelTemplate(label, options = {}) {
31765
- const wildcardTooltip = `
31766
- <i
31767
- class="text-info"
31768
- c8y-icon="info-circle"
31769
- title="{{ 'Use * as a wildcard character' | translate }}"
31770
- ></i>
31771
- `;
31772
- return `
31773
- <label>
31774
- <span>
31775
- {{ '${label}' | translate }}
31776
- </span>
31777
- ${options.showWildcardTooltip ? wildcardTooltip : ''}
31778
- </label>
31779
- `;
31780
- }
31781
- }
31782
-
31783
- class CustomColumn extends BaseColumn {
31784
- constructor(initialColumnConfig) {
31785
- super(initialColumnConfig);
31786
- this.name = this.name || 'custom';
31787
- this.header = this.header || gettext('Custom');
31788
- this.filterable = true;
31789
- this.filteringConfig = {
31790
- fields: [
31791
- {
31792
- key: 'exists',
31793
- type: 'switch',
31794
- defaultValue: false,
31795
- templateOptions: {
31796
- label: gettext('Only rows where value is defined')
31797
- }
31798
- },
31799
- ...getBasicInputArrayFormFieldConfig({
31800
- key: 'equals',
31801
- label: gettext('Only rows where value equals to'),
31802
- addText: gettext('Add next`value`'),
31803
- tooltip: gettext('Use * as a wildcard character'),
31804
- placeholder: '10300',
31805
- optional: true
31806
- })
31807
- ],
31808
- getFilter: (model) => {
31809
- const filter = {};
31810
- if (model.exists) {
31811
- filter.__has = this.path;
31812
- }
31813
- if (model.equals) {
31814
- filter[this.path] = { __in: model.equals };
31815
- }
31816
- return filter;
31817
- }
31818
- };
31819
- this.sortable = true;
31820
- this.sortingConfig = {
31821
- pathSortingConfigs: [{ path: this.path }]
31822
- };
31823
- }
31824
- }
31825
-
31826
32046
  class DataGridService {
31827
32047
  constructor(userPreferencesService) {
31828
32048
  this.userPreferencesService = userPreferencesService;
@@ -31934,6 +32154,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
31934
32154
  }], ctorParameters: () => [{ type: i0.TemplateRef }, { type: i0.ElementRef }, { type: i0.ViewContainerRef }] });
31935
32155
 
31936
32156
  class GridDataSource {
32157
+ set childNodesProperty(name) {
32158
+ this.childNodesPropertyName = name ?? 'childNodes';
32159
+ }
31937
32160
  constructor() {
31938
32161
  this.loadingSubject = new BehaviorSubject(true);
31939
32162
  this.dataSourceSubject = new BehaviorSubject([]);
@@ -31948,11 +32171,14 @@ class GridDataSource {
31948
32171
  filteredDataIds: []
31949
32172
  });
31950
32173
  this.resultListSubject = new Subject();
32174
+ this.nodesLoadingSubject = new BehaviorSubject([]);
32175
+ this.childNodesPropertyName = 'childNodes';
31951
32176
  this.loading$ = this.loadingSubject.asObservable();
31952
32177
  this.data$ = this.dataSourceSubject.asObservable();
31953
32178
  this.stats$ = this.dataStatsSubject.asObservable();
31954
32179
  this.selection$ = this.dataSelectionSubject.asObservable();
31955
32180
  this.resultList$ = this.resultListSubject.asObservable();
32181
+ this.nodesLoading$ = this.nodesLoadingSubject.asObservable();
31956
32182
  }
31957
32183
  connect(_collectionViewer) {
31958
32184
  return this.data$;
@@ -31962,9 +32188,15 @@ class GridDataSource {
31962
32188
  this.dataSourceSubject.complete();
31963
32189
  this.dataStatsSubject.complete();
31964
32190
  this.dataSelectionSubject.complete();
32191
+ this.resultListSubject.complete();
31965
32192
  }
31966
- loadData({ rows, columns, pagination, searchText, serverSideDataCallback, selectable, selectionPrimaryKey, infiniteScroll, reload = false }) {
32193
+ loadData({ rows, columns, pagination, searchText, serverSideDataCallback, selectable, selectionPrimaryKey, infiniteScroll, reload = false, parentRow = null }) {
31967
32194
  const clientSideData$ = toObservable(rows).pipe(map(initialData => {
32195
+ if (!!parentRow) {
32196
+ return parentRow[this.childNodesPropertyName] || [];
32197
+ }
32198
+ return initialData;
32199
+ }), map(initialData => {
31968
32200
  let filteredSize = 0;
31969
32201
  let filteredDataIds = [];
31970
32202
  const transformedData = flow(data => this.doClientSideSearch({ data, columns, searchText }), data => this.doClientSideFiltering({ data, columns }), data => this.doClientSideSorting({ data, columns }), data => {
@@ -31974,13 +32206,15 @@ class GridDataSource {
31974
32206
  : filteredDataIds;
31975
32207
  return data;
31976
32208
  }, data => this.doClientSidePagination({ data, pagination }))(initialData);
31977
- this.dataStatsSubject.next({
31978
- size: initialData.length,
31979
- filteredSize,
31980
- currentPage: pagination.currentPage,
31981
- currentPageSize: transformedData.length,
31982
- firstPageSize: pagination.pageSize
31983
- });
32209
+ if (!parentRow) {
32210
+ this.dataStatsSubject.next({
32211
+ size: initialData.length,
32212
+ filteredSize,
32213
+ currentPage: pagination.currentPage,
32214
+ currentPageSize: transformedData.length,
32215
+ firstPageSize: pagination.pageSize
32216
+ });
32217
+ }
31984
32218
  this.dataSelectionSubject.next({ filteredDataIds });
31985
32219
  return transformedData;
31986
32220
  }));
@@ -31988,24 +32222,44 @@ class GridDataSource {
31988
32222
  columns,
31989
32223
  searchText,
31990
32224
  pagination,
31991
- selection: { enabled: selectable, primaryKey: selectionPrimaryKey }
32225
+ selection: { enabled: selectable, primaryKey: selectionPrimaryKey },
32226
+ parentRow
31992
32227
  }))).pipe(map((result) => {
31993
32228
  const { data, paging, size, filteredSize, filteredDataIds } = result;
31994
- this.dataStatsSubject.next({
31995
- size,
31996
- filteredSize,
31997
- currentPage: paging.currentPage,
31998
- currentPageSize: data.length,
31999
- nextPage: paging.nextPage,
32000
- firstPageSize: paging.pageSize
32001
- });
32229
+ if (!parentRow) {
32230
+ this.dataStatsSubject.next({
32231
+ size,
32232
+ filteredSize,
32233
+ currentPage: paging.currentPage,
32234
+ currentPageSize: data.length,
32235
+ nextPage: paging.nextPage,
32236
+ firstPageSize: paging.pageSize
32237
+ });
32238
+ }
32239
+ else {
32240
+ /* Add additional row to be rendered as pagination row containing statistics data */
32241
+ const childrenStats = {
32242
+ size,
32243
+ filteredSize,
32244
+ currentPage: paging.currentPage,
32245
+ currentPageSize: data.length,
32246
+ nextPage: paging.nextPage,
32247
+ firstPageSize: paging.pageSize
32248
+ };
32249
+ data.push({
32250
+ /* θpagination is an internal flag for pagination rows */
32251
+ θpagination: true,
32252
+ childrenStats,
32253
+ parentRow
32254
+ });
32255
+ }
32002
32256
  this.dataSelectionSubject.next({ filteredDataIds: filteredDataIds || [] });
32003
32257
  this.resultListSubject.next(result);
32004
32258
  return data;
32005
32259
  }));
32006
32260
  const data$ = typeof serverSideDataCallback === 'function' ? serverSideData$ : clientSideData$;
32007
32261
  of([])
32008
- .pipe(tap(() => this.loadingSubject.next(true)), switchMap(() => data$), catchError(() => {
32262
+ .pipe(tap(() => this.emitLoadingStart(parentRow)), switchMap(() => data$), catchError(() => {
32009
32263
  this.dataStatsSubject.next({
32010
32264
  size: 0,
32011
32265
  filteredSize: 0,
@@ -32015,12 +32269,28 @@ class GridDataSource {
32015
32269
  });
32016
32270
  this.dataSelectionSubject.next({ filteredDataIds: [] });
32017
32271
  return of([]);
32018
- }), finalize(() => this.loadingSubject.next(false)))
32272
+ }), finalize(() => this.emitLoadingEnd(parentRow)))
32019
32273
  .subscribe(result => {
32020
- const data = infiniteScroll && !reload ? [...this.dataSourceSubject.value, ...result] : result;
32274
+ let data;
32275
+ if (parentRow) {
32276
+ result.forEach(item => (item.parentRow = parentRow));
32277
+ data = this.dataSourceSubject.value;
32278
+ /* Replace child rows with next page data when paginating */
32279
+ const parentRowIndex = data.indexOf(parentRow);
32280
+ const paginationRowIndex = findIndex$1(data, r => r.θpagination && r.parentRow === parentRow);
32281
+ const numberOfRowsToRemove = paginationRowIndex > -1 ? paginationRowIndex - parentRowIndex : 0;
32282
+ data.splice(parentRowIndex + 1, numberOfRowsToRemove, ...result);
32283
+ }
32284
+ else {
32285
+ data = infiniteScroll && !reload ? [...this.dataSourceSubject.value, ...result] : result;
32286
+ }
32021
32287
  this.dataSourceSubject.next(data);
32022
32288
  });
32023
32289
  }
32290
+ collapseNode(row) {
32291
+ const data = this.dataSourceSubject.value.filter((item) => !this.isParent(item, row));
32292
+ this.dataSourceSubject.next(data);
32293
+ }
32024
32294
  resolveValue(x, path) {
32025
32295
  return get(x, path);
32026
32296
  }
@@ -32030,6 +32300,22 @@ class GridDataSource {
32030
32300
  normalizeNil(x) {
32031
32301
  return isNil(x) ? '' : x;
32032
32302
  }
32303
+ emitLoadingStart(parentRow) {
32304
+ if (parentRow) {
32305
+ this.nodesLoadingSubject.next([...this.nodesLoadingSubject.value, parentRow]);
32306
+ }
32307
+ else {
32308
+ this.loadingSubject.next(true);
32309
+ }
32310
+ }
32311
+ emitLoadingEnd(parentRow) {
32312
+ if (parentRow) {
32313
+ this.nodesLoadingSubject.next(this.nodesLoadingSubject.value.filter(item => item !== parentRow));
32314
+ }
32315
+ else {
32316
+ this.loadingSubject.next(false);
32317
+ }
32318
+ }
32033
32319
  doClientSideFiltering({ data, columns }) {
32034
32320
  return columns.reduce((result, column) => {
32035
32321
  const { filterPredicate } = column;
@@ -32071,6 +32357,10 @@ class GridDataSource {
32071
32357
  createRegexSearch(filterValue) {
32072
32358
  return RegExp(escapeRegExpPattern(filterValue), 'i');
32073
32359
  }
32360
+ isParent(row, parentRow) {
32361
+ return (!!row?.parentRow &&
32362
+ (row.parentRow.id === parentRow.id || this.isParent(row.parentRow, parentRow)));
32363
+ }
32074
32364
  }
32075
32365
  /**
32076
32366
  *
@@ -32110,125 +32400,6 @@ const PX_ACTIONS = {
32110
32400
  CLEAR_SEARCH: 'clearSearch'
32111
32401
  };
32112
32402
 
32113
- class AssetPropertyService extends Service {
32114
- constructor(client, appState) {
32115
- super(client);
32116
- this.appState = appState;
32117
- this.baseUrl = 'service/dtm';
32118
- this.listUrl = '/definitions/properties';
32119
- this.propertyName = 'definitions';
32120
- }
32121
- async canRetrieveAssetProperties() {
32122
- const isAppAvailable = await this.appState.isApplicationAvailable('dtm');
32123
- if (!isAppAvailable) {
32124
- return false;
32125
- }
32126
- try {
32127
- const result = await this.list({ currentPage: 1, pageSize: 1 });
32128
- return result?.data?.length > 0;
32129
- }
32130
- catch (error) {
32131
- return false;
32132
- }
32133
- }
32134
- async list(filterInput = {}) {
32135
- const headers = { accept: 'application/json' };
32136
- const filter = this.buildFilter(filterInput);
32137
- const res = await this.fetch(this.listUrl, this.changeFetchOptions({ headers, params: filter }, this.listUrl));
32138
- const json = (await res.json());
32139
- const data = json.definitions;
32140
- const paging = this.getPaging(json, filter);
32141
- return { res, data, paging };
32142
- }
32143
- async getByIdentifier(identifier) {
32144
- const url = `${this.listUrl}/${encodeURIComponent(identifier)}`;
32145
- const headers = { accept: 'application/json' };
32146
- const res = await this.fetch(url, this.changeFetchOptions({ headers }, url));
32147
- if (res.status === 404) {
32148
- throw new Error(`Property Definition with identifier '${identifier}' not found (404).`);
32149
- }
32150
- if (!res.ok) {
32151
- throw new Error(`Error fetching Property Definition '${identifier}': ${res.status} ${res.statusText}`);
32152
- }
32153
- return (await res.json());
32154
- }
32155
- search(searchTerm) {
32156
- return this.list({ titles: [searchTerm] });
32157
- }
32158
- buildFilter(filter) {
32159
- const newFilter = { ...filter };
32160
- ['identifiers', 'titles', 'tags'].forEach(key => {
32161
- if (Array.isArray(newFilter[key])) {
32162
- newFilter[key] = newFilter[key].join(',');
32163
- }
32164
- });
32165
- return newFilter;
32166
- }
32167
- getPaging(json, filter) {
32168
- if (json.pageStatistics) {
32169
- const { currentPage, hasMorePages } = json.pageStatistics;
32170
- const statistics = {
32171
- ...json.pageStatistics,
32172
- nextPage: hasMorePages ? currentPage + 1 : null,
32173
- prevPage: currentPage > 1 ? currentPage - 1 : null,
32174
- totalPages: json.pageStatistics.pageCount,
32175
- totalElements: json.totalCount
32176
- };
32177
- return new Paging(this, statistics, filter);
32178
- }
32179
- return null;
32180
- }
32181
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AssetPropertyService, deps: [{ token: i1.FetchClient }, { token: AppStateService }], target: i0.ɵɵFactoryTarget.Injectable }); }
32182
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AssetPropertyService, providedIn: 'root' }); }
32183
- }
32184
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AssetPropertyService, decorators: [{
32185
- type: Injectable,
32186
- args: [{
32187
- providedIn: 'root'
32188
- }]
32189
- }], ctorParameters: () => [{ type: i1.FetchClient }, { type: AppStateService }] });
32190
-
32191
- class CustomColumnService {
32192
- constructor(assetPropertiesService, bottomDrawerService, bsModalService) {
32193
- this.assetPropertiesService = assetPropertiesService;
32194
- this.bottomDrawerService = bottomDrawerService;
32195
- this.bsModalService = bsModalService;
32196
- }
32197
- async openCustomColumns(existingColumns, onAdd) {
32198
- const dtmAvailable = await this.assetPropertiesService.canRetrieveAssetProperties();
32199
- if (dtmAvailable) {
32200
- this.openDrawer(onAdd);
32201
- }
32202
- else {
32203
- this.openModal(existingColumns, onAdd);
32204
- }
32205
- }
32206
- openModal(columns, onAdd) {
32207
- const modalRef = this.bsModalService.show(ConfigureCustomColumnComponent, {
32208
- class: 'modal-sm',
32209
- ignoreBackdropClick: true,
32210
- initialState: { columns }
32211
- });
32212
- modalRef.content.onAddCustomColumn
32213
- .pipe(tap((cfg) => onAdd(cfg)), takeUntil(modalRef.onHidden))
32214
- .subscribe();
32215
- }
32216
- async openDrawer(onAdd) {
32217
- // Importing here because otherwise introducing a circular dependency between data-grid and asset-property-grid compponents.
32218
- const { AssetPropertyGridComponent } = await import('./c8y-ngx-components-asset-property-grid.component-CmhkghTo.mjs');
32219
- const drawerRef = this.bottomDrawerService.openDrawer(AssetPropertyGridComponent);
32220
- drawerRef.instance.onAddCustomColumn
32221
- .pipe(tap((cfg) => onAdd(cfg)))
32222
- .subscribe();
32223
- }
32224
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomColumnService, deps: [{ token: AssetPropertyService }, { token: BottomDrawerService }, { token: i1$5.BsModalService }], target: i0.ɵɵFactoryTarget.Injectable }); }
32225
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomColumnService, providedIn: 'root' }); }
32226
- }
32227
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CustomColumnService, decorators: [{
32228
- type: Injectable,
32229
- args: [{ providedIn: 'root' }]
32230
- }], ctorParameters: () => [{ type: AssetPropertyService }, { type: BottomDrawerService }, { type: i1$5.BsModalService }] });
32231
-
32232
32403
  const HOOK_FILTER_MAPPER = new InjectionToken('HOOK_FILTER_MAPPER');
32233
32404
  /**
32234
32405
  * You can either provide a single `FilterMapper` as parameter:
@@ -32532,6 +32703,14 @@ class DataGridComponent {
32532
32703
  set _headerActionControls(headerActionControls) {
32533
32704
  this.headerActionControls = headerActionControls || [];
32534
32705
  }
32706
+ /**
32707
+ * In a client side data fed tree-grid, this input determines the name of the
32708
+ * property holding the child nodes of the current node.
32709
+ * Default value is `childNodes`.
32710
+ */
32711
+ set childNodesProperty(childNodesProperty) {
32712
+ this.dataSource.childNodesProperty = childNodesProperty;
32713
+ }
32535
32714
  constructor(configurationStrategy, dataGridService, sanitizer, gainsightService, alertService, actionControlsService, route) {
32536
32715
  this.configurationStrategy = configurationStrategy;
32537
32716
  this.dataGridService = dataGridService;
@@ -32592,6 +32771,11 @@ class DataGridComponent {
32592
32771
  this.expandableRows = 'NONE';
32593
32772
  /** Determines if the Reload button will be hidden. */
32594
32773
  this.hideReload = false;
32774
+ /**
32775
+ * In a tree-grid, this input determines the name of the property that will be used as a label
32776
+ * to refer to the parent node its pagination row.
32777
+ */
32778
+ this.parentNodeLabelProperty = 'id';
32595
32779
  /** Emits an event when mouse is over a row. */
32596
32780
  this.rowMouseOver = new EventEmitter();
32597
32781
  /** Emits an event when mouse leaves a row. */
@@ -32685,9 +32869,15 @@ class DataGridComponent {
32685
32869
  * This is used to avoid having multiple this.loadData() function calls.
32686
32870
  */
32687
32871
  this.triggerLoadData = new EventEmitter();
32872
+ this.isDataRow = (idx, row) => {
32873
+ return !this.isPaginationRow(idx, row);
32874
+ };
32688
32875
  this.isRowExpanded = (_, row) => {
32689
32876
  return !!this.expandedRows.get(row);
32690
32877
  };
32878
+ this.isPaginationRow = (_, row) => {
32879
+ return !!row?.θpagination;
32880
+ };
32691
32881
  this.triggerLoadData.pipe(debounceTime(1), takeUntil(this.unsubscribe$)).subscribe(reload => {
32692
32882
  this.loadData(reload);
32693
32883
  });
@@ -32790,6 +32980,13 @@ class DataGridComponent {
32790
32980
  this.expandedRows.delete(row);
32791
32981
  this.tableRef.renderRows();
32792
32982
  }
32983
+ expandNode(row) {
32984
+ row.pagination = row.pagination ?? this.childNodePagination;
32985
+ this.loadData(false, row);
32986
+ }
32987
+ collapseNode(row) {
32988
+ this.dataSource.collapseNode(row);
32989
+ }
32793
32990
  setColumns(config) {
32794
32991
  if (!!this.configurationStrategy && !isEmpty(this._columns)) {
32795
32992
  this.columns = this.dataGridService.applyConfigToColumns(config, this._columns);
@@ -32985,6 +33182,18 @@ class DataGridComponent {
32985
33182
  }
32986
33183
  this.triggerEvent({ action: PX_ACTIONS.CHANGE_PAGINATION, itemsPerPage, page });
32987
33184
  }
33185
+ updateChildPagination({ itemsPerPage, page }, { parentRow }) {
33186
+ if (page === parentRow?.pagination?.currentPage &&
33187
+ itemsPerPage === parentRow?.pagination?.pageSize) {
33188
+ // avoid endless loop through same page feedback
33189
+ return;
33190
+ }
33191
+ parentRow.pagination = {
33192
+ currentPage: page,
33193
+ pageSize: itemsPerPage
33194
+ };
33195
+ this.loadData(false, parentRow);
33196
+ }
32988
33197
  clickReload() {
32989
33198
  this.searchText = '';
32990
33199
  this.reload();
@@ -33179,7 +33388,7 @@ class DataGridComponent {
33179
33388
  }
33180
33389
  return config;
33181
33390
  }
33182
- loadData(reload = false) {
33391
+ loadData(reload = false, parentRow) {
33183
33392
  const { rows, columns, pagination, searchText, serverSideDataCallback, selectable, selectionPrimaryKey, infiniteScroll } = this;
33184
33393
  this.dataSource.loadData({
33185
33394
  rows,
@@ -33190,7 +33399,8 @@ class DataGridComponent {
33190
33399
  selectable,
33191
33400
  selectionPrimaryKey,
33192
33401
  infiniteScroll,
33193
- reload
33402
+ reload,
33403
+ parentRow
33194
33404
  });
33195
33405
  }
33196
33406
  updateColumns() {
@@ -33213,7 +33423,14 @@ class DataGridComponent {
33213
33423
  }
33214
33424
  : undefined;
33215
33425
  const expandableRowsColumn = this.expandableRows !== 'NONE' ? new ExpandableRowColumn() : null;
33216
- const columns = [expandableRowsColumn, selectionColumn, ...this.columns, actionsColumn]
33426
+ const treeNodeColums = this.treeGrid ? new TreeNodeColumn() : null;
33427
+ const columns = [
33428
+ treeNodeColums,
33429
+ expandableRowsColumn,
33430
+ selectionColumn,
33431
+ ...this.columns,
33432
+ actionsColumn
33433
+ ]
33217
33434
  .filter(Boolean)
33218
33435
  .map(this.withColumnDefaults);
33219
33436
  this.columns = uniqBy(columns, 'name');
@@ -33241,14 +33458,16 @@ class DataGridComponent {
33241
33458
  return {
33242
33459
  visible: true,
33243
33460
  positionFixed: false,
33244
- resizable: true,
33461
+ resizable: dataType === 'icon' ? false : true,
33245
33462
  sortable: true,
33246
33463
  sortOrder: '',
33247
33464
  filterable: false,
33248
33465
  ...column,
33249
33466
  dataType,
33250
33467
  gridTrackSize: column.gridTrackSize ||
33251
- `minmax(${minColumnGridTrackSize}px, ${ratiosByColumnTypes[dataType]}fr)`,
33468
+ (dataType === 'icon'
33469
+ ? `max-content`
33470
+ : `minmax(${minColumnGridTrackSize}px, ${ratiosByColumnTypes[dataType]}fr)`),
33252
33471
  headerCSSClassName: (typeof headerCSSClassName === 'string'
33253
33472
  ? headerCSSClassName.split(' ')
33254
33473
  : headerCSSClassName) || [],
@@ -33515,12 +33734,12 @@ class DataGridComponent {
33515
33734
  }
33516
33735
  }
33517
33736
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataGridComponent, deps: [{ token: DATA_GRID_CONFIGURATION_STRATEGY, optional: true }, { token: DataGridService }, { token: i1$2.DomSanitizer }, { token: GainsightService }, { token: AlertService }, { token: ActionControlsExtensionService }, { token: i1$4.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component }); }
33518
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DataGridComponent, selector: "c8y-data-grid", inputs: { title: "title", loadMoreItemsLabel: "loadMoreItemsLabel", loadingItemsLabel: "loadingItemsLabel", showSearch: "showSearch", refresh: "refresh", _columns: ["columns", "_columns"], _rows: ["rows", "_rows"], _pagination: ["pagination", "_pagination"], _infiniteScroll: ["infiniteScroll", "_infiniteScroll"], _serverSideDataCallback: ["serverSideDataCallback", "_serverSideDataCallback"], _selectable: ["selectable", "_selectable"], _singleSelection: ["singleSelection", "_singleSelection"], _selectionPrimaryKey: ["selectionPrimaryKey", "_selectionPrimaryKey"], _displayOptions: ["displayOptions", "_displayOptions"], _actionControls: ["actionControls", "_actionControls"], _bulkActionControls: ["bulkActionControls", "_bulkActionControls"], _headerActionControls: ["headerActionControls", "_headerActionControls"], searchText: "searchText", configureColumnsEnabled: "configureColumnsEnabled", showCounterWarning: "showCounterWarning", activeClassName: "activeClassName", expandableRows: "expandableRows", hideReload: "hideReload" }, outputs: { rowMouseOver: "rowMouseOver", rowMouseLeave: "rowMouseLeave", rowClick: "rowClick", onConfigChange: "onConfigChange", onBeforeFilter: "onBeforeFilter", onBeforeSearch: "onBeforeSearch", onFilter: "onFilter", itemsSelect: "itemsSelect", onReload: "onReload", onAddCustomColumn: "onAddCustomColumn", onRemoveCustomColumn: "onRemoveCustomColumn", onColumnFilterReset: "onColumnFilterReset", onSort: "onSort", onPageSizeChange: "onPageSizeChange", onColumnReordered: "onColumnReordered", onColumnVisibilityChange: "onColumnVisibilityChange" }, host: { classAttribute: "d-contents" }, providers: [
33737
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DataGridComponent, selector: "c8y-data-grid", inputs: { title: "title", loadMoreItemsLabel: "loadMoreItemsLabel", loadingItemsLabel: "loadingItemsLabel", showSearch: "showSearch", refresh: "refresh", _columns: ["columns", "_columns"], _rows: ["rows", "_rows"], _pagination: ["pagination", "_pagination"], childNodePagination: "childNodePagination", _infiniteScroll: ["infiniteScroll", "_infiniteScroll"], _serverSideDataCallback: ["serverSideDataCallback", "_serverSideDataCallback"], _selectable: ["selectable", "_selectable"], _singleSelection: ["singleSelection", "_singleSelection"], _selectionPrimaryKey: ["selectionPrimaryKey", "_selectionPrimaryKey"], _displayOptions: ["displayOptions", "_displayOptions"], _actionControls: ["actionControls", "_actionControls"], _bulkActionControls: ["bulkActionControls", "_bulkActionControls"], _headerActionControls: ["headerActionControls", "_headerActionControls"], searchText: "searchText", configureColumnsEnabled: "configureColumnsEnabled", showCounterWarning: "showCounterWarning", activeClassName: "activeClassName", expandableRows: "expandableRows", treeGrid: "treeGrid", hideReload: "hideReload", childNodesProperty: "childNodesProperty", parentNodeLabelProperty: "parentNodeLabelProperty" }, outputs: { rowMouseOver: "rowMouseOver", rowMouseLeave: "rowMouseLeave", rowClick: "rowClick", onConfigChange: "onConfigChange", onBeforeFilter: "onBeforeFilter", onBeforeSearch: "onBeforeSearch", onFilter: "onFilter", itemsSelect: "itemsSelect", onReload: "onReload", onAddCustomColumn: "onAddCustomColumn", onRemoveCustomColumn: "onRemoveCustomColumn", onColumnFilterReset: "onColumnFilterReset", onSort: "onSort", onPageSizeChange: "onPageSizeChange", onColumnReordered: "onColumnReordered", onColumnVisibilityChange: "onColumnVisibilityChange" }, host: { classAttribute: "d-contents" }, providers: [
33519
33738
  {
33520
33739
  provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,
33521
33740
  useExisting: forwardRef(() => DataGridComponent)
33522
33741
  }
33523
- ], queries: [{ propertyName: "expandableRow", first: true, predicate: ExpandableRowDirective, descendants: true }, { propertyName: "emptyState", first: true, predicate: EmptyStateContextDirective, descendants: true }, { propertyName: "columnRenderers", predicate: ColumnDirective }], viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scroll"], descendants: true, static: true }, { propertyName: "infiniteScrollContainer", first: true, predicate: ["infiniteScrollContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "tableRef", first: true, predicate: CdkTable, descendants: true }, { propertyName: "thRefs", predicate: CdkHeaderCell, descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"table-data-grid-scroll\"\n #scroll\n [ngClass]=\"{\n 'table-data-grid__overlay': (dataSource.loading$ | async) && !loadMoreComponent?.isLoading\n }\"\n data-cy=\"c8y-data-grid--table-data-grid-scroll\"\n>\n <div\n class=\"table-data-grid__loading--wrapper\"\n *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent?.isLoading\"\n >\n <div class=\"table-data-grid__loading--loader\">\n <c8y-loading\n layout=\"application\"\n [message]=\"loadingItemsLabel\"\n ></c8y-loading>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-header separator large-padding\"\n *ngIf=\"displayOptions.gridHeader\"\n >\n <div\n class=\"h4\"\n [ngClass]=\"{ 'm-r-16': !!title }\"\n >\n {{ title | translate }}\n </div>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <small\n class=\"m-r-4\"\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n <span\n class=\"label label-default m-r-4\"\n translate\n >\n No filters\n </span>\n </span>\n <span\n class=\"d-flex a-i-center\"\n *ngIf=\"filteringApplied\"\n >\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <div class=\"a-i-center\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n of {{ allItemsCount }} items\n </small>\n </div>\n </ng-container>\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n dropdown\n #ddFilters=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddFilters.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn btn-default btn-sm m-l-8\"\n title=\"{{ 'Active filters' | translate }}\"\n aria-haspopup=\"true\"\n dropdownToggle\n data-cy=\"c8y-data-grid--filters\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"filter\"\n ></i>\n <span>{{ 'Active filters' | translate }}</span>\n <span class=\"badge badge-system\">\n {{ columnsWithFiltersApplied.length }}\n </span>\n </button>\n\n <div\n class=\"dropdown-menu\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"data-grid__dropdown bg-level-0\">\n <ul class=\"list-unstyled m-0\">\n <li\n *ngFor=\"let column of columnsWithFiltersApplied; let last = last\"\n [ngClass]=\"{ 'separator-bottom': !last }\"\n >\n <ng-container>\n <div\n class=\"dropdown-header sticky-top text-truncate no-border-top p-b-0\"\n title=\"{{ (column.header | translate) || column.name }}\"\n >\n <label>\n {{ (column.header | translate) || column.name }}\n </label>\n </div>\n <div\n class=\"list-group-item borderless d-flex d-col\"\n *ngFor=\"\n let groupedFilterChips of column\n | mapToFilterChips\n | async\n | groupedFilterChips;\n let first = first\n \"\n [ngClass]=\"{ 'p-t-0': first }\"\n >\n <p\n class=\"small p-b-4\"\n *ngIf=\"groupedFilterChips.label\"\n >\n {{ groupedFilterChips.label | translate }}\n </p>\n <div class=\"d-flex a-i-center gap-4 flex-wrap\">\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let chip of groupedFilterChips.chips\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ 'Remove filter' | translate }}\"\n (click)=\"removeFilter(chip.remove())\"\n data-cy=\"c8y-data-grid--remove-chip\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ chip.displayValue | translate }}\n </span>\n </div>\n </div>\n </ng-container>\n </li>\n </ul>\n </div>\n <div class=\"list-group-item separator-top sticky-bottom\">\n <button\n class=\"btn btn-sm btn-default\"\n title=\"{{ 'Clear all filters' | translate }}\"\n type=\"button\"\n (click)=\"clearFilters()\"\n data-cy=\"c8y-data-grid--clear-filters\"\n >\n {{ 'Clear all filters' | translate }}\n </button>\n </div>\n </div>\n </div>\n </span>\n\n <button\n class=\"btn-help btn-help--sm hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"filtersHelpPopover\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"displayOptions.filter\"\n data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n <ng-template #filtersHelpPopover>\n <div [innerHtml]=\"filtersHelpPopoverHtml | translate\"></div>\n </ng-template>\n\n <button\n class=\"btn-clean text-primary hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'The counter for the total number of items might be inaccurate.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"showCounterWarning\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n </ng-container>\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n <ng-container\n *ngFor=\"let headerActionControl of headerActionControls | visibleControls | async\"\n >\n <ng-container *ngIf=\"!headerActionControl.template; else customTemplate\">\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ headerActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"headerActionControl.callback()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION,\n customActionName: headerActionControl.text,\n type: headerActionControl.type\n }\"\n >\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"headerActionControl.icon\"\n ></i>\n <span>{{ headerActionControl.text | translate }}</span>\n </button>\n </ng-container>\n <ng-template #customTemplate>\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n *ngIf=\"configureColumnsEnabled\"\n dropdown\n #ddConfigureColumns=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddConfigureColumns.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Configure columns' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--custom-column-btn\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"columns\"\n ></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul\n class=\"dropdown-menu data-grid__dropdown\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <li>\n <div\n class=\"list-group m-0\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n >\n <div\n *ngFor=\"let column of columns\"\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 a-i-center\">\n <label\n class=\"c8y-checkbox p-l-16\"\n title=\"{{ (column.header | translate) || column.name }}\"\n [attr.data-cy]=\"'data-grid--custom-column-header-' + column.header\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"\n updateGridColumnsSize(); emitConfigChange('changeColumnVisibility')\n \"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CHANGE_VISIBILITY,\n column: column.name,\n visible: !column.visible\n }\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n <button\n class=\"btn btn-dot showOnHover max-width-fit a-i-center\"\n [attr.aria-label]=\"'Remove`column,verb`' | translate\"\n tooltip=\"{{ 'Remove`column,verb`' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n (click)=\"removeCustomColumn(poConfirm, column, ddConfigureColumns)\"\n *ngIf=\"column.custom\"\n >\n <c8y-popover-confirm\n [title]=\"'Confirm removal' | translate\"\n triggers=\"focus\"\n [placement]=\"'left'\"\n #poConfirm\n ></c8y-popover-confirm>\n <i\n c8yIcon=\"minus-circle\"\n data-cy=\"data-grid--custom-column-remove-btn\"\n ></i>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n <li\n class=\"p-8 sticky-bottom separator-top\"\n *ngIf=\"isConfigContextKnown\"\n >\n <button\n class=\"btn btn-default btn-block\"\n title=\"{{ 'Add custom column' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--add-custom-column\"\n (click)=\"openCustomColumn(); ddConfigureColumns.hide()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"plus-circle\"\n ></i>\n <span>{{ 'Add custom column' | translate }}</span>\n </button>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n *ngIf=\"!hideReload\"\n data-cy=\"data-grid--reload-btn\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"clickReload()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n ></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div\n class=\"input-group input-group-search m-l-sm-16 data-grid__search-input\"\n *ngIf=\"!serverSideDataCallback || showSearch\"\n >\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n type=\"search\"\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"searchText$.emit($event)\"\n (keydown.enter)=\"$event.stopPropagation(); performSearch(searchText)\"\n />\n <div class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"searchText.length === 0\"\n ></i>\n <i\n class=\"pointer\"\n c8yIcon=\"times\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n data-cy=\"table-data-grid-header-bulk-actions\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <ng-container [ngPlural]=\"selectedItemIds.length\">\n <ng-template ngPluralCase=\"=1\">\n <span translate>1 selected item.</span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: selectedItemIds.length }\"\n >\n {{ count }} selected items.\n </span>\n </ng-template>\n </ng-container>\n <br class=\"visible-xs\" />\n <small *ngIf=\"!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize\">\n <a\n class=\"interact\"\n (click)=\"setAllItemsSelected(true)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n <ng-container\n *ngFor=\"\n let bulkActionControl of bulkActionControls | visibleControls: selectedItemIds | async\n \"\n >\n <ng-container [ngSwitch]=\"bulkActionControl.type\">\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Export\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_EXPORT }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_DELETE }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ bulkActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchDefault\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CUSTOM_ACTION,\n customActionName: bulkActionControl.text\n }\"\n c8yProductExperience\n inherit\n >\n <i\n [class]=\"bulkActionControl.iconClasses\"\n c8yIcon=\"{{ bulkActionControl.icon }}\"\n ></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CANCEL\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-filtered-sorted table-data-grid large-padding\"\n [class.table-striped]=\"displayOptions.striped\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-hover]=\"displayOptions.hover\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n cdk-table\n [dataSource]=\"dataSource\"\n [multiTemplateDataRows]=\"true\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n data-cy=\"c8y-data-grid--table\"\n >\n <ng-container\n *ngFor=\"let column of columns; let i = index; trackBy: trackByName\"\n [cdkColumnDef]=\"column.name\"\n >\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <div>\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--checkbox\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n ></th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-radio\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n name=\"select-row\"\n type=\"radio\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"changeSelectedItem(row)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--radio\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <p class=\"text-medium sr-only\">{{ 'Actions' | translate }}</p>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <ng-container\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice: 0 : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"'Edit' | translate\"\n tooltip=\"{{ 'Edit' | translate }}\"\n container=\"body\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--edit-button-in-row\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n data-cy=\"c8y-data-grid--remove-button-in-row\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"(actionControl.icon ? actionControl.text : '') | translate\"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ showOnHover: actionControl.showOnHover }\"\n [delay]=\"500\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n [attr.data-cy]=\"'c8y-data-grid--button-in-row--' + actionControl.text\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n *ngIf=\"actionControl.icon\"\n ></i>\n <span *ngIf=\"!actionControl.icon\">{{ actionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <div\n [ngClass]=\"{\n 'm-l-auto overflow-visible':\n (actionControls | visibleControls: row | async)?.length > 2\n }\"\n >\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\n *ngIf=\"(actionControls | visibleControls: row | async)?.length > 2\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Actions' | translate }}\"\n aria-haspopup=\"true\"\n type=\"button\"\n data-cy=\"c8y-data-grid--row-actions-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n *dropdownMenu\n >\n <li\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EXPORT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"data-export\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n ></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n >\n <div\n [title]=\"(column.header | translate) || column.name\"\n *ngIf=\"!column.filterable\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <div\n class=\"dropdown\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\n *ngIf=\"column.filterable\"\n dropdown\n #gridHeaderDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"gridHeaderDropdown.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn-header\"\n [title]=\"(column.header | translate) || column.name\"\n type=\"button\"\n [attr.data-cy]=\"'data-grid--header-btn--' + column.header\"\n dropdownToggle\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer\n data-cy=\"c8y-data-grid--c8y-cell-renderer\"\n [spec]=\"cellRendererSpec\"\n ></c8y-cell-renderer>\n </ng-container>\n <i\n c8yIcon=\"filter\"\n title=\"{{ 'Filter' | translate }}\"\n ></i>\n </button>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <ul\n class=\"dropdown-menu\"\n *dropdownMenu\n [ngClass]=\"{ 'dropdown-menu-right-grid': isDropDownPlacedRight(column) }\"\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec : this as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer\n class=\"bg-component\"\n [spec]=\"filteringFormRendererSpec\"\n data-cy=\"c8y-data-grid--c8y-filtering-form-renderer\"\n ></c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btn-sort\"\n [style]=\"{ 'margin-left': !column.filterable && column.sortable ? '-20px' : null }\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n *ngIf=\"column.sortable\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i\n c8yIcon=\"long-arrow-up\"\n *ngSwitchCase=\"'asc'\"\n ></i>\n <i\n c8yIcon=\"long-arrow-down\"\n *ngSwitchCase=\"'desc'\"\n ></i>\n <i\n c8yIcon=\"exchange\"\n *ngSwitchDefault\n ></i>\n </ng-container>\n </button>\n\n <span\n class=\"resize-handle\"\n *ngIf=\"column.resizable\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n </th>\n\n <td\n [class.hidden]=\"!column.visible\"\n [attr.data-cell-title]=\"column.header | translate\"\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cy]=\"'data-grid--' + column.header\"\n [attr.data-type]=\"column.dataType\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-footer-cell\n *cdkFooterCellDef\n >\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr\n cdk-header-row\n *cdkHeaderRowDef=\"columnNames\"\n ></tr>\n\n <tr\n data-cy=\"c8y-data-grid--row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames; let idx = dataIndex\"\n [ngClass]=\"[\n activeClassName && row === lastClickedRow ? activeClassName : '',\n idx % 2 === 0 ? 'even' : 'odd'\n ]\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"handleClick(row)\"\n ></tr>\n\n <tr\n class=\"expanded-row\"\n [ngClass]=\"{ hidden: !(expandedRows.get(row).visible$ | async) }\"\n data-cy=\"c8y-data-grid--expanded-row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['expanded-row']; when: isRowExpanded\"\n ></tr>\n\n <ng-container cdkColumnDef=\"expanded-row\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n expandableRow?.template;\n context: {\n $implicit: row,\n asyncRenderSuccess: setExpandableRowVisible.bind(this, row, true),\n asyncRenderFail: setExpandableRowVisible.bind(this, row, false)\n }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <ng-container>\n <tr\n [ngClass]=\"{ hidden: !infiniteScroll }\"\n cdk-footer-row\n *cdkFooterRowDef=\"['infiniteScrollFooter']\"\n ></tr>\n </ng-container>\n </table>\n\n <div\n class=\"d-flex m-0 p-t-40 p-b-40\"\n *ngIf=\"\n !(dataSource.loading$ | async) &&\n ((dataSource.stats$ | async).filteredSize === 0 || (dataSource.data$ | async).length === 0)\n \"\n >\n <div class=\"col-lg-3 col-sm-4 m-l-auto m-r-auto\">\n <ng-content select=\"c8y-ui-empty-state, .c8y-empty-state\"></ng-content>\n <ng-container\n *ngTemplateOutlet=\"\n emptyState?.templateRef;\n context: { $implicit: emptyStateContext$ | async }\n \"\n ></ng-container>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-footer separator large-padding\"\n *ngIf=\"pagination && !infiniteScroll\"\n >\n <div class=\"col-sm-4 no-gutter\">\n <div\n class=\"counter p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n data-cy=\"data-grid--counter\"\n >\n <span\n class=\"text-muted\"\n ngNonBindable\n translate\n [translateParams]=\"paginationLabelParams\"\n >\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n class=\"form-group form-inline p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n >\n <label\n class=\"m-r-4\"\n for=\"filteredSize\"\n >\n {{ 'Items per page' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"filteredSize\"\n data-cy=\"data-grid--pagesize-options\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option\n *ngFor=\"let pageSize of possiblePageSizes\"\n [ngValue]=\"pageSize\"\n >\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n [class.hidden]=\"hidePagination$ | async\"\n class=\"p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > 0\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount$.next($event)\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n ></pagination>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2$1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i2$1.NgPlural, selector: "[ngPlural]", inputs: ["ngPlural"] }, { kind: "directive", type: i2$1.NgPluralCase, selector: "[ngPluralCase]" }, { kind: "component", type: i8.CdkTable, selector: "cdk-table, table[cdk-table]", inputs: ["trackBy", "dataSource", "multiTemplateDataRows", "fixedLayout"], outputs: ["contentChanged"], exportAs: ["cdkTable"] }, { kind: "directive", type: i8.CdkRowDef, selector: "[cdkRowDef]", inputs: ["cdkRowDefColumns", "cdkRowDefWhen"] }, { kind: "directive", type: i8.CdkCellDef, selector: "[cdkCellDef]" }, { kind: "directive", type: i8.CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { kind: "directive", type: i8.CdkFooterCellDef, selector: "[cdkFooterCellDef]" }, { kind: "directive", type: i8.CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["cdkColumnDef", "sticky", "stickyEnd"] }, { kind: "directive", type: i8.CdkCell, selector: "cdk-cell, td[cdk-cell]" }, { kind: "component", type: i8.CdkRow, selector: "cdk-row, tr[cdk-row]" }, { kind: "directive", type: i8.CdkHeaderCell, selector: "cdk-header-cell, th[cdk-header-cell]" }, { kind: "directive", type: i8.CdkFooterCell, selector: "cdk-footer-cell, td[cdk-footer-cell]" }, { kind: "component", type: i8.CdkHeaderRow, selector: "cdk-header-row, tr[cdk-header-row]" }, { kind: "directive", type: i8.CdkHeaderRowDef, selector: "[cdkHeaderRowDef]", inputs: ["cdkHeaderRowDef", "cdkHeaderRowDefSticky"] }, { kind: "component", type: i8.CdkFooterRow, selector: "cdk-footer-row, tr[cdk-footer-row]" }, { kind: "directive", type: i8.CdkFooterRowDef, selector: "[cdkFooterRowDef]", inputs: ["cdkFooterRowDef", "cdkFooterRowDefSticky"] }, { kind: "directive", type: i5$2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i5$2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2$4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$4.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: i2$4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2$4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: PopoverConfirmComponent, selector: "c8y-popover-confirm", inputs: ["buttons", "message", "title", "isOpen", "containerClass", "placement", "outsideClick", "adaptivePosition", "container"] }, { kind: "directive", type: i1$3.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i1$3.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i1$3.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i2$5.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i2$3.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i18.PaginationComponent, selector: "pagination", inputs: ["align", "maxSize", "boundaryLinks", "directionLinks", "firstText", "previousText", "nextText", "lastText", "rotate", "pageBtnClass", "disabled", "customPageTemplate", "customNextTemplate", "customPreviousTemplate", "customFirstTemplate", "customLastTemplate", "itemsPerPage", "totalItems"], outputs: ["numPages", "pageChanged"] }, { kind: "directive", type: ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "directive", type: i3.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: CellRendererComponent, selector: "c8y-cell-renderer", inputs: ["spec"] }, { kind: "component", type: FilteringFormRendererComponent, selector: "c8y-filtering-form-renderer", inputs: ["spec"] }, { kind: "pipe", type: i2$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.SlicePipe, name: "slice" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: MapFunctionPipe, name: "map" }, { kind: "pipe", type: FilterMapperPipe, name: "mapToFilterChips" }, { kind: "pipe", type: GroupedFilterChips, name: "groupedFilterChips" }, { kind: "pipe", type: VisibleControlsPipe, name: "visibleControls" }] }); }
33742
+ ], queries: [{ propertyName: "expandableRow", first: true, predicate: ExpandableRowDirective, descendants: true }, { propertyName: "emptyState", first: true, predicate: EmptyStateContextDirective, descendants: true }, { propertyName: "columnRenderers", predicate: ColumnDirective }], viewQueries: [{ propertyName: "scrollContainer", first: true, predicate: ["scroll"], descendants: true, static: true }, { propertyName: "infiniteScrollContainer", first: true, predicate: ["infiniteScrollContainer"], descendants: true, read: ViewContainerRef }, { propertyName: "tableRef", first: true, predicate: CdkTable, descendants: true }, { propertyName: "thRefs", predicate: CdkHeaderCell, descendants: true, read: ElementRef }], usesOnChanges: true, ngImport: i0, template: "<div\n class=\"table-data-grid-scroll\"\n #scroll\n [ngClass]=\"{\n 'table-data-grid__overlay': (dataSource.loading$ | async) && !loadMoreComponent?.isLoading\n }\"\n data-cy=\"c8y-data-grid--table-data-grid-scroll\"\n>\n <div\n class=\"table-data-grid__loading--wrapper\"\n *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent?.isLoading\"\n >\n <div class=\"table-data-grid__loading--loader\">\n <c8y-loading\n layout=\"application\"\n [message]=\"loadingItemsLabel\"\n ></c8y-loading>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-header separator large-padding\"\n *ngIf=\"displayOptions.gridHeader\"\n >\n <div\n class=\"h4\"\n [ngClass]=\"{ 'm-r-16': !!title }\"\n >\n {{ title | translate }}\n </div>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <small\n class=\"m-r-4\"\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n <span\n class=\"label label-default m-r-4\"\n translate\n >\n No filters\n </span>\n </span>\n <span\n class=\"d-flex a-i-center\"\n *ngIf=\"filteringApplied\"\n >\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <div class=\"a-i-center\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n of {{ allItemsCount }} items\n </small>\n </div>\n </ng-container>\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n dropdown\n #ddFilters=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddFilters.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn btn-default btn-sm m-l-8\"\n title=\"{{ 'Active filters' | translate }}\"\n aria-haspopup=\"true\"\n dropdownToggle\n data-cy=\"c8y-data-grid--filters\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"filter\"\n ></i>\n <span>{{ 'Active filters' | translate }}</span>\n <span class=\"badge badge-system\">\n {{ columnsWithFiltersApplied.length }}\n </span>\n </button>\n\n <div\n class=\"dropdown-menu\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"data-grid__dropdown bg-level-0\">\n <ul class=\"list-unstyled m-0\">\n <li\n *ngFor=\"let column of columnsWithFiltersApplied; let last = last\"\n [ngClass]=\"{ 'separator-bottom': !last }\"\n >\n <ng-container>\n <div\n class=\"dropdown-header sticky-top text-truncate no-border-top p-b-0\"\n title=\"{{ (column.header | translate) || column.name }}\"\n >\n <label>\n {{ (column.header | translate) || column.name }}\n </label>\n </div>\n <div\n class=\"list-group-item borderless d-flex d-col\"\n *ngFor=\"\n let groupedFilterChips of column\n | mapToFilterChips\n | async\n | groupedFilterChips;\n let first = first\n \"\n [ngClass]=\"{ 'p-t-0': first }\"\n >\n <p\n class=\"small p-b-4\"\n *ngIf=\"groupedFilterChips.label\"\n >\n {{ groupedFilterChips.label | translate }}\n </p>\n <div class=\"d-flex a-i-center gap-4 flex-wrap\">\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let chip of groupedFilterChips.chips\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ 'Remove filter' | translate }}\"\n (click)=\"removeFilter(chip.remove())\"\n data-cy=\"c8y-data-grid--remove-chip\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ chip.displayValue | translate }}\n </span>\n </div>\n </div>\n </ng-container>\n </li>\n </ul>\n </div>\n <div class=\"list-group-item separator-top sticky-bottom\">\n <button\n class=\"btn btn-sm btn-default\"\n title=\"{{ 'Clear all filters' | translate }}\"\n type=\"button\"\n (click)=\"clearFilters()\"\n data-cy=\"c8y-data-grid--clear-filters\"\n >\n {{ 'Clear all filters' | translate }}\n </button>\n </div>\n </div>\n </div>\n </span>\n\n <button\n class=\"btn-help btn-help--sm hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"filtersHelpPopover\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"displayOptions.filter\"\n data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n <ng-template #filtersHelpPopover>\n <div [innerHtml]=\"filtersHelpPopoverHtml | translate\"></div>\n </ng-template>\n\n <button\n class=\"btn-clean text-primary hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'The counter for the total number of items might be inaccurate.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"showCounterWarning\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n </ng-container>\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n <ng-container\n *ngFor=\"let headerActionControl of headerActionControls | visibleControls | async\"\n >\n <ng-container *ngIf=\"!headerActionControl.template; else customTemplate\">\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ headerActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"headerActionControl.callback()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION,\n customActionName: headerActionControl.text,\n type: headerActionControl.type\n }\"\n >\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"headerActionControl.icon\"\n ></i>\n <span>{{ headerActionControl.text | translate }}</span>\n </button>\n </ng-container>\n <ng-template #customTemplate>\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n *ngIf=\"configureColumnsEnabled\"\n dropdown\n #ddConfigureColumns=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddConfigureColumns.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Configure columns' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--custom-column-btn\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"columns\"\n ></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul\n class=\"dropdown-menu data-grid__dropdown\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <li>\n <div\n class=\"list-group m-0\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n >\n <div\n *ngFor=\"let column of columns\"\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 a-i-center\">\n <label\n class=\"c8y-checkbox p-l-16\"\n title=\"{{ (column.header | translate) || column.name }}\"\n [attr.data-cy]=\"'data-grid--custom-column-header-' + column.header\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"\n updateGridColumnsSize(); emitConfigChange('changeColumnVisibility')\n \"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CHANGE_VISIBILITY,\n column: column.name,\n visible: !column.visible\n }\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n <button\n class=\"btn btn-dot showOnHover max-width-fit a-i-center\"\n [attr.aria-label]=\"'Remove`column,verb`' | translate\"\n tooltip=\"{{ 'Remove`column,verb`' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n (click)=\"removeCustomColumn(poConfirm, column, ddConfigureColumns)\"\n *ngIf=\"column.custom\"\n >\n <c8y-popover-confirm\n [title]=\"'Confirm removal' | translate\"\n triggers=\"focus\"\n [placement]=\"'left'\"\n #poConfirm\n ></c8y-popover-confirm>\n <i\n c8yIcon=\"minus-circle\"\n data-cy=\"data-grid--custom-column-remove-btn\"\n ></i>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n <li\n class=\"p-8 sticky-bottom separator-top\"\n *ngIf=\"isConfigContextKnown\"\n >\n <button\n class=\"btn btn-default btn-block\"\n title=\"{{ 'Add custom column' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--add-custom-column\"\n (click)=\"openCustomColumn(); ddConfigureColumns.hide()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"plus-circle\"\n ></i>\n <span>{{ 'Add custom column' | translate }}</span>\n </button>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n *ngIf=\"!hideReload\"\n data-cy=\"data-grid--reload-btn\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"clickReload()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n ></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div\n class=\"input-group input-group-search m-l-sm-16 data-grid__search-input\"\n *ngIf=\"!serverSideDataCallback || showSearch\"\n >\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n type=\"search\"\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"searchText$.emit($event)\"\n (keydown.enter)=\"$event.stopPropagation(); performSearch(searchText)\"\n />\n <div class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"searchText.length === 0\"\n ></i>\n <i\n class=\"pointer\"\n c8yIcon=\"times\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n data-cy=\"table-data-grid-header-bulk-actions\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <ng-container [ngPlural]=\"selectedItemIds.length\">\n <ng-template ngPluralCase=\"=1\">\n <span translate>1 selected item.</span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: selectedItemIds.length }\"\n >\n {{ count }} selected items.\n </span>\n </ng-template>\n </ng-container>\n <br class=\"visible-xs\" />\n <small *ngIf=\"!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize\">\n <a\n class=\"interact\"\n (click)=\"setAllItemsSelected(true)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n <ng-container\n *ngFor=\"\n let bulkActionControl of bulkActionControls | visibleControls: selectedItemIds | async\n \"\n >\n <ng-container [ngSwitch]=\"bulkActionControl.type\">\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Export\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_EXPORT }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_DELETE }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ bulkActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchDefault\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CUSTOM_ACTION,\n customActionName: bulkActionControl.text\n }\"\n c8yProductExperience\n inherit\n >\n <i\n [class]=\"bulkActionControl.iconClasses\"\n c8yIcon=\"{{ bulkActionControl.icon }}\"\n ></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CANCEL\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-filtered-sorted table-data-grid large-padding\"\n [class.table-striped]=\"displayOptions.striped && !treeGrid\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-hover]=\"displayOptions.hover\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n cdk-table\n [dataSource]=\"dataSource\"\n [multiTemplateDataRows]=\"true\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n data-cy=\"c8y-data-grid--table\"\n >\n <ng-container\n *ngFor=\"let column of columns; let i = index; trackBy: trackByName\"\n [cdkColumnDef]=\"column.name\"\n >\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <div>\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--checkbox\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n ></th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-radio\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n name=\"select-row\"\n type=\"radio\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"changeSelectedItem(row)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--radio\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <p class=\"text-medium sr-only\">{{ 'Actions' | translate }}</p>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <ng-container\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice: 0 : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"'Edit' | translate\"\n tooltip=\"{{ 'Edit' | translate }}\"\n container=\"body\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--edit-button-in-row\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n data-cy=\"c8y-data-grid--remove-button-in-row\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"(actionControl.icon ? actionControl.text : '') | translate\"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ showOnHover: actionControl.showOnHover }\"\n [delay]=\"500\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n [attr.data-cy]=\"'c8y-data-grid--button-in-row--' + actionControl.text\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n *ngIf=\"actionControl.icon\"\n ></i>\n <span *ngIf=\"!actionControl.icon\">{{ actionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <div\n [ngClass]=\"{\n 'm-l-auto overflow-visible':\n (actionControls | visibleControls: row | async)?.length > 2\n }\"\n >\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\n *ngIf=\"(actionControls | visibleControls: row | async)?.length > 2\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Actions' | translate }}\"\n aria-haspopup=\"true\"\n type=\"button\"\n data-cy=\"c8y-data-grid--row-actions-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n *dropdownMenu\n >\n <li\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EXPORT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"data-export\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n ></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n >\n <div\n [title]=\"(column.header | translate) || column.name\"\n *ngIf=\"!column.filterable\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <div\n class=\"dropdown\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\n *ngIf=\"column.filterable\"\n dropdown\n #gridHeaderDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"gridHeaderDropdown.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn-header\"\n [title]=\"(column.header | translate) || column.name\"\n type=\"button\"\n [attr.data-cy]=\"'data-grid--header-btn--' + column.header\"\n dropdownToggle\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer\n data-cy=\"c8y-data-grid--c8y-cell-renderer\"\n [spec]=\"cellRendererSpec\"\n ></c8y-cell-renderer>\n </ng-container>\n <i\n c8yIcon=\"filter\"\n title=\"{{ 'Filter' | translate }}\"\n ></i>\n </button>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <ul\n class=\"dropdown-menu\"\n *dropdownMenu\n [ngClass]=\"{ 'dropdown-menu-right-grid': isDropDownPlacedRight(column) }\"\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec : this as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer\n class=\"bg-component\"\n [spec]=\"filteringFormRendererSpec\"\n data-cy=\"c8y-data-grid--c8y-filtering-form-renderer\"\n ></c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btn-sort\"\n [style]=\"{ 'margin-left': !column.filterable && column.sortable ? '-20px' : null }\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n *ngIf=\"column.sortable\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i\n c8yIcon=\"long-arrow-up\"\n *ngSwitchCase=\"'asc'\"\n ></i>\n <i\n c8yIcon=\"long-arrow-down\"\n *ngSwitchCase=\"'desc'\"\n ></i>\n <i\n c8yIcon=\"exchange\"\n *ngSwitchDefault\n ></i>\n </ng-container>\n </button>\n\n <span\n class=\"resize-handle\"\n *ngIf=\"column.resizable\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n </th>\n\n <td\n [class.hidden]=\"!column.visible\"\n [attr.data-cell-title]=\"column.header | translate\"\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cy]=\"'data-grid--' + column.header\"\n [attr.data-type]=\"column.dataType\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-footer-cell\n *cdkFooterCellDef\n >\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr\n cdk-header-row\n *cdkHeaderRowDef=\"columnNames\"\n ></tr>\n\n <tr\n data-cy=\"c8y-data-grid--row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames; let idx = dataIndex; when: isDataRow\"\n [ngClass]=\"[\n activeClassName && row === lastClickedRow ? activeClassName : '',\n idx % 2 === 0 ? 'even' : 'odd',\n row.level > 0 ? 'data-grid-child-node' : ''\n ]\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"handleClick(row)\"\n ></tr>\n\n <tr\n class=\"expanded-row\"\n [ngClass]=\"{ hidden: !(expandedRows.get(row).visible$ | async) }\"\n data-cy=\"c8y-data-grid--expanded-row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['expanded-row']; when: isRowExpanded\"\n ></tr>\n\n <ng-container cdkColumnDef=\"expanded-row\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n expandableRow?.template;\n context: {\n $implicit: row,\n asyncRenderSuccess: setExpandableRowVisible.bind(this, row, true),\n asyncRenderFail: setExpandableRowVisible.bind(this, row, false)\n }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <tr\n class=\"pagination-row\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['pagination-row']; when: isPaginationRow\"\n ></tr>\n\n <ng-container cdkColumnDef=\"pagination-row\">\n <td\n [class]=\"'level-' + (row.parentRow.level + 1)\"\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <div class=\"col-sm-4 no-gutter\">\n <div\n class=\"counter p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n data-cy=\"data-grid--child-counter\"\n >\n <span\n class=\"text-muted\"\n ngNonBindable\n translate\n [translateParams]=\"{\n pageFirstItemIdx:\n (row.childrenStats.currentPage - 1) * row.childrenStats.firstPageSize + 1,\n pageLastItemIdx:\n (row.childrenStats.currentPage - 1) * row.childrenStats.firstPageSize +\n 1 +\n (row.childrenStats.currentPageSize - 1),\n itemsTotal: row.childrenStats.filteredSize\n }\"\n >\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n <span class=\"text-muted text-12 m-r-4\">{{ 'Parent node' | translate }}</span>\n <span class=\"tag tag--default\">{{ row.parentRow?.[parentNodeLabelProperty] }}</span>\n </div>\n </div>\n <div class=\"col-sm-4 col-sm-offset-4 no-gutter text-right\">\n <pagination\n class=\"d-flex j-c-end\"\n *ngIf=\"row.childrenStats.filteredSize > row.childrenStats.currentPageSize\"\n [ngModel]=\"row.childrenStats.currentPage\"\n (pageChanged)=\"updateChildPagination($event, row)\"\n [totalItems]=\"row.childrenStats.filteredSize\"\n [itemsPerPage]=\"row?.parentRow?.pagination?.pageSize ?? childNodePagination.pageSize\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n ></pagination>\n </div>\n </td>\n </ng-container>\n\n <ng-container>\n <tr\n [ngClass]=\"{ hidden: !infiniteScroll }\"\n cdk-footer-row\n *cdkFooterRowDef=\"['infiniteScrollFooter']\"\n ></tr>\n </ng-container>\n </table>\n\n <div\n class=\"d-flex m-0 p-t-40 p-b-40\"\n *ngIf=\"\n !(dataSource.loading$ | async) &&\n ((dataSource.stats$ | async).filteredSize === 0 || (dataSource.data$ | async).length === 0)\n \"\n >\n <div class=\"col-lg-3 col-sm-4 m-l-auto m-r-auto\">\n <ng-content select=\"c8y-ui-empty-state, .c8y-empty-state\"></ng-content>\n <ng-container\n *ngTemplateOutlet=\"\n emptyState?.templateRef;\n context: { $implicit: emptyStateContext$ | async }\n \"\n ></ng-container>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-footer separator large-padding\"\n *ngIf=\"pagination && !infiniteScroll\"\n >\n <div class=\"col-sm-4 no-gutter\">\n <div\n class=\"counter p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n data-cy=\"data-grid--counter\"\n >\n <span\n class=\"text-muted\"\n ngNonBindable\n translate\n [translateParams]=\"paginationLabelParams\"\n >\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n class=\"form-group form-inline p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n >\n <label\n class=\"m-r-4\"\n for=\"filteredSize\"\n >\n {{ 'Items per page' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"filteredSize\"\n data-cy=\"data-grid--pagesize-options\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option\n *ngFor=\"let pageSize of possiblePageSizes\"\n [ngValue]=\"pageSize\"\n >\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n [class.hidden]=\"hidePagination$ | async\"\n class=\"d-flex j-c-end\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > 0\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount$.next($event)\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n ></pagination>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i2$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2$1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "directive", type: i2$1.NgPlural, selector: "[ngPlural]", inputs: ["ngPlural"] }, { kind: "directive", type: i2$1.NgPluralCase, selector: "[ngPluralCase]" }, { kind: "component", type: i8.CdkTable, selector: "cdk-table, table[cdk-table]", inputs: ["trackBy", "dataSource", "multiTemplateDataRows", "fixedLayout"], outputs: ["contentChanged"], exportAs: ["cdkTable"] }, { kind: "directive", type: i8.CdkRowDef, selector: "[cdkRowDef]", inputs: ["cdkRowDefColumns", "cdkRowDefWhen"] }, { kind: "directive", type: i8.CdkCellDef, selector: "[cdkCellDef]" }, { kind: "directive", type: i8.CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { kind: "directive", type: i8.CdkFooterCellDef, selector: "[cdkFooterCellDef]" }, { kind: "directive", type: i8.CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["cdkColumnDef", "sticky", "stickyEnd"] }, { kind: "directive", type: i8.CdkCell, selector: "cdk-cell, td[cdk-cell]" }, { kind: "component", type: i8.CdkRow, selector: "cdk-row, tr[cdk-row]" }, { kind: "directive", type: i8.CdkHeaderCell, selector: "cdk-header-cell, th[cdk-header-cell]" }, { kind: "directive", type: i8.CdkFooterCell, selector: "cdk-footer-cell, td[cdk-footer-cell]" }, { kind: "component", type: i8.CdkHeaderRow, selector: "cdk-header-row, tr[cdk-header-row]" }, { kind: "directive", type: i8.CdkHeaderRowDef, selector: "[cdkHeaderRowDef]", inputs: ["cdkHeaderRowDef", "cdkHeaderRowDefSticky"] }, { kind: "component", type: i8.CdkFooterRow, selector: "cdk-footer-row, tr[cdk-footer-row]" }, { kind: "directive", type: i8.CdkFooterRowDef, selector: "[cdkFooterRowDef]", inputs: ["cdkFooterRowDef", "cdkFooterRowDefSticky"] }, { kind: "directive", type: i5$2.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i5$2.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2$4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2$4.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: i2$4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2$4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2$4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "component", type: PopoverConfirmComponent, selector: "c8y-popover-confirm", inputs: ["buttons", "message", "title", "isOpen", "containerClass", "placement", "outsideClick", "adaptivePosition", "container"] }, { kind: "directive", type: i1$3.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i1$3.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i1$3.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i2$5.PopoverDirective, selector: "[popover]", inputs: ["adaptivePosition", "boundariesElement", "popover", "popoverContext", "popoverTitle", "placement", "outsideClick", "triggers", "container", "containerClass", "isOpen", "delay"], outputs: ["onShown", "onHidden"], exportAs: ["bs-popover"] }, { kind: "directive", type: i2$3.TooltipDirective, selector: "[tooltip], [tooltipHtml]", inputs: ["adaptivePosition", "tooltip", "placement", "triggers", "container", "containerClass", "boundariesElement", "isOpen", "isDisabled", "delay", "tooltipHtml", "tooltipPlacement", "tooltipIsOpen", "tooltipEnable", "tooltipAppendToBody", "tooltipAnimation", "tooltipClass", "tooltipContext", "tooltipPopupDelay", "tooltipFadeDuration", "tooltipTrigger"], outputs: ["tooltipChange", "onShown", "onHidden", "tooltipStateChanged"], exportAs: ["bs-tooltip"] }, { kind: "component", type: i18.PaginationComponent, selector: "pagination", inputs: ["align", "maxSize", "boundaryLinks", "directionLinks", "firstText", "previousText", "nextText", "lastText", "rotate", "pageBtnClass", "disabled", "customPageTemplate", "customNextTemplate", "customPreviousTemplate", "customFirstTemplate", "customLastTemplate", "itemsPerPage", "totalItems"], outputs: ["numPages", "pageChanged"] }, { kind: "directive", type: ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "directive", type: i3.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: CellRendererComponent, selector: "c8y-cell-renderer", inputs: ["spec"] }, { kind: "component", type: FilteringFormRendererComponent, selector: "c8y-filtering-form-renderer", inputs: ["spec"] }, { kind: "pipe", type: i2$1.AsyncPipe, name: "async" }, { kind: "pipe", type: i2$1.SlicePipe, name: "slice" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: MapFunctionPipe, name: "map" }, { kind: "pipe", type: FilterMapperPipe, name: "mapToFilterChips" }, { kind: "pipe", type: GroupedFilterChips, name: "groupedFilterChips" }, { kind: "pipe", type: VisibleControlsPipe, name: "visibleControls" }] }); }
33524
33743
  }
33525
33744
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DataGridComponent, decorators: [{
33526
33745
  type: Component,
@@ -33529,7 +33748,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
33529
33748
  provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,
33530
33749
  useExisting: forwardRef(() => DataGridComponent)
33531
33750
  }
33532
- ], template: "<div\n class=\"table-data-grid-scroll\"\n #scroll\n [ngClass]=\"{\n 'table-data-grid__overlay': (dataSource.loading$ | async) && !loadMoreComponent?.isLoading\n }\"\n data-cy=\"c8y-data-grid--table-data-grid-scroll\"\n>\n <div\n class=\"table-data-grid__loading--wrapper\"\n *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent?.isLoading\"\n >\n <div class=\"table-data-grid__loading--loader\">\n <c8y-loading\n layout=\"application\"\n [message]=\"loadingItemsLabel\"\n ></c8y-loading>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-header separator large-padding\"\n *ngIf=\"displayOptions.gridHeader\"\n >\n <div\n class=\"h4\"\n [ngClass]=\"{ 'm-r-16': !!title }\"\n >\n {{ title | translate }}\n </div>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <small\n class=\"m-r-4\"\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n <span\n class=\"label label-default m-r-4\"\n translate\n >\n No filters\n </span>\n </span>\n <span\n class=\"d-flex a-i-center\"\n *ngIf=\"filteringApplied\"\n >\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <div class=\"a-i-center\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n of {{ allItemsCount }} items\n </small>\n </div>\n </ng-container>\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n dropdown\n #ddFilters=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddFilters.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn btn-default btn-sm m-l-8\"\n title=\"{{ 'Active filters' | translate }}\"\n aria-haspopup=\"true\"\n dropdownToggle\n data-cy=\"c8y-data-grid--filters\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"filter\"\n ></i>\n <span>{{ 'Active filters' | translate }}</span>\n <span class=\"badge badge-system\">\n {{ columnsWithFiltersApplied.length }}\n </span>\n </button>\n\n <div\n class=\"dropdown-menu\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"data-grid__dropdown bg-level-0\">\n <ul class=\"list-unstyled m-0\">\n <li\n *ngFor=\"let column of columnsWithFiltersApplied; let last = last\"\n [ngClass]=\"{ 'separator-bottom': !last }\"\n >\n <ng-container>\n <div\n class=\"dropdown-header sticky-top text-truncate no-border-top p-b-0\"\n title=\"{{ (column.header | translate) || column.name }}\"\n >\n <label>\n {{ (column.header | translate) || column.name }}\n </label>\n </div>\n <div\n class=\"list-group-item borderless d-flex d-col\"\n *ngFor=\"\n let groupedFilterChips of column\n | mapToFilterChips\n | async\n | groupedFilterChips;\n let first = first\n \"\n [ngClass]=\"{ 'p-t-0': first }\"\n >\n <p\n class=\"small p-b-4\"\n *ngIf=\"groupedFilterChips.label\"\n >\n {{ groupedFilterChips.label | translate }}\n </p>\n <div class=\"d-flex a-i-center gap-4 flex-wrap\">\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let chip of groupedFilterChips.chips\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ 'Remove filter' | translate }}\"\n (click)=\"removeFilter(chip.remove())\"\n data-cy=\"c8y-data-grid--remove-chip\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ chip.displayValue | translate }}\n </span>\n </div>\n </div>\n </ng-container>\n </li>\n </ul>\n </div>\n <div class=\"list-group-item separator-top sticky-bottom\">\n <button\n class=\"btn btn-sm btn-default\"\n title=\"{{ 'Clear all filters' | translate }}\"\n type=\"button\"\n (click)=\"clearFilters()\"\n data-cy=\"c8y-data-grid--clear-filters\"\n >\n {{ 'Clear all filters' | translate }}\n </button>\n </div>\n </div>\n </div>\n </span>\n\n <button\n class=\"btn-help btn-help--sm hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"filtersHelpPopover\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"displayOptions.filter\"\n data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n <ng-template #filtersHelpPopover>\n <div [innerHtml]=\"filtersHelpPopoverHtml | translate\"></div>\n </ng-template>\n\n <button\n class=\"btn-clean text-primary hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'The counter for the total number of items might be inaccurate.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"showCounterWarning\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n </ng-container>\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n <ng-container\n *ngFor=\"let headerActionControl of headerActionControls | visibleControls | async\"\n >\n <ng-container *ngIf=\"!headerActionControl.template; else customTemplate\">\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ headerActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"headerActionControl.callback()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION,\n customActionName: headerActionControl.text,\n type: headerActionControl.type\n }\"\n >\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"headerActionControl.icon\"\n ></i>\n <span>{{ headerActionControl.text | translate }}</span>\n </button>\n </ng-container>\n <ng-template #customTemplate>\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n *ngIf=\"configureColumnsEnabled\"\n dropdown\n #ddConfigureColumns=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddConfigureColumns.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Configure columns' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--custom-column-btn\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"columns\"\n ></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul\n class=\"dropdown-menu data-grid__dropdown\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <li>\n <div\n class=\"list-group m-0\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n >\n <div\n *ngFor=\"let column of columns\"\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 a-i-center\">\n <label\n class=\"c8y-checkbox p-l-16\"\n title=\"{{ (column.header | translate) || column.name }}\"\n [attr.data-cy]=\"'data-grid--custom-column-header-' + column.header\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"\n updateGridColumnsSize(); emitConfigChange('changeColumnVisibility')\n \"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CHANGE_VISIBILITY,\n column: column.name,\n visible: !column.visible\n }\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n <button\n class=\"btn btn-dot showOnHover max-width-fit a-i-center\"\n [attr.aria-label]=\"'Remove`column,verb`' | translate\"\n tooltip=\"{{ 'Remove`column,verb`' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n (click)=\"removeCustomColumn(poConfirm, column, ddConfigureColumns)\"\n *ngIf=\"column.custom\"\n >\n <c8y-popover-confirm\n [title]=\"'Confirm removal' | translate\"\n triggers=\"focus\"\n [placement]=\"'left'\"\n #poConfirm\n ></c8y-popover-confirm>\n <i\n c8yIcon=\"minus-circle\"\n data-cy=\"data-grid--custom-column-remove-btn\"\n ></i>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n <li\n class=\"p-8 sticky-bottom separator-top\"\n *ngIf=\"isConfigContextKnown\"\n >\n <button\n class=\"btn btn-default btn-block\"\n title=\"{{ 'Add custom column' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--add-custom-column\"\n (click)=\"openCustomColumn(); ddConfigureColumns.hide()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"plus-circle\"\n ></i>\n <span>{{ 'Add custom column' | translate }}</span>\n </button>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n *ngIf=\"!hideReload\"\n data-cy=\"data-grid--reload-btn\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"clickReload()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n ></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div\n class=\"input-group input-group-search m-l-sm-16 data-grid__search-input\"\n *ngIf=\"!serverSideDataCallback || showSearch\"\n >\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n type=\"search\"\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"searchText$.emit($event)\"\n (keydown.enter)=\"$event.stopPropagation(); performSearch(searchText)\"\n />\n <div class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"searchText.length === 0\"\n ></i>\n <i\n class=\"pointer\"\n c8yIcon=\"times\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n data-cy=\"table-data-grid-header-bulk-actions\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <ng-container [ngPlural]=\"selectedItemIds.length\">\n <ng-template ngPluralCase=\"=1\">\n <span translate>1 selected item.</span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: selectedItemIds.length }\"\n >\n {{ count }} selected items.\n </span>\n </ng-template>\n </ng-container>\n <br class=\"visible-xs\" />\n <small *ngIf=\"!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize\">\n <a\n class=\"interact\"\n (click)=\"setAllItemsSelected(true)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n <ng-container\n *ngFor=\"\n let bulkActionControl of bulkActionControls | visibleControls: selectedItemIds | async\n \"\n >\n <ng-container [ngSwitch]=\"bulkActionControl.type\">\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Export\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_EXPORT }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_DELETE }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ bulkActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchDefault\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CUSTOM_ACTION,\n customActionName: bulkActionControl.text\n }\"\n c8yProductExperience\n inherit\n >\n <i\n [class]=\"bulkActionControl.iconClasses\"\n c8yIcon=\"{{ bulkActionControl.icon }}\"\n ></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CANCEL\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-filtered-sorted table-data-grid large-padding\"\n [class.table-striped]=\"displayOptions.striped\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-hover]=\"displayOptions.hover\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n cdk-table\n [dataSource]=\"dataSource\"\n [multiTemplateDataRows]=\"true\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n data-cy=\"c8y-data-grid--table\"\n >\n <ng-container\n *ngFor=\"let column of columns; let i = index; trackBy: trackByName\"\n [cdkColumnDef]=\"column.name\"\n >\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <div>\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--checkbox\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n ></th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-radio\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n name=\"select-row\"\n type=\"radio\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"changeSelectedItem(row)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--radio\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <p class=\"text-medium sr-only\">{{ 'Actions' | translate }}</p>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <ng-container\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice: 0 : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"'Edit' | translate\"\n tooltip=\"{{ 'Edit' | translate }}\"\n container=\"body\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--edit-button-in-row\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n data-cy=\"c8y-data-grid--remove-button-in-row\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"(actionControl.icon ? actionControl.text : '') | translate\"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ showOnHover: actionControl.showOnHover }\"\n [delay]=\"500\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n [attr.data-cy]=\"'c8y-data-grid--button-in-row--' + actionControl.text\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n *ngIf=\"actionControl.icon\"\n ></i>\n <span *ngIf=\"!actionControl.icon\">{{ actionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <div\n [ngClass]=\"{\n 'm-l-auto overflow-visible':\n (actionControls | visibleControls: row | async)?.length > 2\n }\"\n >\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\n *ngIf=\"(actionControls | visibleControls: row | async)?.length > 2\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Actions' | translate }}\"\n aria-haspopup=\"true\"\n type=\"button\"\n data-cy=\"c8y-data-grid--row-actions-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n *dropdownMenu\n >\n <li\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EXPORT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"data-export\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n ></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n >\n <div\n [title]=\"(column.header | translate) || column.name\"\n *ngIf=\"!column.filterable\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <div\n class=\"dropdown\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\n *ngIf=\"column.filterable\"\n dropdown\n #gridHeaderDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"gridHeaderDropdown.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn-header\"\n [title]=\"(column.header | translate) || column.name\"\n type=\"button\"\n [attr.data-cy]=\"'data-grid--header-btn--' + column.header\"\n dropdownToggle\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer\n data-cy=\"c8y-data-grid--c8y-cell-renderer\"\n [spec]=\"cellRendererSpec\"\n ></c8y-cell-renderer>\n </ng-container>\n <i\n c8yIcon=\"filter\"\n title=\"{{ 'Filter' | translate }}\"\n ></i>\n </button>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <ul\n class=\"dropdown-menu\"\n *dropdownMenu\n [ngClass]=\"{ 'dropdown-menu-right-grid': isDropDownPlacedRight(column) }\"\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec : this as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer\n class=\"bg-component\"\n [spec]=\"filteringFormRendererSpec\"\n data-cy=\"c8y-data-grid--c8y-filtering-form-renderer\"\n ></c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btn-sort\"\n [style]=\"{ 'margin-left': !column.filterable && column.sortable ? '-20px' : null }\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n *ngIf=\"column.sortable\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i\n c8yIcon=\"long-arrow-up\"\n *ngSwitchCase=\"'asc'\"\n ></i>\n <i\n c8yIcon=\"long-arrow-down\"\n *ngSwitchCase=\"'desc'\"\n ></i>\n <i\n c8yIcon=\"exchange\"\n *ngSwitchDefault\n ></i>\n </ng-container>\n </button>\n\n <span\n class=\"resize-handle\"\n *ngIf=\"column.resizable\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n </th>\n\n <td\n [class.hidden]=\"!column.visible\"\n [attr.data-cell-title]=\"column.header | translate\"\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cy]=\"'data-grid--' + column.header\"\n [attr.data-type]=\"column.dataType\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-footer-cell\n *cdkFooterCellDef\n >\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr\n cdk-header-row\n *cdkHeaderRowDef=\"columnNames\"\n ></tr>\n\n <tr\n data-cy=\"c8y-data-grid--row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames; let idx = dataIndex\"\n [ngClass]=\"[\n activeClassName && row === lastClickedRow ? activeClassName : '',\n idx % 2 === 0 ? 'even' : 'odd'\n ]\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"handleClick(row)\"\n ></tr>\n\n <tr\n class=\"expanded-row\"\n [ngClass]=\"{ hidden: !(expandedRows.get(row).visible$ | async) }\"\n data-cy=\"c8y-data-grid--expanded-row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['expanded-row']; when: isRowExpanded\"\n ></tr>\n\n <ng-container cdkColumnDef=\"expanded-row\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n expandableRow?.template;\n context: {\n $implicit: row,\n asyncRenderSuccess: setExpandableRowVisible.bind(this, row, true),\n asyncRenderFail: setExpandableRowVisible.bind(this, row, false)\n }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <ng-container>\n <tr\n [ngClass]=\"{ hidden: !infiniteScroll }\"\n cdk-footer-row\n *cdkFooterRowDef=\"['infiniteScrollFooter']\"\n ></tr>\n </ng-container>\n </table>\n\n <div\n class=\"d-flex m-0 p-t-40 p-b-40\"\n *ngIf=\"\n !(dataSource.loading$ | async) &&\n ((dataSource.stats$ | async).filteredSize === 0 || (dataSource.data$ | async).length === 0)\n \"\n >\n <div class=\"col-lg-3 col-sm-4 m-l-auto m-r-auto\">\n <ng-content select=\"c8y-ui-empty-state, .c8y-empty-state\"></ng-content>\n <ng-container\n *ngTemplateOutlet=\"\n emptyState?.templateRef;\n context: { $implicit: emptyStateContext$ | async }\n \"\n ></ng-container>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-footer separator large-padding\"\n *ngIf=\"pagination && !infiniteScroll\"\n >\n <div class=\"col-sm-4 no-gutter\">\n <div\n class=\"counter p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n data-cy=\"data-grid--counter\"\n >\n <span\n class=\"text-muted\"\n ngNonBindable\n translate\n [translateParams]=\"paginationLabelParams\"\n >\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n class=\"form-group form-inline p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n >\n <label\n class=\"m-r-4\"\n for=\"filteredSize\"\n >\n {{ 'Items per page' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"filteredSize\"\n data-cy=\"data-grid--pagesize-options\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option\n *ngFor=\"let pageSize of possiblePageSizes\"\n [ngValue]=\"pageSize\"\n >\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n [class.hidden]=\"hidePagination$ | async\"\n class=\"p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > 0\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount$.next($event)\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n ></pagination>\n </div>\n </div>\n</div>\n" }]
33751
+ ], template: "<div\n class=\"table-data-grid-scroll\"\n #scroll\n [ngClass]=\"{\n 'table-data-grid__overlay': (dataSource.loading$ | async) && !loadMoreComponent?.isLoading\n }\"\n data-cy=\"c8y-data-grid--table-data-grid-scroll\"\n>\n <div\n class=\"table-data-grid__loading--wrapper\"\n *ngIf=\"(dataSource.loading$ | async) && !loadMoreComponent?.isLoading\"\n >\n <div class=\"table-data-grid__loading--loader\">\n <c8y-loading\n layout=\"application\"\n [message]=\"loadingItemsLabel\"\n ></c8y-loading>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-header separator large-padding\"\n *ngIf=\"displayOptions.gridHeader\"\n >\n <div\n class=\"h4\"\n [ngClass]=\"{ 'm-r-16': !!title }\"\n >\n {{ title | translate }}\n </div>\n\n <ng-container *ngIf=\"displayOptions.filter\">\n <span *ngIf=\"!filteringApplied\">\n <small\n class=\"m-r-4\"\n *ngIf=\"!!filteringLabelsParams.allItemsCount\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n <span\n class=\"label label-default m-r-4\"\n translate\n >\n No filters\n </span>\n </span>\n <span\n class=\"d-flex a-i-center\"\n *ngIf=\"filteringApplied\"\n >\n <ng-container *ngIf=\"!!filteringLabelsParams.allItemsCount\">\n <div class=\"a-i-center\">\n <span class=\"badge badge-info m-r-4\">\n {{ (dataSource.stats$ | async).filteredSize }}\n </span>\n <small\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n of {{ allItemsCount }} items\n </small>\n </div>\n </ng-container>\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n dropdown\n #ddFilters=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddFilters.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn btn-default btn-sm m-l-8\"\n title=\"{{ 'Active filters' | translate }}\"\n aria-haspopup=\"true\"\n dropdownToggle\n data-cy=\"c8y-data-grid--filters\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"filter\"\n ></i>\n <span>{{ 'Active filters' | translate }}</span>\n <span class=\"badge badge-system\">\n {{ columnsWithFiltersApplied.length }}\n </span>\n </button>\n\n <div\n class=\"dropdown-menu\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <div class=\"data-grid__dropdown bg-level-0\">\n <ul class=\"list-unstyled m-0\">\n <li\n *ngFor=\"let column of columnsWithFiltersApplied; let last = last\"\n [ngClass]=\"{ 'separator-bottom': !last }\"\n >\n <ng-container>\n <div\n class=\"dropdown-header sticky-top text-truncate no-border-top p-b-0\"\n title=\"{{ (column.header | translate) || column.name }}\"\n >\n <label>\n {{ (column.header | translate) || column.name }}\n </label>\n </div>\n <div\n class=\"list-group-item borderless d-flex d-col\"\n *ngFor=\"\n let groupedFilterChips of column\n | mapToFilterChips\n | async\n | groupedFilterChips;\n let first = first\n \"\n [ngClass]=\"{ 'p-t-0': first }\"\n >\n <p\n class=\"small p-b-4\"\n *ngIf=\"groupedFilterChips.label\"\n >\n {{ groupedFilterChips.label | translate }}\n </p>\n <div class=\"d-flex a-i-center gap-4 flex-wrap\">\n <span\n class=\"tag tag--info chip\"\n *ngFor=\"let chip of groupedFilterChips.chips\"\n >\n <button\n class=\"btn btn-xs btn-clean text-10 m-r-4\"\n title=\"{{ 'Remove filter' | translate }}\"\n (click)=\"removeFilter(chip.remove())\"\n data-cy=\"c8y-data-grid--remove-chip\"\n >\n <i c8yIcon=\"times\"></i>\n </button>\n {{ chip.displayValue | translate }}\n </span>\n </div>\n </div>\n </ng-container>\n </li>\n </ul>\n </div>\n <div class=\"list-group-item separator-top sticky-bottom\">\n <button\n class=\"btn btn-sm btn-default\"\n title=\"{{ 'Clear all filters' | translate }}\"\n type=\"button\"\n (click)=\"clearFilters()\"\n data-cy=\"c8y-data-grid--clear-filters\"\n >\n {{ 'Clear all filters' | translate }}\n </button>\n </div>\n </div>\n </div>\n </span>\n\n <button\n class=\"btn-help btn-help--sm hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n [popover]=\"filtersHelpPopover\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"displayOptions.filter\"\n data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n <ng-template #filtersHelpPopover>\n <div [innerHtml]=\"filtersHelpPopoverHtml | translate\"></div>\n </ng-template>\n\n <button\n class=\"btn-clean text-primary hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{ 'The counter for the total number of items might be inaccurate.' | translate }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n *ngIf=\"showCounterWarning\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n </ng-container>\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n <ng-container\n *ngFor=\"let headerActionControl of headerActionControls | visibleControls | async\"\n >\n <ng-container *ngIf=\"!headerActionControl.template; else customTemplate\">\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ headerActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"headerActionControl.callback()\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION,\n customActionName: headerActionControl.text,\n type: headerActionControl.type\n }\"\n >\n <i\n class=\"m-r-4\"\n [c8yIcon]=\"headerActionControl.icon\"\n ></i>\n <span>{{ headerActionControl.text | translate }}</span>\n </button>\n </ng-container>\n <ng-template #customTemplate>\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n </ng-template>\n </ng-container>\n\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\n *ngIf=\"configureColumnsEnabled\"\n dropdown\n #ddConfigureColumns=\"bs-dropdown\"\n [cdkTrapFocus]=\"ddConfigureColumns.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Configure columns' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--custom-column-btn\"\n dropdownToggle\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"columns\"\n ></i>\n <span>{{ 'Configure columns' | translate }}</span>\n </button>\n\n <ul\n class=\"dropdown-menu data-grid__dropdown\"\n *dropdownMenu\n (click)=\"$event.stopPropagation()\"\n >\n <li>\n <div\n class=\"list-group m-0\"\n cdkDropList\n (cdkDropListDropped)=\"onColumnDrop($event)\"\n >\n <div\n *ngFor=\"let column of columns\"\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n <ng-container *ngIf=\"!column.positionFixed\">\n <div class=\"list-group-item draggable-after p-0 a-i-center\">\n <label\n class=\"c8y-checkbox p-l-16\"\n title=\"{{ (column.header | translate) || column.name }}\"\n [attr.data-cy]=\"'data-grid--custom-column-header-' + column.header\"\n >\n <input\n type=\"checkbox\"\n [(ngModel)]=\"column.visible\"\n (change)=\"\n updateGridColumnsSize(); emitConfigChange('changeColumnVisibility')\n \"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CHANGE_VISIBILITY,\n column: column.name,\n visible: !column.visible\n }\"\n />\n <span></span>\n <span>{{ (column.header | translate) || column.name }}</span>\n </label>\n <button\n class=\"btn btn-dot showOnHover max-width-fit a-i-center\"\n [attr.aria-label]=\"'Remove`column,verb`' | translate\"\n tooltip=\"{{ 'Remove`column,verb`' | translate }}\"\n placement=\"left\"\n container=\"body\"\n type=\"button\"\n (click)=\"removeCustomColumn(poConfirm, column, ddConfigureColumns)\"\n *ngIf=\"column.custom\"\n >\n <c8y-popover-confirm\n [title]=\"'Confirm removal' | translate\"\n triggers=\"focus\"\n [placement]=\"'left'\"\n #poConfirm\n ></c8y-popover-confirm>\n <i\n c8yIcon=\"minus-circle\"\n data-cy=\"data-grid--custom-column-remove-btn\"\n ></i>\n </button>\n </div>\n </ng-container>\n </div>\n </div>\n </li>\n <li\n class=\"p-8 sticky-bottom separator-top\"\n *ngIf=\"isConfigContextKnown\"\n >\n <button\n class=\"btn btn-default btn-block\"\n title=\"{{ 'Add custom column' | translate }}\"\n type=\"button\"\n data-cy=\"data-grid--add-custom-column\"\n (click)=\"openCustomColumn(); ddConfigureColumns.hide()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"plus-circle\"\n ></i>\n <span>{{ 'Add custom column' | translate }}</span>\n </button>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\n *ngIf=\"!hideReload\"\n data-cy=\"data-grid--reload-btn\"\n [disabled]=\"dataSource.loading$ | async\"\n (click)=\"clickReload()\"\n >\n <i\n class=\"m-r-4\"\n c8yIcon=\"refresh\"\n ></i>\n <span>{{ 'Reload' | translate }}</span>\n </button>\n\n <div\n class=\"input-group input-group-search m-l-sm-16 data-grid__search-input\"\n *ngIf=\"!serverSideDataCallback || showSearch\"\n >\n <input\n class=\"form-control\"\n placeholder=\"{{ 'Search\u2026' | translate }}\"\n type=\"search\"\n [(ngModel)]=\"searchText\"\n (ngModelChange)=\"searchText$.emit($event)\"\n (keydown.enter)=\"$event.stopPropagation(); performSearch(searchText)\"\n />\n <div class=\"input-group-addon\">\n <i\n c8yIcon=\"search\"\n *ngIf=\"searchText.length === 0\"\n ></i>\n <i\n class=\"pointer\"\n c8yIcon=\"times\"\n *ngIf=\"searchText.length > 0\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n </div>\n </div>\n </div>\n </div>\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n data-cy=\"table-data-grid-header-bulk-actions\"\n *ngIf=\"selectedItemIds.length !== 0\"\n >\n <h4>\n <ng-container [ngPlural]=\"selectedItemIds.length\">\n <ng-template ngPluralCase=\"=1\">\n <span translate>1 selected item.</span>\n </ng-template>\n <ng-template ngPluralCase=\"other\">\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: selectedItemIds.length }\"\n >\n {{ count }} selected items.\n </span>\n </ng-template>\n </ng-container>\n <br class=\"visible-xs\" />\n <small *ngIf=\"!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize\">\n <a\n class=\"interact\"\n (click)=\"setAllItemsSelected(true)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n >\n <span\n ngNonBindable\n translate\n [translateParams]=\"{ count: (dataSource.stats$ | async).filteredSize }\"\n >\n Select all {{ count }} items\n </span>\n </a>\n </small>\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n <ng-container\n *ngFor=\"\n let bulkActionControl of bulkActionControls | visibleControls: selectedItemIds | async\n \"\n >\n <ng-container [ngSwitch]=\"bulkActionControl.type\">\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Export\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_EXPORT }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"sign-out\"></i>\n <span>{{ 'Export' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{ action: PX_ACTIONS.BULK_DELETE }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n <span>{{ 'Delete' | translate }}</span>\n </button>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ bulkActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\n *ngSwitchDefault\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CUSTOM_ACTION,\n customActionName: bulkActionControl.text\n }\"\n c8yProductExperience\n inherit\n >\n <i\n [class]=\"bulkActionControl.iconClasses\"\n c8yIcon=\"{{ bulkActionControl.icon }}\"\n ></i>\n <span>{{ bulkActionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n (click)=\"cancel()\"\n [actionData]=\"{\n action: PX_ACTIONS.BULK_CANCEL\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"times\"></i>\n <span>{{ 'Cancel' | translate }}</span>\n </button>\n </div>\n </div>\n </div>\n </div>\n\n <table\n class=\"table table-filtered-sorted table-data-grid large-padding\"\n [class.table-striped]=\"displayOptions.striped && !treeGrid\"\n [class.table-bordered]=\"displayOptions.bordered\"\n [class.table-hover]=\"displayOptions.hover\"\n [class.table-data-grid-with-checkboxes]=\"selectable\"\n [class.table-data-grid-with-actions]=\"actionControls.length > 0\"\n [style.grid-template-columns]=\"styles.gridTemplateColumns\"\n cdk-table\n [dataSource]=\"dataSource\"\n [multiTemplateDataRows]=\"true\"\n (mousemove)=\"resizeHandleContainerMouseMove$.emit($event)\"\n (mouseup)=\"resizeHandleContainerMouseUp$.emit($event)\"\n data-cy=\"c8y-data-grid--table\"\n >\n <ng-container\n *ngFor=\"let column of columns; let i = index; trackBy: trackByName\"\n [cdkColumnDef]=\"column.name\"\n >\n <ng-container [ngSwitch]=\"column.name\">\n <ng-container *ngSwitchCase=\"'checkbox'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <div>\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"currentPageSelectionState.allSelected\"\n [indeterminate]=\"\n !(\n currentPageSelectionState.allSelected ||\n currentPageSelectionState.allDeselected\n )\n \"\n (change)=\"setAllItemsInCurrentPageSelected($event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.SELECT_ALL_ITEMS }\"\n />\n <span></span>\n </label>\n </div>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-checkbox\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n type=\"checkbox\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"setItemsSelected([row], $event.target.checked)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--checkbox\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'radio-button'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n ></th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <label class=\"c8y-radio\">\n <input\n [attr.aria-label]=\"'Selected' | translate\"\n name=\"select-row\"\n type=\"radio\"\n [checked]=\"isItemSelected(row)\"\n (change)=\"changeSelectedItem(row)\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.SELECT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--radio\"\n />\n <span></span>\n </label>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchCase=\"'actions'\">\n <th\n cdk-header-cell\n *cdkHeaderCellDef\n data-type=\"icon\"\n >\n <p class=\"text-medium sr-only\">{{ 'Actions' | translate }}</p>\n </th>\n\n <td\n cdk-cell\n *cdkCellDef=\"let row\"\n data-type=\"icon\"\n >\n <ng-container\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice: 0 : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"'Edit' | translate\"\n tooltip=\"{{ 'Edit' | translate }}\"\n container=\"body\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n data-cy=\"c8y-data-grid--edit-button-in-row\"\n >\n <i c8yIcon=\"pencil\"></i>\n </button>\n\n <button\n class=\"btn btn-dot btn-dot--danger showOnHover\"\n [attr.aria-label]=\"'Delete' | translate\"\n tooltip=\"{{ 'Delete' | translate }}\"\n container=\"body\"\n type=\"button\"\n [delay]=\"500\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n data-cy=\"c8y-data-grid--remove-button-in-row\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"(actionControl.icon ? actionControl.text : '') | translate\"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ showOnHover: actionControl.showOnHover }\"\n [delay]=\"500\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n [attr.data-cy]=\"'c8y-data-grid--button-in-row--' + actionControl.text\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n *ngIf=\"actionControl.icon\"\n ></i>\n <span *ngIf=\"!actionControl.icon\">{{ actionControl.text | translate }}</span>\n </button>\n </ng-container>\n </ng-container>\n\n <div\n [ngClass]=\"{\n 'm-l-auto overflow-visible':\n (actionControls | visibleControls: row | async)?.length > 2\n }\"\n >\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\n *ngIf=\"(actionControls | visibleControls: row | async)?.length > 2\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Actions' | translate }}\"\n aria-haspopup=\"true\"\n type=\"button\"\n data-cy=\"c8y-data-grid--row-actions-dropdown\"\n dropdownToggle\n >\n <i c8yIcon=\"ellipsis-v\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n *dropdownMenu\n >\n <li\n *ngFor=\"\n let actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2)\n \"\n >\n <ng-container [ngSwitch]=\"actionControl.type\">\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Edit\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EDIT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"pencil\"></i>\n {{ 'Edit' | translate }}\n </button>\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Delete\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.DELETE_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"delete\"></i>\n {{ 'Delete' | translate }}\n </button>\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n *ngSwitchCase=\"builtInActionType.Export\"\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n [actionData]=\"{\n action: PX_ACTIONS.EXPORT_ITEM,\n id: row.id\n }\"\n c8yProductExperience\n inherit\n >\n <i c8yIcon=\"data-export\"></i>\n {{ 'Export' | translate }}\n </button>\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\n *ngSwitchDefault\n (click)=\"actionControl.callback(row, reload.bind(this))\"\n c8yProductExperience\n inherit\n [actionData]=\"{\n action: PX_ACTIONS.CUSTOM_ACTION_ITEM,\n customActionName: actionControl.text,\n id: row.id\n }\"\n >\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n ></i>\n {{ actionControl.text | translate }}\n </button>\n </ng-container>\n </li>\n </ul>\n </div>\n </div>\n </td>\n </ng-container>\n\n <ng-container *ngSwitchDefault>\n <th\n [class.sorted]=\"column.sortOrder\"\n [class.filtered]=\"column | map: isColumnFilteringApplied\"\n [class.hidden]=\"!column.visible\"\n cdk-header-cell\n *cdkHeaderCellDef\n [ngClass]=\"column.headerCSSClassName\"\n [attr.data-type]=\"column.dataType\"\n >\n <div\n [title]=\"(column.header | translate) || column.name\"\n *ngIf=\"!column.filterable\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </div>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <div\n class=\"dropdown\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\n *ngIf=\"column.filterable\"\n dropdown\n #gridHeaderDropdown=\"bs-dropdown\"\n [cdkTrapFocus]=\"gridHeaderDropdown.isOpen\"\n [insideClick]=\"true\"\n >\n <button\n class=\"btn-header\"\n [title]=\"(column.header | translate) || column.name\"\n type=\"button\"\n [attr.data-cy]=\"'data-grid--header-btn--' + column.header\"\n dropdownToggle\n >\n <ng-container\n *ngIf=\"\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer\n data-cy=\"c8y-data-grid--c8y-cell-renderer\"\n [spec]=\"cellRendererSpec\"\n ></c8y-cell-renderer>\n </ng-container>\n <i\n c8yIcon=\"filter\"\n title=\"{{ 'Filter' | translate }}\"\n ></i>\n </button>\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n <ul\n class=\"dropdown-menu\"\n *dropdownMenu\n [ngClass]=\"{ 'dropdown-menu-right-grid': isDropDownPlacedRight(column) }\"\n (click)=\"$event.stopPropagation()\"\n >\n <li class=\"data-grid__dropdown\">\n <ng-container\n *ngIf=\"\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec : this as filteringFormRendererSpec\n \"\n >\n <c8y-filtering-form-renderer\n class=\"bg-component\"\n [spec]=\"filteringFormRendererSpec\"\n data-cy=\"c8y-data-grid--c8y-filtering-form-renderer\"\n ></c8y-filtering-form-renderer>\n </ng-container>\n </li>\n </ul>\n </div>\n\n <button\n class=\"btn-sort\"\n [style]=\"{ 'margin-left': !column.filterable && column.sortable ? '-20px' : null }\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n *ngIf=\"column.sortable\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n <ng-container [ngSwitch]=\"column.sortOrder\">\n <i\n c8yIcon=\"long-arrow-up\"\n *ngSwitchCase=\"'asc'\"\n ></i>\n <i\n c8yIcon=\"long-arrow-down\"\n *ngSwitchCase=\"'desc'\"\n ></i>\n <i\n c8yIcon=\"exchange\"\n *ngSwitchDefault\n ></i>\n </ng-container>\n </button>\n\n <span\n class=\"resize-handle\"\n *ngIf=\"column.resizable\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n </th>\n\n <td\n [class.hidden]=\"!column.visible\"\n [attr.data-cell-title]=\"column.header | translate\"\n cdk-cell\n *cdkCellDef=\"let row\"\n [ngClass]=\"column.cellCSSClassName\"\n [attr.data-cy]=\"'data-grid--' + column.header\"\n [attr.data-type]=\"column.dataType\"\n >\n <ng-container\n *ngIf=\"\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec : this as cellRendererSpec\n \"\n >\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n </ng-container>\n </td>\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container cdkColumnDef=\"infiniteScrollFooter\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-footer-cell\n *cdkFooterCellDef\n >\n <template #infiniteScrollContainer></template>\n </td>\n </ng-container>\n\n <tr\n cdk-header-row\n *cdkHeaderRowDef=\"columnNames\"\n ></tr>\n\n <tr\n data-cy=\"c8y-data-grid--row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: columnNames; let idx = dataIndex; when: isDataRow\"\n [ngClass]=\"[\n activeClassName && row === lastClickedRow ? activeClassName : '',\n idx % 2 === 0 ? 'even' : 'odd',\n row.level > 0 ? 'data-grid-child-node' : ''\n ]\"\n (mouseover)=\"rowMouseOver.emit(row)\"\n (mouseleave)=\"rowMouseLeave.emit(row)\"\n (click)=\"handleClick(row)\"\n ></tr>\n\n <tr\n class=\"expanded-row\"\n [ngClass]=\"{ hidden: !(expandedRows.get(row).visible$ | async) }\"\n data-cy=\"c8y-data-grid--expanded-row-in-data-grid\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['expanded-row']; when: isRowExpanded\"\n ></tr>\n\n <ng-container cdkColumnDef=\"expanded-row\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n expandableRow?.template;\n context: {\n $implicit: row,\n asyncRenderSuccess: setExpandableRowVisible.bind(this, row, true),\n asyncRenderFail: setExpandableRowVisible.bind(this, row, false)\n }\n \"\n ></ng-container>\n </td>\n </ng-container>\n\n <tr\n class=\"pagination-row\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['pagination-row']; when: isPaginationRow\"\n ></tr>\n\n <ng-container cdkColumnDef=\"pagination-row\">\n <td\n [class]=\"'level-' + (row.parentRow.level + 1)\"\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <div class=\"col-sm-4 no-gutter\">\n <div\n class=\"counter p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n data-cy=\"data-grid--child-counter\"\n >\n <span\n class=\"text-muted\"\n ngNonBindable\n translate\n [translateParams]=\"{\n pageFirstItemIdx:\n (row.childrenStats.currentPage - 1) * row.childrenStats.firstPageSize + 1,\n pageLastItemIdx:\n (row.childrenStats.currentPage - 1) * row.childrenStats.firstPageSize +\n 1 +\n (row.childrenStats.currentPageSize - 1),\n itemsTotal: row.childrenStats.filteredSize\n }\"\n >\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n <span class=\"text-muted text-12 m-r-4\">{{ 'Parent node' | translate }}</span>\n <span class=\"tag tag--default\">{{ row.parentRow?.[parentNodeLabelProperty] }}</span>\n </div>\n </div>\n <div class=\"col-sm-4 col-sm-offset-4 no-gutter text-right\">\n <pagination\n class=\"d-flex j-c-end\"\n *ngIf=\"row.childrenStats.filteredSize > row.childrenStats.currentPageSize\"\n [ngModel]=\"row.childrenStats.currentPage\"\n (pageChanged)=\"updateChildPagination($event, row)\"\n [totalItems]=\"row.childrenStats.filteredSize\"\n [itemsPerPage]=\"row?.parentRow?.pagination?.pageSize ?? childNodePagination.pageSize\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n ></pagination>\n </div>\n </td>\n </ng-container>\n\n <ng-container>\n <tr\n [ngClass]=\"{ hidden: !infiniteScroll }\"\n cdk-footer-row\n *cdkFooterRowDef=\"['infiniteScrollFooter']\"\n ></tr>\n </ng-container>\n </table>\n\n <div\n class=\"d-flex m-0 p-t-40 p-b-40\"\n *ngIf=\"\n !(dataSource.loading$ | async) &&\n ((dataSource.stats$ | async).filteredSize === 0 || (dataSource.data$ | async).length === 0)\n \"\n >\n <div class=\"col-lg-3 col-sm-4 m-l-auto m-r-auto\">\n <ng-content select=\"c8y-ui-empty-state, .c8y-empty-state\"></ng-content>\n <ng-container\n *ngTemplateOutlet=\"\n emptyState?.templateRef;\n context: { $implicit: emptyStateContext$ | async }\n \"\n ></ng-container>\n </div>\n </div>\n\n <div\n class=\"table-data-grid-footer separator large-padding\"\n *ngIf=\"pagination && !infiniteScroll\"\n >\n <div class=\"col-sm-4 no-gutter\">\n <div\n class=\"counter p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).currentPageSize > 0\"\n data-cy=\"data-grid--counter\"\n >\n <span\n class=\"text-muted\"\n ngNonBindable\n translate\n [translateParams]=\"paginationLabelParams\"\n >\n {{ pageFirstItemIdx }} - {{ pageLastItemIdx }} of {{ itemsTotal }}\n </span>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n <div\n class=\"form-group form-inline p-t-8 p-b-8\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > minPossiblePageSize\"\n >\n <label\n class=\"m-r-4\"\n for=\"filteredSize\"\n >\n {{ 'Items per page' | translate }}\n </label>\n <div class=\"c8y-select-wrapper\">\n <select\n class=\"form-control\"\n id=\"filteredSize\"\n data-cy=\"data-grid--pagesize-options\"\n [ngModel]=\"pagination.pageSize\"\n (ngModelChange)=\"\n updatePagination({ itemsPerPage: $event, page: pagination.currentPage })\n \"\n >\n <option\n *ngFor=\"let pageSize of possiblePageSizes\"\n [ngValue]=\"pageSize\"\n >\n {{ pageSize }}\n </option>\n </select>\n </div>\n </div>\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n <pagination\n [class.hidden]=\"hidePagination$ | async\"\n class=\"d-flex j-c-end\"\n *ngIf=\"(dataSource.stats$ | async).filteredSize > 0\"\n [ngModel]=\"pagination.currentPage\"\n (pageChanged)=\"updatePagination($event)\"\n [totalItems]=\"(dataSource.stats$ | async).filteredSize\"\n [itemsPerPage]=\"pagination.pageSize\"\n (numPages)=\"totalPagesCount$.next($event)\"\n [maxSize]=\"5\"\n [boundaryLinks]=\"false\"\n previousText=\"Previous\"\n nextText=\"Next\"\n ></pagination>\n </div>\n </div>\n</div>\n" }]
33533
33752
  }], ctorParameters: () => [{ type: undefined, decorators: [{
33534
33753
  type: Optional
33535
33754
  }, {
@@ -33554,6 +33773,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
33554
33773
  }], _pagination: [{
33555
33774
  type: Input,
33556
33775
  args: ['pagination']
33776
+ }], childNodePagination: [{
33777
+ type: Input
33557
33778
  }], _infiniteScroll: [{
33558
33779
  type: Input,
33559
33780
  args: ['infiniteScroll']
@@ -33591,8 +33812,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
33591
33812
  type: Input
33592
33813
  }], expandableRows: [{
33593
33814
  type: Input
33815
+ }], treeGrid: [{
33816
+ type: Input
33594
33817
  }], hideReload: [{
33595
33818
  type: Input
33819
+ }], childNodesProperty: [{
33820
+ type: Input
33821
+ }], parentNodeLabelProperty: [{
33822
+ type: Input
33596
33823
  }], rowMouseOver: [{
33597
33824
  type: Output
33598
33825
  }], rowMouseLeave: [{
@@ -36642,5 +36869,5 @@ function colorValidator(allowedModes) {
36642
36869
  * Generated bundle index. Do not edit.
36643
36870
  */
36644
36871
 
36645
- export { CommonModule as $, AssetPropertyService as A, BaseColumn as B, CellRendererContext as C, DataGridModule as D, AlertComponent as E, AlertModule as F, BootstrapComponent as G, HOOK_ACTION_BAR as H, BootstrapModule as I, CookieBannerComponent as J, BreadcrumbOutletComponent as K, BreadcrumbComponent as L, MessageBannerService as M, HOOK_BREADCRUMB as N, hookBreadcrumb as O, BreadcrumbService as P, BreadcrumbItemComponent as Q, BreadcrumbModule as R, DRAWER_ANIMATION_TIME as S, BottomDrawerComponent as T, BottomDrawerService as U, PluginsExportScopes as V, AssetLinkPipe as W, BytesPipe as X, ColorService as Y, MAX_PAGE_SIZE as Z, initializeServices as _, BottomDrawerRef as a, ShortenUserNamePipe as a$, C8yComponentOutlet as a0, ES_MAX_TIME_MILLISECONDS as a1, DatePipe as a2, DeviceService as a3, DropdownDirectionDirective as a4, EmptyStateContextDirective as a5, EmptyStateComponent as a6, fromTrigger as a7, fromTriggerOnce as a8, InjectionType as a9, GroupService as aA, internalApps as aB, HumanizeAppNamePipe as aC, HumanizePipe as aD, IconDirective as aE, IfAllowedDirective as aF, LoadMoreComponent as aG, LoadingComponent as aH, ManagedObjectType as aI, MapFunctionPipe as aJ, MarkdownToHtmlPipe as aK, memoize as aL, MoNamePipe as aM, NUMBER_FORMAT_REGEXP as aN, NumberPipe as aO, OperationResultComponent as aP, HOOK_OPTIONS as aQ, hookOptions as aR, OptionsService as aS, OutletDirective as aT, Permissions as aU, ProgressBarComponent as aV, NULL_VALUE_PLACEHOLDER as aW, RelativeTimePipe as aX, retryWithDelay as aY, hookService as aZ, ServiceRegistry as a_, StandalonePluginInjector as aa, getInjectedHooks as ab, fromFactories as ac, resolveInjectedFactories as ad, stateToFactory as ae, sortByPriority as af, removeDuplicatesIds as ag, toObservableOfArrays as ah, isPromise as ai, isExtensionFactory as aj, toObservable as ak, ExtensionPointWithoutStateForPlugins as al, ExtensionPointForPlugins as am, getActivatedRoute as an, hookGeneric as ao, HookProviderTypes as ap, allEntriesAreEqual as aq, GENERIC_FILE_TYPE as ar, FilesService as as, ForOfDirective as at, GenericFileIconPipe as au, GeoService as av, GetGroupIconPipe as aw, GlobalConfigService as ax, GroupFragment as ay, ASSET_PATH as az, AlertService as b, RecoverPasswordComponent as b$, ShouldShowMoPipe as b0, ShowIfFilterPipe as b1, SkipLinkDirective as b2, StateService as b3, Status as b4, statusIcons as b5, statusClasses as b6, statusAlert as b7, operationStatusIcons as b8, operationStatusClasses as b9, localePathFactory as bA, languagesFactory as bB, localeId as bC, getAngularLocalesLanguageString as bD, I18nModule as bE, LANGUAGES as bF, TranslateParserCustom as bG, LOCALE_PATH as bH, loadLocale as bI, MissingTranslationCustomHandler as bJ, TranslateService as bK, MESSAGES_CORE_I18N as bL, HOOK_PATTERN_MESSAGES as bM, hookPatternMessages as bN, C8yTranslateModule as bO, C8yTranslateDirective as bP, CachedLocaleDictionaryService as bQ, PropertyValueTransformService as bR, NameTransformPipe as bS, TranslationLoaderService as bT, trimTranslationKey as bU, getDictionaryWithTrimmedKeys as bV, LoginService as bW, LoginViews as bX, LoginComponent as bY, PasswordStrengthValidatorDirective as bZ, StrengthValidatorService as b_, StringifyObjectPipe as ba, TabsetAriaDirective as bb, TenantUiService as bc, TextareaAutoresizeDirective as bd, throttle as be, AppStateService as bf, UserNameInitialsPipe as bg, UserPreferencesStorageLocal as bh, UserPreferencesStorageInventory as bi, UserPreferencesService as bj, VirtualScrollWindowStrategy as bk, _virtualScrollWindowStrategyFactory as bl, VirtualScrollWindowDirective as bm, VirtualScrollerWrapperComponent as bn, ZipService as bo, SupportedApps as bp, InterAppService as bq, WIDGET_TYPE_VALUES as br, IntervalBasedReload as bs, DateFormatService as bt, HeaderModule as bu, HeaderService as bv, TitleOutletComponent as bw, TitleComponent as bx, HeaderBarComponent as by, PatternMessagesService as bz, C8yTranslatePipe as c, UserEditComponent as c$, ChangePasswordComponent as c0, TotpAuthComponent as c1, LoginModule as c2, CredentialsComponent as c3, ModalModule as c4, ModalComponent as c5, ConfirmModalComponent as c6, ModalService as c7, PopoverConfirmComponent as c8, NavigatorModule as c9, hookSearch as cA, SearchFilters as cB, SearchService as cC, HighlightComponent as cD, InventorySearchService as cE, SearchComponent as cF, CoreSearchModule as cG, SearchResultEmptyComponent as cH, SearchOutletComponent as cI, ConditionalTabsOutletComponent as cJ, TabsOutletComponent as cK, TabComponent as cL, HOOK_TABS as cM, hookTab as cN, TabsService as cO, TabsModule as cP, DropAreaComponent as cQ, DropAreaModule as cR, FilePickerModule as cS, FilePickerComponent as cT, FilePickerFormControlModule as cU, FilePickerFormControlComponent as cV, DatePickerModule as cW, DatePickerComponent as cX, UserEditModalComponent as cY, hookUserMenu as cZ, UserMenuService as c_, NavigatorIconComponent as ca, HOOK_NAVIGATOR_NODES as cb, hookNavigator as cc, NavigatorService as cd, NavigatorNodeRoot as ce, NavigatorOutletComponent as cf, NavigatorNodeComponent as cg, NavigatorNode as ch, NavigatorTopModule as ci, NavigatorBottomModule as cj, TotpSetupComponent as ck, TotpChallengeComponent as cl, AuthenticationModule as cm, PasswordStrengthCheckerService as cn, PasswordStrengthComponent as co, SmsChallengeComponent as cp, NewPasswordComponent as cq, PasswordCheckListComponent as cr, PasswordConfirmModalComponent as cs, PasswordConfirm as ct, PasswordService as cu, CurrentPasswordModalComponent as cv, ProvidePhoneNumberComponent as cw, PasswordInputComponent as cx, SearchInputComponent as cy, HOOK_SEARCH as cz, DataGridComponent as d, GuideDocsComponent as d$, UserTotpRevokeComponent as d0, UserModule as d1, UserMenuItemComponent as d2, UserTotpSetupComponent as d3, UserMenuOutletComponent as d4, ViewContext as d5, ContextRouteService as d6, extraRoutes as d7, viewContextRoutes as d8, RouterModule as d9, C8yValidators as dA, RequiredInputPlaceholderDirective as dB, simpleJsonPathValidator as dC, SimpleJsonPathValidatorDirective as dD, TextAreaRowHeightDirective as dE, uniqueInCollectionByPathValidator as dF, UniqueInCollectionByPathValidationDirective as dG, DatapointLibraryValidationErrors as dH, ValidationPattern as dI, HumanizeValidationMessagePipe as dJ, ExtractArrayValidationErrorsPipe as dK, FilterNonArrayValidationErrorsPipe as dL, ARRAY_VALIDATION_PREFIX as dM, validateArrayElements as dN, asyncValidateArrayElements as dO, SendStatus as dP, PushStatus as dQ, SendStatusLabels as dR, PushStatusLabels as dS, deviceAvailabilityIconMap as dT, tooltips as dU, DeviceStatusModule as dV, DeviceStatusComponent as dW, DocsModule as dX, HOOK_DOCS as dY, hookDocs as dZ, DocsService as d_, ContextRouteGuard as da, RouterTabsResolver as db, HOOK_ROUTE as dc, hookRoute as dd, RouterService as de, EmptyComponent as df, ContextRouteComponent as dg, ViewContextServices as dh, DefaultValidationDirective as di, EmailsValidatorDirective as dj, FilterInputComponent as dk, FormGroupComponent as dl, FormsModule as dm, InputGroupListContainerDirective as dn, InputGroupListComponent as dp, IpRangeInputListComponent as dq, JsonValidationPrettifierDirective as dr, MaxValidationDirective as ds, MessageDirective as dt, MessagesComponent as du, MinValidationDirective as dv, PhoneValidationDirective as dw, validateInternationalPhoneNumber as dx, RangeComponent as dy, RangeDirective as dz, AppSwitcherComponent as e, ListItemFooterComponent as e$, GuideHrefDirective as e0, DynamicFormsModule as e1, C8yJSONSchema as e2, wrapperLegendFieldConfig as e3, LegendFieldWrapper as e4, RESOLVING_COMPONENT_WAIT_TIME as e5, HOOK_COMPONENTS as e6, hookComponent as e7, hookWidget as e8, isLazyDynamicComponents as e9, WidgetTimeContextDateRangeService as eA, DEFAULT_INTERVAL_VALUE as eB, DEFAULT_INTERVAL_VALUES as eC, DEFAULT_INTERVAL_STATE as eD, GLOBAL_CONTEXT_AUTO_REFRESH as eE, WidgetGlobalAutoRefreshService as eF, globalAutoRefreshLoading as eG, AggregationPickerComponent as eH, RealtimeControlComponent as eI, C8yStepperButtons as eJ, C8yStepperIcon as eK, StepperOutletComponent as eL, C8yStepperProgress as eM, ACTIONS_STEPPER as eN, C8yStepper as eO, Steppers as eP, StepperModule as eQ, HOOK_STEPPER as eR, hookStepper as eS, StepperService as eT, ListGroupComponent as eU, ListGroupModule as eV, ListItemActionComponent as eW, ListItemBodyComponent as eX, ListItemCheckboxComponent as eY, ListItemCollapseComponent as eZ, ListItemDragHandleComponent as e_, isEagerDynamicComponents as ea, DynamicComponentErrorStrategy as eb, DynamicComponentModule as ec, DynamicComponentComponent as ed, DynamicComponentService as ee, DynamicBulkDetailsResolver as ef, DynamicDatapointsResolver as eg, DynamicManagedObjectResolver as eh, DynamicResolverService as ei, DynamicComponentAlertAggregator as ej, DynamicComponentAlert as ek, DismissAlertStrategy as el, DynamicBulkIIdentifiedResolver as em, DynamicComponentAlertsComponent as en, DashboardModule as eo, WidgetsDashboardComponent as ep, DashboardComponent as eq, CopyDashboardDisabledReason as er, NEW_DASHBOARD_ROUTER_STATE_PROP as es, DashboardChildComponent as et, DashboardChildActionComponent as eu, DashboardChildChange as ev, DashboardChildTitleComponent as ew, WidgetTimeContextComponent as ex, DateContextQueryParamNames as ey, WidgetTimeContextActionBarPriority as ez, AppSwitcherInlineComponent as f, SelectModalModule as f$, ListItemIconComponent as f0, ListItemRadioComponent as f1, ListItemTimelineComponent as f2, ListItemComponent as f3, QuickLinkModule as f4, QuickLinkComponent as f5, SelectItemDirective as f6, SelectKeyboardService as f7, SelectLegacyComponent as f8, SelectComponent as f9, DATA_GRID_CONFIGURATION_CONTEXT as fA, DATA_GRID_CONFIGURATION_CONTEXT_PROVIDER as fB, minColumnGridTrackSize as fC, ratiosByColumnTypes as fD, FilteringActionType as fE, BuiltInActionType as fF, DataGridService as fG, BooleanFilterMapper as fH, RadioFilterMapper as fI, TypeaheadFilterMapper as fJ, DateFilterMapper as fK, SelectFilterMapper as fL, StringFilterMapper as fM, hookFilterMapper as fN, FilterMapperFactory as fO, FilterMapperModule as fP, FilterMapperPipe as fQ, FilterMapperService as fR, GroupedFilterChips as fS, GridDataSource as fT, LegacyGridConfigMapperService as fU, PX_EVENT_NAME as fV, PX_ACTIONS as fW, UserPreferencesConfigurationStrategy as fX, VisibleControlsPipe as fY, ExpandableRowDirective as fZ, SelectModalFilterPipe as f_, SelectModule as fa, SelectedItemsComponent as fb, SelectedItemsDirective as fc, TypeaheadComponent as fd, HOOK_DYNAMIC_PROVIDER_CONFIG as fe, hookDynamicProviderConfig as ff, ProviderConfigurationNodeFactory as fg, ProviderConfigurationRouteFactory as fh, ProviderConfigurationComponent as fi, ProviderConfigurationModule as fj, ProviderConfigurationService as fk, ProviderDefinitionsService as fl, AbstractConfigurationStrategy as fm, hookDataGridActionControls as fn, ActionControlsExtensionService as fo, BaseFilteringFormRendererComponent as fp, CellRendererDefDirective as fq, HeaderCellRendererDefDirective as fr, CellRendererComponent as fs, ColumnDirective as ft, CustomColumn as fu, FilteringFormRendererContext as fv, FilteringFormRendererDefDirective as fw, FilteringFormRendererComponent as fx, ConfigureCustomColumnComponent as fy, DATA_GRID_CONFIGURATION_STRATEGY as fz, getBasicInputArrayFormFieldConfig as g, AssetTypesRealtimeService as g$, ModalSelectionMode as g0, SelectModalComponent as g1, GainsightService as g2, ProductExperienceDirective as g3, PRODUCT_EXPERIENCE_EVENT_SOURCE as g4, ProductExperienceModule as g5, UserEngagementsService as g6, HelpComponent as g7, HelpModule as g8, AlarmRealtimeService as g9, SetupStepperFactory as gA, SetupService as gB, HOOK_WIZARD as gC, hookWizard as gD, WizardComponent as gE, WizardModule as gF, WizardBodyComponent as gG, WizardFooterComponent as gH, WizardHeaderComponent as gI, WizardService as gJ, WizardOutletComponent as gK, WizardModalService as gL, PropertiesListComponent as gM, PropertiesListModule as gN, CoreModule as gO, TimeIntervalComponent as gP, LAST_MINUTE as gQ, LAST_HOUR as gR, LAST_DAY as gS, LAST_WEEK as gT, LAST_MONTH as gU, CUSTOM as gV, INTERVAL_OPTIONS as gW, DateTimePickerModule as gX, DateTimePickerComponent as gY, TimePickerComponent as gZ, TimePickerModule as g_, AlarmWithChildrenRealtimeService as ga, EventRealtimeService as gb, ManagedObjectRealtimeService as gc, MeasurementRealtimeService as gd, OperationBulkRealtimeService as ge, OperationRealtimeService as gf, DeviceBootstrapRealtimeService as gg, RealtimeButtonComponent as gh, RealtimeSubjectService as gi, RealtimeMessage as gj, RealtimeModule as gk, RealtimeService as gl, PluginsModule as gm, PluginsService as gn, PluginsResolveService as go, ApplicationPluginStatus as gp, PackageType as gq, PluginLoadedPipe as gr, RangeDisplayModule as gs, RangeDisplayComponent as gt, SetupCompletedComponent as gu, SetupComponent as gv, SetupState as gw, NEEDED_ROLE_FOR_SETUP as gx, SETUP_FINISHED_STEP_ID as gy, SetupModule as gz, AppIconComponent as h, AssetTypesService as h0, AuditLogModule as h1, AuditLogComponent as h2, ListDisplaySwitchModule as h3, ListDisplaySwitchComponent as h4, ClipboardService as h5, ClipboardModule as h6, VersionModule as h7, VersionService as h8, HOOK_VERSION as h9, hookPreview as hA, PreviewService as hB, SHOW_BETA_PREVIEW as hC, BetaPreviewButtonComponent as hD, FeatureCacheService as hE, BETA_FEATURE_PROVIDERS as hF, BetaFeatureShowNotification as hG, VERSION_MODULE_CONFIG as ha, hookVersion as hb, BackendVersionFactory as hc, WebSDKVersionFactory as hd, VersionListComponent as he, PlatformDetailsService as hf, DrawerModule as hg, DrawerOutletComponent as hh, hookDrawer as hi, DrawerService as hj, UiSettingsModule as hk, UiSettingsComponent as hl, ThemeSwitcherService as hm, CountdownIntervalComponent as hn, CountdownIntervalModule as ho, ColorInputComponent as hp, colorValidator as hq, AGGREGATIONS as hr, AGGREGATION_LIMITS as hs, AGGREGATION_ICONS as ht, AGGREGATION_TEXTS as hu, AGGREGATION_VALUES as hv, AGGREGATION_VALUES_ARR as hw, AGGREGATION_LABELS as hx, AggregationService as hy, HOOK_PREVIEW as hz, AppSwitcherService as i, ApplicationModule as j, ActionBarItemComponent as k, ActionBarModule as l, hookActionBar as m, ActionBarService as n, ActionBarComponent as o, HOOK_ACTION as p, hookAction as q, ActionService as r, ActionModule as s, ActionComponent as t, ActionOutletComponent as u, AlertDetailsComponent as v, alertOnError as w, AlertOutletBase as x, AlertOutletComponent as y, AlertTextComponent as z };
36646
- //# sourceMappingURL=c8y-ngx-components-c8y-ngx-components-D-YOjLHK.mjs.map
36872
+ export { CommonModule as $, AssetPropertyService as A, BaseColumn as B, CellRendererContext as C, DataGridModule as D, AlertComponent as E, AlertModule as F, BootstrapComponent as G, HOOK_ACTION_BAR as H, BootstrapModule as I, CookieBannerComponent as J, BreadcrumbOutletComponent as K, BreadcrumbComponent as L, MessageBannerService as M, HOOK_BREADCRUMB as N, hookBreadcrumb as O, BreadcrumbService as P, BreadcrumbItemComponent as Q, BreadcrumbModule as R, DRAWER_ANIMATION_TIME as S, BottomDrawerComponent as T, BottomDrawerService as U, PluginsExportScopes as V, AssetLinkPipe as W, BytesPipe as X, ColorService as Y, MAX_PAGE_SIZE as Z, initializeServices as _, BottomDrawerRef as a, ShortenUserNamePipe as a$, C8yComponentOutlet as a0, ES_MAX_TIME_MILLISECONDS as a1, DatePipe as a2, DeviceService as a3, DropdownDirectionDirective as a4, EmptyStateContextDirective as a5, EmptyStateComponent as a6, fromTrigger as a7, fromTriggerOnce as a8, InjectionType as a9, GroupService as aA, internalApps as aB, HumanizeAppNamePipe as aC, HumanizePipe as aD, IconDirective as aE, IfAllowedDirective as aF, LoadMoreComponent as aG, LoadingComponent as aH, ManagedObjectType as aI, MapFunctionPipe as aJ, MarkdownToHtmlPipe as aK, memoize as aL, MoNamePipe as aM, NUMBER_FORMAT_REGEXP as aN, NumberPipe as aO, OperationResultComponent as aP, HOOK_OPTIONS as aQ, hookOptions as aR, OptionsService as aS, OutletDirective as aT, Permissions as aU, ProgressBarComponent as aV, NULL_VALUE_PLACEHOLDER as aW, RelativeTimePipe as aX, retryWithDelay as aY, hookService as aZ, ServiceRegistry as a_, StandalonePluginInjector as aa, getInjectedHooks as ab, fromFactories as ac, resolveInjectedFactories as ad, stateToFactory as ae, sortByPriority as af, removeDuplicatesIds as ag, toObservableOfArrays as ah, isPromise as ai, isExtensionFactory as aj, toObservable as ak, ExtensionPointWithoutStateForPlugins as al, ExtensionPointForPlugins as am, getActivatedRoute as an, hookGeneric as ao, HookProviderTypes as ap, allEntriesAreEqual as aq, GENERIC_FILE_TYPE as ar, FilesService as as, ForOfDirective as at, GenericFileIconPipe as au, GeoService as av, GetGroupIconPipe as aw, GlobalConfigService as ax, GroupFragment as ay, ASSET_PATH as az, AlertService as b, RecoverPasswordComponent as b$, ShouldShowMoPipe as b0, ShowIfFilterPipe as b1, SkipLinkDirective as b2, StateService as b3, Status as b4, statusIcons as b5, statusClasses as b6, statusAlert as b7, operationStatusIcons as b8, operationStatusClasses as b9, localePathFactory as bA, languagesFactory as bB, localeId as bC, getAngularLocalesLanguageString as bD, I18nModule as bE, LANGUAGES as bF, TranslateParserCustom as bG, LOCALE_PATH as bH, loadLocale as bI, MissingTranslationCustomHandler as bJ, TranslateService as bK, MESSAGES_CORE_I18N as bL, HOOK_PATTERN_MESSAGES as bM, hookPatternMessages as bN, C8yTranslateModule as bO, C8yTranslateDirective as bP, CachedLocaleDictionaryService as bQ, PropertyValueTransformService as bR, NameTransformPipe as bS, TranslationLoaderService as bT, trimTranslationKey as bU, getDictionaryWithTrimmedKeys as bV, LoginService as bW, LoginViews as bX, LoginComponent as bY, PasswordStrengthValidatorDirective as bZ, StrengthValidatorService as b_, StringifyObjectPipe as ba, TabsetAriaDirective as bb, TenantUiService as bc, TextareaAutoresizeDirective as bd, throttle as be, AppStateService as bf, UserNameInitialsPipe as bg, UserPreferencesStorageLocal as bh, UserPreferencesStorageInventory as bi, UserPreferencesService as bj, VirtualScrollWindowStrategy as bk, _virtualScrollWindowStrategyFactory as bl, VirtualScrollWindowDirective as bm, VirtualScrollerWrapperComponent as bn, ZipService as bo, SupportedApps as bp, InterAppService as bq, WIDGET_TYPE_VALUES as br, IntervalBasedReload as bs, DateFormatService as bt, HeaderModule as bu, HeaderService as bv, TitleOutletComponent as bw, TitleComponent as bx, HeaderBarComponent as by, PatternMessagesService as bz, C8yTranslatePipe as c, UserEditComponent as c$, ChangePasswordComponent as c0, TotpAuthComponent as c1, LoginModule as c2, CredentialsComponent as c3, ModalModule as c4, ModalComponent as c5, ConfirmModalComponent as c6, ModalService as c7, PopoverConfirmComponent as c8, NavigatorModule as c9, hookSearch as cA, SearchFilters as cB, SearchService as cC, HighlightComponent as cD, InventorySearchService as cE, SearchComponent as cF, CoreSearchModule as cG, SearchResultEmptyComponent as cH, SearchOutletComponent as cI, ConditionalTabsOutletComponent as cJ, TabsOutletComponent as cK, TabComponent as cL, HOOK_TABS as cM, hookTab as cN, TabsService as cO, TabsModule as cP, DropAreaComponent as cQ, DropAreaModule as cR, FilePickerModule as cS, FilePickerComponent as cT, FilePickerFormControlModule as cU, FilePickerFormControlComponent as cV, DatePickerModule as cW, DatePickerComponent as cX, UserEditModalComponent as cY, hookUserMenu as cZ, UserMenuService as c_, NavigatorIconComponent as ca, HOOK_NAVIGATOR_NODES as cb, hookNavigator as cc, NavigatorService as cd, NavigatorNodeRoot as ce, NavigatorOutletComponent as cf, NavigatorNodeComponent as cg, NavigatorNode as ch, NavigatorTopModule as ci, NavigatorBottomModule as cj, TotpSetupComponent as ck, TotpChallengeComponent as cl, AuthenticationModule as cm, PasswordStrengthCheckerService as cn, PasswordStrengthComponent as co, SmsChallengeComponent as cp, NewPasswordComponent as cq, PasswordCheckListComponent as cr, PasswordConfirmModalComponent as cs, PasswordConfirm as ct, PasswordService as cu, CurrentPasswordModalComponent as cv, ProvidePhoneNumberComponent as cw, PasswordInputComponent as cx, SearchInputComponent as cy, HOOK_SEARCH as cz, DataGridComponent as d, GuideDocsComponent as d$, UserTotpRevokeComponent as d0, UserModule as d1, UserMenuItemComponent as d2, UserTotpSetupComponent as d3, UserMenuOutletComponent as d4, ViewContext as d5, ContextRouteService as d6, extraRoutes as d7, viewContextRoutes as d8, RouterModule as d9, C8yValidators as dA, RequiredInputPlaceholderDirective as dB, simpleJsonPathValidator as dC, SimpleJsonPathValidatorDirective as dD, TextAreaRowHeightDirective as dE, uniqueInCollectionByPathValidator as dF, UniqueInCollectionByPathValidationDirective as dG, DatapointLibraryValidationErrors as dH, ValidationPattern as dI, HumanizeValidationMessagePipe as dJ, ExtractArrayValidationErrorsPipe as dK, FilterNonArrayValidationErrorsPipe as dL, ARRAY_VALIDATION_PREFIX as dM, validateArrayElements as dN, asyncValidateArrayElements as dO, SendStatus as dP, PushStatus as dQ, SendStatusLabels as dR, PushStatusLabels as dS, deviceAvailabilityIconMap as dT, tooltips as dU, DeviceStatusModule as dV, DeviceStatusComponent as dW, DocsModule as dX, HOOK_DOCS as dY, hookDocs as dZ, DocsService as d_, ContextRouteGuard as da, RouterTabsResolver as db, HOOK_ROUTE as dc, hookRoute as dd, RouterService as de, EmptyComponent as df, ContextRouteComponent as dg, ViewContextServices as dh, DefaultValidationDirective as di, EmailsValidatorDirective as dj, FilterInputComponent as dk, FormGroupComponent as dl, FormsModule as dm, InputGroupListContainerDirective as dn, InputGroupListComponent as dp, IpRangeInputListComponent as dq, JsonValidationPrettifierDirective as dr, MaxValidationDirective as ds, MessageDirective as dt, MessagesComponent as du, MinValidationDirective as dv, PhoneValidationDirective as dw, validateInternationalPhoneNumber as dx, RangeComponent as dy, RangeDirective as dz, AppSwitcherComponent as e, ListItemFooterComponent as e$, GuideHrefDirective as e0, DynamicFormsModule as e1, C8yJSONSchema as e2, wrapperLegendFieldConfig as e3, LegendFieldWrapper as e4, RESOLVING_COMPONENT_WAIT_TIME as e5, HOOK_COMPONENTS as e6, hookComponent as e7, hookWidget as e8, isLazyDynamicComponents as e9, WidgetTimeContextDateRangeService as eA, DEFAULT_INTERVAL_VALUE as eB, DEFAULT_INTERVAL_VALUES as eC, DEFAULT_INTERVAL_STATE as eD, GLOBAL_CONTEXT_AUTO_REFRESH as eE, WidgetGlobalAutoRefreshService as eF, globalAutoRefreshLoading as eG, AggregationPickerComponent as eH, RealtimeControlComponent as eI, C8yStepperButtons as eJ, C8yStepperIcon as eK, StepperOutletComponent as eL, C8yStepperProgress as eM, ACTIONS_STEPPER as eN, C8yStepper as eO, Steppers as eP, StepperModule as eQ, HOOK_STEPPER as eR, hookStepper as eS, StepperService as eT, ListGroupComponent as eU, ListGroupModule as eV, ListItemActionComponent as eW, ListItemBodyComponent as eX, ListItemCheckboxComponent as eY, ListItemCollapseComponent as eZ, ListItemDragHandleComponent as e_, isEagerDynamicComponents as ea, DynamicComponentErrorStrategy as eb, DynamicComponentModule as ec, DynamicComponentComponent as ed, DynamicComponentService as ee, DynamicBulkDetailsResolver as ef, DynamicDatapointsResolver as eg, DynamicManagedObjectResolver as eh, DynamicResolverService as ei, DynamicComponentAlertAggregator as ej, DynamicComponentAlert as ek, DismissAlertStrategy as el, DynamicBulkIIdentifiedResolver as em, DynamicComponentAlertsComponent as en, DashboardModule as eo, WidgetsDashboardComponent as ep, DashboardComponent as eq, CopyDashboardDisabledReason as er, NEW_DASHBOARD_ROUTER_STATE_PROP as es, DashboardChildComponent as et, DashboardChildActionComponent as eu, DashboardChildChange as ev, DashboardChildTitleComponent as ew, WidgetTimeContextComponent as ex, DateContextQueryParamNames as ey, WidgetTimeContextActionBarPriority as ez, AppSwitcherInlineComponent as f, UserPreferencesConfigurationStrategy as f$, ListItemIconComponent as f0, ListItemRadioComponent as f1, ListItemTimelineComponent as f2, ListItemComponent as f3, QuickLinkModule as f4, QuickLinkComponent as f5, SelectItemDirective as f6, SelectKeyboardService as f7, SelectLegacyComponent as f8, SelectComponent as f9, TreeNodeHeaderCellRendererComponent as fA, ConfigureCustomColumnComponent as fB, DATA_GRID_CONFIGURATION_STRATEGY as fC, DATA_GRID_CONFIGURATION_CONTEXT as fD, DATA_GRID_CONFIGURATION_CONTEXT_PROVIDER as fE, minColumnGridTrackSize as fF, ratiosByColumnTypes as fG, FilteringActionType as fH, BuiltInActionType as fI, DataGridService as fJ, ExpandableRowDirective as fK, BooleanFilterMapper as fL, RadioFilterMapper as fM, TypeaheadFilterMapper as fN, DateFilterMapper as fO, SelectFilterMapper as fP, StringFilterMapper as fQ, hookFilterMapper as fR, FilterMapperFactory as fS, FilterMapperModule as fT, FilterMapperPipe as fU, FilterMapperService as fV, GroupedFilterChips as fW, GridDataSource as fX, LegacyGridConfigMapperService as fY, PX_EVENT_NAME as fZ, PX_ACTIONS as f_, SelectModule as fa, SelectedItemsComponent as fb, SelectedItemsDirective as fc, TypeaheadComponent as fd, HOOK_DYNAMIC_PROVIDER_CONFIG as fe, hookDynamicProviderConfig as ff, ProviderConfigurationNodeFactory as fg, ProviderConfigurationRouteFactory as fh, ProviderConfigurationComponent as fi, ProviderConfigurationModule as fj, ProviderConfigurationService as fk, ProviderDefinitionsService as fl, AbstractConfigurationStrategy as fm, hookDataGridActionControls as fn, ActionControlsExtensionService as fo, BaseFilteringFormRendererComponent as fp, CellRendererDefDirective as fq, HeaderCellRendererDefDirective as fr, CellRendererComponent as fs, ColumnDirective as ft, CustomColumn as fu, FilteringFormRendererContext as fv, FilteringFormRendererDefDirective as fw, FilteringFormRendererComponent as fx, TreeNodeCellRendererComponent as fy, TreeNodeColumn as fz, getBasicInputArrayFormFieldConfig as g, DateTimePickerComponent as g$, VisibleControlsPipe as g0, SelectModalFilterPipe as g1, SelectModalModule as g2, ModalSelectionMode as g3, SelectModalComponent as g4, GainsightService as g5, ProductExperienceDirective as g6, PRODUCT_EXPERIENCE_EVENT_SOURCE as g7, ProductExperienceModule as g8, UserEngagementsService as g9, NEEDED_ROLE_FOR_SETUP as gA, SETUP_FINISHED_STEP_ID as gB, SetupModule as gC, SetupStepperFactory as gD, SetupService as gE, HOOK_WIZARD as gF, hookWizard as gG, WizardComponent as gH, WizardModule as gI, WizardBodyComponent as gJ, WizardFooterComponent as gK, WizardHeaderComponent as gL, WizardService as gM, WizardOutletComponent as gN, WizardModalService as gO, PropertiesListComponent as gP, PropertiesListModule as gQ, CoreModule as gR, TimeIntervalComponent as gS, LAST_MINUTE as gT, LAST_HOUR as gU, LAST_DAY as gV, LAST_WEEK as gW, LAST_MONTH as gX, CUSTOM as gY, INTERVAL_OPTIONS as gZ, DateTimePickerModule as g_, HelpComponent as ga, HelpModule as gb, AlarmRealtimeService as gc, AlarmWithChildrenRealtimeService as gd, EventRealtimeService as ge, ManagedObjectRealtimeService as gf, MeasurementRealtimeService as gg, OperationBulkRealtimeService as gh, OperationRealtimeService as gi, DeviceBootstrapRealtimeService as gj, RealtimeButtonComponent as gk, RealtimeSubjectService as gl, RealtimeMessage as gm, RealtimeModule as gn, RealtimeService as go, PluginsModule as gp, PluginsService as gq, PluginsResolveService as gr, ApplicationPluginStatus as gs, PackageType as gt, PluginLoadedPipe as gu, RangeDisplayModule as gv, RangeDisplayComponent as gw, SetupCompletedComponent as gx, SetupComponent as gy, SetupState as gz, AppIconComponent as h, TimePickerComponent as h0, TimePickerModule as h1, AssetTypesRealtimeService as h2, AssetTypesService as h3, AuditLogModule as h4, AuditLogComponent as h5, ListDisplaySwitchModule as h6, ListDisplaySwitchComponent as h7, ClipboardService as h8, ClipboardModule as h9, AGGREGATION_LABELS as hA, AggregationService as hB, HOOK_PREVIEW as hC, hookPreview as hD, PreviewService as hE, SHOW_BETA_PREVIEW as hF, BetaPreviewButtonComponent as hG, FeatureCacheService as hH, BETA_FEATURE_PROVIDERS as hI, BetaFeatureShowNotification as hJ, VersionModule as ha, VersionService as hb, HOOK_VERSION as hc, VERSION_MODULE_CONFIG as hd, hookVersion as he, BackendVersionFactory as hf, WebSDKVersionFactory as hg, VersionListComponent as hh, PlatformDetailsService as hi, DrawerModule as hj, DrawerOutletComponent as hk, hookDrawer as hl, DrawerService as hm, UiSettingsModule as hn, UiSettingsComponent as ho, ThemeSwitcherService as hp, CountdownIntervalComponent as hq, CountdownIntervalModule as hr, ColorInputComponent as hs, colorValidator as ht, AGGREGATIONS as hu, AGGREGATION_LIMITS as hv, AGGREGATION_ICONS as hw, AGGREGATION_TEXTS as hx, AGGREGATION_VALUES as hy, AGGREGATION_VALUES_ARR as hz, AppSwitcherService as i, ApplicationModule as j, ActionBarItemComponent as k, ActionBarModule as l, hookActionBar as m, ActionBarService as n, ActionBarComponent as o, HOOK_ACTION as p, hookAction as q, ActionService as r, ActionModule as s, ActionComponent as t, ActionOutletComponent as u, AlertDetailsComponent as v, alertOnError as w, AlertOutletBase as x, AlertOutletComponent as y, AlertTextComponent as z };
36873
+ //# sourceMappingURL=c8y-ngx-components-c8y-ngx-components-D2rmddmn.mjs.map