@c8y/ngx-components 1023.48.3 → 1023.52.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 (70) hide show
  1. package/asset-properties/index.d.ts +1 -2
  2. package/asset-properties/index.d.ts.map +1 -1
  3. package/context-dashboard/index.d.ts.map +1 -1
  4. package/datapoint-explorer/view/index.d.ts +8 -0
  5. package/datapoint-explorer/view/index.d.ts.map +1 -1
  6. package/datapoint-selector/index.d.ts +14 -1
  7. package/datapoint-selector/index.d.ts.map +1 -1
  8. package/echart/index.d.ts +7 -2
  9. package/echart/index.d.ts.map +1 -1
  10. package/echart/models/index.d.ts +1 -0
  11. package/echart/models/index.d.ts.map +1 -1
  12. package/fesm2022/c8y-ngx-components-asset-properties.mjs +3 -4
  13. package/fesm2022/c8y-ngx-components-asset-properties.mjs.map +1 -1
  14. package/fesm2022/c8y-ngx-components-context-dashboard.mjs +2 -3
  15. package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
  16. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +33 -4
  17. package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
  18. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +24 -7
  19. package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
  20. package/fesm2022/c8y-ngx-components-device-grid.mjs +1 -1
  21. package/fesm2022/c8y-ngx-components-device-grid.mjs.map +1 -1
  22. package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -1
  23. package/fesm2022/c8y-ngx-components-echart.mjs +128 -52
  24. package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
  25. package/fesm2022/c8y-ngx-components-global-context.mjs +7 -2
  26. package/fesm2022/c8y-ngx-components-global-context.mjs.map +1 -1
  27. package/fesm2022/c8y-ngx-components-widgets-definitions-asset-table.mjs +127 -0
  28. package/fesm2022/c8y-ngx-components-widgets-definitions-asset-table.mjs.map +1 -0
  29. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs +3 -3
  30. package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs.map +1 -1
  31. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +1 -0
  32. package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
  33. package/fesm2022/c8y-ngx-components-widgets-exports.mjs +8 -1
  34. package/fesm2022/c8y-ngx-components-widgets-exports.mjs.map +1 -1
  35. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs +1959 -0
  36. package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs.map +1 -0
  37. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +90 -56
  38. package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
  39. package/fesm2022/c8y-ngx-components.mjs +1724 -1464
  40. package/fesm2022/c8y-ngx-components.mjs.map +1 -1
  41. package/global-context/index.d.ts +1 -0
  42. package/global-context/index.d.ts.map +1 -1
  43. package/index.d.ts +1453 -1339
  44. package/index.d.ts.map +1 -1
  45. package/locales/de.po +213 -3
  46. package/locales/es.po +213 -3
  47. package/locales/fr.po +213 -3
  48. package/locales/ja_JP.po +213 -3
  49. package/locales/ko.po +213 -3
  50. package/locales/locales.pot +219 -3
  51. package/locales/nl.po +213 -3
  52. package/locales/pl.po +213 -3
  53. package/locales/pt_BR.po +213 -3
  54. package/locales/zh_CN.po +213 -3
  55. package/locales/zh_TW.po +213 -3
  56. package/package.json +1 -1
  57. package/widgets/cockpit-exports/index.d.ts +6 -0
  58. package/widgets/cockpit-exports/index.d.ts.map +1 -1
  59. package/widgets/definitions/asset-table/index.d.ts +6 -0
  60. package/widgets/definitions/asset-table/index.d.ts.map +1 -0
  61. package/widgets/definitions/index.d.ts +1 -0
  62. package/widgets/definitions/index.d.ts.map +1 -1
  63. package/widgets/device-management-exports/index.d.ts +6 -0
  64. package/widgets/device-management-exports/index.d.ts.map +1 -1
  65. package/widgets/exports/index.d.ts +8 -1
  66. package/widgets/exports/index.d.ts.map +1 -1
  67. package/widgets/implementations/asset-table/index.d.ts +229 -0
  68. package/widgets/implementations/asset-table/index.d.ts.map +1 -0
  69. package/widgets/implementations/datapoints-graph/index.d.ts +14 -3
  70. package/widgets/implementations/datapoints-graph/index.d.ts.map +1 -1
@@ -1,8 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Input, Directive, createEnvironmentInjector, InjectionToken, Optional, Inject, Injectable, EventEmitter, Pipe, NgModule, LOCALE_ID, NgModuleRef, createNgModule, isDevMode, inject, DOCUMENT, EnvironmentInjector, Injector, HostListener, Component, HostBinding, Output, forwardRef, DestroyRef, ViewChild, SecurityContext, TemplateRef, provideAppInitializer, Self, SkipSelf, Attribute, ContentChild, ElementRef, ContentChildren, ViewContainerRef, ViewChildren, viewChild, effect, createComponent, runInInjectionContext, importProvidersFrom, ChangeDetectionStrategy, SimpleChange, reflectComponentType, signal, computed, Type, input, output } from '@angular/core';
2
+ import { Input, Directive, createEnvironmentInjector, InjectionToken, Optional, Inject, Injectable, EventEmitter, Pipe, NgModule, LOCALE_ID, NgModuleRef, createNgModule, isDevMode, inject, DOCUMENT, EnvironmentInjector, Injector, HostListener, Component, HostBinding, Output, forwardRef, DestroyRef, ViewChild, SecurityContext, TemplateRef, provideAppInitializer, ElementRef, Self, SkipSelf, Attribute, ContentChild, ContentChildren, ViewContainerRef, ViewChildren, viewChild, effect, createComponent, runInInjectionContext, importProvidersFrom, ChangeDetectionStrategy, SimpleChange, reflectComponentType, signal, computed, Type, input, output } from '@angular/core';
3
3
  import * as i1$3 from 'ngx-bootstrap/dropdown';
4
- import { BsDropdownModule, BsDropdownDirective } from 'ngx-bootstrap/dropdown';
5
- import { CdkTrapFocus, A11yModule } from '@angular/cdk/a11y';
4
+ import { BsDropdownDirective, BsDropdownModule } from 'ngx-bootstrap/dropdown';
5
+ import { ConfigurableFocusTrapFactory, CdkTrapFocus, A11yModule } from '@angular/cdk/a11y';
6
6
  import { castArray, flatten, uniq, sortBy, groupBy, camelCase, isEqual, isUndefined, throttle as throttle$1, each, mapValues, mapKeys, keys, get, isNaN as isNaN$1, isFinite, forEach, assign, min, every, first, map as map$1, find, negate, upperFirst, memoize as memoize$1, isEmpty, property, some, entries, omitBy, isDate, pick, flatMap, orderBy, filter as filter$2, snakeCase, matches, escape, escapeRegExp, assignWith, set, toNumber, isEqualWith, clone, omit, cloneDeep, uniqBy, has, transform, identity, unset, flow, findIndex as findIndex$1, isNil, chunk, values, union, without, indexOf, kebabCase, forOwn } from 'lodash-es';
7
7
  import { merge, of, defer, combineLatest, race, isObservable, from, Subject, BehaviorSubject, ReplaySubject, firstValueFrom, lastValueFrom, NEVER, Observable, startWith as startWith$1, filter as filter$1, tap as tap$1, mergeMap, fromEvent, pipe, throwError, concat, map as map$2, fromEventPattern, withLatestFrom, distinctUntilChanged as distinctUntilChanged$1, takeUntil as takeUntil$1, catchError as catchError$1, empty, timer, forkJoin, interval, shareReplay as shareReplay$1, switchMap as switchMap$1, skip as skip$1, debounceTime as debounceTime$1 } from 'rxjs';
8
8
  import { map, distinctUntilChanged, filter, startWith, switchMap, shareReplay, take, scan, takeUntil, tap, catchError, debounceTime, share, first as first$1, retryWhen, delay, concatMap, debounce, sample, withLatestFrom as withLatestFrom$1, mergeMap as mergeMap$1, every as every$1, toArray, merge as merge$1, expand, mapTo, skip, reduce, finalize, combineLatestWith } from 'rxjs/operators';
@@ -16,7 +16,7 @@ import { provideClientLibServices } from '@c8y/ngx-components/api';
16
16
  import * as i1$1 from '@ngx-translate/core';
17
17
  import { TranslateDirective, TranslatePipe, TranslateStore, TranslateService as TranslateService$1, provideTranslateService, provideTranslateLoader, provideMissingTranslationHandler, TranslateParser } from '@ngx-translate/core';
18
18
  import * as i2$3 from '@angular/common';
19
- import { formatDate, registerLocaleData, DatePipe as DatePipe$1, DATE_PIPE_DEFAULT_TIMEZONE, DATE_PIPE_DEFAULT_OPTIONS, NgIf, NgClass, NgTemplateOutlet, NgSwitch, NgSwitchCase, AsyncPipe, DecimalPipe, NgStyle, CommonModule as CommonModule$1, NgFor, NgComponentOutlet, NgSwitchDefault, KeyValuePipe, LocationStrategy, UpperCasePipe, NgPlural, NgPluralCase, SlicePipe, NgForOf } from '@angular/common';
19
+ import { formatDate, registerLocaleData, DatePipe as DatePipe$1, DATE_PIPE_DEFAULT_TIMEZONE, DATE_PIPE_DEFAULT_OPTIONS, NgIf, NgClass, NgTemplateOutlet, NgSwitch, NgSwitchCase, AsyncPipe, DecimalPipe, NgStyle, CommonModule as CommonModule$1, DOCUMENT as DOCUMENT$1, NgFor, NgComponentOutlet, NgSwitchDefault, KeyValuePipe, LocationStrategy, UpperCasePipe, NgPlural, NgPluralCase, SlicePipe, NgForOf } from '@angular/common';
20
20
  import { gettext as gettext$1 } from '@c8y/ngx-components/gettext';
21
21
  import { coerceNumberProperty } from '@angular/cdk/coercion';
22
22
  import { VIRTUAL_SCROLL_STRATEGY, CdkVirtualScrollViewport, CdkVirtualForOf, CdkFixedSizeVirtualScroll, ScrollingModule } from '@angular/cdk/scrolling';
@@ -986,6 +986,225 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
986
986
  args: [HOOK_PATTERN_MESSAGES]
987
987
  }] }] });
988
988
 
989
+ /* tslint:disable:max-line-length */
990
+ const PATTERN_MESSAGES_ALARMS = {
991
+ '^Alarm created$': {
992
+ gettext: gettext$1('Alarm created')
993
+ },
994
+ '^Alarm updated$': {
995
+ gettext: gettext$1('Alarm updated')
996
+ },
997
+ "^Device name: '(.+?)', alarm text: '(.+?)'$": {
998
+ gettext: gettext$1('Device name: "{{deviceName}}", alarm text: "{{alarmText | translate}}"'),
999
+ placeholders: {
1000
+ deviceName: '$1',
1001
+ alarmText: '$2'
1002
+ }
1003
+ }
1004
+ };
1005
+
1006
+ /* tslint:disable:max-line-length */
1007
+ const PATTERN_MESSAGES_APPLICATIONS = {
1008
+ '^Application with given name already exist$': {
1009
+ gettext: gettext$1('Application with given name already exists.')
1010
+ },
1011
+ '^Application with id (.+?) is already assigned to the tenant (.+?)$': {
1012
+ gettext: gettext$1('This application is already assigned to tenant "{{tenant}}".'),
1013
+ placeholders: {
1014
+ tenant: '$2'
1015
+ }
1016
+ },
1017
+ '^Cannot update/delete application binary via this endpoint$': {
1018
+ gettext: gettext$1('Cannot update/delete application binary via this endpoint')
1019
+ },
1020
+ '^Error occurred when trying to find an Application for id ID (.+) : Could not find application by ID (\\d+)$': {
1021
+ gettext: gettext$1('Could not find application by ID {{applicationId}}.'),
1022
+ placeholders: {
1023
+ applicationId: '$2'
1024
+ }
1025
+ },
1026
+ '^Failed to delete application. : Cannot remove application assigned to other tenants.$': {
1027
+ gettext: gettext$1('Could not delete application assigned to other tenants.')
1028
+ },
1029
+ "^name of Application cannot start with '(.+)' prefix.$": {
1030
+ gettext: gettext$1('Application name must not start with "{{ prefix }}".'),
1031
+ placeholders: {
1032
+ prefix: '$1'
1033
+ }
1034
+ },
1035
+ '^Microservice application name incorrect. Please use only lower-case letters, digits and dashes. Maximum length is (\\d+) characters.$': {
1036
+ gettext: gettext$1('Microservice application name is incorrect: only lower case letters, digits and dashes allowed. Maximum length: {{maxLength}}.'),
1037
+ placeholders: {
1038
+ maxLength: '$1'
1039
+ }
1040
+ },
1041
+ '^Platform application cannot be added to, nor removed from any tenant.$': {
1042
+ gettext: gettext$1('Platform application cannot be added to, nor removed from any tenant.')
1043
+ },
1044
+ '^Failed to refresh application. : Cannot refresh non local-hosted application.$': {
1045
+ gettext: gettext$1('Could not reactivate the application as it is not hosted locally.')
1046
+ },
1047
+ '^Failed to refresh application. : Cannot refresh application without active version id.$': {
1048
+ gettext: gettext$1('Could not reactivate the application as it has no active version.')
1049
+ },
1050
+ '^Application deleted$': {
1051
+ gettext: gettext$1('Application deleted')
1052
+ },
1053
+ '^Microservice application "(.+?)" deleted for tenant "(.+?)"$': {
1054
+ gettext: gettext$1('Microservice application "{{appName}}" deleted for tenant "{{tenant}}"'),
1055
+ placeholders: {
1056
+ appName: '$1',
1057
+ tenant: '$2'
1058
+ }
1059
+ },
1060
+ '^Hosted application "(.+?)" deleted for tenant "(.+?)"$': {
1061
+ gettext: gettext$1('Hosted application "{{appName}}" deleted for tenant "{{tenant}}"'),
1062
+ placeholders: {
1063
+ appName: '$1',
1064
+ tenant: '$2'
1065
+ }
1066
+ },
1067
+ '^External application "(.+?)" deleted for tenant "(.+?)"$': {
1068
+ gettext: gettext$1('External application "{{appName}}" deleted for tenant "{{tenant}}"'),
1069
+ placeholders: {
1070
+ appName: '$1',
1071
+ tenant: '$2'
1072
+ }
1073
+ },
1074
+ '^Application activated$': {
1075
+ gettext: gettext$1('Application activated')
1076
+ },
1077
+ '^Microservice application "(.+?)" activated: version \\[(.+?)\\] added, activeVersionId \\[(.+?)\\] added$': {
1078
+ gettext: gettext$1('Microservice application "{{appName}}" activated: version "{{version}}" added, activeVersionId "{{activeVersionId}}" added'),
1079
+ placeholders: {
1080
+ appName: '$1',
1081
+ version: '$2',
1082
+ activeVersionId: '$3'
1083
+ }
1084
+ },
1085
+ '^Hosted application "(.+?)" activated: version \\[(.+?)\\] added, activeVersionId \\[(.+?)\\] added$': {
1086
+ gettext: gettext$1('Hosted application "{{appName}}" activated: version "{{version}}" added, activeVersionId "{{activeVersionId}}" added'),
1087
+ placeholders: {
1088
+ appName: '$1',
1089
+ version: '$2',
1090
+ activeVersionId: '$3'
1091
+ }
1092
+ },
1093
+ '^Hosted application "(.+?)" activated: activeVersionId \\[\'(.+?)\'\\] added$': {
1094
+ gettext: gettext$1('Hosted application "{{appName}}" activated: activeVersionId "{{activeVersionId}}" added'),
1095
+ placeholders: {
1096
+ appName: '$1',
1097
+ activeVersionId: '$2'
1098
+ }
1099
+ },
1100
+ '^External application "(.+?)" activated: version \\[(.+?)\\] added, activeVersionId \\[(.+?)\\] added$': {
1101
+ gettext: gettext$1('External application "{{appName}}" activated: version "{{version}}" added, activeVersionId "{{activeVersionId}}" added'),
1102
+ placeholders: {
1103
+ appName: '$1',
1104
+ version: '$2',
1105
+ activeVersionId: '$3'
1106
+ }
1107
+ },
1108
+ "^Scaling application '(.+?)' from (.+?) to (.+?) instances$": {
1109
+ gettext: gettext$1('Scaling application "{{appName}}" from {{from}} to {{to}} instances'),
1110
+ placeholders: {
1111
+ appName: '$1',
1112
+ from: '$2',
1113
+ to: '$3'
1114
+ }
1115
+ },
1116
+ '^Entry is outside of the target dir: (.+)$': {
1117
+ gettext: gettext$1('File entry outside of the target directory: "{{path}}".'),
1118
+ placeholders: {
1119
+ path: '$1'
1120
+ }
1121
+ }
1122
+ };
1123
+
1124
+ /* tslint:disable:max-line-length */
1125
+ const PATTERN_MESSAGES_AUTHENTICATION = {
1126
+ '^Authentication failed! : User account is locked$': {
1127
+ gettext: gettext$1('Authentication failed due to: user account is locked.')
1128
+ },
1129
+ '^Cannot change password. : Provided token does not exist.$': {
1130
+ gettext: gettext$1('Cannot change password: provided token is invalid.')
1131
+ },
1132
+ '^Cannot reset user password : Cannot find user with such email.$': {
1133
+ gettext: gettext$1('Cannot reset password for user with such email: email not found.')
1134
+ },
1135
+ '^Error during password validation. : Password must have at least (\\d+?) characters and no more than (\\d+?) and must contain only Latin1 characters.$': {
1136
+ gettext: gettext$1('Password is invalid. It must have at least {{minCharactersCount}} and no more than {{maxCharactersCount}} characters.'),
1137
+ placeholders: {
1138
+ minCharactersCount: '$1',
1139
+ maxCharactersCount: '$2'
1140
+ }
1141
+ },
1142
+ '^Error during password validation. : Your password has been used already. Choose another.$': {
1143
+ gettext: gettext$1('This password has already been used earlier. Use a different one.')
1144
+ },
1145
+ '^Invalid credentials! : Bad credentials$': {
1146
+ gettext: gettext$1('Invalid credentials.')
1147
+ },
1148
+ '^Invalid credentials! : No phone number provided$': {
1149
+ gettext: gettext$1('Log into the management tenant first and enter your phone number.')
1150
+ },
1151
+ '^Password change is temporary blocked.$': {
1152
+ gettext: gettext$1('Password change is temporarily blocked.')
1153
+ },
1154
+ '^(.+?) user login with OAuth internal mode failed$': {
1155
+ gettext: gettext$1('"{{name}}" user login with OAI-Secure mode failed'),
1156
+ placeholders: {
1157
+ name: '$1'
1158
+ }
1159
+ },
1160
+ '^Error updating tenant! Cannot insert second configuration for Password code grant internal/Bad Request$': {
1161
+ gettext: gettext$1('This login mode was already set by another administrator. Refresh the page to update the data.')
1162
+ },
1163
+ '^(.+?) user logged in to the platform with OAuth internal login mode$': {
1164
+ gettext: gettext$1('"{{name}}" user logged in to the platform with OAI-Secure login mode'),
1165
+ placeholders: {
1166
+ name: '$1'
1167
+ }
1168
+ },
1169
+ '^Authentication with id: (.+?) configuration updated.$': {
1170
+ gettext: gettext$1('Authentication configuration with ID "{{id}}" updated.'),
1171
+ placeholders: {
1172
+ id: '$1'
1173
+ }
1174
+ },
1175
+ '^Authentication configuration with id: (.+?) added.$': {
1176
+ gettext: gettext$1('Authentication configuration with ID "{{id}}" added.'),
1177
+ placeholders: {
1178
+ id: '$1'
1179
+ }
1180
+ },
1181
+ '^Configuration type: oauth2_internal.$': {
1182
+ gettext: gettext$1('Configuration type: OAI-Secure.')
1183
+ },
1184
+ '^Configuration type: oauth2.$': {
1185
+ gettext: gettext$1('Configuration type: Single sign-on.')
1186
+ },
1187
+ '^User "(.+?)" password was updated by user "(.+?)"$': {
1188
+ gettext: gettext$1('"{{ targetUserName }}" user\'s password was updated by "{{ userName }}" user'),
1189
+ placeholders: {
1190
+ targetUserName: '$1',
1191
+ userName: '$2'
1192
+ }
1193
+ },
1194
+ '^User password update$': {
1195
+ gettext: gettext$1('User password update')
1196
+ },
1197
+ '^User "(.+?)" password updated$': {
1198
+ gettext: gettext$1('"{{ userName }}" user changed own password'),
1199
+ placeholders: {
1200
+ userName: '$1'
1201
+ }
1202
+ },
1203
+ '^Configuration type: basic.$': {
1204
+ gettext: gettext$1('Configuration type: Basic Auth.')
1205
+ }
1206
+ };
1207
+
989
1208
  /* tslint:disable:max-line-length */
990
1209
  const bulkOperationAuditLogTextPlaceholders = {
991
1210
  updatesList: {
@@ -1018,96 +1237,75 @@ const bulkOperationAuditLogTextPlaceholders = {
1018
1237
  }
1019
1238
  }
1020
1239
  };
1021
- const MESSAGES_CORE_I18N = {
1022
- '^Access is denied$': {
1023
- gettext: gettext$1('Access denied.')
1240
+ const PATTERN_MESSAGES_BULKOPERATIONS = {
1241
+ "^Cannot execute bulk operation on empty group. Group with id='(\\d+?)' doesn't have child assets.$": {
1242
+ gettext: gettext$1('Could not execute bulk operation on an empty group. Group with ID "{{groupId}}" has no child assets.'),
1243
+ placeholders: {
1244
+ groupId: '$1'
1245
+ }
1024
1246
  },
1025
- '^Alarm created$': {
1026
- gettext: gettext$1('Alarm created')
1247
+ "^Cannot execute bulk operation on empty group. DynamicGroup with id='(\\d+?)' doesn't have child assets$": {
1248
+ gettext: gettext$1('Could not execute bulk operation on an empty group. Smart group with ID "{{groupId}}" has no child assets.'),
1249
+ placeholders: {
1250
+ groupId: '$1'
1251
+ }
1027
1252
  },
1028
- '^Alarm updated$': {
1029
- gettext: gettext$1('Alarm updated')
1253
+ '^Cannot reschedule bulk operation. All its operations are successful$': {
1254
+ gettext: gettext$1('Cannot reschedule bulk operation. All its operations are already successful.')
1030
1255
  },
1031
- '^API is not available with the new domain$': {
1032
- gettext: gettext$1('Could not activate custom domain. DNS setup is incorrect.')
1256
+ '^Create bulk operation$': {
1257
+ gettext: gettext$1('Create bulk operation')
1033
1258
  },
1034
- '^Application with given name already exist$': {
1035
- gettext: gettext$1('Application with given name already exists.')
1259
+ '^Create bulk operation: (.+)$': {
1260
+ gettext: gettext$1('Create bulk operation: {{updatesList}}'),
1261
+ placeholders: bulkOperationAuditLogTextPlaceholders
1036
1262
  },
1037
- '^Application with id (.+?) is already assigned to the tenant (.+?)$': {
1038
- gettext: gettext$1('This application is already assigned to tenant "{{tenant}}".'),
1039
- placeholders: {
1040
- tenant: '$2'
1041
- }
1263
+ '^Delete bulk operation$': {
1264
+ gettext: gettext$1('Delete bulk operation')
1042
1265
  },
1043
- '^Apply software changes: (.+?)\\.?$': {
1044
- gettext: gettext$1('Apply software changes: {{ softwareChanges }}'),
1045
- placeholders: {
1046
- softwareChanges: {
1047
- capture: '$1',
1048
- translate: {
1049
- 'install "(.+?)" \\(version: (.+?)\\)': {
1050
- gettext: gettext$1('install "{{ softwareName }}" (version: {{ softwareVersion }})'),
1051
- placeholders: {
1052
- softwareName: '$1',
1053
- softwareVersion: '$2'
1054
- }
1055
- },
1056
- 'install "([^"]+)"(?! \\(version: .+?\\))': {
1057
- gettext: gettext$1('install "{{ softwareName }}"'),
1058
- placeholders: {
1059
- softwareName: '$1'
1060
- }
1061
- },
1062
- 'delete "(.+?)" \\(version: (.+?)\\)': {
1063
- gettext: gettext$1('delete "{{ softwareName }}" (version: {{ softwareVersion }})'),
1064
- placeholders: {
1065
- softwareName: '$1',
1066
- softwareVersion: '$2'
1067
- }
1068
- },
1069
- 'delete "([^"]+)"(?! \\(version: .+?\\))': {
1070
- gettext: gettext$1('delete "{{ softwareName }}"'),
1071
- placeholders: {
1072
- softwareName: '$1'
1073
- }
1074
- }
1075
- }
1076
- }
1077
- }
1266
+ '^Delete bulk operation: (.+)$': {
1267
+ gettext: gettext$1('Delete bulk operation: {{updatesList}}'),
1268
+ placeholders: bulkOperationAuditLogTextPlaceholders
1078
1269
  },
1079
- '^Assign device profile (.+?) to device (.+?)$': {
1080
- gettext: gettext$1('Assign device profile {{profileName}} to device {{deviceName}}'),
1081
- placeholders: {
1082
- profileName: '$1',
1083
- deviceName: '$2'
1084
- }
1270
+ '^Update bulk operation$': {
1271
+ gettext: gettext$1('Update bulk operation')
1085
1272
  },
1086
- '^(.+)pplication for tenant (.+) with properties \\( (.+?) \\) already exists$': {
1087
- gettext: gettext$1('Application for tenant "{{tenant}}" with the following values ({{valuesList}}) already exists.'),
1088
- placeholders: {
1089
- tenant: '$2',
1090
- valuesList: '$3'
1091
- }
1273
+ '^Update bulk operation: (.+)$': {
1274
+ gettext: gettext$1('Update bulk operation: {{updatesList}}'),
1275
+ placeholders: bulkOperationAuditLogTextPlaceholders
1276
+ }
1277
+ };
1278
+
1279
+ /* tslint:disable:max-line-length */
1280
+ const PATTERN_MESSAGES_CEP = {
1281
+ '^Cep module created$': {
1282
+ gettext: gettext$1('CEP module created')
1092
1283
  },
1093
- '^Authentication failed! : User account is locked$': {
1094
- gettext: gettext$1('Authentication failed due to: user account is locked.')
1284
+ '^Cep module updated$': {
1285
+ gettext: gettext$1('CEP module updated')
1095
1286
  },
1096
- '^Availability monitoring record$': {
1097
- gettext: gettext$1('Availability monitoring record')
1287
+ '^Cep module deleted$': {
1288
+ gettext: gettext$1('CEP module deleted')
1098
1289
  },
1099
- '^Can not activate a certificate which is either expired or not yet valid$': {
1100
- gettext: gettext$1('Cannot activate a certificate which is either expired or not yet valid.')
1290
+ '^Cep module "(.+?)" created$': {
1291
+ gettext: gettext$1('CEP module "{{name}}" created'),
1292
+ placeholders: {
1293
+ name: '$1'
1294
+ }
1101
1295
  },
1102
- '^Cannot add certificate - certificate with (.+?) fingerprint already exists. : Certificate with (.+?) fingerprint already exists.$': {
1103
- gettext: gettext$1('Could not add certificate. Certificate with {{fingerprint}} fingerprint already exists.'),
1296
+ '^Cep module "(.+?)" updated$': {
1297
+ gettext: gettext$1('CEP module "{{name}}" updated'),
1104
1298
  placeholders: {
1105
- fingerprint: '$1'
1299
+ name: '$1'
1106
1300
  }
1107
1301
  },
1108
- '^Cannot change password. : Provided token does not exist.$': {
1109
- gettext: gettext$1('Cannot change password: provided token is invalid.')
1302
+ '^Cep module "(.+?)" deleted$': {
1303
+ gettext: gettext$1('CEP module "{{name}}" deleted'),
1304
+ placeholders: {
1305
+ name: '$1'
1306
+ }
1110
1307
  },
1308
+ // CEP module deployment errors
1111
1309
  '^Cannot deploy module (.*)$': {
1112
1310
  gettext: gettext$1('Cannot deploy module due to error: "{{ errorMessage | translate }}".'),
1113
1311
  placeholders: {
@@ -1156,164 +1354,218 @@ const MESSAGES_CORE_I18N = {
1156
1354
  affectedStatement: '$7'
1157
1355
  }
1158
1356
  },
1159
- "^Cannot execute bulk operation on empty group. Group with id='(\\d+?)' doesn't have child assets.$": {
1160
- gettext: gettext$1('Could not execute bulk operation on an empty group. Group with ID "{{groupId}}" has no child assets.'),
1357
+ "^Error in statement (.+?):(.+?)! : Incorrect syntax near '(.+?)' near reserved keyword '(.+?)' \\[([\\S\\s]+?)\\]$": {
1358
+ gettext: gettext$1('Error in statement {{moduleName}}:{{statementNumber}}. Incorrect syntax near expression "{{expression}}" near reserved keyword "{{keyword}}".'),
1161
1359
  placeholders: {
1162
- groupId: '$1'
1360
+ moduleName: '$1',
1361
+ statementNumber: '$2',
1362
+ expression: '$3',
1363
+ keyword: '$4'
1163
1364
  }
1164
1365
  },
1165
- "^Cannot execute bulk operation on empty group. DynamicGroup with id='(\\d+?)' doesn't have child assets$": {
1166
- gettext: gettext$1('Could not execute bulk operation on an empty group. Smart group with ID "{{groupId}}" has no child assets.'),
1366
+ '^Exception on tenant (.+) in statement \'(.+)\': Http status code: (\\d+) \\{error="alarm/Unprocessable Entity",message="(.+)",info="https://www.cumulocity.com/guides/reference-guide/#error_reporting",details="null"\\}$': {
1367
+ gettext: gettext$1('Exception on tenant {{tenantId}} in statement "{{statement}}": HTTP status code: {{httpStatusCode}} : {{message | translate}}'),
1167
1368
  placeholders: {
1168
- groupId: '$1'
1369
+ tenantId: '$1',
1370
+ statement: '$2',
1371
+ httpStatusCode: '$3',
1372
+ message: '$4'
1169
1373
  }
1170
1374
  },
1171
- '^Cannot parse X509 certificate. : Could not parse certificate: (.+?)$': {
1172
- gettext: gettext$1('Could not parse X.509 certificate: {{ failureReason | translate }}.'),
1375
+ "^Exception on tenant (.+) in statement '(.+)': Invocation exception when invoking method '(.+)' of class '(.+)' passing parameters \\[(.+)\\] for statement '(.+)': (.+) : (.+)$": {
1376
+ gettext: gettext$1('Exception on tenant {{tenantId}} in statement "{{moduleName}}": Invocation exception when invoking method "{{methodName}}" of class "{{classPath}}" passing parameters [{{parameters}}] for statement "{{statement}}": {{exceptionType}} : {{exceptionMessage}}.'),
1173
1377
  placeholders: {
1174
- failureReason: '$1'
1378
+ tenantId: '$1',
1379
+ moduleName: '$2',
1380
+ methodName: '$3',
1381
+ classPath: '$4',
1382
+ parameters: '$5',
1383
+ statement: '$6',
1384
+ exceptionType: '$7',
1385
+ exceptionMessage: '$8'
1175
1386
  }
1176
1387
  },
1177
- '^Cannot reschedule bulk operation. All its operations are successful$': {
1178
- gettext: gettext$1('Cannot reschedule bulk operation. All its operations are already successful.')
1179
- },
1180
- '^Cannot reset user password : Cannot find user with such email.$': {
1181
- gettext: gettext$1('Cannot reset password for user with such email: email not found.')
1182
- },
1183
- '^Cannot update/delete application binary via this endpoint$': {
1184
- gettext: gettext$1('Cannot update/delete application binary via this endpoint')
1388
+ // Smart rules (part of CEP functionality)
1389
+ '^Smart rule created$': {
1390
+ gettext: gettext$1('Smart rule created.')
1185
1391
  },
1186
- "^Can't delete user because it is used by another managed object$": {
1187
- gettext: gettext$1('Cannot delete device with associated device owner because this owner is still assigned to other device(s). Try to remove only the device.')
1392
+ '^Smart rule updated$': {
1393
+ gettext: gettext$1('Smart rule updated.')
1188
1394
  },
1189
- '^Cep module created$': {
1190
- gettext: gettext$1('CEP module created')
1395
+ '^Smart rule enabled$': {
1396
+ gettext: gettext$1('Smart rule activated.')
1191
1397
  },
1192
- '^Cep module updated$': {
1193
- gettext: gettext$1('CEP module updated')
1398
+ '^Smart rule disabled$': {
1399
+ gettext: gettext$1('Smart rule deactivated.')
1194
1400
  },
1195
- '^Cep module deleted$': {
1196
- gettext: gettext$1('CEP module deleted')
1401
+ '^Smart rule deleted$': {
1402
+ gettext: gettext$1('Smart rule deleted.')
1197
1403
  },
1198
- '^Cep module "(.+?)" created$': {
1199
- gettext: gettext$1('CEP module "{{name}}" created'),
1404
+ '^Smart rule "(.+?)" created$': {
1405
+ gettext: gettext$1('Smart rule "{{name}}" created.'),
1200
1406
  placeholders: {
1201
1407
  name: '$1'
1202
1408
  }
1203
1409
  },
1204
- '^Cep module "(.+?)" updated$': {
1205
- gettext: gettext$1('CEP module "{{name}}" updated'),
1410
+ '^Smart rule "(.+?)" updated$': {
1411
+ gettext: gettext$1('Smart rule "{{name}}" updated.'),
1206
1412
  placeholders: {
1207
1413
  name: '$1'
1208
1414
  }
1209
1415
  },
1210
- '^Cep module "(.+?)" deleted$': {
1211
- gettext: gettext$1('CEP module "{{name}}" deleted'),
1416
+ '^Smart rule "(.+?)" enabled$': {
1417
+ gettext: gettext$1('Smart rule "{{name}}" activated.'),
1212
1418
  placeholders: {
1213
1419
  name: '$1'
1214
1420
  }
1215
1421
  },
1216
- '^Command state is invalid: (.+)$': {
1217
- gettext: gettext$1('Command state is invalid: {{violations}}'),
1422
+ '^Smart rule "(.+?)" disabled$': {
1423
+ gettext: gettext$1('Smart rule "{{name}}" deactivated.'),
1218
1424
  placeholders: {
1219
- violations: {
1220
- capture: '$1',
1221
- translate: {
1222
- '(\\w+?) - may not be null': {
1223
- gettext: gettext$1('"{{field}}" must not be null'),
1224
- placeholders: {
1225
- field: '$1'
1226
- }
1227
- }
1228
- }
1229
- }
1425
+ name: '$1'
1230
1426
  }
1231
1427
  },
1232
- '^Could not connect to endpoint (.+)\\. Could not verify `(.+)` host key with fingerprint `(.+)` for `(.+)` on port (.+)\\. If you expected that key, please remove the previous one from configuration to allow for connection\\.$': {
1233
- gettext: gettext$1('Could not connect to endpoint "{{endpointName}}". Could not verify {{keyType}} host key with fingerprint {{fingerprint}} for host {{host}} on port {{port}}. If you expected this key, please remove the previous one from configuration to allow for connection.'),
1428
+ '^Smart rule "(.+?)" deleted$': {
1429
+ gettext: gettext$1('Smart rule "{{name}}" deleted.'),
1234
1430
  placeholders: {
1235
- endpointName: '$1',
1236
- keyType: '$2',
1237
- fingerprint: '$3',
1238
- host: '$4',
1239
- port: '$5'
1431
+ name: '$1'
1240
1432
  }
1241
1433
  },
1242
- '^Could not login to ssh server on endpoint "(.+)"\\. Provided credential for user "(.+)" is incorrect\\.$': {
1243
- gettext: gettext$1('Could not access SSH server on endpoint "{{endpointName}}". Provided credentials for user "{{userName}}" are incorrect.'),
1434
+ '^(.+) succeeded for volume "(.+)"$': {
1435
+ gettext: gettext$1('Operation "{{operation}}" succeeded for volume "{{volume}}".'),
1244
1436
  placeholders: {
1245
- endpointName: '$1',
1246
- userName: '$2'
1437
+ operation: '$1',
1438
+ volume: '$2'
1247
1439
  }
1440
+ }
1441
+ };
1442
+
1443
+ /* tslint:disable:max-line-length */
1444
+ const PATTERN_MESSAGES_CERTIFICATES = {
1445
+ '^Can not activate a certificate which is either expired or not yet valid$': {
1446
+ gettext: gettext$1('Cannot activate a certificate which is either expired or not yet valid.')
1248
1447
  },
1249
- '^Could not save object remoteAccessUpdate: (.+)$': {
1250
- gettext: '{{errorMessages}}',
1448
+ '^Cannot add certificate - certificate with (.+?) fingerprint already exists. : Certificate with (.+?) fingerprint already exists.$': {
1449
+ gettext: gettext$1('Could not add certificate. Certificate with {{fingerprint}} fingerprint already exists.'),
1251
1450
  placeholders: {
1252
- errorMessages: {
1253
- capture: '$1',
1254
- translate: {
1255
- 'Could not recognize host-key format': {
1256
- gettext: gettext$1('Could not recognize "Host key" format')
1257
- },
1258
- 'Could not recognize key-pair format': {
1259
- gettext: gettext$1('Could not recognize the format of "Public key" or "Private key"')
1260
- }
1261
- }
1262
- }
1451
+ fingerprint: '$1'
1263
1452
  }
1264
1453
  },
1265
- '^Could not update user. : Error persisting user (.+?)!$': {
1266
- gettext: gettext$1('Could not update user "{{username}}".'),
1454
+ '^Cannot parse X509 certificate. : Could not parse certificate: (.+?)$': {
1455
+ gettext: gettext$1('Could not parse X.509 certificate: {{ failureReason | translate }}.'),
1267
1456
  placeholders: {
1268
- username: '$1'
1457
+ failureReason: '$1'
1269
1458
  }
1270
1459
  },
1271
- '^Create bulk operation$': {
1272
- gettext: gettext$1('Create bulk operation')
1460
+ '^Domain name in uploaded certificate differs from the one in use$': {
1461
+ gettext: gettext$1('Domain name in uploaded certificate differs from the one in use. Please deactivate the custom domain before uploading new certificate.')
1273
1462
  },
1274
- '^Create bulk operation: (.+)$': {
1275
- gettext: gettext$1('Create bulk operation: {{updatesList}}'),
1276
- placeholders: bulkOperationAuditLogTextPlaceholders
1463
+ '^Failed to extract certificate from PKCS12$': {
1464
+ gettext: gettext$1('Failed to extract certificate from PKCS12.')
1277
1465
  },
1278
- '^Creation ramp must be greater than (\\d+?)$': {
1279
- gettext: gettext$1('Bulk operation delay must be greater than {{minSeconds}} seconds.'),
1466
+ "^Trusted certificate updated on '(.+?)'\\.$": {
1467
+ gettext: gettext$1('Trusted certificate updated on tenant "{{ tenantId }}"'),
1280
1468
  placeholders: {
1281
- minSeconds: '$1'
1469
+ tenantId: '$1'
1282
1470
  }
1283
1471
  },
1284
- '^Created container$': {
1285
- gettext: gettext$1('Container created.')
1286
- },
1287
- '^Created pod: (.+)$': {
1288
- gettext: gettext$1('Pod "{{imageName}}" created.'),
1472
+ "^Trusted certificate deleted from '(.+?)'\\.$": {
1473
+ gettext: gettext$1('Trusted certificate deleted from tenant "{{ tenantId }}"'),
1289
1474
  placeholders: {
1290
- imageName: '$1'
1475
+ tenantId: '$1'
1291
1476
  }
1292
1477
  },
1293
- '^Creating device on LoRa platform failed$': {
1294
- gettext: gettext$1('Could not create the device in the LoRa platform.')
1295
- },
1296
- '^CSV file contained empty dataset$': {
1297
- gettext: gettext$1('No entries found in uploaded CSV file.')
1298
- },
1299
- '^Cycle detected for route (.+?)!$': {
1300
- gettext: gettext$1('Cycle detected for route {{route}}.'),
1478
+ "^Certificate fingerprint: '(.+?)'\\.\\n\\s*Certificate subject name: '(.+?)'\\.\\n$": {
1479
+ gettext: gettext$1('Certificate fingerprint: "{{ fingerprint }}".\nCertificate subject name: "{{ subjectName }}".'),
1301
1480
  placeholders: {
1302
- route: '$1'
1481
+ fingerprint: '$1',
1482
+ subjectName: '$2'
1303
1483
  }
1304
1484
  },
1305
- '^Data broker processing is currently overloaded and may stop forwarding your data\\. Please contact support\\.$': {
1306
- gettext: gettext$1('Data broker processing is currently overloaded and may stop forwarding your data. Please contact support.')
1307
- },
1308
- '^Data broker processing is not able to connect do destination tenant, thus data forwarding is not working\\. Please contact support\\.$': {
1309
- gettext: gettext$1('Data broker processing is not able to connect to destination tenant, thus data forwarding is not working. Please contact support.')
1485
+ "^Certificate fingerprint: '(.+?)'\\.\\n\\s*Certificate subject name: '(.+?)'\\.\\n\\s*NotAfter='(.+?)'.*$": {
1486
+ gettext: gettext$1('Certificate fingerprint: "{{ fingerprint }}".\nCertificate subject name: "{{ subjectName }}".\nExpiration date: {{ expirationDate | absoluteDate }}.'),
1487
+ placeholders: {
1488
+ fingerprint: '$1',
1489
+ subjectName: '$2',
1490
+ expirationDate: '$3'
1491
+ }
1310
1492
  },
1311
- '^Delete bulk operation$': {
1312
- gettext: gettext$1('Delete bulk operation')
1493
+ "^Certificate fingerprint: '(.+?)'\\.\\n\\s*Certificate subject name: '(.+?)'\\.\\n\\s*Status='(.+?)'.*$": {
1494
+ gettext: gettext$1('Certificate fingerprint: "{{ fingerprint }}".\nCertificate subject name: "{{ subjectName }}".\nStatus: "{{ status }}".'),
1495
+ placeholders: {
1496
+ fingerprint: '$1',
1497
+ subjectName: '$2',
1498
+ status: '$3'
1499
+ }
1313
1500
  },
1314
- '^Delete bulk operation: (.+)$': {
1315
- gettext: gettext$1('Delete bulk operation: {{updatesList}}'),
1316
- placeholders: bulkOperationAuditLogTextPlaceholders
1501
+ '^The CA certificate has not been refreshed\\.\\s+It may either still have sufficient remaining validity.*$': {
1502
+ gettext: gettext$1('The CA certificate has not been renewed; however, it may still have sufficient validity remaining.')
1503
+ },
1504
+ "^Provisioned certificate stored in user object: '(.+?)'.*$": {
1505
+ gettext: gettext$1('Provisioned certificate stored in user object: "{{ userName }}"'),
1506
+ placeholders: {
1507
+ userName: '$1'
1508
+ }
1509
+ },
1510
+ "^Certificate serial number: '(.+?)'\\.\\n\\s*NotAfter='(.+?)'.*$": {
1511
+ gettext: gettext$1('Certificate serial number: "{{ serialNumber }}".\nExpiration date: {{ expirationDate | absoluteDate }}.'),
1512
+ placeholders: {
1513
+ serialNumber: '$1',
1514
+ expirationDate: '$2'
1515
+ }
1516
+ },
1517
+ "^Provisioned certificates removed from user: '(.+?)'.*$": {
1518
+ gettext: gettext$1('Provisioned certificates removed from user object: "{{ userName }}"'),
1519
+ placeholders: {
1520
+ userName: '$1'
1521
+ }
1522
+ },
1523
+ "^Certificate serial number hex: '(.+?)'.*$": {
1524
+ gettext: gettext$1('Certificate serial number: "{{ serialNumber }}"'),
1525
+ placeholders: {
1526
+ serialNumber: '$1'
1527
+ }
1528
+ },
1529
+ "^Tenant certificate authority\\(CA\\) created on '(.+?)'.*$": {
1530
+ gettext: gettext$1('Tenant certificate authority (CA) created for tenant "{{ tenantId }}"'),
1531
+ placeholders: {
1532
+ tenantId: '$1'
1533
+ }
1534
+ },
1535
+ "^Tenant certificate authority\\(CA\\) was renewed for Tenant: '(.+?)'.*$": {
1536
+ gettext: gettext$1('Tenant certificate authority (CA) was renewed for tenant "{{ tenantId }}"'),
1537
+ placeholders: {
1538
+ tenantId: '$1'
1539
+ }
1540
+ },
1541
+ "^Tenant certificate authority\\(CA\\) renewal for Tenant: '(.+?)' failed.*$": {
1542
+ gettext: gettext$1('Tenant certificate authority (CA) renewal for tenant "{{ tenantId }}" failed'),
1543
+ placeholders: {
1544
+ tenantId: '$1'
1545
+ }
1546
+ },
1547
+ '^Tenant certificate authority\\(CA\\) signed certificate for device: (.+?)\\.$': {
1548
+ gettext: gettext$1('Tenant certificate authority (CA) signed certificate for device: "{{ deviceId }}".'),
1549
+ placeholders: {
1550
+ deviceId: '$1'
1551
+ }
1552
+ },
1553
+ '^Revoked serials: (.+?)$': {
1554
+ gettext: gettext$1('Revoked serials: {{ revokedSerials }}'),
1555
+ placeholders: {
1556
+ revokedSerials: '$1'
1557
+ }
1558
+ }
1559
+ };
1560
+
1561
+ /* tslint:disable:max-line-length */
1562
+ const PATTERN_MESSAGES_DEVICES = {
1563
+ '^Assign device profile (.+?) to device (.+?)$': {
1564
+ gettext: gettext$1('Assign device profile {{profileName}} to device {{deviceName}}'),
1565
+ placeholders: {
1566
+ profileName: '$1',
1567
+ deviceName: '$2'
1568
+ }
1317
1569
  },
1318
1570
  "^Device id '(.+?)' contains '(.+?)' character which is not permitted.$": {
1319
1571
  gettext: gettext$1('ID "{{deviceId}}" contains invalid character: "{{invalidCharacter}}".'),
@@ -1322,13 +1574,6 @@ const MESSAGES_CORE_I18N = {
1322
1574
  invalidCharacter: '$2'
1323
1575
  }
1324
1576
  },
1325
- "^Device name: '(.+?)', alarm text: '(.+?)'$": {
1326
- gettext: gettext$1('Device name: "{{deviceName}}", alarm text: "{{alarmText | translate}}"'),
1327
- placeholders: {
1328
- deviceName: '$1',
1329
- alarmText: '$2'
1330
- }
1331
- },
1332
1577
  '^Device (.+?) already registered to a tenant.$': {
1333
1578
  gettext: gettext$1('Device {{ devEUI }} is already registered in your tenant or in another tenant in the platform.'),
1334
1579
  placeholders: {
@@ -1342,517 +1587,577 @@ const MESSAGES_CORE_I18N = {
1342
1587
  newExtIds: '$2'
1343
1588
  }
1344
1589
  },
1345
- '^Display name$': {
1346
- gettext: gettext$1('Login alias')
1347
- },
1348
- '^Domain name in uploaded certificate differs from the one in use$': {
1349
- gettext: gettext$1('Domain name in uploaded certificate differs from the one in use. Please deactivate the custom domain before uploading new certificate.')
1350
- },
1351
- '^Domain name is already in use by another tenant!$': {
1352
- gettext: gettext$1('Domain name is already used by another tenant.')
1353
- },
1354
- '^Duplicated connector for instanceUrl (.+?)!$': {
1355
- gettext: gettext$1('Target URL {{targetUrl}} already used by another connector.'),
1590
+ "^Finding device data from database failed : No managedObject for id '(.+?)'!$": {
1591
+ gettext: gettext$1('Could not find managed object with ID "{{deviceId}}".'),
1356
1592
  placeholders: {
1357
- targetUrl: '$1'
1593
+ deviceId: '$1'
1358
1594
  }
1359
1595
  },
1360
- '^Duplicated connector for name (.+?)!$': {
1361
- gettext: gettext$1('Connector name "{{name}}" already used by another connector.'),
1596
+ '^NewDeviceRequest for id = (.+?) already exists.$': {
1597
+ gettext: gettext$1('Device registration request with ID {{id}} already exists.'),
1362
1598
  placeholders: {
1363
- name: '$1'
1599
+ id: '$1'
1364
1600
  }
1365
1601
  },
1366
- '^Entry is outside of the target dir: (.+)$': {
1367
- gettext: gettext$1('File entry outside of the target directory: "{{path}}".'),
1602
+ '^NewDeviceRequest for device id (.+?) is in state BLOCKED, not PENDING_ACCEPTANCE.$': {
1603
+ gettext: gettext$1('Device registration request with ID "{{deviceId}}" is in state "Blocked", not "Pending acceptance". Remove this registration request and start over.'),
1368
1604
  placeholders: {
1369
- path: '$1'
1605
+ deviceId: '$1'
1370
1606
  }
1371
1607
  },
1372
- '^Error during password validation. : Password must have at least (\\d+?) characters and no more than (\\d+?) and must contain only Latin1 characters.$': {
1373
- gettext: gettext$1('Password is invalid. It must have at least {{minCharactersCount}} and no more than {{maxCharactersCount}} characters.'),
1608
+ '^No communication with device since (.+?)$': {
1609
+ gettext: gettext$1('No communication with device since {{timestamp | absoluteDate}}.'),
1374
1610
  placeholders: {
1375
- minCharactersCount: '$1',
1376
- maxCharactersCount: '$2'
1611
+ timestamp: '$1'
1377
1612
  }
1378
1613
  },
1379
- '^Error during password validation. : Your password has been used already. Choose another.$': {
1380
- gettext: gettext$1('This password has already been used earlier. Use a different one.')
1614
+ '^No data received from device within required interval.$': {
1615
+ gettext: gettext$1('No data received from device within required interval.')
1381
1616
  },
1382
- "^Error in statement (.+?):(.+?)! : Incorrect syntax near '(.+?)' near reserved keyword '(.+?)' \\[([\\S\\s]+?)\\]$": {
1383
- gettext: gettext$1('Error in statement {{moduleName}}:{{statementNumber}}. Incorrect syntax near expression "{{expression}}" near reserved keyword "{{keyword}}".'),
1617
+ '^Provided security key does not match key stored for device (.+?).$': {
1618
+ gettext: gettext$1('Provided security token does not match the security token stored for this device "{{deviceId}}".'),
1384
1619
  placeholders: {
1385
- moduleName: '$1',
1386
- statementNumber: '$2',
1387
- expression: '$3',
1388
- keyword: '$4'
1620
+ deviceId: '$1'
1389
1621
  }
1390
1622
  },
1391
- '^External id not found; external id = ID \\[type=(.+?), value=(.+?)\\]$': {
1392
- gettext: gettext$1('External ID not found for type "{{type}}" and value "{{value}}".'),
1623
+ '^Provided security key does not match key stored for device (.+?).Reached maximum number of failed attempts while trying to register this device. Request will now be blocked and has to be removed manually to restart the process.$': {
1624
+ gettext: gettext$1('The provided security token does not match the token stored for device "{{deviceId}}". You have reached the maximum number of failed attempts while trying to register this device. The request will now be blocked and must be removed manually to restart the process.'),
1393
1625
  placeholders: {
1394
- type: '$1',
1395
- value: '$2'
1626
+ deviceId: '$1'
1396
1627
  }
1397
1628
  },
1398
- '^Error occurred when trying to find an Application for id ID (.+) : Could not find application by ID (\\d+)$': {
1399
- gettext: gettext$1('Could not find application by ID {{applicationId}}.'),
1629
+ '^Retrieve configuration snapshot from device (.+?)$': {
1630
+ gettext: gettext$1('Retrieve configuration snapshot from device {{deviceName}}'),
1400
1631
  placeholders: {
1401
- applicationId: '$2'
1632
+ deviceName: '$1'
1402
1633
  }
1403
1634
  },
1404
- '^Http status code: 404\n{error="options/Not Found",message="Unable to find option by given key: sigfox-agent/provider.token",info="https://www.cumulocity.com/guides/reference-guide/#error_reporting",details="null"}$': {
1405
- gettext: gettext$1('Unable to find option by given key: sigfox-agent/provider.token')
1635
+ '^Retrieve (.+?) configuration snapshot from device (.+?)$': {
1636
+ gettext: gettext$1('Retrieve {{configurationType}} configuration snapshot from device {{deviceName}}'),
1637
+ placeholders: {
1638
+ configurationType: '$1',
1639
+ deviceName: '$2'
1640
+ }
1406
1641
  },
1407
- '^Failed to delete application. : Cannot remove application assigned to other tenants.$': {
1408
- gettext: gettext$1('Could not delete application assigned to other tenants.')
1642
+ '^Send configuration snapshot (.+?) of configuration type (.+?) to device (.+?)$': {
1643
+ gettext: gettext$1('Send configuration snapshot {{snapshotName}} of configuration type {{configurationType}} to device {{deviceName}}'),
1644
+ placeholders: {
1645
+ snapshotName: '$1',
1646
+ configurationType: '$2',
1647
+ deviceName: '$3'
1648
+ }
1409
1649
  },
1410
- '^Failed to extract certificate from PKCS12$': {
1411
- gettext: gettext$1('Failed to extract certificate from PKCS12.')
1650
+ '^Send configuration snapshot (.+?) to device (.+?)$': {
1651
+ gettext: gettext$1('Send configuration snapshot {{snapshotName}} to device {{deviceName}}'),
1652
+ placeholders: {
1653
+ snapshotName: '$1',
1654
+ deviceName: '$2'
1655
+ }
1412
1656
  },
1413
- '^Failed to update domain at the platform$': {
1414
- gettext: gettext$1('Failed to update domain at the platform.')
1657
+ '^You have reached devices limit. No more devices can be registered.$': {
1658
+ gettext: gettext$1('You reached devices limit. No more devices can be registered.')
1415
1659
  },
1416
- "^Finding device data from database failed : No managedObject for id '(.+?)'!$": {
1417
- gettext: gettext$1('Could not find managed object with ID "{{deviceId}}".'),
1660
+ '^Added new child device to "(.+)" \\(ID: (.+)\\).$': {
1661
+ gettext: gettext$1('Added new child device to "{{parentDeviceName}}" (ID: {{parentDeviceId}}).'),
1418
1662
  placeholders: {
1419
- deviceId: '$1'
1663
+ parentDeviceName: '$1',
1664
+ parentDeviceId: '$2'
1420
1665
  }
1421
1666
  },
1422
- '^Following mandatory fields should be included: (.+?)$': {
1423
- gettext: gettext$1('Following mandatory fields should be included: {{fields}}'),
1667
+ '^Updated child device of "(.+)" \\(ID: (.+)\\).$': {
1668
+ gettext: gettext$1('Updated child device of "{{parentDeviceName}}" (ID: {{parentDeviceId}}).'),
1424
1669
  placeholders: {
1425
- fields: '$1'
1670
+ parentDeviceName: '$1',
1671
+ parentDeviceId: '$2'
1426
1672
  }
1427
1673
  },
1428
- '^Global Role updated$': {
1429
- gettext: gettext$1('Global role updated')
1674
+ '^Added child device "(.+)" \\(ID: (.+)\\).$': {
1675
+ gettext: gettext$1('Added child device "{{name}}" (ID: {{id}}).'),
1676
+ placeholders: {
1677
+ name: '$1',
1678
+ id: '$2'
1679
+ }
1430
1680
  },
1431
- '^Global Role (.+?) updated$': {
1432
- gettext: gettext$1('Global role "{{name}}" updated'),
1681
+ '^Removed child device "(.+)" \\(ID: (.+)\\).$': {
1682
+ gettext: gettext$1('Removed child device "{{name}}" (ID: {{id}}).'),
1683
+ placeholders: {
1684
+ name: '$1',
1685
+ id: '$2'
1686
+ }
1687
+ },
1688
+ '^Apply device profile: (.+).?$': {
1689
+ gettext: gettext$1('Apply device profile: {{ name }}'),
1433
1690
  placeholders: {
1434
1691
  name: '$1'
1435
1692
  }
1436
1693
  },
1437
- '^Global Role (.+?) updated: (.+)$': {
1438
- gettext: gettext$1('Global role "{{name}}" updated: {{updatesList}}'),
1694
+ '^Device put into maintenance state$': {
1695
+ gettext: gettext$1('Device put into maintenance state')
1696
+ },
1697
+ '^device with id: (.+?) is put into maintenance state$': {
1698
+ gettext: gettext$1('Device with ID "{{deviceId}}" is put into maintenance state'),
1439
1699
  placeholders: {
1440
- name: '$1',
1441
- updatesList: {
1442
- capture: '$2',
1443
- translate: {
1444
- 'applications \\[([^\\]]+?)\\] added': {
1445
- gettext: gettext$1('applications {{list}} added'),
1446
- placeholders: {
1447
- list: '$1'
1448
- }
1449
- },
1450
- 'applications \\[([^\\]]+?)\\] removed': {
1451
- gettext: gettext$1('applications {{list}} removed'),
1452
- placeholders: {
1453
- list: '$1'
1454
- }
1455
- },
1456
- 'roles \\[([^\\]]+?)\\] added': {
1457
- gettext: gettext$1('roles {{list}} added'),
1458
- placeholders: {
1459
- list: '$1'
1460
- }
1461
- },
1462
- 'roles \\[([^\\]]+?)\\] removed': {
1463
- gettext: gettext$1('roles {{list}} removed'),
1464
- placeholders: {
1465
- list: '$1'
1466
- }
1467
- }
1468
- }
1469
- }
1700
+ deviceId: '$1'
1470
1701
  }
1471
1702
  },
1472
- '^Global Roles$': {
1473
- gettext: gettext$1('Global roles')
1703
+ '^External id not found; external id = ID \\[type=(.+?), value=(.+?)\\]$': {
1704
+ gettext: gettext$1('External ID not found for type "{{type}}" and value "{{value}}".'),
1705
+ placeholders: {
1706
+ type: '$1',
1707
+ value: '$2'
1708
+ }
1474
1709
  },
1475
- '^Operation updated: (.+)$': {
1476
- gettext: gettext$1('Operation updated: {{updatesList}}'),
1710
+ '^ID \\[type=(.+?), value=(.+?)\\] was already bound to different Global ID.$': {
1711
+ gettext: gettext$1('External ID "{{value}}" of the type "{{type}}" already exists.'),
1477
1712
  placeholders: {
1478
- updatesList: {
1713
+ type: '$1',
1714
+ value: '$2'
1715
+ }
1716
+ }
1717
+ };
1718
+
1719
+ /* tslint:disable:max-line-length */
1720
+ const PATTERN_MESSAGES_FIRMWARE = {
1721
+ '^Apply software changes: (.+?)\\.?$': {
1722
+ gettext: gettext$1('Apply software changes: {{ softwareChanges }}'),
1723
+ placeholders: {
1724
+ softwareChanges: {
1479
1725
  capture: '$1',
1480
1726
  translate: {
1481
- "status='(.+?)'": {
1482
- gettext: gettext$1('status: "{{ status | translate }}"'),
1727
+ 'install "(.+?)" \\(version: (.+?)\\)': {
1728
+ gettext: gettext$1('install "{{ softwareName }}" (version: {{ softwareVersion }})'),
1483
1729
  placeholders: {
1484
- status: '$1'
1730
+ softwareName: '$1',
1731
+ softwareVersion: '$2'
1485
1732
  }
1486
1733
  },
1487
- "description='(.+?)'": {
1488
- gettext: gettext$1('description: "{{ description | translate }}"'),
1734
+ 'install "([^"]+)"(?! \\(version: .+?\\))': {
1735
+ gettext: gettext$1('install "{{ softwareName }}"'),
1489
1736
  placeholders: {
1490
- description: '$1'
1737
+ softwareName: '$1'
1491
1738
  }
1492
1739
  },
1493
- "device name='(.+?)'": {
1494
- gettext: gettext$1('device name: "{{ deviceName }}"'),
1740
+ 'delete "(.+?)" \\(version: (.+?)\\)': {
1741
+ gettext: gettext$1('delete "{{ softwareName }}" (version: {{ softwareVersion }})'),
1495
1742
  placeholders: {
1496
- deviceName: '$1'
1743
+ softwareName: '$1',
1744
+ softwareVersion: '$2'
1497
1745
  }
1498
1746
  },
1499
- "failure reason='(.+?)'": {
1500
- gettext: gettext$1('failure reason: "{{ failureReason | translate }}"'),
1747
+ 'delete "([^"]+)"(?! \\(version: .+?\\))': {
1748
+ gettext: gettext$1('delete "{{ softwareName }}"'),
1501
1749
  placeholders: {
1502
- failureReason: '$1'
1750
+ softwareName: '$1'
1503
1751
  }
1504
1752
  }
1505
1753
  }
1506
1754
  }
1507
1755
  }
1508
1756
  },
1509
- '^ID \\[type=(.+?), value=(.+?)\\] was already bound to different Global ID.$': {
1510
- gettext: gettext$1('External ID "{{value}}" of the type "{{type}}" already exists.'),
1757
+ '^Update firmware to: "?(.+?)"? \\(version: (.+)\\)\\.?$': {
1758
+ gettext: gettext$1('Update firmware to: "{{ name }}" (version: {{ version }})'),
1511
1759
  placeholders: {
1512
- type: '$1',
1513
- value: '$2'
1760
+ name: '$1',
1761
+ version: '$2'
1514
1762
  }
1515
1763
  },
1516
- '^Invalid credentials! : Bad credentials$': {
1517
- gettext: gettext$1('Invalid credentials.')
1518
- },
1519
- '^Invalid credentials! : No phone number provided$': {
1520
- gettext: gettext$1('Log into the management tenant first and enter your phone number.')
1521
- },
1522
- '^Inventory Role removed$': {
1523
- gettext: gettext$1('Inventory role removed')
1524
- },
1525
- '^Inventory Role (.+?) removed$': {
1526
- gettext: gettext$1('Inventory role "{{name}}" deleted.'),
1764
+ '^Update firmware to: "?(.+?)"?\\.?$': {
1765
+ gettext: gettext$1('Update firmware to: "{{ name }}"'),
1527
1766
  placeholders: {
1528
1767
  name: '$1'
1529
1768
  }
1769
+ }
1770
+ };
1771
+
1772
+ /* tslint:disable:max-line-length */
1773
+ const PATTERN_MESSAGES_MICROSERVICES = {
1774
+ '^Created container$': {
1775
+ gettext: gettext$1('Container created.')
1530
1776
  },
1531
- '^Inventory Role updated$': {
1532
- gettext: gettext$1('Inventory role updated')
1533
- },
1534
- '^Inventory Role (.+?) updated$': {
1535
- gettext: gettext$1('Inventory role "{{name}}" updated.'),
1777
+ '^Created pod: (.+)$': {
1778
+ gettext: gettext$1('Pod "{{imageName}}" created.'),
1536
1779
  placeholders: {
1537
- name: '$1'
1780
+ imageName: '$1'
1538
1781
  }
1539
1782
  },
1540
- '^I/O error: Connection refused; nested exception is Connection refused : Connection refused$': {
1541
- gettext: gettext$1('Connection refused')
1783
+ '^Microservice not available.*$': {
1784
+ gettext: gettext$1('Microservice is not available.')
1542
1785
  },
1543
- '^I/O error: Read timed out; nested exception is Read timed out : Read timed out$': {
1544
- gettext: gettext$1('Read timed out')
1786
+ '^Started container$': {
1787
+ gettext: gettext$1('Container started.')
1545
1788
  },
1546
- '^Log file requested$': {
1547
- gettext: gettext$1('Log file requested.')
1789
+ '^Error syncing pod$': {
1790
+ gettext: gettext$1('Pod synchronization error.')
1548
1791
  },
1549
- '^Managed object deleted$': {
1550
- gettext: gettext$1('Managed object deleted')
1792
+ '^Failed create pod sandbox.$': {
1793
+ gettext: gettext$1('Pod sandbox creation failed.')
1551
1794
  },
1552
- '^Managed object "(.+?)" deleted$': {
1553
- gettext: gettext$1('Managed object "{{name}}" deleted'),
1795
+ '^Deleted pod: (.+)$': {
1796
+ gettext: gettext$1('Pod "{{imageName}}" deleted.'),
1554
1797
  placeholders: {
1555
- name: '$1'
1798
+ imageName: '$1'
1556
1799
  }
1557
1800
  },
1558
- '^Maximum file size exceeded$': {
1559
- gettext: gettext$1('Maximum file size exceeded.')
1560
- },
1561
- "^Message with ID (.+?) doesn't exist in smart rest template (.+?)$": {
1562
- gettext: gettext$1('Message with ID "{{messageId}}" doesn\'t exist in SmartREST template with ID "{{templateId}}"'),
1801
+ '^Container image "(.+)" already present on machine$': {
1802
+ gettext: gettext$1('Container image "{{imageName}}" already exists.'),
1563
1803
  placeholders: {
1564
- messageId: '$1',
1565
- templateId: '$2'
1804
+ imageName: '$1'
1566
1805
  }
1567
1806
  },
1568
- "^name of Application cannot start with '(.+)' prefix.$": {
1569
- gettext: gettext$1('Application name must not start with "{{ prefix }}".'),
1807
+ '^Scaled up replica set (.+) to (\\d+)$': {
1808
+ gettext: gettext$1('Replica set "{{replicaSetName}}" scaled up to "{{scaleNumber}}".'),
1570
1809
  placeholders: {
1571
- prefix: '$1'
1810
+ replicaSetName: '$1',
1811
+ scaleNumber: '$2'
1572
1812
  }
1573
1813
  },
1574
- '^NewDeviceRequest for id = (.+?) already exists.$': {
1575
- gettext: gettext$1('Device registration request with ID {{id}} already exists.'),
1814
+ '^Scaled down replica set (.+) to (\\d+)$': {
1815
+ gettext: gettext$1('Replica set "{{replicaSetName}}" scaled down to "{{scaleNumber}}".'),
1576
1816
  placeholders: {
1577
- id: '$1'
1817
+ replicaSetName: '$1',
1818
+ scaleNumber: '$2'
1578
1819
  }
1579
1820
  },
1580
- '^NewDeviceRequest for device id (.+?) is in state BLOCKED, not PENDING_ACCEPTANCE.$': {
1581
- gettext: gettext$1('Device registration request with ID "{{deviceId}}" is in state "Blocked", not "Pending acceptance". Remove this registration request and start over.'),
1821
+ '^Not within any context!$': {
1822
+ gettext: gettext$1('A problem occurred with microservice subscription.')
1823
+ },
1824
+ '^pulling image "(.+)"$': {
1825
+ gettext: gettext$1('Pulling image: "{{imageName}}".'),
1582
1826
  placeholders: {
1583
- deviceId: '$1'
1827
+ imageName: '$1'
1584
1828
  }
1585
1829
  },
1586
- '^No communication with device since (.+?)$': {
1587
- gettext: gettext$1('No communication with device since {{timestamp | absoluteDate}}.'),
1830
+ '^RESTART (.+?)$': {
1831
+ gettext: gettext$1('RESTART`verb, action` {{service}}'),
1588
1832
  placeholders: {
1589
- timestamp: '$1'
1833
+ service: '$1'
1590
1834
  }
1591
1835
  },
1592
- '^No data received from device within required interval.$': {
1593
- gettext: gettext$1('No data received from device within required interval.')
1594
- },
1595
- '^No LoRa provider settings are found. Please configure the connectivity settings.$': {
1596
- gettext: gettext$1('No LoRa provider settings are found. Please configure the connectivity settings.')
1597
- },
1598
- '^Not within any context!$': {
1599
- gettext: gettext$1('A problem occurred with microservice subscription.')
1600
- },
1601
- '^Maximum age cannot be bigger than 10 years.$': {
1602
- gettext: gettext$1('Maximum age cannot be bigger than 10 years.')
1603
- },
1604
- '^Microservice application name incorrect. Please use only lower-case letters, digits and dashes. Maximum length is (\\d+) characters.$': {
1605
- gettext: gettext$1('Microservice application name is incorrect: only lower case letters, digits and dashes allowed. Maximum length: {{maxLength}}.'),
1836
+ '^START (.+?)$': {
1837
+ gettext: gettext$1('START`verb, action` {{service}}'),
1606
1838
  placeholders: {
1607
- maxLength: '$1'
1839
+ service: '$1'
1608
1840
  }
1609
1841
  },
1610
- '^Microservice not available.*$': {
1611
- gettext: gettext$1('Microservice is not available.')
1612
- },
1613
- '^Operation created$': {
1614
- gettext: gettext$1('Operation created.')
1615
- },
1616
- '^Operation updated$': {
1617
- gettext: gettext$1('Operation updated.')
1618
- },
1619
- "^Operation created: status='(.+?)'.$": {
1620
- gettext: gettext$1('Operation created: status: "{{ status | translate }}".'),
1842
+ '^STOP (.+?)$': {
1843
+ gettext: gettext$1('STOP`verb, action` {{service}}'),
1621
1844
  placeholders: {
1622
- status: '$1'
1845
+ service: '$1'
1623
1846
  }
1624
1847
  },
1625
- '^Option created$': {
1626
- gettext: gettext$1('Option created.')
1627
- },
1628
- '^Option "(.+?)" created$': {
1629
- gettext: gettext$1('Option "{{option}}" created.'),
1848
+ '^Successfully assigned (.+) to (.+)$': {
1849
+ gettext: gettext$1('"{{imageName}}" assigned to "{{address}}".'),
1630
1850
  placeholders: {
1631
- option: '$1'
1851
+ imageName: '$1',
1852
+ address: '$2'
1632
1853
  }
1633
1854
  },
1634
- '^Option deleted$': {
1635
- gettext: gettext$1('Option deleted.')
1636
- },
1637
- '^Option "(.+?)" deleted$': {
1638
- gettext: gettext$1('Option "{{option}}" deleted.'),
1855
+ '^Successfully pulled image "(.+)"$': {
1856
+ gettext: gettext$1('Image "{{imageName}}" pulled.'),
1639
1857
  placeholders: {
1640
- option: '$1'
1858
+ imageName: '$1'
1641
1859
  }
1642
1860
  },
1643
- '^Owner field error. : Cannot introduce cyclic dependency.$': {
1644
- gettext: gettext$1('Could not introduce cyclic ownership dependency.')
1645
- },
1646
- '^Password change is temporary blocked.$': {
1647
- gettext: gettext$1('Password change is temporarily blocked.')
1648
- },
1649
- '^Password cipher does not match$': {
1650
- gettext: gettext$1('Password cipher does not match.')
1651
- },
1652
- '^Platform application cannot be added to, nor removed from any tenant.$': {
1653
- gettext: gettext$1('Platform application cannot be added to, nor removed from any tenant.')
1654
- },
1655
- '^Private key must be provided in KEY_PAIR credentials$': {
1656
- gettext: gettext$1('Private key must be provided when "Public/private keys" option is selected.')
1861
+ '^Write failed with error code 16733 and error message \'trying to index text where term list is too big, max is 4mb _id: "(.+?)"\'$': {
1862
+ gettext: gettext$1('The uploaded image cannot be bigger than 4 MB. Please upload a smaller one.')
1657
1863
  },
1658
- '^Private key cipher does not match$': {
1659
- gettext: gettext$1('Private key cipher does not match')
1864
+ '^Write failed with error code 17280 and error message \'WiredTigerIndex::insert: key too large to index, failing (.+?) { : "(.+?)" }\'$': {
1865
+ gettext: gettext$1('The selected name is too long. Please try a shorter one.')
1660
1866
  },
1661
- '^Protocol "(.+?)" does not support "(.+?)" credentials type$': {
1662
- gettext: gettext$1('Protocol "{{protocol}}" does not support "{{credentialsType}}" credentials type.'),
1867
+ '^No nodes are available that match all of the predicates: (.+).$': {
1868
+ gettext: gettext$1('No nodes are available that match all of the predicates: [{{predicates}}].'),
1663
1869
  placeholders: {
1664
- protocol: '$1',
1665
- credentialsType: '$2'
1870
+ predicates: '$1'
1666
1871
  }
1667
1872
  },
1668
- '^Provided security key does not match key stored for device (.+?).$': {
1669
- gettext: gettext$1('Provided security token does not match the security token stored for this device "{{deviceId}}".'),
1873
+ '^Readiness probe failed: (.+) (.+): (.+): request canceled while waiting for connection \\(Client.Timeout exceeded while awaiting headers\\)$': {
1874
+ gettext: gettext$1('Readiness probe failed: {{requestMethod}} {{uri}}: {{protocol}}: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).'),
1670
1875
  placeholders: {
1671
- deviceId: '$1'
1876
+ requestMethod: '$1',
1877
+ uri: '$2',
1878
+ protocol: '$3'
1672
1879
  }
1673
1880
  },
1674
- '^Provided security key does not match key stored for device (.+?).Reached maximum number of failed attempts while trying to register this device. Request will now be blocked and has to be removed manually to restart the process.$': {
1675
- gettext: gettext$1('The provided security token does not match the token stored for device "{{deviceId}}". You have reached the maximum number of failed attempts while trying to register this device. The request will now be blocked and must be removed manually to restart the process.'),
1881
+ '^Liveness probe failed: (.+) (.+): (.+): request canceled while waiting for connection \\(Client.Timeout exceeded while awaiting headers\\)$': {
1882
+ gettext: gettext$1('Liveness probe failed: {{requestMethod}} {{uri}}: {{protocol}}: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).'),
1676
1883
  placeholders: {
1677
- deviceId: '$1'
1884
+ requestMethod: '$1',
1885
+ uri: '$2',
1886
+ protocol: '$3'
1678
1887
  }
1679
- },
1680
- '^pulling image "(.+)"$': {
1681
- gettext: gettext$1('Pulling image: "{{imageName}}".'),
1888
+ }
1889
+ };
1890
+
1891
+ /* tslint:disable:max-line-length */
1892
+ const PATTERN_MESSAGES_OPERATIONS = {
1893
+ '^Creation ramp must be greater than (\\d+?)$': {
1894
+ gettext: gettext$1('Bulk operation delay must be greater than {{minSeconds}} seconds.'),
1682
1895
  placeholders: {
1683
- imageName: '$1'
1896
+ minSeconds: '$1'
1684
1897
  }
1685
1898
  },
1686
- '^Real-time event processing is currently overloaded and may stop processing your events\\. Please contact support\\.$': {
1687
- gettext: gettext$1('Real-time event processing is currently overloaded and may stop processing your events. Please contact support.')
1688
- },
1689
- '^Resource ID \\[type=com_cumulocity_model_idtype_GId, value=(.+?)\\] for this request not found.$': {
1690
- gettext: gettext$1('Could not find the resource with ID "{{id}}".'),
1899
+ '^Close relay (.+).$': {
1900
+ gettext: gettext$1('Close relay {{number}}.'),
1691
1901
  placeholders: {
1692
- id: '$1'
1902
+ number: '$1'
1693
1903
  }
1694
1904
  },
1695
- '^RESTART (.+?)$': {
1696
- gettext: gettext$1('RESTART`verb, action` {{service}}'),
1697
- placeholders: {
1698
- service: '$1'
1699
- }
1700
- },
1701
- '^Retrieve configuration snapshot from device (.+?)$': {
1702
- gettext: gettext$1('Retrieve configuration snapshot from device {{deviceName}}'),
1905
+ '^Open relay (.+).$': {
1906
+ gettext: gettext$1('Open relay {{number}}.'),
1703
1907
  placeholders: {
1704
- deviceName: '$1'
1908
+ number: '$1'
1705
1909
  }
1706
1910
  },
1707
- '^Retrieve (.+?) configuration snapshot from device (.+?)$': {
1708
- gettext: gettext$1('Retrieve {{configurationType}} configuration snapshot from device {{deviceName}}'),
1911
+ '^Change trace status to (.+).$': {
1912
+ gettext: gettext$1('Change trace status to {{state | translate}}.'),
1709
1913
  placeholders: {
1710
- configurationType: '$1',
1711
- deviceName: '$2'
1914
+ state: '$1'
1712
1915
  }
1713
1916
  },
1714
- '^Scaled up replica set (.+) to (\\d+)$': {
1715
- gettext: gettext$1('Replica set "{{replicaSetName}}" scaled up to "{{scaleNumber}}".'),
1917
+ '^Change relay status to (.+).$': {
1918
+ gettext: gettext$1('Change relay status to {{status | translate}}.'),
1716
1919
  placeholders: {
1717
- replicaSetName: '$1',
1718
- scaleNumber: '$2'
1920
+ status: '$1'
1719
1921
  }
1720
1922
  },
1721
- '^Send configuration snapshot (.+?) of configuration type (.+?) to device (.+?)$': {
1722
- gettext: gettext$1('Send configuration snapshot {{snapshotName}} of configuration type {{configurationType}} to device {{deviceName}}'),
1923
+ '^Closing relay (.+).$': {
1924
+ gettext: gettext$1('Closing relay {{number}}.'),
1723
1925
  placeholders: {
1724
- snapshotName: '$1',
1725
- configurationType: '$2',
1726
- deviceName: '$3'
1926
+ number: '$1'
1727
1927
  }
1728
1928
  },
1729
- '^Send configuration snapshot (.+?) to device (.+?)$': {
1730
- gettext: gettext$1('Send configuration snapshot {{snapshotName}} to device {{deviceName}}'),
1929
+ '^Opening relay (.+).$': {
1930
+ gettext: gettext$1('Opening relay {{number}}.'),
1731
1931
  placeholders: {
1732
- snapshotName: '$1',
1733
- deviceName: '$2'
1932
+ number: '$1'
1734
1933
  }
1735
1934
  },
1736
- '^Simulator state is invalid: (.+)$': {
1737
- gettext: gettext$1('Simulator state is invalid: {{violations}}'),
1935
+ '^Operation updated: (.+)$': {
1936
+ gettext: gettext$1('Operation updated: {{updatesList}}'),
1738
1937
  placeholders: {
1739
- violations: {
1938
+ updatesList: {
1740
1939
  capture: '$1',
1741
1940
  translate: {
1742
- '(\\w+?) - may not be null': {
1743
- gettext: gettext$1('"{{field}}" should not be null'),
1744
- placeholders: {
1745
- field: '$1'
1746
- }
1747
- },
1748
- '(\\w+?) - must be less than or equal to (\\d+)': {
1749
- gettext: gettext$1('"{{field}}" must be less than or equal to {{maxValue}}'),
1941
+ "status='(.+?)'": {
1942
+ gettext: gettext$1('status: "{{ status | translate }}"'),
1750
1943
  placeholders: {
1751
- field: '$1',
1752
- maxValue: '$2'
1944
+ status: '$1'
1753
1945
  }
1754
1946
  },
1755
- '(\\w+?) - should not contain null values': {
1756
- gettext: gettext$1('"{{field}}" should not contain null values'),
1947
+ "description='(.+?)'": {
1948
+ gettext: gettext$1('description: "{{ description | translate }}"'),
1757
1949
  placeholders: {
1758
- field: '$1'
1950
+ description: '$1'
1759
1951
  }
1760
1952
  },
1761
- '(\\w+?) - must be true': {
1762
- gettext: gettext$1('"{{field}}" must be true'),
1953
+ "device name='(.+?)'": {
1954
+ gettext: gettext$1('device name: "{{ deviceName }}"'),
1763
1955
  placeholders: {
1764
- field: '$1'
1956
+ deviceName: '$1'
1765
1957
  }
1766
1958
  },
1767
- '(\\w+?) - must not be empty': {
1768
- gettext: gettext$1('"{{field}}" must not be empty'),
1959
+ "failure reason='(.+?)'": {
1960
+ gettext: gettext$1('failure reason: "{{ failureReason | translate }}"'),
1769
1961
  placeholders: {
1770
- field: '$1'
1962
+ failureReason: '$1'
1771
1963
  }
1772
1964
  }
1773
1965
  }
1774
1966
  }
1775
1967
  }
1776
1968
  },
1777
- "^Smart rest template (.+?) doesn't exist$": {
1778
- gettext: gettext$1('SmartREST template with ID "{{templateId}}" doesn\'t exist.'),
1779
- placeholders: {
1780
- templateId: '$1'
1781
- }
1782
- },
1783
- '^Smart rule created$': {
1784
- gettext: gettext$1('Smart rule created.')
1785
- },
1786
- '^Smart rule updated$': {
1787
- gettext: gettext$1('Smart rule updated.')
1788
- },
1789
- '^Smart rule enabled$': {
1790
- gettext: gettext$1('Smart rule activated.')
1791
- },
1792
- '^Smart rule disabled$': {
1793
- gettext: gettext$1('Smart rule deactivated.')
1969
+ '^Operation created$': {
1970
+ gettext: gettext$1('Operation created.')
1794
1971
  },
1795
- '^Smart rule deleted$': {
1796
- gettext: gettext$1('Smart rule deleted.')
1972
+ '^Operation updated$': {
1973
+ gettext: gettext$1('Operation updated.')
1797
1974
  },
1798
- '^Smart rule "(.+?)" created$': {
1799
- gettext: gettext$1('Smart rule "{{name}}" created.'),
1975
+ "^Operation created: status='(.+?)'.$": {
1976
+ gettext: gettext$1('Operation created: status: "{{ status | translate }}".'),
1800
1977
  placeholders: {
1801
- name: '$1'
1978
+ status: '$1'
1802
1979
  }
1803
1980
  },
1804
- '^Smart rule "(.+?)" updated$': {
1805
- gettext: gettext$1('Smart rule "{{name}}" updated.'),
1981
+ '^Change value of "(.+)" to (.+) (.+).$': {
1982
+ gettext: gettext$1('Change value of "{{name}}" to {{value}}{{unit}}.'),
1806
1983
  placeholders: {
1807
- name: '$1'
1984
+ name: '$1',
1985
+ value: '$2',
1986
+ unit: '$3'
1808
1987
  }
1809
1988
  },
1810
- '^Smart rule "(.+?)" enabled$': {
1811
- gettext: gettext$1('Smart rule "{{name}}" activated.'),
1989
+ '^Change value of "(.+)" to (.+).$': {
1990
+ gettext: gettext$1('Change value of "{{name}}" to {{value}}.'),
1812
1991
  placeholders: {
1813
- name: '$1'
1992
+ name: '$1',
1993
+ value: '$2'
1814
1994
  }
1815
1995
  },
1816
- '^Smart rule "(.+?)" disabled$': {
1817
- gettext: gettext$1('Smart rule "{{name}}" deactivated.'),
1996
+ '^Change status of "(.+)" to "(.+)".$': {
1997
+ gettext: gettext$1('Change status of "{{name}}" to "{{label}}".'),
1818
1998
  placeholders: {
1819
- name: '$1'
1999
+ name: '$1',
2000
+ label: '$2'
1820
2001
  }
2002
+ }
2003
+ };
2004
+
2005
+ /* tslint:disable:max-line-length */
2006
+ const PATTERN_MESSAGES_ROLES = {
2007
+ '^Global Role updated$': {
2008
+ gettext: gettext$1('Global role updated')
1821
2009
  },
1822
- '^Smart rule "(.+?)" deleted$': {
1823
- gettext: gettext$1('Smart rule "{{name}}" deleted.'),
2010
+ '^Global Role (.+?) updated$': {
2011
+ gettext: gettext$1('Global role "{{name}}" updated'),
1824
2012
  placeholders: {
1825
2013
  name: '$1'
1826
2014
  }
1827
2015
  },
1828
- '^START (.+?)$': {
1829
- gettext: gettext$1('START`verb, action` {{service}}'),
2016
+ '^Global Role (.+?) updated: (.+)$': {
2017
+ gettext: gettext$1('Global role "{{name}}" updated: {{updatesList}}'),
1830
2018
  placeholders: {
1831
- service: '$1'
2019
+ name: '$1',
2020
+ updatesList: {
2021
+ capture: '$2',
2022
+ translate: {
2023
+ 'applications \\[([^\\]]+?)\\] added': {
2024
+ gettext: gettext$1('applications {{list}} added'),
2025
+ placeholders: { list: '$1' }
2026
+ },
2027
+ 'applications \\[([^\\]]+?)\\] removed': {
2028
+ gettext: gettext$1('applications {{list}} removed'),
2029
+ placeholders: { list: '$1' }
2030
+ },
2031
+ 'roles \\[([^\\]]+?)\\] added': {
2032
+ gettext: gettext$1('roles {{list}} added'),
2033
+ placeholders: { list: '$1' }
2034
+ },
2035
+ 'roles \\[([^\\]]+?)\\] removed': {
2036
+ gettext: gettext$1('roles {{list}} removed'),
2037
+ placeholders: { list: '$1' }
2038
+ }
2039
+ }
2040
+ }
1832
2041
  }
1833
2042
  },
1834
- '^Started container$': {
1835
- gettext: gettext$1('Container started.')
2043
+ '^Global Roles$': {
2044
+ gettext: gettext$1('Global roles')
1836
2045
  },
1837
- '^STOP (.+?)$': {
1838
- gettext: gettext$1('STOP`verb, action` {{service}}'),
2046
+ '^Inventory Role removed$': {
2047
+ gettext: gettext$1('Inventory role removed')
2048
+ },
2049
+ '^Inventory Role (.+?) removed$': {
2050
+ gettext: gettext$1('Inventory role "{{name}}" deleted.'),
1839
2051
  placeholders: {
1840
- service: '$1'
2052
+ name: '$1'
1841
2053
  }
1842
2054
  },
1843
- '^Successfully assigned (.+) to (.+)$': {
1844
- gettext: gettext$1('"{{imageName}}" assigned to "{{address}}".'),
2055
+ '^Inventory Role updated$': {
2056
+ gettext: gettext$1('Inventory role updated')
2057
+ },
2058
+ '^Inventory Role (.+?) updated$': {
2059
+ gettext: gettext$1('Inventory role "{{name}}" updated.'),
1845
2060
  placeholders: {
1846
- imageName: '$1',
1847
- address: '$2'
2061
+ name: '$1'
1848
2062
  }
1849
2063
  },
1850
- '^Successfully pulled image "(.+)"$': {
1851
- gettext: gettext$1('Image "{{imageName}}" pulled.'),
2064
+ // Global roles and descriptions
2065
+ '^Global Manager$': {
2066
+ gettext: gettext$1('Global Manager')
2067
+ },
2068
+ '^Can read and write all data from all devices$': {
2069
+ gettext: gettext$1('Can read and write all data from all devices.')
2070
+ },
2071
+ '^Global Reader$': {
2072
+ gettext: gettext$1('Global Reader')
2073
+ },
2074
+ '^Can read all data \\(including users, in contrast to "Global Reader"\\)$': {
2075
+ gettext: gettext$1('Can read all data (including users, in contrast to "Global Reader").')
2076
+ },
2077
+ '^Tenant Manager$': {
2078
+ gettext: gettext$1('Tenant Manager')
2079
+ },
2080
+ '^Can manage tenant wide configurations like applications, tenant options and retention rules$': {
2081
+ gettext: gettext$1('Can manage tenant wide configurations like applications, tenant options and retention rules.')
2082
+ },
2083
+ '^CEP Manager$': {
2084
+ gettext: gettext$1('CEP Manager')
2085
+ },
2086
+ '^Has full access to all deployed CEP modules and SmartRules$': {
2087
+ gettext: gettext$1('Has full access to all deployed CEP modules and smart rules.')
2088
+ },
2089
+ '^Cockpit User$': {
2090
+ gettext: gettext$1('Cockpit User')
2091
+ },
2092
+ '^User to work in Cockpit application. This does not include the access to any device data.$': {
2093
+ gettext: gettext$1('User to work in Cockpit application. This does not include the access to any device data.')
2094
+ },
2095
+ '^Global User Manager$': {
2096
+ gettext: gettext$1('Global User Manager')
2097
+ },
2098
+ '^Can access and modify the full user hierarchy$': {
2099
+ gettext: gettext$1('Can access and edit the full user hierarchy.')
2100
+ },
2101
+ '^Shared User Manager$': {
2102
+ gettext: gettext$1('Shared User Manager')
2103
+ },
2104
+ '^Can create new user as his own sub-users and manage this$': {
2105
+ gettext: gettext$1('Can create new own sub-users and manage them.')
2106
+ },
2107
+ // Device management roles
2108
+ '^Reader$': {
2109
+ gettext: gettext$1('Reader')
2110
+ },
2111
+ '^Can read all data of the asset.$': {
2112
+ gettext: gettext$1('Can read all data of the asset.')
2113
+ },
2114
+ '^Devicemanagement User$': {
2115
+ gettext: gettext$1('Device Management User')
2116
+ },
2117
+ '^Gives access to bulk operations and device management application. This does not include access to any device data.$': {
2118
+ gettext: gettext$1('Gives access to bulk operations and Device Management application. This does not include access to any device data.')
2119
+ },
2120
+ // Description for 'devices' role
2121
+ '^A role marker for device users. After registration, a device automatically has this role$': {
2122
+ gettext: gettext$1('A role marker for device users. After registration, a device automatically has this role.')
2123
+ },
2124
+ // Inventory operations all role
2125
+ '^Operations: All$': {
2126
+ gettext: gettext$1('Operations: All')
2127
+ },
2128
+ '^Can remotely manage the assets by sending operations to the device. This includes for example remote configuration, software update, etc.$': {
2129
+ gettext: gettext$1('Can remotely manage the assets by sending operations to the device. This includes remote configuration, software update and more.')
2130
+ },
2131
+ '^Operations: Restart Device$': {
2132
+ gettext: gettext$1('Operations: Restart Device')
2133
+ },
2134
+ '^Can restart devices.$': {
2135
+ gettext: gettext$1('Can restart devices.')
2136
+ },
2137
+ // Description for 'business' role
2138
+ '^Can access all devices and their data but has no management permission in the tenant$': {
2139
+ gettext: gettext$1('Can access all devices and their data but has no management permission in the tenant.')
2140
+ },
2141
+ '^Can read all data from all devices$': {
2142
+ gettext: gettext$1('Can read all data from all devices.')
2143
+ },
2144
+ '^Enables administrative permissions. The first user created for the tenant receives this role$': {
2145
+ gettext: gettext$1('Enables administrative permissions. The first user created for the tenant receives this role.')
2146
+ }
2147
+ };
2148
+
2149
+ /* tslint:disable:max-line-length */
2150
+ const PATTERN_MESSAGES_TENANTS = {
2151
+ '^(.+)pplication for tenant (.+) with properties \\( (.+?) \\) already exists$': {
2152
+ gettext: gettext$1('Application for tenant "{{tenant}}" with the following values ({{valuesList}}) already exists.'),
1852
2153
  placeholders: {
1853
- imageName: '$1'
2154
+ tenant: '$2',
2155
+ valuesList: '$3'
1854
2156
  }
1855
2157
  },
2158
+ '^Domain name is already in use by another tenant!$': {
2159
+ gettext: gettext$1('Domain name is already used by another tenant.')
2160
+ },
1856
2161
  '^Tenant creation failed. : Tenant with given id already exists.$': {
1857
2162
  gettext: gettext$1('Could not create a tenant. Tenant with given domain/URL already exists.')
1858
2163
  },
@@ -1913,9 +2218,22 @@ const MESSAGES_CORE_I18N = {
1913
2218
  },
1914
2219
  '^Tenant updated$': {
1915
2220
  gettext: gettext$1('Tenant updated.')
2221
+ }
2222
+ };
2223
+
2224
+ /* tslint:disable:max-line-length */
2225
+ const PATTERN_MESSAGES_USERS = {
2226
+ "^Can't delete user because it is used by another managed object$": {
2227
+ gettext: gettext$1('Cannot delete device with associated device owner because this owner is still assigned to other device(s). Try to remove only the device.')
1916
2228
  },
1917
- '^Too Many Requests$': {
1918
- gettext: gettext$1('Too many requests. Try again later.')
2229
+ '^Could not update user. : Error persisting user (.+?)!$': {
2230
+ gettext: gettext$1('Could not update user "{{username}}".'),
2231
+ placeholders: {
2232
+ username: '$1'
2233
+ }
2234
+ },
2235
+ '^Owner field error. : Cannot introduce cyclic dependency.$': {
2236
+ gettext: gettext$1('Could not introduce cyclic ownership dependency.')
1919
2237
  },
1920
2238
  "^User alias equals username '(.+)'$": {
1921
2239
  gettext: gettext$1('Username and login alias must be different.')
@@ -1938,12 +2256,6 @@ const MESSAGES_CORE_I18N = {
1938
2256
  name: '$1'
1939
2257
  }
1940
2258
  },
1941
- '^(.+?) user login with OAuth internal mode failed$': {
1942
- gettext: gettext$1('"{{name}}" user login with OAI-Secure mode failed'),
1943
- placeholders: {
1944
- name: '$1'
1945
- }
1946
- },
1947
2259
  '^User updated$': {
1948
2260
  gettext: gettext$1('User updated')
1949
2261
  },
@@ -2024,200 +2336,86 @@ const MESSAGES_CORE_I18N = {
2024
2336
  email: '$1'
2025
2337
  }
2026
2338
  },
2027
- '^unable to find option with given key (.+?) : Could not find entity Option by ID (.+?)!$': {
2028
- gettext: gettext$1('Unable to get tenant option: "{{option}}".'),
2029
- placeholders: {
2030
- option: '$2'
2031
- }
2032
- },
2033
- '^unable to find option with given key (.+?) : There is no system property for key (.+?)$': {
2034
- gettext: gettext$1('Unable to get system option: "{{option}}".'),
2035
- placeholders: {
2036
- option: '$2'
2037
- }
2038
- },
2039
- '^Write failed with error code 16733 and error message \'trying to index text where term list is too big, max is 4mb _id: "(.+?)"\'$': {
2040
- gettext: gettext$1('The uploaded image cannot be bigger than 4 MB. Please upload a smaller one.')
2041
- },
2042
- '^Write failed with error code 17280 and error message \'WiredTigerIndex::insert: key too large to index, failing (.+?) { : "(.+?)" }\'$': {
2043
- gettext: gettext$1('The selected name is too long. Please try a shorter one.')
2044
- },
2045
- '^You have reached devices limit. No more devices can be registered.$': {
2046
- gettext: gettext$1('You reached devices limit. No more devices can be registered.')
2047
- },
2048
- '^(.+) succeeded for volume "(.+)"$': {
2049
- gettext: gettext$1('Operation "{{operation}}" succeeded for volume "{{volume}}".'),
2050
- placeholders: {
2051
- operation: '$1',
2052
- volume: '$2'
2053
- }
2054
- },
2055
- "^Exception on tenant (.+) in statement '(.+)': Invocation exception when invoking method '(.+)' of class '(.+)' passing parameters \\[(.+)\\] for statement '(.+)': (.+) : (.+)$": {
2056
- gettext: gettext$1('Exception on tenant {{tenantId}} in statement "{{moduleName}}": Invocation exception when invoking method "{{methodName}}" of class "{{classPath}}" passing parameters [{{parameters}}] for statement "{{statement}}": {{exceptionType}} : {{exceptionMessage}}.'),
2057
- placeholders: {
2058
- tenantId: '$1',
2059
- moduleName: '$2',
2060
- methodName: '$3',
2061
- classPath: '$4',
2062
- parameters: '$5',
2063
- statement: '$6',
2064
- exceptionType: '$7',
2065
- exceptionMessage: '$8'
2066
- }
2067
- },
2068
- '^No nodes are available that match all of the predicates: (.+).$': {
2069
- gettext: gettext$1('No nodes are available that match all of the predicates: [{{predicates}}].'),
2070
- placeholders: {
2071
- predicates: '$1'
2072
- }
2073
- },
2074
- '^Readiness probe failed: (.+) (.+): (.+): request canceled while waiting for connection \\(Client.Timeout exceeded while awaiting headers\\)$': {
2075
- gettext: gettext$1('Readiness probe failed: {{requestMethod}} {{uri}}: {{protocol}}: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).'),
2076
- placeholders: {
2077
- requestMethod: '$1',
2078
- uri: '$2',
2079
- protocol: '$3'
2080
- }
2081
- },
2082
- '^Liveness probe failed: (.+) (.+): (.+): request canceled while waiting for connection \\(Client.Timeout exceeded while awaiting headers\\)$': {
2083
- gettext: gettext$1('Liveness probe failed: {{requestMethod}} {{uri}}: {{protocol}}: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers).'),
2084
- placeholders: {
2085
- requestMethod: '$1',
2086
- uri: '$2',
2087
- protocol: '$3'
2088
- }
2089
- },
2090
- '^Error syncing pod$': {
2091
- gettext: gettext$1('Pod synchronization error.')
2092
- },
2093
- '^Failed create pod sandbox.$': {
2094
- gettext: gettext$1('Pod sandbox creation failed.')
2095
- },
2096
- '^Exception on tenant (.+) in statement \'(.+)\': Http status code: (\\d+) \\{error="alarm/Unprocessable Entity",message="(.+)",info="https://www.cumulocity.com/guides/reference-guide/#error_reporting",details="null"\\}$': {
2097
- gettext: gettext$1('Exception on tenant {{tenantId}} in statement "{{statement}}": HTTP status code: {{httpStatusCode}} : {{message | translate}}'),
2098
- placeholders: {
2099
- tenantId: '$1',
2100
- statement: '$2',
2101
- httpStatusCode: '$3',
2102
- message: '$4'
2103
- }
2104
- },
2105
2339
  "^User '(.+)' is managed by a remote identity management service defined by an administrator, direct update is forbidden$": {
2106
2340
  gettext: gettext$1('User "{{userName}}" is managed by a remote identity management service defined by an administrator, direct update is forbidden.'),
2107
2341
  placeholders: {
2108
2342
  userName: '$1'
2109
2343
  }
2110
2344
  },
2111
- '^Added new child device to "(.+)" \\(ID: (.+)\\).$': {
2112
- gettext: gettext$1('Added new child device to "{{parentDeviceName}}" (ID: {{parentDeviceId}}).'),
2113
- placeholders: {
2114
- parentDeviceName: '$1',
2115
- parentDeviceId: '$2'
2116
- }
2117
- },
2118
- '^Updated child device of "(.+)" \\(ID: (.+)\\).$': {
2119
- gettext: gettext$1('Updated child device of "{{parentDeviceName}}" (ID: {{parentDeviceId}}).'),
2120
- placeholders: {
2121
- parentDeviceName: '$1',
2122
- parentDeviceId: '$2'
2123
- }
2345
+ '^User logout$': {
2346
+ gettext: gettext$1('User logout')
2124
2347
  },
2125
- '^Added child device "(.+)" \\(ID: (.+)\\).$': {
2126
- gettext: gettext$1('Added child device "{{name}}" (ID: {{id}}).'),
2348
+ '^(.+?) user logout$': {
2349
+ gettext: gettext$1('"{{name}}" user logout'),
2127
2350
  placeholders: {
2128
- name: '$1',
2129
- id: '$2'
2351
+ name: '$1'
2130
2352
  }
2131
2353
  },
2132
- '^Removed child device "(.+)" \\(ID: (.+)\\).$': {
2133
- gettext: gettext$1('Removed child device "{{name}}" (ID: {{id}}).'),
2134
- placeholders: {
2135
- name: '$1',
2136
- id: '$2'
2137
- }
2354
+ '^Display name$': {
2355
+ gettext: gettext$1('Login alias')
2356
+ }
2357
+ };
2358
+
2359
+ /* tslint:disable:max-line-length */
2360
+ const PATTERN_MESSAGES_MISC = {
2361
+ '^Access is denied$': {
2362
+ gettext: gettext$1('Access denied.')
2138
2363
  },
2139
- '^Change value of "(.+)" to (.+) (.+).$': {
2140
- gettext: gettext$1('Change value of "{{name}}" to {{value}}{{unit}}.'),
2141
- placeholders: {
2142
- name: '$1',
2143
- value: '$2',
2144
- unit: '$3'
2145
- }
2364
+ '^API is not available with the new domain$': {
2365
+ gettext: gettext$1('Could not activate custom domain. DNS setup is incorrect.')
2146
2366
  },
2147
- '^Change value of "(.+)" to (.+).$': {
2148
- gettext: gettext$1('Change value of "{{name}}" to {{value}}.'),
2149
- placeholders: {
2150
- name: '$1',
2151
- value: '$2'
2152
- }
2367
+ '^Availability monitoring record$': {
2368
+ gettext: gettext$1('Availability monitoring record')
2153
2369
  },
2154
- '^Change status of "(.+)" to "(.+)".$': {
2155
- gettext: gettext$1('Change status of "{{name}}" to "{{label}}".'),
2156
- placeholders: {
2157
- name: '$1',
2158
- label: '$2'
2159
- }
2370
+ '^Failed to update domain at the platform$': {
2371
+ gettext: gettext$1('Failed to update domain at the platform.')
2160
2372
  },
2161
- '^Send message "(.+)".$': {
2162
- gettext: gettext$1('Send message "{{str}}".'),
2373
+ '^Following mandatory fields should be included: (.+?)$': {
2374
+ gettext: gettext$1('Following mandatory fields should be included: {{fields}}'),
2163
2375
  placeholders: {
2164
- str: '$1'
2376
+ fields: '$1'
2165
2377
  }
2166
2378
  },
2167
- '^Close relay (.+).$': {
2168
- gettext: gettext$1('Close relay {{number}}.'),
2169
- placeholders: {
2170
- number: '$1'
2171
- }
2379
+ '^I/O error: Connection refused; nested exception is Connection refused : Connection refused$': {
2380
+ gettext: gettext$1('Connection refused')
2172
2381
  },
2173
- '^Open relay (.+).$': {
2174
- gettext: gettext$1('Open relay {{number}}.'),
2175
- placeholders: {
2176
- number: '$1'
2177
- }
2382
+ '^I/O error: Read timed out; nested exception is Read timed out : Read timed out$': {
2383
+ gettext: gettext$1('Read timed out')
2178
2384
  },
2179
- '^Change trace status to (.+).$': {
2180
- gettext: gettext$1('Change trace status to {{state | translate}}.'),
2181
- placeholders: {
2182
- state: '$1'
2183
- }
2385
+ '^Log file requested$': {
2386
+ gettext: gettext$1('Log file requested.')
2184
2387
  },
2185
- '^Change relay status to (.+).$': {
2186
- gettext: gettext$1('Change relay status to {{status | translate}}.'),
2187
- placeholders: {
2188
- status: '$1'
2189
- }
2388
+ '^Managed object deleted$': {
2389
+ gettext: gettext$1('Managed object deleted')
2190
2390
  },
2191
- '^Closing relay (.+).$': {
2192
- gettext: gettext$1('Closing relay {{number}}.'),
2391
+ '^Managed object "(.+?)" deleted$': {
2392
+ gettext: gettext$1('Managed object "{{name}}" deleted'),
2193
2393
  placeholders: {
2194
- number: '$1'
2394
+ name: '$1'
2195
2395
  }
2196
2396
  },
2197
- '^Opening relay (.+).$': {
2198
- gettext: gettext$1('Opening relay {{number}}.'),
2199
- placeholders: {
2200
- number: '$1'
2201
- }
2397
+ '^Maximum file size exceeded$': {
2398
+ gettext: gettext$1('Maximum file size exceeded.')
2202
2399
  },
2203
- '^Update bulk operation$': {
2204
- gettext: gettext$1('Update bulk operation')
2400
+ '^Maximum age cannot be bigger than 10 years.$': {
2401
+ gettext: gettext$1('Maximum age cannot be bigger than 10 years.')
2205
2402
  },
2206
- '^Update bulk operation: (.+)$': {
2207
- gettext: gettext$1('Update bulk operation: {{updatesList}}'),
2208
- placeholders: bulkOperationAuditLogTextPlaceholders
2403
+ '^Real-time event processing is currently overloaded and may stop processing your events\\. Please contact support\\.$': {
2404
+ gettext: gettext$1('Real-time event processing is currently overloaded and may stop processing your events. Please contact support.')
2209
2405
  },
2210
- '^Update firmware to: "?(.+?)"? \\(version: (.+)\\)\\.?$': {
2211
- gettext: gettext$1('Update firmware to: "{{ name }}" (version: {{ version }})'),
2406
+ '^Resource ID \\[type=com_cumulocity_model_idtype_GId, value=(.+?)\\] for this request not found.$': {
2407
+ gettext: gettext$1('Could not find the resource with ID "{{id}}".'),
2212
2408
  placeholders: {
2213
- name: '$1',
2214
- version: '$2'
2409
+ id: '$1'
2215
2410
  }
2216
2411
  },
2217
- '^Update firmware to: "?(.+?)"?\\.?$': {
2218
- gettext: gettext$1('Update firmware to: "{{ name }}"'),
2412
+ '^Too Many Requests$': {
2413
+ gettext: gettext$1('Too many requests. Try again later.')
2414
+ },
2415
+ '^Send message "(.+)".$': {
2416
+ gettext: gettext$1('Send message "{{str}}".'),
2219
2417
  placeholders: {
2220
- name: '$1'
2418
+ str: '$1'
2221
2419
  }
2222
2420
  },
2223
2421
  '^Update configuration to (.+).$': {
@@ -2226,163 +2424,173 @@ const MESSAGES_CORE_I18N = {
2226
2424
  name: '$1'
2227
2425
  }
2228
2426
  },
2229
- '^Apply device profile: (.+).?$': {
2230
- gettext: gettext$1('Apply device profile: {{ name }}'),
2231
- placeholders: {
2232
- name: '$1'
2233
- }
2234
- },
2235
2427
  '^Execute generic command: (.+).?$': {
2236
2428
  gettext: gettext$1('Execute generic command: {{command}}'),
2237
2429
  placeholders: {
2238
2430
  command: '$1'
2239
2431
  }
2240
2432
  },
2241
- '^Failed to refresh application. : Cannot refresh non local-hosted application.$': {
2242
- gettext: gettext$1('Could not reactivate the application as it is not hosted locally.')
2243
- },
2244
- '^Failed to refresh application. : Cannot refresh application without active version id.$': {
2245
- gettext: gettext$1('Could not reactivate the application as it has no active version.')
2433
+ '^Error while processing report$': {
2434
+ gettext: gettext$1('Error while processing report')
2246
2435
  },
2247
- // TODO: remove if we decide not to translate such messages:
2248
- // '^Killing container with id (.+):Need to kill Pod$': {
2249
- // gettext: gettext('Killing container with ID "{{containerId}}". Need to kill Pod.'),
2250
- // placeholders: {
2251
- // containerId: '$1'
2252
- // }
2253
- // },
2254
- '^Scaled down replica set (.+) to (\\d+)$': {
2255
- gettext: gettext$1('Replica set "{{replicaSetName}}" scaled down to "{{scaleNumber}}".'),
2436
+ '^Expected 1 endpointId argument$': {
2437
+ gettext: gettext$1('Expected 1 endpointId argument')
2438
+ }
2439
+ };
2440
+
2441
+ const PATTERN_MESSAGES_SIMULATION = {
2442
+ '^Command state is invalid: (.+)$': {
2443
+ gettext: gettext$1('Command state is invalid: {{violations}}'),
2256
2444
  placeholders: {
2257
- replicaSetName: '$1',
2258
- scaleNumber: '$2'
2445
+ violations: {
2446
+ capture: '$1',
2447
+ translate: {
2448
+ '(\\w+?) - may not be null': {
2449
+ gettext: gettext$1('"{{field}}" must not be null'),
2450
+ placeholders: {
2451
+ field: '$1'
2452
+ }
2453
+ }
2454
+ }
2455
+ }
2259
2456
  }
2260
2457
  },
2261
- '^Deleted pod: (.+)$': {
2262
- gettext: gettext$1('Pod "{{imageName}}" deleted.'),
2458
+ '^Simulator state is invalid: (.+)$': {
2459
+ gettext: gettext$1('Simulator state is invalid: {{violations}}'),
2263
2460
  placeholders: {
2264
- imageName: '$1'
2461
+ violations: {
2462
+ capture: '$1',
2463
+ translate: {
2464
+ '(\\w+?) - may not be null': {
2465
+ gettext: gettext$1('"{{field}}" should not be null'),
2466
+ placeholders: {
2467
+ field: '$1'
2468
+ }
2469
+ },
2470
+ '(\\w+?) - must be less than or equal to (\\d+)': {
2471
+ gettext: gettext$1('"{{field}}" must be less than or equal to {{maxValue}}'),
2472
+ placeholders: {
2473
+ field: '$1',
2474
+ maxValue: '$2'
2475
+ }
2476
+ },
2477
+ '(\\w+?) - should not contain null values': {
2478
+ gettext: gettext$1('"{{field}}" should not contain null values'),
2479
+ placeholders: {
2480
+ field: '$1'
2481
+ }
2482
+ },
2483
+ '(\\w+?) - must be true': {
2484
+ gettext: gettext$1('"{{field}}" must be true'),
2485
+ placeholders: {
2486
+ field: '$1'
2487
+ }
2488
+ },
2489
+ '(\\w+?) - must not be empty': {
2490
+ gettext: gettext$1('"{{field}}" must not be empty'),
2491
+ placeholders: {
2492
+ field: '$1'
2493
+ }
2494
+ }
2495
+ }
2496
+ }
2265
2497
  }
2266
- },
2267
- '^Container image "(.+)" already present on machine$': {
2268
- gettext: gettext$1('Container image "{{imageName}}" already exists.'),
2498
+ }
2499
+ };
2500
+
2501
+ const PATTERN_MESSAGE_REMOTE_ACCESS = {
2502
+ '^Could not login to ssh server on endpoint "(.+)"\\. Provided credential for user "(.+)" is incorrect\\.$': {
2503
+ gettext: gettext$1('Could not access SSH server on endpoint "{{endpointName}}". Provided credentials for user "{{userName}}" are incorrect.'),
2269
2504
  placeholders: {
2270
- imageName: '$1'
2505
+ endpointName: '$1',
2506
+ userName: '$2'
2271
2507
  }
2272
2508
  },
2273
- '^Error updating tenant! Cannot insert second configuration for Password code grant internal/Bad Request$': {
2274
- gettext: gettext$1('This login mode was already set by another administrator. Refresh the page to update the data.')
2275
- },
2276
- // Translations for audit logs
2277
- '^Application deleted$': {
2278
- gettext: gettext$1('Application deleted')
2279
- },
2280
- '^Microservice application "(.+?)" deleted for tenant "(.+?)"$': {
2281
- gettext: gettext$1('Microservice application "{{appName}}" deleted for tenant "{{tenant}}"'),
2509
+ '^Could not connect to endpoint (.+)\\. Could not verify `(.+)` host key with fingerprint `(.+)` for `(.+)` on port (.+)\\. If you expected that key, please remove the previous one from configuration to allow for connection\\.$': {
2510
+ gettext: gettext$1('Could not connect to endpoint "{{endpointName}}". Could not verify {{keyType}} host key with fingerprint {{fingerprint}} for host {{host}} on port {{port}}. If you expected this key, please remove the previous one from configuration to allow for connection.'),
2282
2511
  placeholders: {
2283
- appName: '$1',
2284
- tenant: '$2'
2512
+ endpointName: '$1',
2513
+ keyType: '$2',
2514
+ fingerprint: '$3',
2515
+ host: '$4',
2516
+ port: '$5'
2285
2517
  }
2286
2518
  },
2287
- '^Hosted application "(.+?)" deleted for tenant "(.+?)"$': {
2288
- gettext: gettext$1('Hosted application "{{appName}}" deleted for tenant "{{tenant}}"'),
2519
+ '^Could not save object remoteAccessUpdate: (.+)$': {
2520
+ gettext: '{{errorMessages}}',
2289
2521
  placeholders: {
2290
- appName: '$1',
2291
- tenant: '$2'
2522
+ errorMessages: {
2523
+ capture: '$1',
2524
+ translate: {
2525
+ 'Could not recognize host-key format': {
2526
+ gettext: gettext$1('Could not recognize "Host key" format')
2527
+ },
2528
+ 'Could not recognize key-pair format': {
2529
+ gettext: gettext$1('Could not recognize the format of "Public key" or "Private key"')
2530
+ }
2531
+ }
2532
+ }
2292
2533
  }
2293
2534
  },
2294
- '^External application "(.+?)" deleted for tenant "(.+?)"$': {
2295
- gettext: gettext$1('External application "{{appName}}" deleted for tenant "{{tenant}}"'),
2296
- placeholders: {
2297
- appName: '$1',
2298
- tenant: '$2'
2299
- }
2535
+ '^Password cipher does not match$': {
2536
+ gettext: gettext$1('Password cipher does not match.')
2300
2537
  },
2301
- '^Application activated$': {
2302
- gettext: gettext$1('Application activated')
2538
+ '^Private key must be provided in KEY_PAIR credentials$': {
2539
+ gettext: gettext$1('Private key must be provided when "Public/private keys" option is selected.')
2303
2540
  },
2304
- '^Microservice application "(.+?)" activated: version \\[(.+?)\\] added, activeVersionId \\[(.+?)\\] added$': {
2305
- gettext: gettext$1('Microservice application "{{appName}}" activated: version "{{version}}" added, activeVersionId "{{activeVersionId}}" added'),
2541
+ '^Protocol "(.+?)" does not support "(.+?)" credentials type$': {
2542
+ gettext: gettext$1('Protocol "{{protocol}}" does not support "{{credentialsType}}" credentials type.'),
2306
2543
  placeholders: {
2307
- appName: '$1',
2308
- version: '$2',
2309
- activeVersionId: '$3'
2544
+ protocol: '$1',
2545
+ credentialsType: '$2'
2310
2546
  }
2311
2547
  },
2312
- '^Hosted application "(.+?)" activated: version \\[(.+?)\\] added, activeVersionId \\[(.+?)\\] added$': {
2313
- gettext: gettext$1('Hosted application "{{appName}}" activated: version "{{version}}" added, activeVersionId "{{activeVersionId}}" added'),
2314
- placeholders: {
2315
- appName: '$1',
2316
- version: '$2',
2317
- activeVersionId: '$3'
2318
- }
2548
+ '^Private key cipher does not match$': {
2549
+ gettext: gettext$1('Private key cipher does not match')
2550
+ }
2551
+ };
2552
+
2553
+ const PATTERN_MESSAGES_BULKREGISTRATION = {
2554
+ '^A bulk registration CSV template showing all mandatory fields$': {
2555
+ gettext: gettext$1('A bulk registration CSV template showing all mandatory fields')
2319
2556
  },
2320
- '^Hosted application "(.+?)" activated: activeVersionId \\[\'(.+?)\'\\] added$': {
2321
- gettext: gettext$1('Hosted application "{{appName}}" activated: activeVersionId "{{activeVersionId}}" added'),
2322
- placeholders: {
2323
- appName: '$1',
2324
- activeVersionId: '$2'
2325
- }
2557
+ '^A bulk registration CSV template for NO_SEC devices with all optional fields$': {
2558
+ gettext: gettext$1('A bulk registration CSV template for NO_SEC devices with all optional fields')
2326
2559
  },
2327
- '^External application "(.+?)" activated: version \\[(.+?)\\] added, activeVersionId \\[(.+?)\\] added$': {
2328
- gettext: gettext$1('External application "{{appName}}" activated: version "{{version}}" added, activeVersionId "{{activeVersionId}}" added'),
2329
- placeholders: {
2330
- appName: '$1',
2331
- version: '$2',
2332
- activeVersionId: '$3'
2333
- }
2560
+ '^A general bulk registration CSV template showing all possible fields$': {
2561
+ gettext: gettext$1('A general bulk registration CSV template showing all possible fields')
2334
2562
  },
2335
- '^(.+?) user logged in to the platform with OAuth internal login mode$': {
2336
- gettext: gettext$1('"{{name}}" user logged in to the platform with OAI-Secure login mode'),
2337
- placeholders: {
2338
- name: '$1'
2339
- }
2563
+ '^A bulk registration CSV template for PSK devices with all optional fields$': {
2564
+ gettext: gettext$1('A bulk registration CSV template for PSK devices with all optional fields')
2340
2565
  },
2341
- "^Scaling application '(.+?)' from (.+?) to (.+?) instances$": {
2342
- gettext: gettext$1('Scaling application "{{appName}}" from {{from}} to {{to}} instances'),
2566
+ '^CSV file contained empty dataset$': {
2567
+ gettext: gettext$1('No entries found in uploaded CSV file.')
2568
+ }
2569
+ };
2570
+
2571
+ const PATTERN_MESSAGE_DATABROKER = {
2572
+ '^Cycle detected for route (.+?)!$': {
2573
+ gettext: gettext$1('Cycle detected for route {{route}}.'),
2343
2574
  placeholders: {
2344
- appName: '$1',
2345
- from: '$2',
2346
- to: '$3'
2575
+ route: '$1'
2347
2576
  }
2348
2577
  },
2349
- '^User logout$': {
2350
- gettext: gettext$1('User logout')
2351
- },
2352
- '^(.+?) user logout$': {
2353
- gettext: gettext$1('"{{name}}" user logout'),
2354
- placeholders: {
2355
- name: '$1'
2356
- }
2578
+ '^Data broker processing is currently overloaded and may stop forwarding your data\\. Please contact support\\.$': {
2579
+ gettext: gettext$1('Data broker processing is currently overloaded and may stop forwarding your data. Please contact support.')
2357
2580
  },
2358
- '^Authentication with id: (.+?) configuration updated.$': {
2359
- gettext: gettext$1('Authentication configuration with ID "{{id}}" updated.'),
2360
- placeholders: {
2361
- id: '$1'
2362
- }
2581
+ '^Data broker processing is not able to connect do destination tenant, thus data forwarding is not working\\. Please contact support\\.$': {
2582
+ gettext: gettext$1('Data broker processing is not able to connect to destination tenant, thus data forwarding is not working. Please contact support.')
2363
2583
  },
2364
- '^Authentication configuration with id: (.+?) added.$': {
2365
- gettext: gettext$1('Authentication configuration with ID "{{id}}" added.'),
2584
+ '^Duplicated connector for instanceUrl (.+?)!$': {
2585
+ gettext: gettext$1('Target URL {{targetUrl}} already used by another connector.'),
2366
2586
  placeholders: {
2367
- id: '$1'
2587
+ targetUrl: '$1'
2368
2588
  }
2369
2589
  },
2370
- '^Configuration type: basic.$': {
2371
- gettext: gettext$1('Configuration type: Basic Auth.')
2372
- },
2373
- '^Configuration type: oauth2_internal.$': {
2374
- gettext: gettext$1('Configuration type: OAI-Secure.')
2375
- },
2376
- '^Configuration type: oauth2.$': {
2377
- gettext: gettext$1('Configuration type: Single sign-on.')
2378
- },
2379
- '^Device put into maintenance state$': {
2380
- gettext: gettext$1('Device put into maintenance state')
2381
- },
2382
- '^device with id: (.+?) is put into maintenance state$': {
2383
- gettext: gettext$1('Device with ID "{{deviceId}}" is put into maintenance state'),
2590
+ '^Duplicated connector for name (.+?)!$': {
2591
+ gettext: gettext$1('Connector name "{{name}}" already used by another connector.'),
2384
2592
  placeholders: {
2385
- deviceId: '$1'
2593
+ name: '$1'
2386
2594
  }
2387
2595
  },
2388
2596
  '^Connector updated$': {
@@ -2430,131 +2638,224 @@ const MESSAGES_CORE_I18N = {
2430
2638
  oldConfig: '$2',
2431
2639
  newConfig: '$3'
2432
2640
  }
2641
+ }
2642
+ };
2643
+
2644
+ const PATTERN_MESSAGES_SMARTREST = {
2645
+ "^Message with ID (.+?) doesn't exist in smart rest template (.+?)$": {
2646
+ gettext: gettext$1('Message with ID "{{messageId}}" doesn\'t exist in SmartREST template with ID "{{templateId}}"'),
2647
+ placeholders: {
2648
+ messageId: '$1',
2649
+ templateId: '$2'
2650
+ }
2433
2651
  },
2434
- '^Can read all data of the asset and manage all inventory data, but cannot perform operations. Can also acknowledge and clear alarms. Can create and updates dashboards.$': {
2435
- gettext: gettext$1('Can read all data of the asset and manage all inventory data, but cannot perform operations. Can also acknowledge and clear alarms. Can create and updates dashboards.')
2436
- },
2437
- '^Operations: All$': {
2438
- gettext: gettext$1('Operations: All')
2439
- },
2440
- '^Can remotely manage the assets by sending operations to the device. This includes for example remote configuration, software update, etc.$': {
2441
- gettext: gettext$1('Can remotely manage the assets by sending operations to the device. This includes remote configuration, software update and more.')
2652
+ "^Smart rest template (.+?) doesn't exist$": {
2653
+ gettext: gettext$1('SmartREST template with ID "{{templateId}}" doesn\'t exist.'),
2654
+ placeholders: {
2655
+ templateId: '$1'
2656
+ }
2657
+ }
2658
+ };
2659
+
2660
+ const PATTERN_MESSAGES_OPTIONS = {
2661
+ '^Option created$': {
2662
+ gettext: gettext$1('Option created.')
2442
2663
  },
2443
- '^Operations: Restart Device$': {
2444
- gettext: gettext$1('Operations: Restart Device')
2664
+ '^Option "(.+?)" created$': {
2665
+ gettext: gettext$1('Option "{{option}}" created.'),
2666
+ placeholders: {
2667
+ option: '$1'
2668
+ }
2445
2669
  },
2446
- '^Can restart devices.$': {
2447
- gettext: gettext$1('Can restart devices.')
2670
+ '^Option deleted$': {
2671
+ gettext: gettext$1('Option deleted.')
2448
2672
  },
2449
- '^Reader$': {
2450
- gettext: gettext$1('Reader')
2673
+ '^Option "(.+?)" deleted$': {
2674
+ gettext: gettext$1('Option "{{option}}" deleted.'),
2675
+ placeholders: {
2676
+ option: '$1'
2677
+ }
2451
2678
  },
2452
- '^Can read all data of the asset.$': {
2453
- gettext: gettext$1('Can read all data of the asset.')
2679
+ '^unable to find option with given key (.+?) : Could not find entity Option by ID (.+?)!$': {
2680
+ gettext: gettext$1('Unable to get tenant option: "{{option}}".'),
2681
+ placeholders: {
2682
+ option: '$2'
2683
+ }
2454
2684
  },
2455
- // Default global roles' names and descriptions:
2456
- // Description for 'admins' role
2457
- '^Enables administrative permissions. The first user created for the tenant receives this role$': {
2458
- gettext: gettext$1('Enables administrative permissions. The first user created for the tenant receives this role.')
2685
+ '^unable to find option with given key (.+?) : There is no system property for key (.+?)$': {
2686
+ gettext: gettext$1('Unable to get system option: "{{option}}".'),
2687
+ placeholders: {
2688
+ option: '$2'
2689
+ }
2690
+ }
2691
+ };
2692
+
2693
+ const PATTERN_MESSAGES_DATAHUB = {
2694
+ '^DATAHUB_ADMINISTRATOR$': {
2695
+ gettext: gettext$1('DataHub Administrator')
2459
2696
  },
2460
- // Description for 'business' role
2461
- '^Can access all devices and their data but has no management permission in the tenant$': {
2462
- gettext: gettext$1('Can access all devices and their data but has no management permission in the tenant.')
2697
+ '^Can conduct administrative tasks and manage offloading pipelines$': {
2698
+ gettext: gettext$1('Can conduct administrative tasks and manage offloading pipelines.')
2463
2699
  },
2464
- '^CEP Manager$': {
2465
- gettext: gettext$1('CEP Manager')
2700
+ '^DATAHUB_MANAGER$': {
2701
+ gettext: gettext$1('DataHub Manager')
2466
2702
  },
2467
- '^Has full access to all deployed CEP modules and SmartRules$': {
2468
- gettext: gettext$1('Has full access to all deployed CEP modules and smart rules.')
2703
+ '^Can manage offloading pipelines$': {
2704
+ gettext: gettext$1('Can manage offloading pipelines.')
2469
2705
  },
2470
- '^Devicemanagement User$': {
2471
- gettext: gettext$1('Device Management User')
2706
+ '^DATAHUB_READER$': {
2707
+ gettext: gettext$1('DataHub Reader')
2472
2708
  },
2473
- '^Gives access to bulk operations and device management application. This does not include access to any device data.$': {
2474
- gettext: gettext$1('Gives access to bulk operations and Device Management application. This does not include access to any device data.')
2709
+ '^Can execute SQL queries against the data in the data lake$': {
2710
+ gettext: gettext$1('Can execute SQL queries against the data in the data lake.')
2711
+ }
2712
+ };
2713
+
2714
+ const PATTERN_MESSAGES_LPWAN = {
2715
+ '^Authentication to the Loriot platform failed with status code (.+?). Check if the credentials are correct or if Session ID is expired.$': {
2716
+ gettext: gettext$1('Authentication to the LORIOT platform failed with status code {{ statusCode }}. Check if the credentials are correct or if session ID is expired.'),
2717
+ placeholders: {
2718
+ statusCode: '$1'
2719
+ }
2475
2720
  },
2476
- // Description for 'devices' role
2477
- '^A role marker for device users. After registration, a device automatically has this role$': {
2478
- gettext: gettext$1('A role marker for device users. After registration, a device automatically has this role.')
2721
+ '^Authentication to the Loriot platform failed with status code (.+?). Check if the base URL, credentials are correct and the application with the given ID exists.$': {
2722
+ gettext: gettext$1('Authentication to the LORIOT platform failed with status code {{ statusCode }}. Check if the base URL, credentials are correct and the application with the given ID exists.'),
2723
+ placeholders: {
2724
+ statusCode: '$1'
2725
+ }
2479
2726
  },
2480
- '^Global Manager$': {
2481
- gettext: gettext$1('Global Manager')
2727
+ '^Application output creation failed due to status code (.+?)$': {
2728
+ gettext: gettext$1('Application output creation failed due to status code {{ statusCode }}.'),
2729
+ placeholders: {
2730
+ statusCode: '$1'
2731
+ }
2482
2732
  },
2483
- '^Can read and write all data from all devices$': {
2484
- gettext: gettext$1('Can read and write all data from all devices.')
2733
+ '^Application output update failed due to status code (.+?)$': {
2734
+ gettext: gettext$1('Application output update failed due to status code {{ statusCode }}.'),
2735
+ placeholders: {
2736
+ statusCode: '$1'
2737
+ }
2485
2738
  },
2486
- '^Global Reader$': {
2487
- gettext: gettext$1('Global Reader')
2739
+ '^Error creating the device due to status code (.+?). Check if the application Id, devEui, appEui and appKey are in the correct format or the device limit has been exceeded or has been registered with another account in the Loriot provider$': {
2740
+ gettext: gettext$1('Error creating the device due to status code {{ statusCode }}. Check if the application name, Device EUI, Application EUI and Application key are in the correct format or the device limit has been exceeded or has been registered with another account in the LORIOT provider.'),
2741
+ placeholders: {
2742
+ statusCode: '$1'
2743
+ }
2488
2744
  },
2489
- '^Can read all data from all devices$': {
2490
- gettext: gettext$1('Can read all data from all devices.')
2745
+ '^Error retrieving application with given ID: (.+?) with status code 400. Check if the applicationId provided is in the correct format$': {
2746
+ gettext: gettext$1('Error retrieving application with given ID: {{ applicationId }} with status code 400. Check if the selected application is correct'),
2747
+ placeholders: {
2748
+ applicationId: '$1'
2749
+ }
2491
2750
  },
2492
- '^Cockpit User$': {
2493
- gettext: gettext$1('Cockpit User')
2751
+ "^LNS connection name can't be null or blank.$": {
2752
+ gettext: gettext$1("LNS connection name can't be empty.")
2494
2753
  },
2495
- '^User to work in Cockpit application. This does not include the access to any device data.$': {
2496
- gettext: gettext$1('User to work in Cockpit application. This does not include the access to any device data.')
2754
+ '^Unexpected error occurred while accessing the cached LNS connections map with key (.+?)$': {
2755
+ gettext: gettext$1('Unexpected error occurred while accessing the cached LNS connections map with key "{{ connectionName }}".'),
2756
+ placeholders: {
2757
+ connectionName: '$1'
2758
+ }
2497
2759
  },
2498
- '^Global User Manager$': {
2499
- gettext: gettext$1('Global User Manager')
2760
+ "^LNS connection named (.+?) doesn't exist.$": {
2761
+ gettext: gettext$1('LNS connection named "{{ connectionName }}" doesn\'t exist.'),
2762
+ placeholders: {
2763
+ connectionName: '$1'
2764
+ }
2500
2765
  },
2501
- '^Can access and modify the full user hierarchy$': {
2502
- gettext: gettext$1('Can access and edit the full user hierarchy.')
2766
+ '^LNS connection named (.+?) already exists.$': {
2767
+ gettext: gettext$1('LNS connection named "{{ connectionName }}" already exists.'),
2768
+ placeholders: {
2769
+ connectionName: '$1'
2770
+ }
2503
2771
  },
2504
- // '^readers$': {
2505
- // gettext: gettext('Reader')
2506
- // },
2507
- '^Can read all data \\(including users, in contrast to "Global Reader"\\)$': {
2508
- gettext: gettext$1('Can read all data (including users, in contrast to "Global Reader").')
2772
+ "^New LNS connection can't be null.$": {
2773
+ gettext: gettext$1("New LNS connection can't be empty.")
2509
2774
  },
2510
- '^Shared User Manager$': {
2511
- gettext: gettext$1('Shared User Manager')
2775
+ "^LNS connection to update can't be null.$": {
2776
+ gettext: gettext$1("LNS connection to update can't be empty.")
2512
2777
  },
2513
- '^Can create new user as his own sub-users and manage this$': {
2514
- gettext: gettext$1('Can create new own sub-users and manage them.')
2778
+ "^The name of the LNS connection to update can't be null.$": {
2779
+ gettext: gettext$1("The name of the LNS connection to update can't be empty.")
2515
2780
  },
2516
- '^Tenant Manager$': {
2517
- gettext: gettext$1('Tenant Manager')
2781
+ '^Can not delete the LNS connection with name "(.+?)" as it\'s associated with (.+?) device(s).$': {
2782
+ gettext: gettext$1('Could not delete the LNS connection with the name "{{ connectionName }}" as it\'s associated with {{ numberOfDevices }} device(s).'),
2783
+ placeholders: {
2784
+ connectionName: '$1',
2785
+ numberOfDevices: '$2'
2786
+ }
2518
2787
  },
2519
- '^Can manage tenant wide configurations like applications, tenant options and retention rules$': {
2520
- gettext: gettext$1('Can manage tenant wide configurations like applications, tenant options and retention rules.')
2788
+ '^Can not update the LNS connection with name "(.+?)" as it\'s associated with (.+?) device(s).$': {
2789
+ gettext: gettext$1('Could not update the LNS connection with the name "{{ connectionName }}" as it\'s associated with {{ numberOfDevices }} device(s).'),
2790
+ placeholders: {
2791
+ connectionName: '$1',
2792
+ numberOfDevices: '$2'
2793
+ }
2521
2794
  },
2522
- // DataHub global roles' names and descriptions:
2523
- '^DATAHUB_ADMINISTRATOR$': {
2524
- gettext: gettext$1('DataHub Administrator')
2795
+ '^Authentication to the Actility platform failed with status code (.+?). Check if the credentials are correct.$': {
2796
+ gettext: gettext$1('Authentication to the Actility platform failed with status code {{ statusCode }}. Check if the credentials are correct.'),
2797
+ placeholders: {
2798
+ statusCode: '$1'
2799
+ }
2525
2800
  },
2526
- '^Can conduct administrative tasks and manage offloading pipelines$': {
2527
- gettext: gettext$1('Can conduct administrative tasks and manage offloading pipelines.')
2801
+ '^Authentication to the Actility platform failed with status code (.+?). Check if the profile Id is correct.$': {
2802
+ gettext: gettext$1('Authentication to the Actility platform failed with status code {{ statusCode }}. Check if the Profile ID is correct.'),
2803
+ placeholders: {
2804
+ statusCode: '$1'
2805
+ }
2528
2806
  },
2529
- '^DATAHUB_MANAGER$': {
2530
- gettext: gettext$1('DataHub Manager')
2807
+ '^Authentication to the Actility platform failed. Check if the base URL (.+?) is correct.$': {
2808
+ gettext: gettext$1('Authentication to the Actility platform failed. Check if the base URL {{ baseUrl }} is correct.'),
2809
+ placeholders: {
2810
+ baseUrl: '$1'
2811
+ }
2531
2812
  },
2532
- '^Can manage offloading pipelines$': {
2533
- gettext: gettext$1('Can manage offloading pipelines.')
2813
+ '^Authentication to the Sigfox platform failed. Check if the base URL (.+) is correct.$': {
2814
+ gettext: gettext$1('Authentication to the Sigfox platform failed. Check if the base URL {{ baseUrl }} is correct.'),
2815
+ placeholders: {
2816
+ baseUrl: '$1'
2817
+ }
2534
2818
  },
2535
- '^DATAHUB_READER$': {
2536
- gettext: gettext$1('DataHub Reader')
2819
+ '^Authentication to the Sigfox platform failed. Check if the Parent group Id and/or the credentials are correct.$': {
2820
+ gettext: gettext$1('Authentication to the Sigfox platform failed. Check if the Parent group ID and/or the credentials are correct.')
2537
2821
  },
2538
- '^Can execute SQL queries against the data in the data lake$': {
2539
- gettext: gettext$1('Can execute SQL queries against the data in the data lake.')
2822
+ '^Authentication to the Loriot platform failed with status code (.+?). Session Id might have expired.$': {
2823
+ gettext: gettext$1('Authentication to the LORIOT platform failed with status code {{ statusCode }}. Session ID might have expired.'),
2824
+ placeholders: {
2825
+ statusCode: '$1'
2826
+ }
2540
2827
  },
2541
- '^User "(.+?)" password was updated by user "(.+?)"$': {
2542
- gettext: gettext$1('"{{ targetUserName }}" user\'s password was updated by "{{ userName }}" user'),
2828
+ '^Authentication to the Actility platform failed with status code (.+?). Check if the base URL and/or the credentials are correct.$': {
2829
+ gettext: gettext$1('Authentication to the Actility platform failed with status code {{ statusCode }}. Check if the base URL and/or the credentials are correct.'),
2543
2830
  placeholders: {
2544
- targetUserName: '$1',
2545
- userName: '$2'
2831
+ statusCode: '$1'
2546
2832
  }
2547
2833
  },
2548
- '^User password update$': {
2549
- gettext: gettext$1('User password update')
2834
+ '^Error on deleting group: (.+?) : Role (.+?) is used in SSO dynamic access mapping$': {
2835
+ gettext: gettext$1('Role "{{ roleName }}" cannot be deleted because it is assigned to a dynamic access mapping in Single sign-on configuration.'),
2836
+ placeholders: {
2837
+ roleName: '$1'
2838
+ }
2550
2839
  },
2551
- '^User "(.+?)" password updated$': {
2552
- gettext: gettext$1('"{{ userName }}" user changed own password'),
2840
+ '^The series param (.+?) has wrong format. Valid format is (.+?)$': {
2841
+ gettext: gettext$1('The data cannot be retrieved because the fragment and series combination <code>{{ seriesParam }}</code> has an invalid format. Please verify your fragment and series selections in the data point configuration. The correct format should be <code>{{ validFormat }}</code>.'),
2553
2842
  placeholders: {
2554
- userName: '$1'
2843
+ seriesParam: '$1',
2844
+ validFormat: '$2'
2555
2845
  }
2556
2846
  },
2557
- // LWM2M strings (move to submodule when it's migrated from ng1)
2847
+ '^Http status code: 404\n{error="options/Not Found",message="Unable to find option by given key: sigfox-agent/provider.token",info="https://www.cumulocity.com/guides/reference-guide/#error_reporting",details="null"}$': {
2848
+ gettext: gettext$1('Unable to find option by given key: sigfox-agent/provider.token')
2849
+ },
2850
+ '^Creating device on LoRa platform failed$': {
2851
+ gettext: gettext$1('Could not create the device in the LoRa platform.')
2852
+ },
2853
+ '^No LoRa provider settings are found. Please configure the connectivity settings.$': {
2854
+ gettext: gettext$1('No LoRa provider settings are found. Please configure the connectivity settings.')
2855
+ }
2856
+ };
2857
+
2858
+ const PATTERN_MESSAGES_LWM2M = {
2558
2859
  '^LWM2M device type$': {
2559
2860
  gettext: gettext$1('LWM2M device type')
2560
2861
  },
@@ -2755,237 +3056,63 @@ const MESSAGES_CORE_I18N = {
2755
3056
  },
2756
3057
  '^NO_SEC template$': {
2757
3058
  gettext: gettext$1('NO_SEC template')
2758
- },
2759
- // LPWAN device registration and connectivity strings
2760
- '^Authentication to the Loriot platform failed with status code (.+?). Check if the credentials are correct or if Session ID is expired.$': {
2761
- gettext: gettext$1('Authentication to the LORIOT platform failed with status code {{ statusCode }}. Check if the credentials are correct or if session ID is expired.'),
2762
- placeholders: {
2763
- statusCode: '$1'
2764
- }
2765
- },
2766
- '^Authentication to the Loriot platform failed with status code (.+?). Check if the base URL, credentials are correct and the application with the given ID exists.$': {
2767
- gettext: gettext$1('Authentication to the LORIOT platform failed with status code {{ statusCode }}. Check if the base URL, credentials are correct and the application with the given ID exists.'),
2768
- placeholders: {
2769
- statusCode: '$1'
2770
- }
2771
- },
2772
- '^Application output creation failed due to status code (.+?)$': {
2773
- gettext: gettext$1('Application output creation failed due to status code {{ statusCode }}.'),
2774
- placeholders: {
2775
- statusCode: '$1'
2776
- }
2777
- },
2778
- '^Application output update failed due to status code (.+?)$': {
2779
- gettext: gettext$1('Application output update failed due to status code {{ statusCode }}.'),
2780
- placeholders: {
2781
- statusCode: '$1'
2782
- }
2783
- },
2784
- '^Error creating the device due to status code (.+?). Check if the application Id, devEui, appEui and appKey are in the correct format or the device limit has been exceeded or has been registered with another account in the Loriot provider$': {
2785
- gettext: gettext$1('Error creating the device due to status code {{ statusCode }}. Check if the application name, Device EUI, Application EUI and Application key are in the correct format or the device limit has been exceeded or has been registered with another account in the LORIOT provider.'),
2786
- placeholders: {
2787
- statusCode: '$1'
2788
- }
2789
- },
2790
- '^Error retrieving application with given ID: (.+?) with status code 400. Check if the applicationId provided is in the correct format$': {
2791
- gettext: gettext$1('Error retrieving application with given ID: {{ applicationId }} with status code 400. Check if the selected application is correct'),
2792
- placeholders: {
2793
- applicationId: '$1'
2794
- }
2795
- },
2796
- "^LNS connection name can't be null or blank.$": {
2797
- gettext: gettext$1("LNS connection name can't be empty.")
2798
- },
2799
- '^Unexpected error occurred while accessing the cached LNS connections map with key (.+?)$': {
2800
- gettext: gettext$1('Unexpected error occurred while accessing the cached LNS connections map with key "{{ connectionName }}".'),
2801
- placeholders: {
2802
- connectionName: '$1'
2803
- }
2804
- },
2805
- "^LNS connection named (.+?) doesn't exist.$": {
2806
- gettext: gettext$1('LNS connection named "{{ connectionName }}" doesn\'t exist.'),
2807
- placeholders: {
2808
- connectionName: '$1'
2809
- }
2810
- },
2811
- '^LNS connection named (.+?) already exists.$': {
2812
- gettext: gettext$1('LNS connection named "{{ connectionName }}" already exists.'),
2813
- placeholders: {
2814
- connectionName: '$1'
2815
- }
2816
- },
2817
- "^New LNS connection can't be null.$": {
2818
- gettext: gettext$1("New LNS connection can't be empty.")
2819
- },
2820
- "^LNS connection to update can't be null.$": {
2821
- gettext: gettext$1("LNS connection to update can't be empty.")
2822
- },
2823
- "^The name of the LNS connection to update can't be null.$": {
2824
- gettext: gettext$1("The name of the LNS connection to update can't be empty.")
2825
- },
2826
- '^Can not delete the LNS connection with name "(.+?)" as it\'s associated with (.+?) device(s).$': {
2827
- gettext: gettext$1('Could not delete the LNS connection with the name "{{ connectionName }}" as it\'s associated with {{ numberOfDevices }} device(s).'),
2828
- placeholders: {
2829
- connectionName: '$1',
2830
- numberOfDevices: '$2'
2831
- }
2832
- },
2833
- '^Can not update the LNS connection with name "(.+?)" as it\'s associated with (.+?) device(s).$': {
2834
- gettext: gettext$1('Could not update the LNS connection with the name "{{ connectionName }}" as it\'s associated with {{ numberOfDevices }} device(s).'),
2835
- placeholders: {
2836
- connectionName: '$1',
2837
- numberOfDevices: '$2'
2838
- }
2839
- },
2840
- '^Authentication to the Actility platform failed with status code (.+?). Check if the credentials are correct.$': {
2841
- gettext: gettext$1('Authentication to the Actility platform failed with status code {{ statusCode }}. Check if the credentials are correct.'),
2842
- placeholders: {
2843
- statusCode: '$1'
2844
- }
2845
- },
2846
- '^Authentication to the Actility platform failed with status code (.+?). Check if the profile Id is correct.$': {
2847
- gettext: gettext$1('Authentication to the Actility platform failed with status code {{ statusCode }}. Check if the Profile ID is correct.'),
2848
- placeholders: {
2849
- statusCode: '$1'
2850
- }
2851
- },
2852
- '^Authentication to the Actility platform failed. Check if the base URL (.+?) is correct.$': {
2853
- gettext: gettext$1('Authentication to the Actility platform failed. Check if the base URL {{ baseUrl }} is correct.'),
2854
- placeholders: {
2855
- baseUrl: '$1'
2856
- }
2857
- },
2858
- '^Authentication to the Sigfox platform failed. Check if the base URL (.+) is correct.$': {
2859
- gettext: gettext$1('Authentication to the Sigfox platform failed. Check if the base URL {{ baseUrl }} is correct.'),
2860
- placeholders: {
2861
- baseUrl: '$1'
2862
- }
2863
- },
2864
- '^Authentication to the Sigfox platform failed. Check if the Parent group Id and/or the credentials are correct.$': {
2865
- gettext: gettext$1('Authentication to the Sigfox platform failed. Check if the Parent group ID and/or the credentials are correct.')
2866
- },
2867
- '^Authentication to the Loriot platform failed with status code (.+?). Session Id might have expired.$': {
2868
- gettext: gettext$1('Authentication to the LORIOT platform failed with status code {{ statusCode }}. Session ID might have expired.'),
2869
- placeholders: {
2870
- statusCode: '$1'
2871
- }
2872
- },
2873
- '^Authentication to the Actility platform failed with status code (.+?). Check if the base URL and/or the credentials are correct.$': {
2874
- gettext: gettext$1('Authentication to the Actility platform failed with status code {{ statusCode }}. Check if the base URL and/or the credentials are correct.'),
2875
- placeholders: {
2876
- statusCode: '$1'
2877
- }
2878
- },
2879
- '^Error on deleting group: (.+?) : Role (.+?) is used in SSO dynamic access mapping$': {
2880
- gettext: gettext$1('Role "{{ roleName }}" cannot be deleted because it is assigned to a dynamic access mapping in Single sign-on configuration.'),
2881
- placeholders: {
2882
- roleName: '$1'
2883
- }
2884
- },
2885
- '^The series param (.+?) has wrong format. Valid format is (.+?)$': {
2886
- gettext: gettext$1('The data cannot be retrieved because the fragment and series combination <code>{{ seriesParam }}</code> has an invalid format. Please verify your fragment and series selections in the data point configuration. The correct format should be <code>{{ validFormat }}</code>.'),
2887
- placeholders: {
2888
- seriesParam: '$1',
2889
- validFormat: '$2'
2890
- }
2891
- },
2892
- // Trusted certificate audit records
2893
- "^Trusted certificate updated on '(.+?)'\\.$": {
2894
- gettext: gettext$1('Trusted certificate updated on tenant "{{ tenantId }}"'),
2895
- placeholders: {
2896
- tenantId: '$1'
2897
- }
2898
- },
2899
- "^Trusted certificate deleted from '(.+?)'\\.$": {
2900
- gettext: gettext$1('Trusted certificate deleted from tenant "{{ tenantId }}"'),
2901
- placeholders: {
2902
- tenantId: '$1'
2903
- }
2904
- },
2905
- // Tenant Certificate Authority audit records
2906
- "^Tenant certificate authority\\(CA\\) created on '(.+?)'.*$": {
2907
- gettext: gettext$1('Tenant certificate authority (CA) created for tenant "{{ tenantId }}"'),
2908
- placeholders: {
2909
- tenantId: '$1'
2910
- }
2911
- },
2912
- "^Certificate fingerprint: '(.+?)'\\.\\n\\s*Certificate subject name: '(.+?)'\\.\\n$": {
2913
- gettext: gettext$1('Certificate fingerprint: "{{ fingerprint }}".\nCertificate subject name: "{{ subjectName }}".'),
2914
- placeholders: {
2915
- fingerprint: '$1',
2916
- subjectName: '$2'
2917
- }
2918
- },
2919
- "^Tenant certificate authority\\(CA\\) was renewed for Tenant: '(.+?)'.*$": {
2920
- gettext: gettext$1('Tenant certificate authority (CA) was renewed for tenant "{{ tenantId }}"'),
2921
- placeholders: {
2922
- tenantId: '$1'
2923
- }
2924
- },
2925
- "^Certificate fingerprint: '(.+?)'\\.\\n\\s*Certificate subject name: '(.+?)'\\.\\n\\s*NotAfter='(.+?)'.*$": {
2926
- gettext: gettext$1('Certificate fingerprint: "{{ fingerprint }}".\nCertificate subject name: "{{ subjectName }}".\nExpiration date: {{ expirationDate | absoluteDate }}.'),
2927
- placeholders: {
2928
- fingerprint: '$1',
2929
- subjectName: '$2',
2930
- expirationDate: '$3'
2931
- }
2932
- },
2933
- "^Certificate fingerprint: '(.+?)'\\.\\n\\s*Certificate subject name: '(.+?)'\\.\\n\\s*Status='(.+?)'.*$": {
2934
- gettext: gettext$1('Certificate fingerprint: "{{ fingerprint }}".\nCertificate subject name: "{{ subjectName }}".\nStatus: "{{ status }}".'),
2935
- placeholders: {
2936
- fingerprint: '$1',
2937
- subjectName: '$2',
2938
- status: '$3'
2939
- }
2940
- },
2941
- "^Tenant certificate authority\\(CA\\) renewal for Tenant: '(.+?)' failed.*$": {
2942
- gettext: gettext$1('Tenant certificate authority (CA) renewal for tenant "{{ tenantId }}" failed'),
2943
- placeholders: {
2944
- tenantId: '$1'
2945
- }
2946
- },
2947
- '^The CA certificate has not been refreshed\\.\\s+It may either still have sufficient remaining validity.*$': {
2948
- gettext: gettext$1('The CA certificate has not been renewed; however, it may still have sufficient validity remaining.')
2949
- },
2950
- "^Provisioned certificate stored in user object: '(.+?)'.*$": {
2951
- gettext: gettext$1('Provisioned certificate stored in user object: "{{ userName }}"'),
2952
- placeholders: {
2953
- userName: '$1'
2954
- }
2955
- },
2956
- "^Certificate serial number: '(.+?)'\\.\\n\\s*NotAfter='(.+?)'.*$": {
2957
- gettext: gettext$1('Certificate serial number: "{{ serialNumber }}".\nExpiration date: {{ expirationDate | absoluteDate }}.'),
2958
- placeholders: {
2959
- serialNumber: '$1',
2960
- expirationDate: '$2'
2961
- }
2962
- },
2963
- "^Provisioned certificates removed from user: '(.+?)'.*$": {
2964
- gettext: gettext$1('Provisioned certificates removed from user object: "{{ userName }}"'),
2965
- placeholders: {
2966
- userName: '$1'
2967
- }
2968
- },
2969
- '^Revoked serials: (.+?)$': {
2970
- gettext: gettext$1('Revoked serials: {{ revokedSerials }}'),
2971
- placeholders: {
2972
- revokedSerials: '$1'
2973
- }
2974
- },
2975
- "^Certificate serial number hex: '(.+?)'.*$": {
2976
- gettext: gettext$1('Certificate serial number: "{{ serialNumber }}"'),
2977
- placeholders: {
2978
- serialNumber: '$1'
2979
- }
2980
- },
2981
- '^Tenant certificate authority\\(CA\\) signed certificate for device: (.+?)\\.$': {
2982
- gettext: gettext$1('Tenant certificate authority (CA) signed certificate for device: "{{ deviceId }}".'),
2983
- placeholders: {
2984
- deviceId: '$1'
2985
- }
2986
3059
  }
2987
3060
  };
2988
3061
 
3062
+ const MESSAGES_CORE_I18N = {
3063
+ ...PATTERN_MESSAGES_ALARMS,
3064
+ ...PATTERN_MESSAGES_APPLICATIONS,
3065
+ ...PATTERN_MESSAGES_AUTHENTICATION,
3066
+ ...PATTERN_MESSAGES_DATAHUB,
3067
+ ...PATTERN_MESSAGES_BULKOPERATIONS,
3068
+ ...PATTERN_MESSAGES_BULKREGISTRATION,
3069
+ ...PATTERN_MESSAGES_CEP,
3070
+ ...PATTERN_MESSAGES_CERTIFICATES,
3071
+ ...PATTERN_MESSAGES_DEVICES,
3072
+ ...PATTERN_MESSAGES_FIRMWARE,
3073
+ ...PATTERN_MESSAGES_MICROSERVICES,
3074
+ ...PATTERN_MESSAGES_OPERATIONS,
3075
+ ...PATTERN_MESSAGES_ROLES,
3076
+ ...PATTERN_MESSAGES_TENANTS,
3077
+ ...PATTERN_MESSAGES_USERS,
3078
+ ...PATTERN_MESSAGES_LPWAN,
3079
+ ...PATTERN_MESSAGES_LWM2M,
3080
+ ...PATTERN_MESSAGE_REMOTE_ACCESS,
3081
+ ...PATTERN_MESSAGE_DATABROKER,
3082
+ ...PATTERN_MESSAGES_SIMULATION,
3083
+ ...PATTERN_MESSAGES_SMARTREST,
3084
+ ...PATTERN_MESSAGES_OPTIONS,
3085
+ ...PATTERN_MESSAGES_MISC
3086
+ };
3087
+
3088
+ /* tslint:disable:max-line-length */
3089
+ /**
3090
+ * Pattern-based i18n messages for Cumulocity IoT.
3091
+ *
3092
+ * This file re-exports all pattern messages from the patterns directory.
3093
+ * Each feature category has its own file for better maintainability:
3094
+ *
3095
+ * - alarms: Alarm-related messages
3096
+ * - applications: Application management messages
3097
+ * - authentication: Authentication and login messages
3098
+ * - bulk-operations: Bulk operation messages
3099
+ * - cep: CEP module messages
3100
+ * - certificates: Certificate and PKI messages
3101
+ * - connectors: Data broker and connector messages
3102
+ * - csv: CSV file messages
3103
+ * - devices: Device, LWM2M, LoRa, Sigfox, and device protocol messages
3104
+ * - firmware: Firmware and software messages
3105
+ * - microservices: Microservice, container, and Kubernetes messages
3106
+ * - operations: Operation and command messages
3107
+ * - roles: Role and permission messages
3108
+ * - tenants: Tenant and domain messages
3109
+ * - users: User management messages
3110
+ * - simulation: Simulation messages
3111
+ * - loriot: LORIOT provider messages
3112
+ * - remote-access: Remote access messages
3113
+ * - misc: Other miscellaneous messages
3114
+ */
3115
+
2989
3116
  /**
2990
3117
  * Messages required to translate texts of events sent by the datahub microservice.
2991
3118
  */
@@ -8843,6 +8970,138 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
8843
8970
  }]
8844
8971
  }] });
8845
8972
 
8973
+ /**
8974
+ * Directive to manage focus trapping and keyboard navigation for ngx-bootstrap dropdowns with `container="body"`.
8975
+ *
8976
+ * ## Problem
8977
+ * When a dropdown is appended to the body using `container="body"`, the standard `cdkTrapFocus`
8978
+ * directive doesn't work because the dropdown content is outside the normal DOM hierarchy where
8979
+ * the directive is applied.
8980
+ *
8981
+ * ## Solution
8982
+ * This directive:
8983
+ * - Detects when a dropdown with `container="body"` opens
8984
+ * - Programmatically creates a CDK focus trap on the body-appended dropdown menu element
8985
+ * - Traps Tab/Shift+Tab navigation within the dropdown menu
8986
+ * - Automatically closes dropdown and restores focus to toggle button when user selects an item with Enter/Space
8987
+ * - Prevents ESC key from propagating to parent elements (e.g., modals, drawers) and restores focus on close
8988
+ * - Cleans up all listeners when the dropdown closes
8989
+ *
8990
+ * ## Usage
8991
+ * Simply apply this directive to the same element that has the `dropdown` directive:
8992
+ *
8993
+ * @example
8994
+ * ```html
8995
+ * <div dropdown container="body" c8yDropdownFocusTrap #myDropdown="bs-dropdown">
8996
+ * <button dropdownToggle>Select option</button>
8997
+ * <div *dropdownMenu class="dropdown-menu">
8998
+ * <c8y-list-group role="list">
8999
+ * <c8y-li tabindex="0" role="listitem">Option 1</c8y-li>
9000
+ * <c8y-li tabindex="0" role="listitem">Option 2</c8y-li>
9001
+ * </c8y-list-group>
9002
+ * </div>
9003
+ * </div>
9004
+ * ```
9005
+ *
9006
+ * ## Features
9007
+ * - **Focus trapping**: Tab key navigation cycles through dropdown items
9008
+ * - **Automatic focus management**: Enter/Space automatically closes dropdown and returns focus to toggle button
9009
+ * - **ESC key isolation**: Pressing ESC closes only the dropdown, not parent modals/drawers, and restores focus
9010
+ * - **Form-friendly**: Skips automatic close for inputs, textareas, and selects within the dropdown
9011
+ * - **Automatic cleanup**: All listeners and focus trap removed when dropdown closes
9012
+ * - **Zero configuration**: Just add the directive, no manual focus management needed
9013
+ *
9014
+ * @see {@link https://material.angular.io/cdk/a11y/overview#focustrap|CDK FocusTrap}
9015
+ */
9016
+ class DropdownFocusTrapDirective {
9017
+ constructor() {
9018
+ this.dropdown = inject(BsDropdownDirective);
9019
+ this.focusTrapFactory = inject(ConfigurableFocusTrapFactory);
9020
+ this.document = inject(DOCUMENT$1);
9021
+ this.elementRef = inject(ElementRef);
9022
+ this.shouldRestoreFocus = false;
9023
+ this.handleSelection = (event) => {
9024
+ if (event.key !== 'Enter' && event.key !== ' ') {
9025
+ return;
9026
+ }
9027
+ const target = event.target;
9028
+ if (!this.dropdownMenuElement?.contains(target) || target.matches('input, textarea, select')) {
9029
+ return;
9030
+ }
9031
+ this.shouldRestoreFocus = true;
9032
+ setTimeout(() => this.dropdown.hide(), 50);
9033
+ };
9034
+ this.handleEscape = (event) => {
9035
+ if (event.key !== 'Escape') {
9036
+ return;
9037
+ }
9038
+ event.preventDefault();
9039
+ event.stopImmediatePropagation();
9040
+ this.shouldRestoreFocus = true;
9041
+ this.dropdown.hide();
9042
+ };
9043
+ this.dropdown.onShown.pipe(takeUntilDestroyed()).subscribe(() => this.setupFocusTrap());
9044
+ this.dropdown.onHidden.pipe(takeUntilDestroyed()).subscribe(() => this.onDropdownHidden());
9045
+ }
9046
+ ngOnDestroy() {
9047
+ this.cleanupFocusTrap();
9048
+ }
9049
+ /**
9050
+ * Sets up the focus trap when the dropdown opens.
9051
+ * @private
9052
+ */
9053
+ setupFocusTrap() {
9054
+ // Use setTimeout to ensure the dropdown menu is rendered in the DOM
9055
+ setTimeout(() => {
9056
+ const dropdownMenus = this.document.querySelectorAll('.dropdown-menu.show');
9057
+ if (!dropdownMenus || dropdownMenus.length === 0) {
9058
+ return;
9059
+ }
9060
+ this.dropdownMenuElement = dropdownMenus[dropdownMenus.length - 1];
9061
+ // Simplified toggle button query
9062
+ this.toggleButton = this.elementRef.nativeElement.querySelector('.dropdown-toggle');
9063
+ if (!this.dropdownMenuElement) {
9064
+ return;
9065
+ }
9066
+ this.focusTrap = this.focusTrapFactory.create(this.dropdownMenuElement);
9067
+ this.focusTrap.enabled = true;
9068
+ this.document.addEventListener('keydown', this.handleSelection, true);
9069
+ this.document.addEventListener('keydown', this.handleEscape, true);
9070
+ }, 0);
9071
+ }
9072
+ onDropdownHidden() {
9073
+ const buttonToFocus = this.toggleButton;
9074
+ const shouldRestore = this.shouldRestoreFocus;
9075
+ this.cleanupFocusTrap();
9076
+ if (shouldRestore && buttonToFocus) {
9077
+ setTimeout(() => buttonToFocus.focus(), 0);
9078
+ }
9079
+ }
9080
+ /**
9081
+ * Cleans up the focus trap when the dropdown closes.
9082
+ * @private
9083
+ */
9084
+ cleanupFocusTrap() {
9085
+ this.document.removeEventListener('keydown', this.handleSelection, true);
9086
+ this.document.removeEventListener('keydown', this.handleEscape, true);
9087
+ this.shouldRestoreFocus = false;
9088
+ if (this.focusTrap) {
9089
+ this.focusTrap.destroy();
9090
+ this.focusTrap = undefined;
9091
+ }
9092
+ this.dropdownMenuElement = undefined;
9093
+ this.toggleButton = undefined;
9094
+ }
9095
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DropdownFocusTrapDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
9096
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "20.3.16", type: DropdownFocusTrapDirective, isStandalone: true, selector: "[c8yDropdownFocusTrap]", ngImport: i0 }); }
9097
+ }
9098
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DropdownFocusTrapDirective, decorators: [{
9099
+ type: Directive,
9100
+ args: [{
9101
+ selector: '[c8yDropdownFocusTrap]'
9102
+ }]
9103
+ }], ctorParameters: () => [] });
9104
+
8846
9105
  /**
8847
9106
  * Pipe that strips HTML tags from a string.
8848
9107
  *
@@ -10654,7 +10913,8 @@ const PRODUCT_EXPERIENCE_INTERVAL_BASED_RELOAD = {
10654
10913
  };
10655
10914
  const WIDGET_TYPE_VALUES = {
10656
10915
  ALARMS: 'alarms',
10657
- DATA_POINTS_TABLE: 'dataPointsTable'
10916
+ DATA_POINTS_TABLE: 'dataPointsTable',
10917
+ ASSET_TABLE: 'assetTable'
10658
10918
  };
10659
10919
  /**
10660
10920
  * Abstract class representing an interval reload functionality.
@@ -16427,7 +16687,7 @@ class ListItemComponent {
16427
16687
  this.pulse$.next(true);
16428
16688
  }
16429
16689
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ListItemComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
16430
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: ListItemComponent, isStandalone: true, selector: "c8y-list-item, c8y-li", inputs: { active: "active", highlighted: "highlighted", emptyActions: "emptyActions", dense: "dense", collapsed: "collapsed", selectable: "selectable" }, outputs: { collapsedChange: "collapsedChange" }, host: { properties: { "class.active": "this.active", "class.highlighted": "this.highlighted", "class.c8y-list__item--empty-actions": "this.emptyActions", "class.c8y-list__item--dense": "this.dense", "class.selectable": "this.selectable" }, classAttribute: "c8y-list__item" }, queries: [{ propertyName: "itemFooter", first: true, predicate: ListItemFooterComponent, descendants: true }, { propertyName: "itemCollapse", first: true, predicate: ListItemCollapseComponent, descendants: true }, { propertyName: "itemActions", predicate: ListItemActionComponent }], ngImport: i0, template: "<div\n [ngClass]=\"{ expanded: !collapsed, interact: itemCollapse && itemCollapse.collapseWay === 'row' }\"\n>\n <div class=\"c8y-list__item__block\">\n <ng-content select=\"c8y-list-item-drag-handle, c8y-li-drag-handle\"></ng-content>\n <ng-content select=\"c8y-list-item-radio, c8y-li-radio\"></ng-content>\n <ng-content select=\"c8y-list-item-checkbox, c8y-li-checkbox\"></ng-content>\n\n <ng-content select=\"c8y-list-item-icon, c8y-li-icon\"></ng-content>\n\n <div\n class=\"c8y-list__item__body text-truncate-wrap\"\n (click)=\"rowToggleCollapsed()\"\n >\n <ng-content select=\"c8y-list-item-body, c8y-li-body\"></ng-content>\n <ng-content></ng-content>\n <div\n class=\"c8y-list__item__footer\"\n *ngIf=\"showFooter\"\n >\n <ng-content select=\"c8y-list-item-footer, c8y-li-footer\"></ng-content>\n </div>\n </div>\n\n <div\n class=\"c8y-list__item__actions\"\n *ngIf=\"(showCollapse && itemCollapse && itemCollapse.collapseWay === 'button') || showActions\"\n >\n <button\n class=\"collapse-btn\"\n title=\"{{ 'Expand' | translate }}\"\n [attr.aria-expanded]=\"!collapsed\"\n type=\"button\"\n (click)=\"toggleCollapsed($event)\"\n *ngIf=\"showCollapse && itemCollapse.collapseWay === 'button'\"\n data-cy=\"c8y-li--collapse-btn\"\n >\n <i [c8yIcon]=\"'chevron-down'\"></i>\n </button>\n <div\n class=\"dropdown\"\n #liDropdownActions=\"bs-dropdown\"\n [cdkTrapFocus]=\"liDropdownActions.isOpen\"\n dropdown\n c8yDropdownDirection\n #dropDirection=\"bs-dropdown\"\n [cdkTrapFocus]=\"dropDirection.isOpen\"\n *ngIf=\"showActions\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Actions' | translate }}\"\n type=\"button\"\n dropdownToggle\n data-cy=\"c8y-li--actions-btn\"\n >\n <i [c8yIcon]=\"'ellipsis-v'\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n data-cy=\"list-item--dropdown-menu\"\n *dropdownMenu\n >\n <ng-content select=\"c8y-list-item-action, c8y-li-action\"></ng-content>\n <ng-container *ngFor=\"let action of actions\">\n <ng-container *ngTemplateOutlet=\"action.template\"></ng-container>\n </ng-container>\n </ul>\n </div>\n\n <ng-content\n select=\"c8y-list-item-action, c8y-li-action\"\n *ngIf=\"showActions\"\n ></ng-content>\n </div>\n </div>\n\n <div\n *ngIf=\"showCollapse\"\n [collapse]=\"collapsed\"\n [isAnimated]=\"true\"\n >\n <div class=\"c8y-list__item__collapse--container\">\n <ng-content select=\"c8y-list-item-collapse, c8y-li-collapse\"></ng-content>\n </div>\n </div>\n</div>\n", 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: "ngmodule", type: BsDropdownModule }, { 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: DropdownDirectionDirective, selector: "[dropdown][c8yBsDropdownDirection],[dropdown][c8yDropdownDirection]" }, { kind: "directive", type: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: CollapseModule }, { kind: "directive", type: i2$2.CollapseDirective, selector: "[collapse]", inputs: ["display", "isAnimated", "collapse"], outputs: ["collapsed", "collapses", "expanded", "expands"], exportAs: ["bs-collapse"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
16690
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: ListItemComponent, isStandalone: true, selector: "c8y-list-item, c8y-li", inputs: { active: "active", highlighted: "highlighted", emptyActions: "emptyActions", dense: "dense", collapsed: "collapsed", selectable: "selectable" }, outputs: { collapsedChange: "collapsedChange" }, host: { properties: { "class.active": "this.active", "class.highlighted": "this.highlighted", "class.c8y-list__item--empty-actions": "this.emptyActions", "class.c8y-list__item--dense": "this.dense", "class.selectable": "this.selectable" }, classAttribute: "c8y-list__item" }, queries: [{ propertyName: "itemFooter", first: true, predicate: ListItemFooterComponent, descendants: true }, { propertyName: "itemCollapse", first: true, predicate: ListItemCollapseComponent, descendants: true }, { propertyName: "itemActions", predicate: ListItemActionComponent }], ngImport: i0, template: "<div\n [ngClass]=\"{ expanded: !collapsed, interact: itemCollapse && itemCollapse.collapseWay === 'row' }\"\n>\n <div class=\"c8y-list__item__block\">\n <ng-content select=\"c8y-list-item-drag-handle, c8y-li-drag-handle\"></ng-content>\n <ng-content select=\"c8y-list-item-radio, c8y-li-radio\"></ng-content>\n <ng-content select=\"c8y-list-item-checkbox, c8y-li-checkbox\"></ng-content>\n\n <ng-content select=\"c8y-list-item-icon, c8y-li-icon\"></ng-content>\n\n <div\n class=\"c8y-list__item__body text-truncate-wrap\"\n (click)=\"rowToggleCollapsed()\"\n >\n <ng-content select=\"c8y-list-item-body, c8y-li-body\"></ng-content>\n <ng-content></ng-content>\n\n @if (showFooter) {\n <div class=\"c8y-list__item__footer\">\n <ng-content select=\"c8y-list-item-footer, c8y-li-footer\"></ng-content>\n </div>\n }\n </div>\n\n @if ((showCollapse && itemCollapse && itemCollapse.collapseWay === 'button') || showActions) {\n <div class=\"c8y-list__item__actions\">\n @if (showCollapse && itemCollapse.collapseWay === 'button') {\n <button\n class=\"collapse-btn\"\n title=\"{{ 'Expand' | translate }}\"\n [attr.aria-expanded]=\"!collapsed\"\n type=\"button\"\n (click)=\"toggleCollapsed($event)\"\n data-cy=\"c8y-li--collapse-btn\"\n >\n <i [c8yIcon]=\"'chevron-down'\"></i>\n </button>\n }\n\n @if (showActions) {\n <div\n class=\"dropdown\"\n container=\"body\"\n #liDropdownActions=\"bs-dropdown\"\n dropdown\n #dropDirection=\"bs-dropdown\"\n c8yDropdownFocusTrap\n >\n <button\n class=\"dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Actions' | translate }}\"\n type=\"button\"\n dropdownToggle\n data-cy=\"c8y-li--actions-btn\"\n >\n <i [c8yIcon]=\"'ellipsis-v'\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n data-cy=\"list-item--dropdown-menu\"\n *dropdownMenu\n >\n <ng-content select=\"c8y-list-item-action, c8y-li-action\"></ng-content>\n\n @for (action of actions; track action) {\n <ng-container *ngTemplateOutlet=\"action.template\"></ng-container>\n }\n </ul>\n </div>\n\n <ng-content select=\"c8y-list-item-action, c8y-li-action\"></ng-content>\n }\n </div>\n }\n </div>\n\n @if (showCollapse) {\n <div\n [collapse]=\"collapsed\"\n [isAnimated]=\"true\"\n >\n <div class=\"c8y-list__item__collapse--container\">\n <ng-content select=\"c8y-list-item-collapse, c8y-li-collapse\"></ng-content>\n </div>\n </div>\n }\n</div>\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: BsDropdownModule }, { 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: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: CollapseModule }, { kind: "directive", type: i2$2.CollapseDirective, selector: "[collapse]", inputs: ["display", "isAnimated", "collapse"], outputs: ["collapsed", "collapses", "expanded", "expands"], exportAs: ["bs-collapse"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
16431
16691
  }
16432
16692
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: ListItemComponent, decorators: [{
16433
16693
  type: Component,
@@ -16444,7 +16704,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
16444
16704
  NgTemplateOutlet,
16445
16705
  CollapseModule,
16446
16706
  C8yTranslatePipe
16447
- ], template: "<div\n [ngClass]=\"{ expanded: !collapsed, interact: itemCollapse && itemCollapse.collapseWay === 'row' }\"\n>\n <div class=\"c8y-list__item__block\">\n <ng-content select=\"c8y-list-item-drag-handle, c8y-li-drag-handle\"></ng-content>\n <ng-content select=\"c8y-list-item-radio, c8y-li-radio\"></ng-content>\n <ng-content select=\"c8y-list-item-checkbox, c8y-li-checkbox\"></ng-content>\n\n <ng-content select=\"c8y-list-item-icon, c8y-li-icon\"></ng-content>\n\n <div\n class=\"c8y-list__item__body text-truncate-wrap\"\n (click)=\"rowToggleCollapsed()\"\n >\n <ng-content select=\"c8y-list-item-body, c8y-li-body\"></ng-content>\n <ng-content></ng-content>\n <div\n class=\"c8y-list__item__footer\"\n *ngIf=\"showFooter\"\n >\n <ng-content select=\"c8y-list-item-footer, c8y-li-footer\"></ng-content>\n </div>\n </div>\n\n <div\n class=\"c8y-list__item__actions\"\n *ngIf=\"(showCollapse && itemCollapse && itemCollapse.collapseWay === 'button') || showActions\"\n >\n <button\n class=\"collapse-btn\"\n title=\"{{ 'Expand' | translate }}\"\n [attr.aria-expanded]=\"!collapsed\"\n type=\"button\"\n (click)=\"toggleCollapsed($event)\"\n *ngIf=\"showCollapse && itemCollapse.collapseWay === 'button'\"\n data-cy=\"c8y-li--collapse-btn\"\n >\n <i [c8yIcon]=\"'chevron-down'\"></i>\n </button>\n <div\n class=\"dropdown\"\n #liDropdownActions=\"bs-dropdown\"\n [cdkTrapFocus]=\"liDropdownActions.isOpen\"\n dropdown\n c8yDropdownDirection\n #dropDirection=\"bs-dropdown\"\n [cdkTrapFocus]=\"dropDirection.isOpen\"\n *ngIf=\"showActions\"\n >\n <button\n class=\"dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Actions' | translate }}\"\n type=\"button\"\n dropdownToggle\n data-cy=\"c8y-li--actions-btn\"\n >\n <i [c8yIcon]=\"'ellipsis-v'\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n data-cy=\"list-item--dropdown-menu\"\n *dropdownMenu\n >\n <ng-content select=\"c8y-list-item-action, c8y-li-action\"></ng-content>\n <ng-container *ngFor=\"let action of actions\">\n <ng-container *ngTemplateOutlet=\"action.template\"></ng-container>\n </ng-container>\n </ul>\n </div>\n\n <ng-content\n select=\"c8y-list-item-action, c8y-li-action\"\n *ngIf=\"showActions\"\n ></ng-content>\n </div>\n </div>\n\n <div\n *ngIf=\"showCollapse\"\n [collapse]=\"collapsed\"\n [isAnimated]=\"true\"\n >\n <div class=\"c8y-list__item__collapse--container\">\n <ng-content select=\"c8y-list-item-collapse, c8y-li-collapse\"></ng-content>\n </div>\n </div>\n</div>\n" }]
16707
+ ], template: "<div\n [ngClass]=\"{ expanded: !collapsed, interact: itemCollapse && itemCollapse.collapseWay === 'row' }\"\n>\n <div class=\"c8y-list__item__block\">\n <ng-content select=\"c8y-list-item-drag-handle, c8y-li-drag-handle\"></ng-content>\n <ng-content select=\"c8y-list-item-radio, c8y-li-radio\"></ng-content>\n <ng-content select=\"c8y-list-item-checkbox, c8y-li-checkbox\"></ng-content>\n\n <ng-content select=\"c8y-list-item-icon, c8y-li-icon\"></ng-content>\n\n <div\n class=\"c8y-list__item__body text-truncate-wrap\"\n (click)=\"rowToggleCollapsed()\"\n >\n <ng-content select=\"c8y-list-item-body, c8y-li-body\"></ng-content>\n <ng-content></ng-content>\n\n @if (showFooter) {\n <div class=\"c8y-list__item__footer\">\n <ng-content select=\"c8y-list-item-footer, c8y-li-footer\"></ng-content>\n </div>\n }\n </div>\n\n @if ((showCollapse && itemCollapse && itemCollapse.collapseWay === 'button') || showActions) {\n <div class=\"c8y-list__item__actions\">\n @if (showCollapse && itemCollapse.collapseWay === 'button') {\n <button\n class=\"collapse-btn\"\n title=\"{{ 'Expand' | translate }}\"\n [attr.aria-expanded]=\"!collapsed\"\n type=\"button\"\n (click)=\"toggleCollapsed($event)\"\n data-cy=\"c8y-li--collapse-btn\"\n >\n <i [c8yIcon]=\"'chevron-down'\"></i>\n </button>\n }\n\n @if (showActions) {\n <div\n class=\"dropdown\"\n container=\"body\"\n #liDropdownActions=\"bs-dropdown\"\n dropdown\n #dropDirection=\"bs-dropdown\"\n c8yDropdownFocusTrap\n >\n <button\n class=\"dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Actions' | translate }}\"\n type=\"button\"\n dropdownToggle\n data-cy=\"c8y-li--actions-btn\"\n >\n <i [c8yIcon]=\"'ellipsis-v'\"></i>\n </button>\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n data-cy=\"list-item--dropdown-menu\"\n *dropdownMenu\n >\n <ng-content select=\"c8y-list-item-action, c8y-li-action\"></ng-content>\n\n @for (action of actions; track action) {\n <ng-container *ngTemplateOutlet=\"action.template\"></ng-container>\n }\n </ul>\n </div>\n\n <ng-content select=\"c8y-list-item-action, c8y-li-action\"></ng-content>\n }\n </div>\n }\n </div>\n\n @if (showCollapse) {\n <div\n [collapse]=\"collapsed\"\n [isAnimated]=\"true\"\n >\n <div class=\"c8y-list__item__collapse--container\">\n <ng-content select=\"c8y-list-item-collapse, c8y-li-collapse\"></ng-content>\n </div>\n </div>\n }\n</div>\n" }]
16448
16708
  }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { active: [{
16449
16709
  type: Input
16450
16710
  }, {
@@ -29080,6 +29340,307 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
29080
29340
  args: ['window:resize']
29081
29341
  }] } });
29082
29342
 
29343
+ /**
29344
+ * A dashboard child allows to position elements
29345
+ * correctly on a grid.
29346
+ *
29347
+ * By setting `c8y-dashboard-child-actions` and
29348
+ * `c8y-dashboard-child-title` on the element you can add
29349
+ * custom actions or a custom title to the current child.
29350
+ *
29351
+ * By adding the correct branded classes, you can define
29352
+ * the look and feel of the child. By default it is displayed
29353
+ * as a card.
29354
+ *
29355
+ * ```html
29356
+ * <c8y-dashboard-child
29357
+ * #cpWidget3
29358
+ * [x]="0"
29359
+ * [y]="3"
29360
+ * [width]="4"
29361
+ * [height]="4"
29362
+ * [class]="'card-dashboard panel-content-transparent'"
29363
+ * >
29364
+ * <c8y-dashboard-child-title *ngIf="showTitle">
29365
+ * <span>Transparent!</span>
29366
+ * </c8y-dashboard-child-title>
29367
+ * <c8y-dashboard-child-action>
29368
+ * <a href="" (click)="showTitle = !showTitle; (false)">
29369
+ * <i [c8yIcon]="'heading'"></i> Hide/show title
29370
+ * </a>
29371
+ * </c8y-dashboard-child-action>
29372
+ * x: {{ cpWidget3.x }}<br />
29373
+ * y: {{ cpWidget3.y }}<br />
29374
+ * width: {{ cpWidget3.width }}<br />
29375
+ * height: {{ cpWidget3.height }}<br />
29376
+ * </c8y-dashboard-child>
29377
+ * ```
29378
+ */
29379
+ class DashboardChildComponent {
29380
+ set templateActions(actions) {
29381
+ this.addActions(actions, true);
29382
+ }
29383
+ /**
29384
+ * If a dashboard is frozen, all children cannot be moved
29385
+ * or resized.
29386
+ * @deprecated use editMode.
29387
+ */
29388
+ set isFrozen(value) {
29389
+ this.editMode = !value;
29390
+ }
29391
+ /**
29392
+ * Updates the pixel width of the child (used for resizing)
29393
+ */
29394
+ set pxWidth(value) {
29395
+ this._pxWidth = `${value}px`;
29396
+ }
29397
+ /**
29398
+ * Updates the pixel height of the child (used for resizing)
29399
+ */
29400
+ set pxHeight(value) {
29401
+ this._pxHeight = `${value}px`;
29402
+ }
29403
+ /**
29404
+ * nasty workaround for that issue:
29405
+ * https://github.com/angular/angular/issues/9343
29406
+ */
29407
+ get inlineStyle() {
29408
+ return this.sanitizer.bypassSecurityTrustStyle(`
29409
+ grid-column-start: ${this.x + 1};
29410
+ grid-row-start: ${this.y + 1};
29411
+ grid-column-end: span ${this.width};
29412
+ grid-row-end: span ${this.height};
29413
+ display: block;
29414
+ margin: ${this.margin || 12}px;
29415
+ order: ${this.getOrder()};
29416
+ `);
29417
+ }
29418
+ constructor(dashboard, sanitizer, element) {
29419
+ this.dashboard = dashboard;
29420
+ this.sanitizer = sanitizer;
29421
+ this.element = element;
29422
+ this.actions = [];
29423
+ this.isResize = false;
29424
+ this.isDragging = false;
29425
+ this.klasses = {};
29426
+ this._additionalHeaderTemplates = new BehaviorSubject([]);
29427
+ this.additionalHeaderTemplates$ = this._additionalHeaderTemplates.asObservable().pipe(map(templates => this.sortByPriority(templates)), shareReplay(1));
29428
+ this._pxWidth = '100%';
29429
+ this._pxHeight = '100%';
29430
+ this.fullscreen = false;
29431
+ this.MD_BOOTSTRAP_BREAKPOINT_READONLY_CLASS_PROPERTY = 768;
29432
+ /**
29433
+ * The width of the component in grid-columns.
29434
+ */
29435
+ this.width = 1;
29436
+ /**
29437
+ * The height of the component in grid-rows.
29438
+ */
29439
+ this.height = 1;
29440
+ /**
29441
+ * The margin of the child in pixel.
29442
+ */
29443
+ this.margin = 12;
29444
+ /**
29445
+ * The child content is initialized, as soon it is scrolled into viewport
29446
+ */
29447
+ this.useIntersection = false;
29448
+ this.canToggleFullscreen = true;
29449
+ /**
29450
+ * If a dashboard editing is disabled no widgets can be moved, edited, removed
29451
+ * or added.
29452
+ */
29453
+ this.editMode = false;
29454
+ /**
29455
+ * An event fired if a child change is started (dragging or resizing)
29456
+ */
29457
+ this.changeStart = new EventEmitter();
29458
+ /**
29459
+ * An event fired if a child change is ended
29460
+ */
29461
+ this.changeEnd = new EventEmitter();
29462
+ /**
29463
+ * An event fired if the fullscreen toggle button was pressed.
29464
+ */
29465
+ this.toggleFullscreen = new EventEmitter();
29466
+ /**
29467
+ * All classes added to this child
29468
+ */
29469
+ this.class = {};
29470
+ /**
29471
+ * Triggers on every resize and returns true if in one column view (mobile view)
29472
+ */
29473
+ this.isOneColumnView$ = fromEvent(window, 'resize').pipe(map(_ => {
29474
+ return (document.documentElement.clientWidth <= this.MD_BOOTSTRAP_BREAKPOINT_READONLY_CLASS_PROPERTY);
29475
+ }), debounceTime(200), startWith(document.documentElement.clientWidth <= this.MD_BOOTSTRAP_BREAKPOINT_READONLY_CLASS_PROPERTY));
29476
+ /**
29477
+ * An indicator if the child is intersected (that mean visible for the user)
29478
+ */
29479
+ this.intersected = false;
29480
+ /**
29481
+ * Tells if the last change was a dragging or resizing event;
29482
+ */
29483
+ this.lastChange = null;
29484
+ }
29485
+ ngOnChanges() {
29486
+ this.klasses = {
29487
+ card: true,
29488
+ 'card-dashboard': true,
29489
+ 'on-resize': this.isResize,
29490
+ ...this.class
29491
+ };
29492
+ }
29493
+ ngOnInit() {
29494
+ if (this.x === undefined || this.y === undefined) {
29495
+ setTimeout(() => this.setDynamicDimension());
29496
+ }
29497
+ if (this.useIntersection && 'IntersectionObserver' in window) {
29498
+ const intersectionObserver = new IntersectionObserver(events => (this.intersected = this.childInView(events, intersectionObserver)));
29499
+ intersectionObserver.observe(this.element.nativeElement);
29500
+ }
29501
+ else {
29502
+ this.intersected = true;
29503
+ }
29504
+ }
29505
+ ngAfterViewInit() {
29506
+ this.dashboard.children.push(this);
29507
+ }
29508
+ setDynamicDimension() {
29509
+ const ds = new DashboardChildChange(this);
29510
+ const { x, y } = ds.findFreeDimension();
29511
+ this.x = x;
29512
+ this.y = y;
29513
+ this.dashboard.emitChange(this);
29514
+ }
29515
+ resizeStarted($event) {
29516
+ this.isResize = true;
29517
+ this.dashboard.updateRectSize();
29518
+ this.dragSource = $event.source;
29519
+ const positioning = new DashboardChildChange(this);
29520
+ this.changeSubscription = positioning.resize$.subscribe();
29521
+ this.changeStart.emit(this);
29522
+ this.ngOnChanges();
29523
+ }
29524
+ dragStarted($event) {
29525
+ this.isDragging = true;
29526
+ this.dashboard.updateRectSize();
29527
+ this.dragSource = $event.source;
29528
+ const positioning = new DashboardChildChange(this);
29529
+ this.changeSubscription = positioning.drag$.subscribe();
29530
+ this.changeStart.emit(this);
29531
+ }
29532
+ reset($event) {
29533
+ this.lastChange = this.isResize ? 'resize' : 'drag';
29534
+ this.isResize = false;
29535
+ this.isDragging = false;
29536
+ this._pxWidth = '100%';
29537
+ this._pxHeight = '100%';
29538
+ this.ngOnChanges();
29539
+ if ($event) {
29540
+ $event.source.reset();
29541
+ }
29542
+ if (this.changeSubscription) {
29543
+ this.changeSubscription.unsubscribe();
29544
+ this.dashboard.emitChange(this);
29545
+ this.changeEnd.emit(this);
29546
+ }
29547
+ }
29548
+ ngOnDestroy() {
29549
+ if (this.changeSubscription) {
29550
+ this.changeSubscription.unsubscribe();
29551
+ }
29552
+ this._additionalHeaderTemplates.complete();
29553
+ this.removeSelfFromDashboard();
29554
+ }
29555
+ addActions(actions, prepend = false) {
29556
+ if (prepend) {
29557
+ this.actions = [...actions, ...this.actions];
29558
+ }
29559
+ else {
29560
+ this.actions = [...this.actions, ...actions];
29561
+ }
29562
+ }
29563
+ removeSelfFromDashboard() {
29564
+ const i = this.dashboard.children.indexOf(this);
29565
+ if (i >= 0) {
29566
+ this.dashboard.children.splice(i, 1);
29567
+ }
29568
+ }
29569
+ sortByPriority(items) {
29570
+ return [...items].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
29571
+ }
29572
+ getOrder() {
29573
+ return `${Math.round((this.y + (this.x + 1) / 100) * 100)}`;
29574
+ }
29575
+ childInView(events, observer) {
29576
+ const intersectingEvent = events.find(event => event.isIntersecting);
29577
+ if (intersectingEvent) {
29578
+ observer.unobserve(intersectingEvent.target);
29579
+ return true;
29580
+ }
29581
+ return false;
29582
+ }
29583
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DashboardChildComponent, deps: [{ token: DashboardComponent }, { token: i1$2.DomSanitizer }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
29584
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DashboardChildComponent, isStandalone: true, selector: "c8y-dashboard-child", inputs: { x: "x", y: "y", width: "width", height: "height", data: "data", margin: "margin", useIntersection: "useIntersection", isFrozen: "isFrozen", canToggleFullscreen: "canToggleFullscreen", editMode: "editMode", class: "class" }, outputs: { changeStart: "changeStart", changeEnd: "changeEnd", toggleFullscreen: "toggleFullscreen" }, host: { properties: { "class.fullscreen": "this.fullscreen", "attr.style": "this.inlineStyle" }, classAttribute: "dashboard-grid-child" }, queries: [{ propertyName: "templateActions", predicate: DashboardChildActionComponent }], usesOnChanges: true, ngImport: i0, template: "<div cdkDropList>\n @if (isResize) {\n <div class=\"card-placeholder\"></div>\n }\n\n <div\n [ngStyle]=\"{ width: _pxWidth, height: _pxHeight }\"\n [ngClass]=\"klasses\"\n cdkDrag\n (cdkDragStarted)=\"dragStarted($event)\"\n (cdkDragEnded)=\"reset($event)\"\n [cdkDragDisabled]=\"(isOneColumnView$ | async) || !editMode || fullscreen\"\n >\n <div\n class=\"card-header-actions card-header-grid\"\n [ngClass]=\"{\n 'drag-handle': editMode && !fullscreen,\n draggableCursor: editMode && !fullscreen\n }\"\n cdkDragHandle\n >\n <ng-content select=\"c8y-dashboard-child-title\"></ng-content>\n\n @if (actions.length > 0) {\n <div class=\"header-actions d-flex a-i-center\">\n @for (headerTemplate of additionalHeaderTemplates$ | async; track headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate.template\"></ng-container>\n }\n\n <button\n class=\"btn btn-icon\"\n [attr.aria-label]=\"'Full screen' | translate\"\n [tooltip]=\"fullscreen ? ('Exit full screen' | translate) : ('Full screen' | translate)\"\n container=\"body\"\n [delay]=\"500\"\n [disabled]=\"editMode || !canToggleFullscreen\"\n (click)=\"toggleFullscreen.next()\"\n data-cy=\"c8y-dashboard-child--settings-fullscreen\"\n >\n <i [c8yIcon]=\"fullscreen ? 'compress' : 'expand'\"></i>\n </button>\n\n <div\n class=\"optionsBtn dropdown\"\n placement=\"bottom right\"\n dropdown\n c8yDropdownFocusTrap\n [container]=\"'body'\"\n #cardDashboardActions=\"bs-dropdown\"\n >\n @if (editMode) {\n <button\n class=\"btn btn-icon dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Settings' | translate }}\"\n [attr.aria-label]=\"'Settings' | translate\"\n aria-haspopup=\"true\"\n [attr.aria-expanded]=\"cardDashboardActions.isOpen\"\n data-cy=\"c8y-dashboard-child--settings\"\n (click)=\"(false)\"\n dropdownToggle\n >\n <i [c8yIcon]=\"'cog'\"></i>\n </button>\n } @else {\n <button\n class=\"btn btn-icon\"\n [attr.aria-label]=\"'Click &quot;Edit widgets&quot; to unlock' | translate\"\n tooltip=\"{{ 'Click &quot;Edit widgets&quot; to unlock' | translate }}\"\n container=\"body\"\n (click)=\"(false)\"\n data-cy=\"c8y-dashboard-child--settings-locked\"\n >\n <i [c8yIcon]=\"'lock'\"></i>\n </button>\n }\n\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n style=\"right: -1px\"\n data-cy=\"c8y-dashboard-child--actions-dropdown\"\n *dropdownMenu\n >\n @for (action of actions; track action) {\n <ng-container *ngTemplateOutlet=\"action.template\"></ng-container>\n }\n </ul>\n </div>\n </div>\n }\n </div>\n\n <div class=\"card-inner-scroll\">\n <ng-content></ng-content>\n </div>\n\n @if (editMode && !isDragging && !fullscreen) {\n <div\n class=\"resize-handle hidden-xs\"\n cdkDrag\n [cdkDragDisabled]=\"!editMode || fullscreen\"\n (cdkDragStarted)=\"resizeStarted($event)\"\n (cdkDragEnded)=\"reset($event)\"\n ></div>\n <div class=\"resize-icon hidden-xs\"></div>\n }\n\n <div\n class=\"card-placeholder\"\n *cdkDragPlaceholder\n ></div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: 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: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i1$5.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: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: BsDropdownModule }, { 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: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "directive", type: DropdownFocusTrapDirective, selector: "[c8yDropdownFocusTrap]" }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
29585
+ }
29586
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DashboardChildComponent, decorators: [{
29587
+ type: Component,
29588
+ args: [{ selector: 'c8y-dashboard-child', host: {
29589
+ class: 'dashboard-grid-child'
29590
+ }, standalone: true, imports: [
29591
+ CdkDropList,
29592
+ CdkDrag,
29593
+ NgStyle,
29594
+ NgClass,
29595
+ CdkDragHandle,
29596
+ TooltipModule,
29597
+ IconDirective,
29598
+ BsDropdownModule,
29599
+ NgTemplateOutlet,
29600
+ CdkDragPlaceholder,
29601
+ C8yTranslatePipe,
29602
+ DropdownFocusTrapDirective,
29603
+ AsyncPipe
29604
+ ], template: "<div cdkDropList>\n @if (isResize) {\n <div class=\"card-placeholder\"></div>\n }\n\n <div\n [ngStyle]=\"{ width: _pxWidth, height: _pxHeight }\"\n [ngClass]=\"klasses\"\n cdkDrag\n (cdkDragStarted)=\"dragStarted($event)\"\n (cdkDragEnded)=\"reset($event)\"\n [cdkDragDisabled]=\"(isOneColumnView$ | async) || !editMode || fullscreen\"\n >\n <div\n class=\"card-header-actions card-header-grid\"\n [ngClass]=\"{\n 'drag-handle': editMode && !fullscreen,\n draggableCursor: editMode && !fullscreen\n }\"\n cdkDragHandle\n >\n <ng-content select=\"c8y-dashboard-child-title\"></ng-content>\n\n @if (actions.length > 0) {\n <div class=\"header-actions d-flex a-i-center\">\n @for (headerTemplate of additionalHeaderTemplates$ | async; track headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate.template\"></ng-container>\n }\n\n <button\n class=\"btn btn-icon\"\n [attr.aria-label]=\"'Full screen' | translate\"\n [tooltip]=\"fullscreen ? ('Exit full screen' | translate) : ('Full screen' | translate)\"\n container=\"body\"\n [delay]=\"500\"\n [disabled]=\"editMode || !canToggleFullscreen\"\n (click)=\"toggleFullscreen.next()\"\n data-cy=\"c8y-dashboard-child--settings-fullscreen\"\n >\n <i [c8yIcon]=\"fullscreen ? 'compress' : 'expand'\"></i>\n </button>\n\n <div\n class=\"optionsBtn dropdown\"\n placement=\"bottom right\"\n dropdown\n c8yDropdownFocusTrap\n [container]=\"'body'\"\n #cardDashboardActions=\"bs-dropdown\"\n >\n @if (editMode) {\n <button\n class=\"btn btn-icon dropdown-toggle c8y-dropdown\"\n title=\"{{ 'Settings' | translate }}\"\n [attr.aria-label]=\"'Settings' | translate\"\n aria-haspopup=\"true\"\n [attr.aria-expanded]=\"cardDashboardActions.isOpen\"\n data-cy=\"c8y-dashboard-child--settings\"\n (click)=\"(false)\"\n dropdownToggle\n >\n <i [c8yIcon]=\"'cog'\"></i>\n </button>\n } @else {\n <button\n class=\"btn btn-icon\"\n [attr.aria-label]=\"'Click &quot;Edit widgets&quot; to unlock' | translate\"\n tooltip=\"{{ 'Click &quot;Edit widgets&quot; to unlock' | translate }}\"\n container=\"body\"\n (click)=\"(false)\"\n data-cy=\"c8y-dashboard-child--settings-locked\"\n >\n <i [c8yIcon]=\"'lock'\"></i>\n </button>\n }\n\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n style=\"right: -1px\"\n data-cy=\"c8y-dashboard-child--actions-dropdown\"\n *dropdownMenu\n >\n @for (action of actions; track action) {\n <ng-container *ngTemplateOutlet=\"action.template\"></ng-container>\n }\n </ul>\n </div>\n </div>\n }\n </div>\n\n <div class=\"card-inner-scroll\">\n <ng-content></ng-content>\n </div>\n\n @if (editMode && !isDragging && !fullscreen) {\n <div\n class=\"resize-handle hidden-xs\"\n cdkDrag\n [cdkDragDisabled]=\"!editMode || fullscreen\"\n (cdkDragStarted)=\"resizeStarted($event)\"\n (cdkDragEnded)=\"reset($event)\"\n ></div>\n <div class=\"resize-icon hidden-xs\"></div>\n }\n\n <div\n class=\"card-placeholder\"\n *cdkDragPlaceholder\n ></div>\n </div>\n</div>\n" }]
29605
+ }], ctorParameters: () => [{ type: DashboardComponent }, { type: i1$2.DomSanitizer }, { type: i0.ElementRef }], propDecorators: { templateActions: [{
29606
+ type: ContentChildren,
29607
+ args: [DashboardChildActionComponent]
29608
+ }], fullscreen: [{
29609
+ type: HostBinding,
29610
+ args: ['class.fullscreen']
29611
+ }], x: [{
29612
+ type: Input
29613
+ }], y: [{
29614
+ type: Input
29615
+ }], width: [{
29616
+ type: Input
29617
+ }], height: [{
29618
+ type: Input
29619
+ }], data: [{
29620
+ type: Input
29621
+ }], margin: [{
29622
+ type: Input
29623
+ }], useIntersection: [{
29624
+ type: Input
29625
+ }], isFrozen: [{
29626
+ type: Input
29627
+ }], canToggleFullscreen: [{
29628
+ type: Input
29629
+ }], editMode: [{
29630
+ type: Input
29631
+ }], changeStart: [{
29632
+ type: Output
29633
+ }], changeEnd: [{
29634
+ type: Output
29635
+ }], toggleFullscreen: [{
29636
+ type: Output
29637
+ }], class: [{
29638
+ type: Input
29639
+ }], inlineStyle: [{
29640
+ type: HostBinding,
29641
+ args: ['attr.style']
29642
+ }] } });
29643
+
29083
29644
  const AGGREGATIONS = [
29084
29645
  { id: null, title: gettext$1('None') },
29085
29646
  { id: aggregationType.MINUTELY, title: gettext$1('Minutely') },
@@ -29123,344 +29684,6 @@ const AGGREGATION_LABELS = {
29123
29684
  [aggregationType.DAILY]: AGGREGATIONS[3].title
29124
29685
  };
29125
29686
 
29126
- class WidgetTimeContextIconBar {
29127
- constructor() {
29128
- this.AGGREGATION_ICONS = AGGREGATION_ICONS;
29129
- this.AGGREGATION_TEXTS = AGGREGATION_TEXTS;
29130
- }
29131
- ngOnInit() {
29132
- if (this.config.displaySettings.globalRealtimeContext &&
29133
- !this.config.displaySettings.globalTimeContext) {
29134
- this.globalContextButtonText = gettext$1('This widget is in sync with the dashboard realtime context.');
29135
- }
29136
- else {
29137
- this.globalContextButtonText = gettext$1('This widget is in sync with the dashboard time range.');
29138
- }
29139
- }
29140
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: WidgetTimeContextIconBar, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29141
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: WidgetTimeContextIconBar, isStandalone: true, selector: "c8y-widget-time-context-icon-bar", inputs: { config: "config" }, ngImport: i0, template: "<span class=\"m-l-auto d-flex\">\n <button\n class=\"btn btn-clean btn-no-focus\"\n [attr.aria-label]=\"'Aggregation' | translate\"\n tooltip=\"{{\n (config?.aggregation ? AGGREGATION_TEXTS[config.aggregation] : AGGREGATION_TEXTS.undefined)\n | translate\n }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"config.displaySettings.globalAggregationContext\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n config?.aggregation ? AGGREGATION_ICONS[config.aggregation] : AGGREGATION_ICONS.undefined\n \"\n ></i>\n </button>\n <button\n class=\"btn c8y-realtime btn-no-focus\"\n [attr.aria-label]=\"(config?.realtime ? 'Realtime active' : 'Realtime inactive') | translate\"\n tooltip=\"{{ (config?.realtime ? 'Realtime active' : 'Realtime inactive') | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"config?.widgetInstanceGlobalTimeContext\"\n >\n <span\n class=\"c8y-pulse m-0\"\n [ngClass]=\"{ active: config?.realtime, inactive: !config?.realtime }\"\n ></span>\n </button>\n <button\n class=\"btn btn-clean btn-no-focus p-l-4 p-r-0\"\n [attr.aria-label]=\"globalContextButtonText | translate\"\n [tooltip]=\"globalContextButtonText | translate\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"dashboard-child--global-date-context-indicator\"\n *ngIf=\"config?.widgetInstanceGlobalTimeContext\"\n >\n <span class=\"tag tag--success chip\">\n <i c8yIcon=\"clock\"></i>\n {{ 'Realtime' | translate }}\n </span>\n </button>\n</span>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i1$5.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: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
29142
- }
29143
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: WidgetTimeContextIconBar, decorators: [{
29144
- type: Component,
29145
- args: [{ selector: 'c8y-widget-time-context-icon-bar', standalone: true, imports: [NgIf, TooltipModule, IconDirective, NgClass, C8yTranslatePipe], template: "<span class=\"m-l-auto d-flex\">\n <button\n class=\"btn btn-clean btn-no-focus\"\n [attr.aria-label]=\"'Aggregation' | translate\"\n tooltip=\"{{\n (config?.aggregation ? AGGREGATION_TEXTS[config.aggregation] : AGGREGATION_TEXTS.undefined)\n | translate\n }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"config.displaySettings.globalAggregationContext\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n config?.aggregation ? AGGREGATION_ICONS[config.aggregation] : AGGREGATION_ICONS.undefined\n \"\n ></i>\n </button>\n <button\n class=\"btn c8y-realtime btn-no-focus\"\n [attr.aria-label]=\"(config?.realtime ? 'Realtime active' : 'Realtime inactive') | translate\"\n tooltip=\"{{ (config?.realtime ? 'Realtime active' : 'Realtime inactive') | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"config?.widgetInstanceGlobalTimeContext\"\n >\n <span\n class=\"c8y-pulse m-0\"\n [ngClass]=\"{ active: config?.realtime, inactive: !config?.realtime }\"\n ></span>\n </button>\n <button\n class=\"btn btn-clean btn-no-focus p-l-4 p-r-0\"\n [attr.aria-label]=\"globalContextButtonText | translate\"\n [tooltip]=\"globalContextButtonText | translate\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"dashboard-child--global-date-context-indicator\"\n *ngIf=\"config?.widgetInstanceGlobalTimeContext\"\n >\n <span class=\"tag tag--success chip\">\n <i c8yIcon=\"clock\"></i>\n {{ 'Realtime' | translate }}\n </span>\n </button>\n</span>\n" }]
29146
- }], propDecorators: { config: [{
29147
- type: Input
29148
- }] } });
29149
-
29150
- class WidgetAutoRefreshContextIconBarComponent {
29151
- constructor() {
29152
- this.globalAutoRefreshTooltip = gettext$1('This widget is in sync with the dashboard auto refresh context.');
29153
- }
29154
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: WidgetAutoRefreshContextIconBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
29155
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: WidgetAutoRefreshContextIconBarComponent, isStandalone: true, selector: "c8y-widget-auto-refresh-context-icon-bar", ngImport: i0, template: "<span class=\"m-l-auto d-flex\">\n <button\n class=\"btn btn-clean btn-no-focus p-l-4 p-r-0\"\n [attr.aria-label]=\"globalAutoRefreshTooltip | translate\"\n [tooltip]=\"globalAutoRefreshTooltip | translate\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"c8y-widget-auto-refresh-context-icon-bar--global-refresh-context-indicator\"\n >\n <span class=\"tag tag--info chip\">\n <i c8yIcon=\"refresh\"></i>\n {{ 'Auto refresh' | translate }}\n </span>\n </button>\n</span>\n", dependencies: [{ kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i1$5.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: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
29156
- }
29157
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: WidgetAutoRefreshContextIconBarComponent, decorators: [{
29158
- type: Component,
29159
- args: [{ selector: 'c8y-widget-auto-refresh-context-icon-bar', standalone: true, imports: [TooltipModule, IconDirective, C8yTranslatePipe], template: "<span class=\"m-l-auto d-flex\">\n <button\n class=\"btn btn-clean btn-no-focus p-l-4 p-r-0\"\n [attr.aria-label]=\"globalAutoRefreshTooltip | translate\"\n [tooltip]=\"globalAutoRefreshTooltip | translate\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"c8y-widget-auto-refresh-context-icon-bar--global-refresh-context-indicator\"\n >\n <span class=\"tag tag--info chip\">\n <i c8yIcon=\"refresh\"></i>\n {{ 'Auto refresh' | translate }}\n </span>\n </button>\n</span>\n" }]
29160
- }] });
29161
-
29162
- /**
29163
- * A dashboard child allows to position elements
29164
- * correctly on a grid.
29165
- *
29166
- * By setting `c8y-dashboard-child-actions` and
29167
- * `c8y-dashboard-child-title` on the element you can add
29168
- * custom actions or a custom title to the current child.
29169
- *
29170
- * By adding the correct branded classes, you can define
29171
- * the look and feel of the child. By default it is displayed
29172
- * as a card.
29173
- *
29174
- * ```html
29175
- * <c8y-dashboard-child
29176
- * #cpWidget3
29177
- * [x]="0"
29178
- * [y]="3"
29179
- * [width]="4"
29180
- * [height]="4"
29181
- * [class]="'card-dashboard panel-content-transparent'"
29182
- * >
29183
- * <c8y-dashboard-child-title *ngIf="showTitle">
29184
- * <span>Transparent!</span>
29185
- * </c8y-dashboard-child-title>
29186
- * <c8y-dashboard-child-action>
29187
- * <a href="" (click)="showTitle = !showTitle; (false)">
29188
- * <i [c8yIcon]="'heading'"></i> Hide/show title
29189
- * </a>
29190
- * </c8y-dashboard-child-action>
29191
- * x: {{ cpWidget3.x }}<br />
29192
- * y: {{ cpWidget3.y }}<br />
29193
- * width: {{ cpWidget3.width }}<br />
29194
- * height: {{ cpWidget3.height }}<br />
29195
- * </c8y-dashboard-child>
29196
- * ```
29197
- */
29198
- class DashboardChildComponent {
29199
- set templateActions(actions) {
29200
- this.addActions(actions, true);
29201
- }
29202
- /**
29203
- * If a dashboard is frozen, all children cannot be moved
29204
- * or resized.
29205
- * @deprecated use editMode.
29206
- */
29207
- set isFrozen(value) {
29208
- this.editMode = !value;
29209
- }
29210
- /**
29211
- * Updates the pixel width of the child (used for resizing)
29212
- */
29213
- set pxWidth(value) {
29214
- this._pxWidth = `${value}px`;
29215
- }
29216
- /**
29217
- * Updates the pixel height of the child (used for resizing)
29218
- */
29219
- set pxHeight(value) {
29220
- this._pxHeight = `${value}px`;
29221
- }
29222
- /**
29223
- * nasty workaround for that issue:
29224
- * https://github.com/angular/angular/issues/9343
29225
- */
29226
- get inlineStyle() {
29227
- return this.sanitizer.bypassSecurityTrustStyle(`
29228
- grid-column-start: ${this.x + 1};
29229
- grid-row-start: ${this.y + 1};
29230
- grid-column-end: span ${this.width};
29231
- grid-row-end: span ${this.height};
29232
- display: block;
29233
- margin: ${this.margin || 12}px;
29234
- order: ${this.getOrder()};
29235
- `);
29236
- }
29237
- constructor(dashboard, sanitizer, element) {
29238
- this.dashboard = dashboard;
29239
- this.sanitizer = sanitizer;
29240
- this.element = element;
29241
- this.actions = [];
29242
- this.isResize = false;
29243
- this.isDragging = false;
29244
- this.klasses = {};
29245
- this._additionalHeaderTemplates = new BehaviorSubject([]);
29246
- this.additionalHeaderTemplates$ = this._additionalHeaderTemplates.asObservable().pipe(map(templates => this.sortByPriority(templates)), shareReplay(1));
29247
- this._pxWidth = '100%';
29248
- this._pxHeight = '100%';
29249
- this.fullscreen = false;
29250
- this.MD_BOOTSTRAP_BREAKPOINT_READONLY_CLASS_PROPERTY = 768;
29251
- /**
29252
- * The width of the component in grid-columns.
29253
- */
29254
- this.width = 1;
29255
- /**
29256
- * The height of the component in grid-rows.
29257
- */
29258
- this.height = 1;
29259
- /**
29260
- * The margin of the child in pixel.
29261
- */
29262
- this.margin = 12;
29263
- /**
29264
- * The child content is initialized, as soon it is scrolled into viewport
29265
- */
29266
- this.useIntersection = false;
29267
- this.canToggleFullscreen = true;
29268
- /**
29269
- * If a dashboard editing is disabled no widgets can be moved, edited, removed
29270
- * or added.
29271
- */
29272
- this.editMode = false;
29273
- /**
29274
- * An event fired if a child change is started (dragging or resizing)
29275
- */
29276
- this.changeStart = new EventEmitter();
29277
- /**
29278
- * An event fired if a child change is ended
29279
- */
29280
- this.changeEnd = new EventEmitter();
29281
- /**
29282
- * An event fired if the fullscreen toggle button was pressed.
29283
- */
29284
- this.toggleFullscreen = new EventEmitter();
29285
- /**
29286
- * All classes added to this child
29287
- */
29288
- this.class = {};
29289
- /**
29290
- * Triggers on every resize and returns true if in one column view (mobile view)
29291
- */
29292
- this.isOneColumnView$ = fromEvent(window, 'resize').pipe(map(_ => {
29293
- return (document.documentElement.clientWidth <= this.MD_BOOTSTRAP_BREAKPOINT_READONLY_CLASS_PROPERTY);
29294
- }), debounceTime(200), startWith(document.documentElement.clientWidth <= this.MD_BOOTSTRAP_BREAKPOINT_READONLY_CLASS_PROPERTY));
29295
- /**
29296
- * An indicator if the child is intersected (that mean visible for the user)
29297
- */
29298
- this.intersected = false;
29299
- /**
29300
- * Tells if the last change was a dragging or resizing event;
29301
- */
29302
- this.lastChange = null;
29303
- }
29304
- ngOnChanges() {
29305
- this.klasses = {
29306
- card: true,
29307
- 'card-dashboard': true,
29308
- 'on-resize': this.isResize,
29309
- ...this.class
29310
- };
29311
- }
29312
- ngOnInit() {
29313
- if (this.x === undefined || this.y === undefined) {
29314
- setTimeout(() => this.setDynamicDimension());
29315
- }
29316
- if (this.useIntersection && 'IntersectionObserver' in window) {
29317
- const intersectionObserver = new IntersectionObserver(events => (this.intersected = this.childInView(events, intersectionObserver)));
29318
- intersectionObserver.observe(this.element.nativeElement);
29319
- }
29320
- else {
29321
- this.intersected = true;
29322
- }
29323
- }
29324
- ngAfterViewInit() {
29325
- this.dashboard.children.push(this);
29326
- }
29327
- setDynamicDimension() {
29328
- const ds = new DashboardChildChange(this);
29329
- const { x, y } = ds.findFreeDimension();
29330
- this.x = x;
29331
- this.y = y;
29332
- this.dashboard.emitChange(this);
29333
- }
29334
- resizeStarted($event) {
29335
- this.isResize = true;
29336
- this.dashboard.updateRectSize();
29337
- this.dragSource = $event.source;
29338
- const positioning = new DashboardChildChange(this);
29339
- this.changeSubscription = positioning.resize$.subscribe();
29340
- this.changeStart.emit(this);
29341
- this.ngOnChanges();
29342
- }
29343
- dragStarted($event) {
29344
- this.isDragging = true;
29345
- this.dashboard.updateRectSize();
29346
- this.dragSource = $event.source;
29347
- const positioning = new DashboardChildChange(this);
29348
- this.changeSubscription = positioning.drag$.subscribe();
29349
- this.changeStart.emit(this);
29350
- }
29351
- reset($event) {
29352
- this.lastChange = this.isResize ? 'resize' : 'drag';
29353
- this.isResize = false;
29354
- this.isDragging = false;
29355
- this._pxWidth = '100%';
29356
- this._pxHeight = '100%';
29357
- this.ngOnChanges();
29358
- if ($event) {
29359
- $event.source.reset();
29360
- }
29361
- if (this.changeSubscription) {
29362
- this.changeSubscription.unsubscribe();
29363
- this.dashboard.emitChange(this);
29364
- this.changeEnd.emit(this);
29365
- }
29366
- }
29367
- ngOnDestroy() {
29368
- if (this.changeSubscription) {
29369
- this.changeSubscription.unsubscribe();
29370
- }
29371
- this._additionalHeaderTemplates.complete();
29372
- this.removeSelfFromDashboard();
29373
- }
29374
- addActions(actions, prepend = false) {
29375
- if (prepend) {
29376
- this.actions = [...actions, ...this.actions];
29377
- }
29378
- else {
29379
- this.actions = [...this.actions, ...actions];
29380
- }
29381
- }
29382
- removeSelfFromDashboard() {
29383
- const i = this.dashboard.children.indexOf(this);
29384
- if (i >= 0) {
29385
- this.dashboard.children.splice(i, 1);
29386
- }
29387
- }
29388
- sortByPriority(items) {
29389
- return [...items].sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
29390
- }
29391
- getOrder() {
29392
- return `${Math.round((this.y + (this.x + 1) / 100) * 100)}`;
29393
- }
29394
- childInView(events, observer) {
29395
- const intersectingEvent = events.find(event => event.isIntersecting);
29396
- if (intersectingEvent) {
29397
- observer.unobserve(intersectingEvent.target);
29398
- return true;
29399
- }
29400
- return false;
29401
- }
29402
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DashboardChildComponent, deps: [{ token: DashboardComponent }, { token: i1$2.DomSanitizer }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
29403
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.16", type: DashboardChildComponent, isStandalone: true, selector: "c8y-dashboard-child", inputs: { x: "x", y: "y", width: "width", height: "height", data: "data", margin: "margin", useIntersection: "useIntersection", isFrozen: "isFrozen", canToggleFullscreen: "canToggleFullscreen", editMode: "editMode", class: "class" }, outputs: { changeStart: "changeStart", changeEnd: "changeEnd", toggleFullscreen: "toggleFullscreen" }, host: { properties: { "class.fullscreen": "this.fullscreen", "attr.style": "this.inlineStyle" }, classAttribute: "dashboard-grid-child" }, queries: [{ propertyName: "templateActions", predicate: DashboardChildActionComponent }], usesOnChanges: true, ngImport: i0, template: "<div cdkDropList>\n @if (isResize) {\n <div class=\"card-placeholder\"></div>\n }\n\n <div\n [ngStyle]=\"{ width: _pxWidth, height: _pxHeight }\"\n [ngClass]=\"klasses\"\n cdkDrag\n (cdkDragStarted)=\"dragStarted($event)\"\n (cdkDragEnded)=\"reset($event)\"\n [cdkDragDisabled]=\"(isOneColumnView$ | async) || !editMode || fullscreen\"\n >\n <div\n class=\"card-header-actions card-header-grid\"\n [ngClass]=\"{\n 'drag-handle': editMode && !fullscreen,\n draggableCursor: editMode && !fullscreen\n }\"\n cdkDragHandle\n >\n <ng-content select=\"c8y-dashboard-child-title\"></ng-content>\n\n @if (actions.length > 0) {\n <div class=\"header-actions d-flex a-i-center\">\n @for (headerTemplate of additionalHeaderTemplates$ | async; track headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate.template\"></ng-container>\n }\n\n <button\n class=\"btn btn-icon\"\n [attr.aria-label]=\"'Full screen' | translate\"\n [tooltip]=\"fullscreen ? ('Exit full screen' | translate) : ('Full screen' | translate)\"\n container=\"body\"\n [delay]=\"500\"\n [disabled]=\"editMode || !canToggleFullscreen\"\n (click)=\"toggleFullscreen.next()\"\n data-cy=\"c8y-dashboard-child--settings-fullscreen\"\n >\n <i [c8yIcon]=\"fullscreen ? 'compress' : 'expand'\"></i>\n </button>\n\n <div\n class=\"optionsBtn dropdown\"\n placement=\"bottom right\"\n dropdown\n [container]=\"'body'\"\n >\n @if (editMode) {\n <button\n class=\"btn btn-icon c8y-dropdown\"\n title=\"{{ 'Settings' | translate }}\"\n aria-haspopup=\"true\"\n data-cy=\"c8y-dashboard-child--settings\"\n (click)=\"(false)\"\n dropdownToggle\n >\n <i [c8yIcon]=\"'cog'\"></i>\n </button>\n } @else {\n <button\n class=\"btn btn-icon\"\n [attr.aria-label]=\"'Click &quot;Edit widgets&quot; to unlock' | translate\"\n tooltip=\"{{ 'Click &quot;Edit widgets&quot; to unlock' | translate }}\"\n container=\"body\"\n (click)=\"(false)\"\n data-cy=\"c8y-dashboard-child--settings-locked\"\n >\n <i [c8yIcon]=\"'lock'\"></i>\n </button>\n }\n\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n style=\"right: -1px\"\n data-cy=\"c8y-dashboard-child--actions-dropdown\"\n *dropdownMenu\n >\n @for (action of actions; track action) {\n <ng-container *ngTemplateOutlet=\"action.template\"></ng-container>\n }\n </ul>\n </div>\n </div>\n }\n </div>\n\n <div class=\"card-inner-scroll\">\n <ng-content></ng-content>\n </div>\n\n @if (editMode && !isDragging && !fullscreen) {\n <div\n class=\"resize-handle hidden-xs\"\n cdkDrag\n [cdkDragDisabled]=\"!editMode || fullscreen\"\n (cdkDragStarted)=\"resizeStarted($event)\"\n (cdkDragEnded)=\"reset($event)\"\n ></div>\n\n <div class=\"resize-icon hidden-xs\"></div>\n }\n\n <div\n class=\"card-placeholder\"\n *cdkDragPlaceholder\n ></div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: 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: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i1$5.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: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: BsDropdownModule }, { 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: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdkDragPlaceholder, selector: "ng-template[cdkDragPlaceholder]", inputs: ["data"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
29404
- }
29405
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DashboardChildComponent, decorators: [{
29406
- type: Component,
29407
- args: [{ selector: 'c8y-dashboard-child', host: {
29408
- class: 'dashboard-grid-child'
29409
- }, standalone: true, imports: [
29410
- CdkDropList,
29411
- CdkDrag,
29412
- NgStyle,
29413
- NgClass,
29414
- CdkDragHandle,
29415
- WidgetTimeContextIconBar,
29416
- WidgetAutoRefreshContextIconBarComponent,
29417
- TooltipModule,
29418
- IconDirective,
29419
- BsDropdownModule,
29420
- NgTemplateOutlet,
29421
- CdkDragPlaceholder,
29422
- C8yTranslatePipe,
29423
- AsyncPipe
29424
- ], template: "<div cdkDropList>\n @if (isResize) {\n <div class=\"card-placeholder\"></div>\n }\n\n <div\n [ngStyle]=\"{ width: _pxWidth, height: _pxHeight }\"\n [ngClass]=\"klasses\"\n cdkDrag\n (cdkDragStarted)=\"dragStarted($event)\"\n (cdkDragEnded)=\"reset($event)\"\n [cdkDragDisabled]=\"(isOneColumnView$ | async) || !editMode || fullscreen\"\n >\n <div\n class=\"card-header-actions card-header-grid\"\n [ngClass]=\"{\n 'drag-handle': editMode && !fullscreen,\n draggableCursor: editMode && !fullscreen\n }\"\n cdkDragHandle\n >\n <ng-content select=\"c8y-dashboard-child-title\"></ng-content>\n\n @if (actions.length > 0) {\n <div class=\"header-actions d-flex a-i-center\">\n @for (headerTemplate of additionalHeaderTemplates$ | async; track headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate.template\"></ng-container>\n }\n\n <button\n class=\"btn btn-icon\"\n [attr.aria-label]=\"'Full screen' | translate\"\n [tooltip]=\"fullscreen ? ('Exit full screen' | translate) : ('Full screen' | translate)\"\n container=\"body\"\n [delay]=\"500\"\n [disabled]=\"editMode || !canToggleFullscreen\"\n (click)=\"toggleFullscreen.next()\"\n data-cy=\"c8y-dashboard-child--settings-fullscreen\"\n >\n <i [c8yIcon]=\"fullscreen ? 'compress' : 'expand'\"></i>\n </button>\n\n <div\n class=\"optionsBtn dropdown\"\n placement=\"bottom right\"\n dropdown\n [container]=\"'body'\"\n >\n @if (editMode) {\n <button\n class=\"btn btn-icon c8y-dropdown\"\n title=\"{{ 'Settings' | translate }}\"\n aria-haspopup=\"true\"\n data-cy=\"c8y-dashboard-child--settings\"\n (click)=\"(false)\"\n dropdownToggle\n >\n <i [c8yIcon]=\"'cog'\"></i>\n </button>\n } @else {\n <button\n class=\"btn btn-icon\"\n [attr.aria-label]=\"'Click &quot;Edit widgets&quot; to unlock' | translate\"\n tooltip=\"{{ 'Click &quot;Edit widgets&quot; to unlock' | translate }}\"\n container=\"body\"\n (click)=\"(false)\"\n data-cy=\"c8y-dashboard-child--settings-locked\"\n >\n <i [c8yIcon]=\"'lock'\"></i>\n </button>\n }\n\n <ul\n class=\"dropdown-menu dropdown-menu-right\"\n style=\"right: -1px\"\n data-cy=\"c8y-dashboard-child--actions-dropdown\"\n *dropdownMenu\n >\n @for (action of actions; track action) {\n <ng-container *ngTemplateOutlet=\"action.template\"></ng-container>\n }\n </ul>\n </div>\n </div>\n }\n </div>\n\n <div class=\"card-inner-scroll\">\n <ng-content></ng-content>\n </div>\n\n @if (editMode && !isDragging && !fullscreen) {\n <div\n class=\"resize-handle hidden-xs\"\n cdkDrag\n [cdkDragDisabled]=\"!editMode || fullscreen\"\n (cdkDragStarted)=\"resizeStarted($event)\"\n (cdkDragEnded)=\"reset($event)\"\n ></div>\n\n <div class=\"resize-icon hidden-xs\"></div>\n }\n\n <div\n class=\"card-placeholder\"\n *cdkDragPlaceholder\n ></div>\n </div>\n</div>\n" }]
29425
- }], ctorParameters: () => [{ type: DashboardComponent }, { type: i1$2.DomSanitizer }, { type: i0.ElementRef }], propDecorators: { templateActions: [{
29426
- type: ContentChildren,
29427
- args: [DashboardChildActionComponent]
29428
- }], fullscreen: [{
29429
- type: HostBinding,
29430
- args: ['class.fullscreen']
29431
- }], x: [{
29432
- type: Input
29433
- }], y: [{
29434
- type: Input
29435
- }], width: [{
29436
- type: Input
29437
- }], height: [{
29438
- type: Input
29439
- }], data: [{
29440
- type: Input
29441
- }], margin: [{
29442
- type: Input
29443
- }], useIntersection: [{
29444
- type: Input
29445
- }], isFrozen: [{
29446
- type: Input
29447
- }], canToggleFullscreen: [{
29448
- type: Input
29449
- }], editMode: [{
29450
- type: Input
29451
- }], changeStart: [{
29452
- type: Output
29453
- }], changeEnd: [{
29454
- type: Output
29455
- }], toggleFullscreen: [{
29456
- type: Output
29457
- }], class: [{
29458
- type: Input
29459
- }], inlineStyle: [{
29460
- type: HostBinding,
29461
- args: ['attr.style']
29462
- }] } });
29463
-
29464
29687
  class AggregationService {
29465
29688
  constructor() {
29466
29689
  this.AGGREGATION_MAP = {
@@ -31085,6 +31308,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
31085
31308
  type: Input
31086
31309
  }] } });
31087
31310
 
31311
+ class WidgetAutoRefreshContextIconBarComponent {
31312
+ constructor() {
31313
+ this.globalAutoRefreshTooltip = gettext$1('This widget is in sync with the dashboard auto refresh context.');
31314
+ }
31315
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: WidgetAutoRefreshContextIconBarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
31316
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: WidgetAutoRefreshContextIconBarComponent, isStandalone: true, selector: "c8y-widget-auto-refresh-context-icon-bar", ngImport: i0, template: "<span class=\"m-l-auto d-flex\">\n <button\n class=\"btn btn-clean btn-no-focus p-l-4 p-r-0\"\n [attr.aria-label]=\"globalAutoRefreshTooltip | translate\"\n [tooltip]=\"globalAutoRefreshTooltip | translate\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"c8y-widget-auto-refresh-context-icon-bar--global-refresh-context-indicator\"\n >\n <span class=\"tag tag--info chip\">\n <i c8yIcon=\"refresh\"></i>\n {{ 'Auto refresh' | translate }}\n </span>\n </button>\n</span>\n", dependencies: [{ kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i1$5.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: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
31317
+ }
31318
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: WidgetAutoRefreshContextIconBarComponent, decorators: [{
31319
+ type: Component,
31320
+ args: [{ selector: 'c8y-widget-auto-refresh-context-icon-bar', standalone: true, imports: [TooltipModule, IconDirective, C8yTranslatePipe], template: "<span class=\"m-l-auto d-flex\">\n <button\n class=\"btn btn-clean btn-no-focus p-l-4 p-r-0\"\n [attr.aria-label]=\"globalAutoRefreshTooltip | translate\"\n [tooltip]=\"globalAutoRefreshTooltip | translate\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"c8y-widget-auto-refresh-context-icon-bar--global-refresh-context-indicator\"\n >\n <span class=\"tag tag--info chip\">\n <i c8yIcon=\"refresh\"></i>\n {{ 'Auto refresh' | translate }}\n </span>\n </button>\n</span>\n" }]
31321
+ }] });
31322
+
31088
31323
  function globalAutoRefreshLoading(globalRefreshService) {
31089
31324
  return (source) => source.pipe(distinctUntilChanged(), tap(isLoading => isLoading
31090
31325
  ? globalRefreshService.incrementLoading()
@@ -31690,6 +31925,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
31690
31925
  }]
31691
31926
  }] });
31692
31927
 
31928
+ class WidgetTimeContextIconBar {
31929
+ constructor() {
31930
+ this.AGGREGATION_ICONS = AGGREGATION_ICONS;
31931
+ this.AGGREGATION_TEXTS = AGGREGATION_TEXTS;
31932
+ }
31933
+ ngOnInit() {
31934
+ if (this.config.displaySettings.globalRealtimeContext &&
31935
+ !this.config.displaySettings.globalTimeContext) {
31936
+ this.globalContextButtonText = gettext$1('This widget is in sync with the dashboard realtime context.');
31937
+ }
31938
+ else {
31939
+ this.globalContextButtonText = gettext$1('This widget is in sync with the dashboard time range.');
31940
+ }
31941
+ }
31942
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: WidgetTimeContextIconBar, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
31943
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.16", type: WidgetTimeContextIconBar, isStandalone: true, selector: "c8y-widget-time-context-icon-bar", inputs: { config: "config" }, ngImport: i0, template: "<span class=\"m-l-auto d-flex\">\n <button\n class=\"btn btn-clean btn-no-focus\"\n [attr.aria-label]=\"'Aggregation' | translate\"\n tooltip=\"{{\n (config?.aggregation ? AGGREGATION_TEXTS[config.aggregation] : AGGREGATION_TEXTS.undefined)\n | translate\n }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"config.displaySettings.globalAggregationContext\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n config?.aggregation ? AGGREGATION_ICONS[config.aggregation] : AGGREGATION_ICONS.undefined\n \"\n ></i>\n </button>\n <button\n class=\"btn c8y-realtime btn-no-focus\"\n [attr.aria-label]=\"(config?.realtime ? 'Realtime active' : 'Realtime inactive') | translate\"\n tooltip=\"{{ (config?.realtime ? 'Realtime active' : 'Realtime inactive') | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"config?.widgetInstanceGlobalTimeContext\"\n >\n <span\n class=\"c8y-pulse m-0\"\n [ngClass]=\"{ active: config?.realtime, inactive: !config?.realtime }\"\n ></span>\n </button>\n <button\n class=\"btn btn-clean btn-no-focus p-l-4 p-r-0\"\n [attr.aria-label]=\"globalContextButtonText | translate\"\n [tooltip]=\"globalContextButtonText | translate\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"dashboard-child--global-date-context-indicator\"\n *ngIf=\"config?.widgetInstanceGlobalTimeContext\"\n >\n <span class=\"tag tag--success chip\">\n <i c8yIcon=\"clock\"></i>\n {{ 'Realtime' | translate }}\n </span>\n </button>\n</span>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i1$5.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: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: C8yTranslatePipe, name: "translate" }] }); }
31944
+ }
31945
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: WidgetTimeContextIconBar, decorators: [{
31946
+ type: Component,
31947
+ args: [{ selector: 'c8y-widget-time-context-icon-bar', standalone: true, imports: [NgIf, TooltipModule, IconDirective, NgClass, C8yTranslatePipe], template: "<span class=\"m-l-auto d-flex\">\n <button\n class=\"btn btn-clean btn-no-focus\"\n [attr.aria-label]=\"'Aggregation' | translate\"\n tooltip=\"{{\n (config?.aggregation ? AGGREGATION_TEXTS[config.aggregation] : AGGREGATION_TEXTS.undefined)\n | translate\n }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"config.displaySettings.globalAggregationContext\"\n [adaptivePosition]=\"false\"\n >\n <i\n class=\"icon-14\"\n [c8yIcon]=\"\n config?.aggregation ? AGGREGATION_ICONS[config.aggregation] : AGGREGATION_ICONS.undefined\n \"\n ></i>\n </button>\n <button\n class=\"btn c8y-realtime btn-no-focus\"\n [attr.aria-label]=\"(config?.realtime ? 'Realtime active' : 'Realtime inactive') | translate\"\n tooltip=\"{{ (config?.realtime ? 'Realtime active' : 'Realtime inactive') | translate }}\"\n placement=\"top\"\n container=\"body\"\n type=\"button\"\n *ngIf=\"config?.widgetInstanceGlobalTimeContext\"\n >\n <span\n class=\"c8y-pulse m-0\"\n [ngClass]=\"{ active: config?.realtime, inactive: !config?.realtime }\"\n ></span>\n </button>\n <button\n class=\"btn btn-clean btn-no-focus p-l-4 p-r-0\"\n [attr.aria-label]=\"globalContextButtonText | translate\"\n [tooltip]=\"globalContextButtonText | translate\"\n placement=\"top\"\n container=\"body\"\n data-cy=\"dashboard-child--global-date-context-indicator\"\n *ngIf=\"config?.widgetInstanceGlobalTimeContext\"\n >\n <span class=\"tag tag--success chip\">\n <i c8yIcon=\"clock\"></i>\n {{ 'Realtime' | translate }}\n </span>\n </button>\n</span>\n" }]
31948
+ }], propDecorators: { config: [{
31949
+ type: Input
31950
+ }] } });
31951
+
31693
31952
  class DashboardModule {
31694
31953
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DashboardModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
31695
31954
  static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.3.16", ngImport: i0, type: DashboardModule, imports: [CommonModule,
@@ -33450,7 +33709,8 @@ class DataGridComponent {
33450
33709
  bordered: false,
33451
33710
  gridHeader: true,
33452
33711
  filter: true,
33453
- hover: true
33712
+ hover: true,
33713
+ showLoadingIndicator: true
33454
33714
  };
33455
33715
  this.actionControls = [];
33456
33716
  /** Sets initial search text. */
@@ -34453,7 +34713,7 @@ class DataGridComponent {
34453
34713
  provide: PRODUCT_EXPERIENCE_EVENT_SOURCE,
34454
34714
  useExisting: forwardRef(() => DataGridComponent)
34455
34715
  }
34456
- ], 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: "@let loadingData = ((dataSource.loading$ | async) && !loadMoreComponent?.isLoading) || loading;\n\n<div\n class=\"table-data-grid-scroll\"\n #scroll\n [ngClass]=\"{\n 'table-data-grid__overlay': loadingData\n }\"\n data-cy=\"c8y-data-grid--table-data-grid-scroll\"\n>\n @if (loadingData) {\n <div class=\"table-data-grid__loading--wrapper\">\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\n @if (displayOptions.gridHeader) {\n <div class=\"table-data-grid-header separator large-padding\">\n <div\n class=\"h4\"\n [ngClass]=\"{ 'm-r-16': !!title }\"\n >\n {{ title | translate }}\n </div>\n\n @if (displayOptions.filter) {\n @if (!filteringApplied) {\n <span>\n @if (!!filteringLabelsParams.allItemsCount) {\n <small\n class=\"m-r-4\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n }\n <span\n class=\"label label-default m-r-4\"\n translate\n >\n No filters\n </span>\n </span>\n }\n @if (filteringApplied) {\n <span class=\"d-flex a-i-center\">\n @if (!!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 }\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 @for (column of columnsWithFiltersApplied; track $index; let last = $last) {\n <li [ngClass]=\"{ 'separator-bottom': !last }\">\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 @for (\n groupedFilterChips of column\n | mapToFilterChips\n | async\n | groupedFilterChips;\n track $index;\n let first = $first\n ) {\n <div\n class=\"list-group-item borderless d-flex d-col\"\n [ngClass]=\"{ 'p-t-0': first }\"\n >\n @if (groupedFilterChips.label) {\n <p class=\"small p-b-4\">\n {{ groupedFilterChips.label | translate }}\n </p>\n }\n <div class=\"d-flex a-i-center gap-4 flex-wrap\">\n @for (chip of groupedFilterChips.chips; track $index) {\n <span class=\"tag tag--info chip\">\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 }\n </div>\n </div>\n }\n </ng-container>\n </li>\n }\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\n @if (displayOptions.filter) {\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 data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n }\n <ng-template #filtersHelpPopover>\n <div [innerHtml]=\"filtersHelpPopoverHtml | translate\"></div>\n </ng-template>\n\n @if (showCounterWarning) {\n <button\n class=\"btn-clean text-primary hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'The counter for the total number of items might be inaccurate.' | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n }\n }\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n @for (\n headerActionControl of headerActionControls | visibleControls | async;\n track $index\n ) {\n <ng-container>\n @if (!headerActionControl.template) {\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 } @else {\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n }\n </ng-container>\n }\n\n @if (configureColumnsEnabled) {\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\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 @for (column of columns; track $index) {\n <div\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n @if (!column.positionFixed) {\n <div class=\"list-group-item draggable-after p-l-16 p-r-16 a-i-center\">\n <label\n class=\"c8y-checkbox min-width-0\"\n title=\"{{ column.custom ? ('Custom' | translate) + ' ' : '' }}{{\n (column.header | translate) || column.name\n }}\"\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();\n 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 <div class=\"d-col min-width-0 m-l-8 m-r-8\">\n @if (column?.custom) {\n <span class=\"text-muted text-10 m-b-0 l-h-1\">\n {{ 'Custom' | translate }}\n </span>\n }\n <span class=\"text-truncate l-h-1\">\n {{ (column.header | translate) || column.name }}\n </span>\n </div>\n @let canRetrieve = canRetrieveAssetProperties | async;\n @if (canRetrieve) {\n @if (canRetrieve && column?.type) {\n <span\n class=\"tag tag--default a-s-end\"\n title=\"{{ column.type | translate | humanize }}\"\n >\n {{ column.type | translate | humanize }}\n </span>\n }\n }\n </label>\n @if (column.custom) {\n <button\n class=\"btn btn-dot btn-dot--danger 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 >\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 }\n </div>\n }\n </div>\n }\n </div>\n </li>\n @if (isConfigContextKnown) {\n <li class=\"p-8 sticky-bottom separator-top\">\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 }\n </ul>\n </div>\n }\n\n @if (!hideReload) {\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\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\n @if (!serverSideDataCallback || showSearch) {\n <div class=\"input-group input-group-search m-l-sm-16 data-grid__search-input\">\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 @if (searchText.length === 0) {\n <i c8yIcon=\"search\"></i>\n }\n @if (searchText.length > 0) {\n <i\n class=\"pointer\"\n c8yIcon=\"times\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n }\n </div>\n </div>\n }\n </div>\n </div>\n @if (selectedItemIds.length !== 0) {\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n data-cy=\"table-data-grid-header-bulk-actions\"\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 @if (!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize) {\n <small>\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 }\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n @for (\n bulkActionControl of bulkActionControls | visibleControls: selectedItemIds | async;\n track $index\n ) {\n <ng-container>\n @switch (bulkActionControl.type) {\n @case (builtInActionType.Export) {\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\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 @case (builtInActionType.Delete) {\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\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 @default {\n <button\n class=\"btnbar-btn\"\n title=\"{{ bulkActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\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 }\n }\n </ng-container>\n }\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 }\n </div>\n }\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 data-cy=\"c8y-data-grid--table\"\n >\n @for (column of columns; track column.name; let i = $index) {\n <ng-container [cdkColumnDef]=\"column.name\">\n @switch (column.name) {\n @case ('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 }\n\n @case ('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 }\n\n @case ('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 @for (\n actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : 0\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2);\n track $index\n ) {\n <ng-container>\n @switch (actionControl.type) {\n @case (builtInActionType.Edit) {\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"'Edit' | translate\"\n tooltip=\"{{ 'Edit' | translate }}\"\n container=\"body\"\n type=\"button\"\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 @case (builtInActionType.Delete) {\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 [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 @default {\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"\n (actionControl.icon ? actionControl.text : '') | translate\n \"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ showOnHover: actionControl.showOnHover }\"\n [delay]=\"500\"\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 @if (actionControl.icon) {\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n ></i>\n } @else {\n <span>{{ actionControl.text | translate }}</span>\n }\n </button>\n }\n }\n </ng-container>\n }\n\n <div\n [ngClass]=\"{\n 'm-l-auto overflow-visible':\n (actionControls | visibleControls: row | async)?.length > 2\n }\"\n >\n @if ((actionControls | visibleControls: row | async)?.length > 2) {\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\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 @for (\n actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2);\n track $index\n ) {\n <li>\n @switch (actionControl.type) {\n @case (builtInActionType.Edit) {\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\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 }\n @case (builtInActionType.Delete) {\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\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 }\n @case (builtInActionType.Export) {\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\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 }\n @default {\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\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 }\n }\n </li>\n }\n </ul>\n </div>\n }\n </div>\n </td>\n }\n @default {\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 @if (!column.filterable) {\n <div [title]=\"(column.header | translate) || column.name\">\n @let cellRendererSpec =\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this;\n\n @if (cellRendererSpec) {\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n }\n </div>\n }\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n @if (column.filterable) {\n <div\n class=\"dropdown\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\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 @let cellRendererSpec =\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this;\n\n @if (cellRendererSpec) {\n <c8y-cell-renderer\n data-cy=\"c8y-data-grid--c8y-cell-renderer\"\n [spec]=\"cellRendererSpec\"\n ></c8y-cell-renderer>\n }\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 @let filteringFormRendererSpec =\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec : this;\n\n @if (filteringFormRendererSpec) {\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 }\n </li>\n </ul>\n </div>\n }\n\n @if (column.sortable) {\n <button\n class=\"btn-sort\"\n [style]=\"{\n 'margin-left': !column.filterable && column.sortable ? '-20px' : null\n }\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n @switch (column.sortOrder) {\n @case ('asc') {\n <i c8yIcon=\"long-arrow-up\"></i>\n }\n @case ('desc') {\n <i c8yIcon=\"long-arrow-down\"></i>\n }\n @default {\n <i c8yIcon=\"exchange\"></i>\n }\n }\n </button>\n }\n\n @if (column.resizable) {\n <span\n class=\"resize-handle\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n }\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 @let cellRendererSpec =\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec : this;\n\n @if (cellRendererSpec) {\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n }\n </td>\n }\n }\n </ng-container>\n }\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 level-' + row.level : ''\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 level-' + (row.parentRow.level + 1)\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['pagination-row']; when: isPaginationRow\"\n ></tr>\n\n <ng-container cdkColumnDef=\"pagination-row\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <div class=\"col-sm-4 no-gutter\">\n @if ((dataSource.stats$ | async).currentPageSize > 0) {\n <div\n class=\"counter p-t-8 p-b-8\"\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 }\n </div>\n <div class=\"col-sm-4 col-sm-offset-4 no-gutter text-right\">\n @if (row.childrenStats.filteredSize > row.childrenStats.currentPageSize) {\n <pagination\n class=\"d-flex j-c-end\"\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' | translate\"\n [nextText]=\"'Next' | translate\"\n ></pagination>\n }\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 @if (\n !(dataSource.loading$ | async) &&\n !loading &&\n ((dataSource.stats$ | async).filteredSize === 0 || (dataSource.data$ | async).length === 0)\n ) {\n <div class=\"d-flex m-0 p-t-40 p-b-40\">\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\n @if (pagination && !infiniteScroll) {\n <div class=\"table-data-grid-footer separator large-padding\">\n <div class=\"col-sm-4 no-gutter\">\n @if ((dataSource.stats$ | async).currentPageSize > 0) {\n <div\n class=\"counter p-t-8 p-b-8\"\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 }\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n @if ((dataSource.stats$ | async).filteredSize > minPossiblePageSize) {\n <div class=\"form-group form-inline p-t-8 p-b-8\">\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 @for (pageSize of possiblePageSizes; track $index) {\n <option [ngValue]=\"pageSize\">\n {{ pageSize }}\n </option>\n }\n </select>\n </div>\n </div>\n }\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n @if ((dataSource.stats$ | async).filteredSize > 0) {\n <pagination\n [class.hidden]=\"hidePagination$ | async\"\n class=\"d-flex j-c-end\"\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' | translate\"\n [nextText]=\"'Next' | translate\"\n ></pagination>\n }\n </div>\n </div>\n }\n</div>\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "ngmodule", type: BsDropdownModule }, { 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: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i1$9.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: ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: 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: "ngmodule", type: FormsModule$1 }, { kind: "directive", type: i1$8.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$8.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$8.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: i1$8.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1$8.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i1$5.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: PopoverConfirmComponent, selector: "c8y-popover-confirm", inputs: ["buttons", "message", "title", "isOpen", "containerClass", "placement", "outsideClick", "adaptivePosition", "container"] }, { kind: "directive", type: NgPlural, selector: "[ngPlural]", inputs: ["ngPlural"] }, { kind: "directive", type: NgPluralCase, selector: "[ngPluralCase]" }, { kind: "component", type: CdkTable, selector: "cdk-table, table[cdk-table]", inputs: ["trackBy", "dataSource", "multiTemplateDataRows", "fixedLayout"], outputs: ["contentChanged"], exportAs: ["cdkTable"] }, { kind: "directive", type: CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["cdkColumnDef", "sticky", "stickyEnd"] }, { kind: "directive", type: CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { kind: "directive", type: CdkHeaderCell, selector: "cdk-header-cell, th[cdk-header-cell]" }, { kind: "directive", type: CdkCellDef, selector: "[cdkCellDef]" }, { kind: "directive", type: CdkCell, selector: "cdk-cell, td[cdk-cell]" }, { kind: "component", type: CellRendererComponent, selector: "c8y-cell-renderer", inputs: ["spec"] }, { kind: "component", type: FilteringFormRendererComponent, selector: "c8y-filtering-form-renderer", inputs: ["spec"] }, { kind: "directive", type: CdkFooterCellDef, selector: "[cdkFooterCellDef]" }, { kind: "directive", type: CdkFooterCell, selector: "cdk-footer-cell, td[cdk-footer-cell]" }, { kind: "directive", type: CdkHeaderRowDef, selector: "[cdkHeaderRowDef]", inputs: ["cdkHeaderRowDef", "cdkHeaderRowDefSticky"] }, { kind: "component", type: CdkHeaderRow, selector: "cdk-header-row, tr[cdk-header-row]" }, { kind: "directive", type: CdkRowDef, selector: "[cdkRowDef]", inputs: ["cdkRowDefColumns", "cdkRowDefWhen"] }, { kind: "component", type: CdkRow, selector: "cdk-row, tr[cdk-row]" }, { kind: "directive", type: CdkFooterRowDef, selector: "[cdkFooterRowDef]", inputs: ["cdkFooterRowDef", "cdkFooterRowDefSticky"] }, { kind: "component", type: CdkFooterRow, selector: "cdk-footer-row, tr[cdk-footer-row]" }, { kind: "ngmodule", type: PaginationModule }, { kind: "component", type: i11.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: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: 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" }, { kind: "pipe", type: HumanizePipe, name: "humanize" }] }); }
34716
+ ], 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: "@let loadingData = ((dataSource.loading$ | async) && !loadMoreComponent?.isLoading) || loading;\n\n<div\n class=\"table-data-grid-scroll\"\n #scroll\n [ngClass]=\"{\n 'table-data-grid__overlay': loadingData\n }\"\n data-cy=\"c8y-data-grid--table-data-grid-scroll\"\n>\n @if (loadingData && displayOptions.showLoadingIndicator) {\n <div class=\"table-data-grid__loading--wrapper\">\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\n @if (displayOptions.gridHeader) {\n <div class=\"table-data-grid-header separator large-padding\">\n <div\n class=\"h4\"\n [ngClass]=\"{ 'm-r-16': !!title }\"\n >\n {{ title | translate }}\n </div>\n\n @if (displayOptions.filter) {\n @if (!filteringApplied) {\n <span>\n @if (!!filteringLabelsParams.allItemsCount) {\n <small\n class=\"m-r-4\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n }\n <span\n class=\"label label-default m-r-4\"\n translate\n >\n No filters\n </span>\n </span>\n }\n @if (filteringApplied) {\n <span class=\"d-flex a-i-center\">\n @if (!!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 }\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 @for (column of columnsWithFiltersApplied; track $index; let last = $last) {\n <li [ngClass]=\"{ 'separator-bottom': !last }\">\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 @for (\n groupedFilterChips of column\n | mapToFilterChips\n | async\n | groupedFilterChips;\n track $index;\n let first = $first\n ) {\n <div\n class=\"list-group-item borderless d-flex d-col\"\n [ngClass]=\"{ 'p-t-0': first }\"\n >\n @if (groupedFilterChips.label) {\n <p class=\"small p-b-4\">\n {{ groupedFilterChips.label | translate }}\n </p>\n }\n <div class=\"d-flex a-i-center gap-4 flex-wrap\">\n @for (chip of groupedFilterChips.chips; track $index) {\n <span class=\"tag tag--info chip\">\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 }\n </div>\n </div>\n }\n </ng-container>\n </li>\n }\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\n @if (displayOptions.filter) {\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 data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n }\n <ng-template #filtersHelpPopover>\n <div [innerHtml]=\"filtersHelpPopoverHtml | translate\"></div>\n </ng-template>\n\n @if (showCounterWarning) {\n <button\n class=\"btn-clean text-primary hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'The counter for the total number of items might be inaccurate.' | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n }\n }\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n @for (\n headerActionControl of headerActionControls | visibleControls | async;\n track $index\n ) {\n <ng-container>\n @if (!headerActionControl.template) {\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 } @else {\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n }\n </ng-container>\n }\n\n @if (configureColumnsEnabled) {\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\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 @for (column of columns; track $index) {\n <div\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n @if (!column.positionFixed) {\n <div class=\"list-group-item draggable-after p-l-16 p-r-16 a-i-center\">\n <label\n class=\"c8y-checkbox min-width-0\"\n title=\"{{ column.custom ? ('Custom' | translate) + ' ' : '' }}{{\n (column.header | translate) || column.name\n }}\"\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();\n 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 <div class=\"d-col min-width-0 m-l-8 m-r-8\">\n @if (column?.custom) {\n <span class=\"text-muted text-10 m-b-0\">\n {{ 'Custom' | translate }}\n </span>\n }\n <span class=\"text-truncate l-h-1 m-t-2\">\n {{ (column.header | translate) || column.name }}\n </span>\n </div>\n @let canRetrieve = canRetrieveAssetProperties | async;\n @if (canRetrieve) {\n @if (canRetrieve && column?.type) {\n <span\n class=\"tag tag--default a-s-end\"\n title=\"{{ column.type | translate | humanize }}\"\n >\n {{ column.type | translate | humanize }}\n </span>\n }\n }\n </label>\n @if (column.custom) {\n <button\n class=\"btn btn-dot btn-dot--danger 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 >\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 }\n </div>\n }\n </div>\n }\n </div>\n </li>\n @if (isConfigContextKnown) {\n <li class=\"p-8 sticky-bottom separator-top\">\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 }\n </ul>\n </div>\n }\n\n @if (!hideReload) {\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\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\n @if (!serverSideDataCallback || showSearch) {\n <div class=\"input-group input-group-search m-l-sm-16 data-grid__search-input\">\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 @if (searchText.length === 0) {\n <i c8yIcon=\"search\"></i>\n }\n @if (searchText.length > 0) {\n <i\n class=\"pointer\"\n c8yIcon=\"times\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n }\n </div>\n </div>\n }\n </div>\n </div>\n @if (selectedItemIds.length !== 0) {\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n data-cy=\"table-data-grid-header-bulk-actions\"\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 @if (!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize) {\n <small>\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 }\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n @for (\n bulkActionControl of bulkActionControls | visibleControls: selectedItemIds | async;\n track $index\n ) {\n <ng-container>\n @switch (bulkActionControl.type) {\n @case (builtInActionType.Export) {\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\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 @case (builtInActionType.Delete) {\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\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 @default {\n <button\n class=\"btnbar-btn\"\n title=\"{{ bulkActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\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 }\n }\n </ng-container>\n }\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 }\n </div>\n }\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 data-cy=\"c8y-data-grid--table\"\n >\n @for (column of columns; track column.name; let i = $index) {\n <ng-container [cdkColumnDef]=\"column.name\">\n @switch (column.name) {\n @case ('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 }\n\n @case ('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 }\n\n @case ('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 @for (\n actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : 0\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2);\n track $index\n ) {\n <ng-container>\n @switch (actionControl.type) {\n @case (builtInActionType.Edit) {\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"'Edit' | translate\"\n tooltip=\"{{ 'Edit' | translate }}\"\n container=\"body\"\n type=\"button\"\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 @case (builtInActionType.Delete) {\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 [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 @default {\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"\n (actionControl.icon ? actionControl.text : '') | translate\n \"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ showOnHover: actionControl.showOnHover }\"\n [delay]=\"500\"\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 @if (actionControl.icon) {\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n ></i>\n } @else {\n <span>{{ actionControl.text | translate }}</span>\n }\n </button>\n }\n }\n </ng-container>\n }\n\n <div\n [ngClass]=\"{\n 'm-l-auto overflow-visible':\n (actionControls | visibleControls: row | async)?.length > 2\n }\"\n >\n @if ((actionControls | visibleControls: row | async)?.length > 2) {\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\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 @for (\n actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2);\n track $index\n ) {\n <li>\n @switch (actionControl.type) {\n @case (builtInActionType.Edit) {\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\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 }\n @case (builtInActionType.Delete) {\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\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 }\n @case (builtInActionType.Export) {\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\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 }\n @default {\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\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 }\n }\n </li>\n }\n </ul>\n </div>\n }\n </div>\n </td>\n }\n @default {\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 @if (!column.filterable) {\n <div [title]=\"(column.header | translate) || column.name\">\n @let cellRendererSpec =\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this;\n\n @if (cellRendererSpec) {\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n }\n </div>\n }\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n @if (column.filterable) {\n <div\n class=\"dropdown\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\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 @let cellRendererSpec =\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this;\n\n @if (cellRendererSpec) {\n <c8y-cell-renderer\n data-cy=\"c8y-data-grid--c8y-cell-renderer\"\n [spec]=\"cellRendererSpec\"\n ></c8y-cell-renderer>\n }\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 @let filteringFormRendererSpec =\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec : this;\n\n @if (filteringFormRendererSpec) {\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 }\n </li>\n </ul>\n </div>\n }\n\n @if (column.sortable) {\n <button\n class=\"btn-sort\"\n [style]=\"{\n 'margin-left': !column.filterable && column.sortable ? '-20px' : null\n }\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n @switch (column.sortOrder) {\n @case ('asc') {\n <i c8yIcon=\"long-arrow-up\"></i>\n }\n @case ('desc') {\n <i c8yIcon=\"long-arrow-down\"></i>\n }\n @default {\n <i c8yIcon=\"exchange\"></i>\n }\n }\n </button>\n }\n\n @if (column.resizable) {\n <span\n class=\"resize-handle\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n }\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 @let cellRendererSpec =\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec : this;\n\n @if (cellRendererSpec) {\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n }\n </td>\n }\n }\n </ng-container>\n }\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 level-' + row.level : ''\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 level-' + (row.parentRow.level + 1)\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['pagination-row']; when: isPaginationRow\"\n ></tr>\n\n <ng-container cdkColumnDef=\"pagination-row\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <div class=\"col-sm-4 no-gutter\">\n @if ((dataSource.stats$ | async).currentPageSize > 0) {\n <div\n class=\"counter p-t-8 p-b-8\"\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 }\n </div>\n <div class=\"col-sm-4 col-sm-offset-4 no-gutter text-right\">\n @if (row.childrenStats.filteredSize > row.childrenStats.currentPageSize) {\n <pagination\n class=\"d-flex j-c-end\"\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' | translate\"\n [nextText]=\"'Next' | translate\"\n ></pagination>\n }\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 @if (\n !(dataSource.loading$ | async) &&\n !loading &&\n ((dataSource.stats$ | async).filteredSize === 0 || (dataSource.data$ | async).length === 0)\n ) {\n <div class=\"d-flex m-0 p-t-40 p-b-40\">\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\n @if (pagination && !infiniteScroll) {\n <div class=\"table-data-grid-footer separator large-padding\">\n <div class=\"col-sm-4 no-gutter\">\n @if ((dataSource.stats$ | async).currentPageSize > 0) {\n <div\n class=\"counter p-t-8 p-b-8\"\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 }\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n @if ((dataSource.stats$ | async).filteredSize > minPossiblePageSize) {\n <div class=\"form-group form-inline p-t-8 p-b-8\">\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 @for (pageSize of possiblePageSizes; track $index) {\n <option [ngValue]=\"pageSize\">\n {{ pageSize }}\n </option>\n }\n </select>\n </div>\n </div>\n }\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n @if ((dataSource.stats$ | async).filteredSize > 0) {\n <pagination\n [class.hidden]=\"hidePagination$ | async\"\n class=\"d-flex j-c-end\"\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' | translate\"\n [nextText]=\"'Next' | translate\"\n ></pagination>\n }\n </div>\n </div>\n }\n</div>\n", dependencies: [{ kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: LoadingComponent, selector: "c8y-loading", inputs: ["layout", "progress", "message"] }, { kind: "directive", type: C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "ngmodule", type: BsDropdownModule }, { 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: CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "ngmodule", type: PopoverModule }, { kind: "directive", type: i1$9.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: ProductExperienceDirective, selector: "[c8yProductExperience]", inputs: ["actionName", "actionData", "inherit", "suppressDataOverriding"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: 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: "ngmodule", type: FormsModule$1 }, { kind: "directive", type: i1$8.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$8.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$8.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: i1$8.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1$8.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i1$5.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: PopoverConfirmComponent, selector: "c8y-popover-confirm", inputs: ["buttons", "message", "title", "isOpen", "containerClass", "placement", "outsideClick", "adaptivePosition", "container"] }, { kind: "directive", type: NgPlural, selector: "[ngPlural]", inputs: ["ngPlural"] }, { kind: "directive", type: NgPluralCase, selector: "[ngPluralCase]" }, { kind: "component", type: CdkTable, selector: "cdk-table, table[cdk-table]", inputs: ["trackBy", "dataSource", "multiTemplateDataRows", "fixedLayout"], outputs: ["contentChanged"], exportAs: ["cdkTable"] }, { kind: "directive", type: CdkColumnDef, selector: "[cdkColumnDef]", inputs: ["cdkColumnDef", "sticky", "stickyEnd"] }, { kind: "directive", type: CdkHeaderCellDef, selector: "[cdkHeaderCellDef]" }, { kind: "directive", type: CdkHeaderCell, selector: "cdk-header-cell, th[cdk-header-cell]" }, { kind: "directive", type: CdkCellDef, selector: "[cdkCellDef]" }, { kind: "directive", type: CdkCell, selector: "cdk-cell, td[cdk-cell]" }, { kind: "component", type: CellRendererComponent, selector: "c8y-cell-renderer", inputs: ["spec"] }, { kind: "component", type: FilteringFormRendererComponent, selector: "c8y-filtering-form-renderer", inputs: ["spec"] }, { kind: "directive", type: CdkFooterCellDef, selector: "[cdkFooterCellDef]" }, { kind: "directive", type: CdkFooterCell, selector: "cdk-footer-cell, td[cdk-footer-cell]" }, { kind: "directive", type: CdkHeaderRowDef, selector: "[cdkHeaderRowDef]", inputs: ["cdkHeaderRowDef", "cdkHeaderRowDefSticky"] }, { kind: "component", type: CdkHeaderRow, selector: "cdk-header-row, tr[cdk-header-row]" }, { kind: "directive", type: CdkRowDef, selector: "[cdkRowDef]", inputs: ["cdkRowDefColumns", "cdkRowDefWhen"] }, { kind: "component", type: CdkRow, selector: "cdk-row, tr[cdk-row]" }, { kind: "directive", type: CdkFooterRowDef, selector: "[cdkFooterRowDef]", inputs: ["cdkFooterRowDef", "cdkFooterRowDefSticky"] }, { kind: "component", type: CdkFooterRow, selector: "cdk-footer-row, tr[cdk-footer-row]" }, { kind: "ngmodule", type: PaginationModule }, { kind: "component", type: i11.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: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: 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" }, { kind: "pipe", type: HumanizePipe, name: "humanize" }] }); }
34457
34717
  }
34458
34718
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImport: i0, type: DataGridComponent, decorators: [{
34459
34719
  type: Component,
@@ -34504,7 +34764,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
34504
34764
  GroupedFilterChips,
34505
34765
  VisibleControlsPipe,
34506
34766
  HumanizePipe
34507
- ], template: "@let loadingData = ((dataSource.loading$ | async) && !loadMoreComponent?.isLoading) || loading;\n\n<div\n class=\"table-data-grid-scroll\"\n #scroll\n [ngClass]=\"{\n 'table-data-grid__overlay': loadingData\n }\"\n data-cy=\"c8y-data-grid--table-data-grid-scroll\"\n>\n @if (loadingData) {\n <div class=\"table-data-grid__loading--wrapper\">\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\n @if (displayOptions.gridHeader) {\n <div class=\"table-data-grid-header separator large-padding\">\n <div\n class=\"h4\"\n [ngClass]=\"{ 'm-r-16': !!title }\"\n >\n {{ title | translate }}\n </div>\n\n @if (displayOptions.filter) {\n @if (!filteringApplied) {\n <span>\n @if (!!filteringLabelsParams.allItemsCount) {\n <small\n class=\"m-r-4\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n }\n <span\n class=\"label label-default m-r-4\"\n translate\n >\n No filters\n </span>\n </span>\n }\n @if (filteringApplied) {\n <span class=\"d-flex a-i-center\">\n @if (!!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 }\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 @for (column of columnsWithFiltersApplied; track $index; let last = $last) {\n <li [ngClass]=\"{ 'separator-bottom': !last }\">\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 @for (\n groupedFilterChips of column\n | mapToFilterChips\n | async\n | groupedFilterChips;\n track $index;\n let first = $first\n ) {\n <div\n class=\"list-group-item borderless d-flex d-col\"\n [ngClass]=\"{ 'p-t-0': first }\"\n >\n @if (groupedFilterChips.label) {\n <p class=\"small p-b-4\">\n {{ groupedFilterChips.label | translate }}\n </p>\n }\n <div class=\"d-flex a-i-center gap-4 flex-wrap\">\n @for (chip of groupedFilterChips.chips; track $index) {\n <span class=\"tag tag--info chip\">\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 }\n </div>\n </div>\n }\n </ng-container>\n </li>\n }\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\n @if (displayOptions.filter) {\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 data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n }\n <ng-template #filtersHelpPopover>\n <div [innerHtml]=\"filtersHelpPopoverHtml | translate\"></div>\n </ng-template>\n\n @if (showCounterWarning) {\n <button\n class=\"btn-clean text-primary hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'The counter for the total number of items might be inaccurate.' | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n }\n }\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n @for (\n headerActionControl of headerActionControls | visibleControls | async;\n track $index\n ) {\n <ng-container>\n @if (!headerActionControl.template) {\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 } @else {\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n }\n </ng-container>\n }\n\n @if (configureColumnsEnabled) {\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\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 @for (column of columns; track $index) {\n <div\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n @if (!column.positionFixed) {\n <div class=\"list-group-item draggable-after p-l-16 p-r-16 a-i-center\">\n <label\n class=\"c8y-checkbox min-width-0\"\n title=\"{{ column.custom ? ('Custom' | translate) + ' ' : '' }}{{\n (column.header | translate) || column.name\n }}\"\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();\n 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 <div class=\"d-col min-width-0 m-l-8 m-r-8\">\n @if (column?.custom) {\n <span class=\"text-muted text-10 m-b-0 l-h-1\">\n {{ 'Custom' | translate }}\n </span>\n }\n <span class=\"text-truncate l-h-1\">\n {{ (column.header | translate) || column.name }}\n </span>\n </div>\n @let canRetrieve = canRetrieveAssetProperties | async;\n @if (canRetrieve) {\n @if (canRetrieve && column?.type) {\n <span\n class=\"tag tag--default a-s-end\"\n title=\"{{ column.type | translate | humanize }}\"\n >\n {{ column.type | translate | humanize }}\n </span>\n }\n }\n </label>\n @if (column.custom) {\n <button\n class=\"btn btn-dot btn-dot--danger 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 >\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 }\n </div>\n }\n </div>\n }\n </div>\n </li>\n @if (isConfigContextKnown) {\n <li class=\"p-8 sticky-bottom separator-top\">\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 }\n </ul>\n </div>\n }\n\n @if (!hideReload) {\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\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\n @if (!serverSideDataCallback || showSearch) {\n <div class=\"input-group input-group-search m-l-sm-16 data-grid__search-input\">\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 @if (searchText.length === 0) {\n <i c8yIcon=\"search\"></i>\n }\n @if (searchText.length > 0) {\n <i\n class=\"pointer\"\n c8yIcon=\"times\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n }\n </div>\n </div>\n }\n </div>\n </div>\n @if (selectedItemIds.length !== 0) {\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n data-cy=\"table-data-grid-header-bulk-actions\"\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 @if (!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize) {\n <small>\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 }\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n @for (\n bulkActionControl of bulkActionControls | visibleControls: selectedItemIds | async;\n track $index\n ) {\n <ng-container>\n @switch (bulkActionControl.type) {\n @case (builtInActionType.Export) {\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\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 @case (builtInActionType.Delete) {\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\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 @default {\n <button\n class=\"btnbar-btn\"\n title=\"{{ bulkActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\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 }\n }\n </ng-container>\n }\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 }\n </div>\n }\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 data-cy=\"c8y-data-grid--table\"\n >\n @for (column of columns; track column.name; let i = $index) {\n <ng-container [cdkColumnDef]=\"column.name\">\n @switch (column.name) {\n @case ('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 }\n\n @case ('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 }\n\n @case ('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 @for (\n actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : 0\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2);\n track $index\n ) {\n <ng-container>\n @switch (actionControl.type) {\n @case (builtInActionType.Edit) {\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"'Edit' | translate\"\n tooltip=\"{{ 'Edit' | translate }}\"\n container=\"body\"\n type=\"button\"\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 @case (builtInActionType.Delete) {\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 [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 @default {\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"\n (actionControl.icon ? actionControl.text : '') | translate\n \"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ showOnHover: actionControl.showOnHover }\"\n [delay]=\"500\"\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 @if (actionControl.icon) {\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n ></i>\n } @else {\n <span>{{ actionControl.text | translate }}</span>\n }\n </button>\n }\n }\n </ng-container>\n }\n\n <div\n [ngClass]=\"{\n 'm-l-auto overflow-visible':\n (actionControls | visibleControls: row | async)?.length > 2\n }\"\n >\n @if ((actionControls | visibleControls: row | async)?.length > 2) {\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\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 @for (\n actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2);\n track $index\n ) {\n <li>\n @switch (actionControl.type) {\n @case (builtInActionType.Edit) {\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\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 }\n @case (builtInActionType.Delete) {\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\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 }\n @case (builtInActionType.Export) {\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\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 }\n @default {\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\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 }\n }\n </li>\n }\n </ul>\n </div>\n }\n </div>\n </td>\n }\n @default {\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 @if (!column.filterable) {\n <div [title]=\"(column.header | translate) || column.name\">\n @let cellRendererSpec =\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this;\n\n @if (cellRendererSpec) {\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n }\n </div>\n }\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n @if (column.filterable) {\n <div\n class=\"dropdown\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\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 @let cellRendererSpec =\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this;\n\n @if (cellRendererSpec) {\n <c8y-cell-renderer\n data-cy=\"c8y-data-grid--c8y-cell-renderer\"\n [spec]=\"cellRendererSpec\"\n ></c8y-cell-renderer>\n }\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 @let filteringFormRendererSpec =\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec : this;\n\n @if (filteringFormRendererSpec) {\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 }\n </li>\n </ul>\n </div>\n }\n\n @if (column.sortable) {\n <button\n class=\"btn-sort\"\n [style]=\"{\n 'margin-left': !column.filterable && column.sortable ? '-20px' : null\n }\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n @switch (column.sortOrder) {\n @case ('asc') {\n <i c8yIcon=\"long-arrow-up\"></i>\n }\n @case ('desc') {\n <i c8yIcon=\"long-arrow-down\"></i>\n }\n @default {\n <i c8yIcon=\"exchange\"></i>\n }\n }\n </button>\n }\n\n @if (column.resizable) {\n <span\n class=\"resize-handle\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n }\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 @let cellRendererSpec =\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec : this;\n\n @if (cellRendererSpec) {\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n }\n </td>\n }\n }\n </ng-container>\n }\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 level-' + row.level : ''\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 level-' + (row.parentRow.level + 1)\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['pagination-row']; when: isPaginationRow\"\n ></tr>\n\n <ng-container cdkColumnDef=\"pagination-row\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <div class=\"col-sm-4 no-gutter\">\n @if ((dataSource.stats$ | async).currentPageSize > 0) {\n <div\n class=\"counter p-t-8 p-b-8\"\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 }\n </div>\n <div class=\"col-sm-4 col-sm-offset-4 no-gutter text-right\">\n @if (row.childrenStats.filteredSize > row.childrenStats.currentPageSize) {\n <pagination\n class=\"d-flex j-c-end\"\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' | translate\"\n [nextText]=\"'Next' | translate\"\n ></pagination>\n }\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 @if (\n !(dataSource.loading$ | async) &&\n !loading &&\n ((dataSource.stats$ | async).filteredSize === 0 || (dataSource.data$ | async).length === 0)\n ) {\n <div class=\"d-flex m-0 p-t-40 p-b-40\">\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\n @if (pagination && !infiniteScroll) {\n <div class=\"table-data-grid-footer separator large-padding\">\n <div class=\"col-sm-4 no-gutter\">\n @if ((dataSource.stats$ | async).currentPageSize > 0) {\n <div\n class=\"counter p-t-8 p-b-8\"\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 }\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n @if ((dataSource.stats$ | async).filteredSize > minPossiblePageSize) {\n <div class=\"form-group form-inline p-t-8 p-b-8\">\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 @for (pageSize of possiblePageSizes; track $index) {\n <option [ngValue]=\"pageSize\">\n {{ pageSize }}\n </option>\n }\n </select>\n </div>\n </div>\n }\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n @if ((dataSource.stats$ | async).filteredSize > 0) {\n <pagination\n [class.hidden]=\"hidePagination$ | async\"\n class=\"d-flex j-c-end\"\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' | translate\"\n [nextText]=\"'Next' | translate\"\n ></pagination>\n }\n </div>\n </div>\n }\n</div>\n" }]
34767
+ ], template: "@let loadingData = ((dataSource.loading$ | async) && !loadMoreComponent?.isLoading) || loading;\n\n<div\n class=\"table-data-grid-scroll\"\n #scroll\n [ngClass]=\"{\n 'table-data-grid__overlay': loadingData\n }\"\n data-cy=\"c8y-data-grid--table-data-grid-scroll\"\n>\n @if (loadingData && displayOptions.showLoadingIndicator) {\n <div class=\"table-data-grid__loading--wrapper\">\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\n @if (displayOptions.gridHeader) {\n <div class=\"table-data-grid-header separator large-padding\">\n <div\n class=\"h4\"\n [ngClass]=\"{ 'm-r-16': !!title }\"\n >\n {{ title | translate }}\n </div>\n\n @if (displayOptions.filter) {\n @if (!filteringApplied) {\n <span>\n @if (!!filteringLabelsParams.allItemsCount) {\n <small\n class=\"m-r-4\"\n ngNonBindable\n translate\n [translateParams]=\"filteringLabelsParams\"\n >\n {{ filteredItemsCount }} of {{ allItemsCount }} items\n </small>\n }\n <span\n class=\"label label-default m-r-4\"\n translate\n >\n No filters\n </span>\n </span>\n }\n @if (filteringApplied) {\n <span class=\"d-flex a-i-center\">\n @if (!!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 }\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 @for (column of columnsWithFiltersApplied; track $index; let last = $last) {\n <li [ngClass]=\"{ 'separator-bottom': !last }\">\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 @for (\n groupedFilterChips of column\n | mapToFilterChips\n | async\n | groupedFilterChips;\n track $index;\n let first = $first\n ) {\n <div\n class=\"list-group-item borderless d-flex d-col\"\n [ngClass]=\"{ 'p-t-0': first }\"\n >\n @if (groupedFilterChips.label) {\n <p class=\"small p-b-4\">\n {{ groupedFilterChips.label | translate }}\n </p>\n }\n <div class=\"d-flex a-i-center gap-4 flex-wrap\">\n @for (chip of groupedFilterChips.chips; track $index) {\n <span class=\"tag tag--info chip\">\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 }\n </div>\n </div>\n }\n </ng-container>\n </li>\n }\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\n @if (displayOptions.filter) {\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 data-cy=\"data-grid--help-filters\"\n >\n <i c8yIcon=\"question-circle-o\"></i>\n </button>\n }\n <ng-template #filtersHelpPopover>\n <div [innerHtml]=\"filtersHelpPopoverHtml | translate\"></div>\n </ng-template>\n\n @if (showCounterWarning) {\n <button\n class=\"btn-clean text-primary hidden-xs hidden-sm\"\n [attr.aria-label]=\"'Help' | translate\"\n popover=\"{{\n 'The counter for the total number of items might be inaccurate.' | translate\n }}\"\n placement=\"right\"\n triggers=\"focus\"\n type=\"button\"\n >\n <i c8yIcon=\"warning\"></i>\n </button>\n }\n }\n\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex a-i-center\">\n @for (\n headerActionControl of headerActionControls | visibleControls | async;\n track $index\n ) {\n <ng-container>\n @if (!headerActionControl.template) {\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 } @else {\n <ng-container\n *ngTemplateOutlet=\"\n headerActionControl.template;\n context: { headerActionControl: headerActionControl }\n \"\n ></ng-container>\n }\n </ng-container>\n }\n\n @if (configureColumnsEnabled) {\n <div\n class=\"dropdown\"\n placement=\"bottom left\"\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 @for (column of columns; track $index) {\n <div\n cdkDrag\n cdkDragLockAxis=\"y\"\n >\n @if (!column.positionFixed) {\n <div class=\"list-group-item draggable-after p-l-16 p-r-16 a-i-center\">\n <label\n class=\"c8y-checkbox min-width-0\"\n title=\"{{ column.custom ? ('Custom' | translate) + ' ' : '' }}{{\n (column.header | translate) || column.name\n }}\"\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();\n 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 <div class=\"d-col min-width-0 m-l-8 m-r-8\">\n @if (column?.custom) {\n <span class=\"text-muted text-10 m-b-0\">\n {{ 'Custom' | translate }}\n </span>\n }\n <span class=\"text-truncate l-h-1 m-t-2\">\n {{ (column.header | translate) || column.name }}\n </span>\n </div>\n @let canRetrieve = canRetrieveAssetProperties | async;\n @if (canRetrieve) {\n @if (canRetrieve && column?.type) {\n <span\n class=\"tag tag--default a-s-end\"\n title=\"{{ column.type | translate | humanize }}\"\n >\n {{ column.type | translate | humanize }}\n </span>\n }\n }\n </label>\n @if (column.custom) {\n <button\n class=\"btn btn-dot btn-dot--danger 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 >\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 }\n </div>\n }\n </div>\n }\n </div>\n </li>\n @if (isConfigContextKnown) {\n <li class=\"p-8 sticky-bottom separator-top\">\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 }\n </ul>\n </div>\n }\n\n @if (!hideReload) {\n <button\n class=\"btnbar-btn btn-link\"\n title=\"{{ 'Reload' | translate }}\"\n type=\"button\"\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\n @if (!serverSideDataCallback || showSearch) {\n <div class=\"input-group input-group-search m-l-sm-16 data-grid__search-input\">\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 @if (searchText.length === 0) {\n <i c8yIcon=\"search\"></i>\n }\n @if (searchText.length > 0) {\n <i\n class=\"pointer\"\n c8yIcon=\"times\"\n (click)=\"searchText = ''; searchText$.emit('')\"\n c8yProductExperience\n inherit\n [actionData]=\"{ action: PX_ACTIONS.CLEAR_SEARCH }\"\n ></i>\n }\n </div>\n </div>\n }\n </div>\n </div>\n @if (selectedItemIds.length !== 0) {\n <div\n class=\"table-data-grid-header-bulk-actions animated slideInDown fast\"\n data-cy=\"table-data-grid-header-bulk-actions\"\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 @if (!serverSideDataCallback && selectedItemIds.length >= pagination.pageSize) {\n <small>\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 }\n </h4>\n <div class=\"m-l-auto\">\n <div class=\"btnbar d-flex\">\n @for (\n bulkActionControl of bulkActionControls | visibleControls: selectedItemIds | async;\n track $index\n ) {\n <ng-container>\n @switch (bulkActionControl.type) {\n @case (builtInActionType.Export) {\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\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 @case (builtInActionType.Delete) {\n <button\n class=\"btnbar-btn\"\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\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 @default {\n <button\n class=\"btnbar-btn\"\n title=\"{{ bulkActionControl.text | translate }}\"\n type=\"button\"\n (click)=\"bulkActionControl.callback(selectedItemIds, reload.bind(this))\"\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 }\n }\n </ng-container>\n }\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 }\n </div>\n }\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 data-cy=\"c8y-data-grid--table\"\n >\n @for (column of columns; track column.name; let i = $index) {\n <ng-container [cdkColumnDef]=\"column.name\">\n @switch (column.name) {\n @case ('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 }\n\n @case ('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 }\n\n @case ('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 @for (\n actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : 0\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2);\n track $index\n ) {\n <ng-container>\n @switch (actionControl.type) {\n @case (builtInActionType.Edit) {\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"'Edit' | translate\"\n tooltip=\"{{ 'Edit' | translate }}\"\n container=\"body\"\n type=\"button\"\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 @case (builtInActionType.Delete) {\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 [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 @default {\n <button\n class=\"btn btn-dot\"\n [attr.aria-label]=\"\n (actionControl.icon ? actionControl.text : '') | translate\n \"\n tooltip=\"{{ (actionControl.icon ? actionControl.text : '') | translate }}\"\n container=\"body\"\n type=\"button\"\n [ngClass]=\"{ showOnHover: actionControl.showOnHover }\"\n [delay]=\"500\"\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 @if (actionControl.icon) {\n <i\n c8yIcon=\"{{ actionControl.icon }}\"\n [ngClass]=\"actionControl.iconClasses\"\n ></i>\n } @else {\n <span>{{ actionControl.text | translate }}</span>\n }\n </button>\n }\n }\n </ng-container>\n }\n\n <div\n [ngClass]=\"{\n 'm-l-auto overflow-visible':\n (actionControls | visibleControls: row | async)?.length > 2\n }\"\n >\n @if ((actionControls | visibleControls: row | async)?.length > 2) {\n <div\n class=\"dropdown\"\n placement=\"bottom right\"\n container=\"body\"\n dropdown\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 @for (\n actionControl of actionControls\n | visibleControls: row\n | async\n | slice\n : ((actionControls | visibleControls: row | async)?.length > 2 ? 1 : 2);\n track $index\n ) {\n <li>\n @switch (actionControl.type) {\n @case (builtInActionType.Edit) {\n <button\n title=\"{{ 'Edit' | translate }}\"\n type=\"button\"\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 }\n @case (builtInActionType.Delete) {\n <button\n title=\"{{ 'Delete' | translate }}\"\n type=\"button\"\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 }\n @case (builtInActionType.Export) {\n <button\n title=\"{{ 'Export' | translate }}\"\n type=\"button\"\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 }\n @default {\n <button\n title=\"{{ actionControl.text | translate }}\"\n type=\"button\"\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 }\n }\n </li>\n }\n </ul>\n </div>\n }\n </div>\n </td>\n }\n @default {\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 @if (!column.filterable) {\n <div [title]=\"(column.header | translate) || column.name\">\n @let cellRendererSpec =\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this;\n\n @if (cellRendererSpec) {\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n }\n </div>\n }\n\n <!-- isDropDownPlacedRight to be removed when columns are transformed to observables. -->\n @if (column.filterable) {\n <div\n class=\"dropdown\"\n placement=\"bottom {{ isDropDownPlacedRight(column) ? 'right' : 'left' }}\"\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 @let cellRendererSpec =\n [\n {\n columnName: column.name,\n value: (column.header | translate) || column.name\n }\n ] | map: getHeaderCellRendererSpec : this;\n\n @if (cellRendererSpec) {\n <c8y-cell-renderer\n data-cy=\"c8y-data-grid--c8y-cell-renderer\"\n [spec]=\"cellRendererSpec\"\n ></c8y-cell-renderer>\n }\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 @let filteringFormRendererSpec =\n [\n {\n column: column,\n dropdown: gridHeaderDropdown\n }\n ] | map: getFilteringFormRendererSpec : this;\n\n @if (filteringFormRendererSpec) {\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 }\n </li>\n </ul>\n </div>\n }\n\n @if (column.sortable) {\n <button\n class=\"btn-sort\"\n [style]=\"{\n 'margin-left': !column.filterable && column.sortable ? '-20px' : null\n }\"\n [title]=\"sortColumnTitle | translate: { name: column.header | translate }\"\n type=\"button\"\n (click)=\"changeSortOrder(column.name)\"\n data-cy=\"change-sort-order\"\n >\n @switch (column.sortOrder) {\n @case ('asc') {\n <i c8yIcon=\"long-arrow-up\"></i>\n }\n @case ('desc') {\n <i c8yIcon=\"long-arrow-down\"></i>\n }\n @default {\n <i c8yIcon=\"exchange\"></i>\n }\n }\n </button>\n }\n\n @if (column.resizable) {\n <span\n class=\"resize-handle\"\n (mousedown)=\"\n resizeHandleMouseDown$.emit({ event: $event, targetColumnName: column.name })\n \"\n ></span>\n }\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 @let cellRendererSpec =\n [\n {\n value: resolveCellValue(row, column.path),\n row: row,\n columnName: column.name\n }\n ] | map: getCellRendererSpec : this;\n\n @if (cellRendererSpec) {\n <c8y-cell-renderer [spec]=\"cellRendererSpec\"></c8y-cell-renderer>\n }\n </td>\n }\n }\n </ng-container>\n }\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 level-' + row.level : ''\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 level-' + (row.parentRow.level + 1)\"\n cdk-row\n *cdkRowDef=\"let row; columns: ['pagination-row']; when: isPaginationRow\"\n ></tr>\n\n <ng-container cdkColumnDef=\"pagination-row\">\n <td\n [style.grid-column]=\"styles.gridInfiniteScrollColumn\"\n cdk-cell\n *cdkCellDef=\"let row\"\n >\n <div class=\"col-sm-4 no-gutter\">\n @if ((dataSource.stats$ | async).currentPageSize > 0) {\n <div\n class=\"counter p-t-8 p-b-8\"\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 }\n </div>\n <div class=\"col-sm-4 col-sm-offset-4 no-gutter text-right\">\n @if (row.childrenStats.filteredSize > row.childrenStats.currentPageSize) {\n <pagination\n class=\"d-flex j-c-end\"\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' | translate\"\n [nextText]=\"'Next' | translate\"\n ></pagination>\n }\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 @if (\n !(dataSource.loading$ | async) &&\n !loading &&\n ((dataSource.stats$ | async).filteredSize === 0 || (dataSource.data$ | async).length === 0)\n ) {\n <div class=\"d-flex m-0 p-t-40 p-b-40\">\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\n @if (pagination && !infiniteScroll) {\n <div class=\"table-data-grid-footer separator large-padding\">\n <div class=\"col-sm-4 no-gutter\">\n @if ((dataSource.stats$ | async).currentPageSize > 0) {\n <div\n class=\"counter p-t-8 p-b-8\"\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 }\n </div>\n\n <div class=\"col-sm-4 no-gutter text-center\">\n @if ((dataSource.stats$ | async).filteredSize > minPossiblePageSize) {\n <div class=\"form-group form-inline p-t-8 p-b-8\">\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 @for (pageSize of possiblePageSizes; track $index) {\n <option [ngValue]=\"pageSize\">\n {{ pageSize }}\n </option>\n }\n </select>\n </div>\n </div>\n }\n </div>\n\n <div class=\"col-sm-4 no-gutter text-right\">\n @if ((dataSource.stats$ | async).filteredSize > 0) {\n <pagination\n [class.hidden]=\"hidePagination$ | async\"\n class=\"d-flex j-c-end\"\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' | translate\"\n [nextText]=\"'Next' | translate\"\n ></pagination>\n }\n </div>\n </div>\n }\n</div>\n" }]
34508
34768
  }], ctorParameters: () => [{ type: undefined, decorators: [{
34509
34769
  type: Optional
34510
34770
  }, {
@@ -37892,7 +38152,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
37892
38152
  }], ctorParameters: () => [{ type: RealtimeSubjectService }] });
37893
38153
 
37894
38154
  /**
37895
- * A service for handling bulk operation realtime notifications in RxJS fashion.
38155
+ * A service for handling operation realtime notifications in RxJS fashion.
37896
38156
  */
37897
38157
  class OperationRealtimeService extends RealtimeService {
37898
38158
  constructor(realtimeSubject) {
@@ -39387,5 +39647,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.16", ngImpo
39387
39647
  * Generated bundle index. Do not edit.
39388
39648
  */
39389
39649
 
39390
- export { ACTIONS_STEPPER, AGGREGATIONS, AGGREGATION_ICONS, AGGREGATION_LABELS, AGGREGATION_LIMITS, AGGREGATION_TEXTS, AGGREGATION_VALUES, AGGREGATION_VALUES_ARR, ARRAY_VALIDATION_PREFIX, ASSET_PATH, AbstractConfigurationStrategy, ActionBarComponent, ActionBarItemComponent, ActionBarModule, ActionBarService, ActionComponent, ActionControlsExtensionService, ActionModule, ActionOutletComponent, ActionService, AggregationPickerComponent, AggregationService, AlarmRealtimeService, AlarmWithChildrenRealtimeService, AlertComponent, AlertDetailsComponent, AlertModule, AlertOutletBase, AlertOutletComponent, AlertService, AlertTextComponent, AppHrefPipe, AppIconComponent, AppStateService, AppSwitcherComponent, AppSwitcherInlineComponent, AppSwitcherService, ApplicationModule, ApplicationPluginStatus, AssetHierarchyService, AssetLinkPipe, AssetPropertyService, AssetTypesRealtimeService, AssetTypesService, AuditLogComponent, AuditLogModule, AuthenticationModule, BackendVersionFactory, BaseColumn, BaseFilteringFormRendererComponent, BooleanFilterMapper, BootstrapComponent, BootstrapModule, BottomDrawerComponent, BottomDrawerRef, BottomDrawerService, BreadcrumbComponent, BreadcrumbItemComponent, BreadcrumbModule, BreadcrumbOutletComponent, BreadcrumbService, BuiltInActionType, BytesPipe, C8Y_PLUGIN_CONTEXT_PATH, C8Y_PLUGIN_NAME, C8yComponentOutlet, C8yJSONSchema, C8yStepper, C8yStepperButtons, C8yStepperIcon, C8yStepperProgress, C8yTranslateDirective, C8yTranslateModule, C8yTranslatePipe, C8yTranslationCache, C8yTranslationLoader, C8yValidators, CUSTOM, CachedLocaleDictionaryService, CellRendererComponent, CellRendererContext, CellRendererDefDirective, ChangeCurrentUserPasswordService, ChangeIconComponent, ClipboardModule, ClipboardService, ColorInputComponent, ColorService, ColumnDirective, CommonModule, ConditionalTabsOutletComponent, ConfigureCustomColumnComponent, ConfirmModalComponent, ContextRouteComponent, ContextRouteGuard, ContextRouteService, CookieBannerComponent, CopyDashboardDisabledReason, CoreModule, CoreSearchModule, CountdownIntervalComponent, CountdownIntervalModule, CurrentPasswordModalComponent, CustomColumn, CustomTranslateService, CustomTranslateStore, DATA_GRID_CONFIGURATION_CONTEXT, DATA_GRID_CONFIGURATION_CONTEXT_PROVIDER, DATA_GRID_CONFIGURATION_STRATEGY, DEFAULT_INTERVAL_STATE, DEFAULT_INTERVAL_VALUE, DEFAULT_INTERVAL_VALUES, DRAWER_ANIMATION_TIME, DashboardChildActionComponent, DashboardChildChange, DashboardChildComponent, DashboardChildTitleComponent, DashboardComponent, DashboardModule, DataGridComponent, DataGridModule, DataGridService, DatapointLibraryValidationErrors, DatapointSyncService, DateContextQueryParamNames, DateFilterMapper, DateFormatService, DatePickerComponent, DatePickerModule, DatePipe, DateTimePickerComponent, DateTimePickerModule, DefaultValidationDirective, DeviceBootstrapRealtimeService, DeviceService, DeviceStatusComponent, DeviceStatusModule, DismissAlertStrategy, DocsModule, DocsService, DrawerModule, DrawerOutletComponent, DrawerService, DropAreaComponent, DropAreaModule, DropdownDirectionDirective, DynamicBulkDetailsResolver, DynamicBulkIIdentifiedResolver, DynamicComponentAlert, DynamicComponentAlertAggregator, DynamicComponentAlertsComponent, DynamicComponentComponent, DynamicComponentErrorStrategy, DynamicComponentModule, DynamicComponentService, DynamicDatapointsResolver, DynamicFormsModule, DynamicManagedObjectResolver, DynamicResolverService, ES_MAX_TIME_MILLISECONDS, EmailsValidatorDirective, EmptyComponent, EmptyStateComponent, EmptyStateContextDirective, EventRealtimeService, ExpandableRowDirective, ExtensionPointForPlugins, ExtensionPointWithoutStateForPlugins, ExtractArrayValidationErrorsPipe, FeatureCacheService, FeedbackFormComponent, FilePickerComponent, FilePickerFormControlComponent, FilePickerFormControlModule, FilePickerModule, FilesService, FilterByPipe, FilterInputComponent, FilterMapperFactory, FilterMapperModule, FilterMapperPipe, FilterMapperService, FilterNonArrayValidationErrorsPipe, FilteringActionType, FilteringFormRendererComponent, FilteringFormRendererContext, FilteringFormRendererDefDirective, ForOfDirective, FormGroupComponent, FormsModule, GENERIC_FILE_TYPE, GLOBAL_CONTEXT_AUTO_REFRESH, GainsightService, GenericFileIconPipe, GeoService, GetGroupIconPipe, GlobalConfigService, GridDataSource, GroupFragment, GroupService, GroupedFilterChips, GuideDocsComponent, GuideHrefDirective, HOOK_ACTION, HOOK_ACTION_BAR, HOOK_BREADCRUMB, HOOK_COMPONENTS, HOOK_CURRENT_APPLICATION, HOOK_CURRENT_TENANT, HOOK_CURRENT_USER, HOOK_DOCS, HOOK_DYNAMIC_PROVIDER_CONFIG, HOOK_NAVIGATOR_NODES, HOOK_OPTIONS, HOOK_PATTERN_MESSAGES, HOOK_PLUGIN, HOOK_PREVIEW, HOOK_QUERY_PARAM, HOOK_QUERY_PARAM_BOTTOM_DRAWER, HOOK_QUERY_PARAM_MODAL, HOOK_ROUTE, HOOK_SEARCH, HOOK_STEPPER, HOOK_TABS, HOOK_VERSION, HOOK_WIZARD, HeaderBarComponent, HeaderCellRendererDefDirective, HeaderModule, HeaderService, HelpComponent, HelpModule, HighlightComponent, HookProviderTypes, HumanizeAppNamePipe, HumanizePipe, HumanizeValidationMessagePipe, I18nModule, INTERVAL_OPTIONS, IconDirective, IconPanelComponent, IfAllowedDirective, InjectionType, InputGroupListComponent, InputGroupListContainerDirective, InterAppService, IntervalBasedReload, InventorySearchService, IpRangeInputListComponent, JsonValidationPrettifierDirective, LANGUAGES, LAST_DAY, LAST_HOUR, LAST_MINUTE, LAST_MONTH, LAST_WEEK, LOCALE_PATH, LegacyGridConfigMapperService, LegendFieldWrapper, ListDisplaySwitchComponent, ListDisplaySwitchModule, ListGroupComponent, ListGroupModule, ListItemActionComponent, ListItemBodyComponent, ListItemCheckboxComponent, ListItemCollapseComponent, ListItemComponent, ListItemDragHandleComponent, ListItemFooterComponent, ListItemIconComponent, ListItemRadioComponent, ListItemTimelineComponent, LoadMoreComponent, LoadingComponent, MAX_PAGE_SIZE, MESSAGES_CORE_I18N, MOChunkLoaderService, ManagedObjectRealtimeService, ManagedObjectType, MapFunctionPipe, MarkdownToHtmlPipe, MaxValidationDirective, MeasurementRealtimeService, MessageBannerService, MessageDirective, MessagesComponent, MinValidationDirective, MissingTranslationCustomHandler, MoNamePipe, ModalComponent, ModalModule, ModalSelectionMode, ModalService, NEEDED_ROLE_FOR_SETUP, NEW_DASHBOARD_ROUTER_STATE_PROP, NULL_VALUE_PLACEHOLDER, NUMBER_FORMAT_REGEXP, NameTransformPipe, NavigatorBottomModule, NavigatorIconComponent, NavigatorModule, NavigatorNode, NavigatorNodeComponent, NavigatorNodeRoot, NavigatorOutletComponent, NavigatorService, NavigatorTopModule, NewPasswordComponent, NumberPipe, OperationBulkRealtimeService, OperationRealtimeService, OperationResultComponent, OptionsService, OutletDirective, PREVIEW_FEATURE_PROVIDERS, PRODUCT_EXPERIENCE_EVENT_SOURCE, PX_ACTIONS, PX_EVENT_NAME, PackageType, PasswordCheckListComponent, PasswordConfirm, PasswordConfirmModalComponent, PasswordInputComponent, PasswordService, PasswordStrengthCheckerService, PasswordStrengthComponent, PasswordStrengthService, PatternMessagesService, Permissions, PhoneValidationDirective, PlatformDetailsService, PluginLoadedPipe, PluginsExportScopes, PluginsLoaderService, PluginsModule, PluginsResolveService, PluginsService, PopoverConfirmComponent, PreviewFeatureButtonComponent, PreviewFeatureShowNotification, PreviewService, ProductExperienceDirective, ProductExperienceModule, ProgressBarComponent, PropertiesListComponent, PropertiesListModule, PropertyValueTransformService, ProviderConfigurationComponent, ProviderConfigurationModule, ProviderConfigurationNodeFactory, ProviderConfigurationRouteFactory, ProviderConfigurationService, ProviderDefinitionsService, PushStatus, PushStatusLabels, QUERY_PARAM_HANDLER_PROVIDERS, QueryParamBottomDrawerFactory, QueryParamBottomDrawerStateService, QueryParamHandlerService, QueryParamModalFactory, QueryParamModalStateService, QuickLinkComponent, QuickLinkModule, RESOLVING_COMPONENT_WAIT_TIME, RadioFilterMapper, RangeComponent, RangeDirective, RangeDisplayComponent, RangeDisplayModule, RealtimeButtonComponent, RealtimeControlComponent, RealtimeMessage, RealtimeModule, RealtimeService, RealtimeSubjectService, RelativeTimePipe, RequiredInputPlaceholderDirective, ResizableGridComponent, ResolverServerError, RouterModule, RouterService, RouterTabsResolver, SETUP_FINISHED_STEP_ID, SHOW_PREVIEW_FEATURES, SearchComponent, SearchFilters, SearchInputComponent, SearchOutletComponent, SearchResultEmptyComponent, SearchService, SelectComponent, SelectFilterMapper, SelectItemDirective, SelectKeyboardService, SelectLegacyComponent, SelectModalComponent, SelectModalFilterPipe, SelectModalModule, SelectModule, SelectedItemsComponent, SelectedItemsDirective, SendStatus, SendStatusLabels, ServiceRegistry, SetupCompletedComponent, SetupComponent, SetupModule, SetupService, SetupState, SetupStepperFactory, ShortenUserNamePipe, ShouldShowMoPipe, ShowIfFilterPipe, SimpleJsonPathValidatorDirective, SimplifiedAuthService, SkipLinkDirective, SplitViewAlertsComponent, SplitViewComponent, SplitViewDetailsActionsComponent, SplitViewDetailsComponent, SplitViewExtraHeaderComponent, SplitViewFooterComponent, SplitViewHeaderActionsComponent, SplitViewListComponent, SplitViewListItemDirective, SplitViewSelectionService, StateService, Status, StepperModule, StepperOutletComponent, StepperService, Steppers, StringFilterMapper, StringifyObjectPipe, StripHtmlPipe, SupportedApps, TabComponent, TabsModule, TabsOutletComponent, TabsService, TabsetAriaDirective, TenantUiService, TextAreaRowHeightDirective, TextareaAutoresizeDirective, ThemeSwitcherService, TimeIntervalComponent, TimePickerComponent, TimePickerModule, TitleComponent, TitleOutletComponent, TotpChallengeComponent, TotpSetupComponent, TranslateService, TreeNodeCellRendererComponent, TreeNodeColumn, TreeNodeHeaderCellRendererComponent, TypeaheadComponent, TypeaheadFilterMapper, UiSettingsComponent, UiSettingsModule, UniqueInCollectionByPathValidationDirective, UserEditComponent, UserEditModalComponent, UserEngagementsService, UserMenuItemComponent, UserMenuOutletComponent, UserMenuService, UserModule, UserNameInitialsPipe, UserPreferencesConfigurationStrategy, UserPreferencesService, UserPreferencesStorageInventory, UserPreferencesStorageLocal, UserTotpRevokeComponent, UserTotpSetupComponent, VERSION_MODULE_CONFIG, ValidationPattern, VersionListComponent, VersionModule, VersionService, ViewContext, ViewContextServices, VirtualScrollWindowDirective, VirtualScrollWindowStrategy, VirtualScrollerWrapperComponent, VisibleControlsPipe, WIDGET_CONFIGURATION_GRID_SIZE, WIDGET_TYPE_VALUES, WILDCARD_SEARCH_FEATURE_KEY, WebSDKVersionFactory, WidgetActionWrapperComponent, WidgetGlobalAutoRefreshService, WidgetTimeContextActionBarPriority, WidgetTimeContextComponent, WidgetTimeContextDateRangeService, WidgetTimeContextMediatorService, WidgetsDashboardComponent, WidgetsDashboardEventService, WizardBodyComponent, WizardComponent, WizardFooterComponent, WizardHeaderComponent, WizardModalService, WizardModule, WizardOutletComponent, WizardService, ZipService, _virtualScrollWindowStrategyFactory, alertOnError, allEntriesAreEqual, asyncValidateArrayElements, colorValidator, deviceAvailabilityIconMap, extraRoutes, fromFactories, fromTrigger, fromTriggerOnce, getActivatedRoute, getAngularLocalesLanguageString, getBasicInputArrayFormFieldConfig, getDictionaryWithTrimmedKeys, getInjectedHooks, gettext, globalAutoRefreshLoading, hookAction, hookActionBar, hookBreadcrumb, hookComponent, hookCurrentApplication, hookCurrentTenant, hookCurrentUser, hookDataGridActionControls, hookDocs, hookDrawer, hookDynamicProviderConfig, hookFilterMapper, hookGeneric, hookNavigator, hookOptions, hookPatternMessages, hookPlugin, hookPreview, hookQueryParam, hookQueryParamBottomDrawer, hookQueryParamModal, hookRoute, hookSearch, hookService, hookStepper, hookTab, hookUserMenu, hookVersion, hookWidget, hookWizard, internalApps, isEagerDynamicComponents, isExtensionFactory, isLazyDynamicComponents, isPromise, languagesFactory, loadLocale, localeId, localePathFactory, memoize, minColumnGridTrackSize, operationStatusClasses, operationStatusIcons, provideBootstrapMetadata, provideCommonPipes, provideCommonServices, provideDefaultOptionsAppInitializer, provideI18n, provideLanguageSelectorAppInitializer, providePluginsLoaderServiceAppInitializer, provideTranslationServiceInstance, ratiosByColumnTypes, removeContextIndicators, removeDuplicatesIds, resolveInjectedFactories, retryWithDelay, simpleJsonPathValidator, sortByPriority, stateToFactory, statusAlert, statusClasses, statusIcons, throttle, toObservable, toObservableOfArrays, tooltips, trimTranslationKey, uniqueInCollectionByPathValidator, validateArrayElements, validateInternationalPhoneNumber, viewContextRoutes, wrapperLegendFieldConfig };
39650
+ export { ACTIONS_STEPPER, AGGREGATIONS, AGGREGATION_ICONS, AGGREGATION_LABELS, AGGREGATION_LIMITS, AGGREGATION_TEXTS, AGGREGATION_VALUES, AGGREGATION_VALUES_ARR, ARRAY_VALIDATION_PREFIX, ASSET_PATH, AbstractConfigurationStrategy, ActionBarComponent, ActionBarItemComponent, ActionBarModule, ActionBarService, ActionComponent, ActionControlsExtensionService, ActionModule, ActionOutletComponent, ActionService, AggregationPickerComponent, AggregationService, AlarmRealtimeService, AlarmWithChildrenRealtimeService, AlertComponent, AlertDetailsComponent, AlertModule, AlertOutletBase, AlertOutletComponent, AlertService, AlertTextComponent, AppHrefPipe, AppIconComponent, AppStateService, AppSwitcherComponent, AppSwitcherInlineComponent, AppSwitcherService, ApplicationModule, ApplicationPluginStatus, AssetHierarchyService, AssetLinkPipe, AssetPropertyService, AssetTypesRealtimeService, AssetTypesService, AuditLogComponent, AuditLogModule, AuthenticationModule, BackendVersionFactory, BaseColumn, BaseFilteringFormRendererComponent, BooleanFilterMapper, BootstrapComponent, BootstrapModule, BottomDrawerComponent, BottomDrawerRef, BottomDrawerService, BreadcrumbComponent, BreadcrumbItemComponent, BreadcrumbModule, BreadcrumbOutletComponent, BreadcrumbService, BuiltInActionType, BytesPipe, C8Y_PLUGIN_CONTEXT_PATH, C8Y_PLUGIN_NAME, C8yComponentOutlet, C8yJSONSchema, C8yStepper, C8yStepperButtons, C8yStepperIcon, C8yStepperProgress, C8yTranslateDirective, C8yTranslateModule, C8yTranslatePipe, C8yTranslationCache, C8yTranslationLoader, C8yValidators, CUSTOM, CachedLocaleDictionaryService, CellRendererComponent, CellRendererContext, CellRendererDefDirective, ChangeCurrentUserPasswordService, ChangeIconComponent, ClipboardModule, ClipboardService, ColorInputComponent, ColorService, ColumnDirective, CommonModule, ConditionalTabsOutletComponent, ConfigureCustomColumnComponent, ConfirmModalComponent, ContextRouteComponent, ContextRouteGuard, ContextRouteService, CookieBannerComponent, CopyDashboardDisabledReason, CoreModule, CoreSearchModule, CountdownIntervalComponent, CountdownIntervalModule, CurrentPasswordModalComponent, CustomColumn, CustomTranslateService, CustomTranslateStore, DATA_GRID_CONFIGURATION_CONTEXT, DATA_GRID_CONFIGURATION_CONTEXT_PROVIDER, DATA_GRID_CONFIGURATION_STRATEGY, DEFAULT_INTERVAL_STATE, DEFAULT_INTERVAL_VALUE, DEFAULT_INTERVAL_VALUES, DRAWER_ANIMATION_TIME, DashboardChildActionComponent, DashboardChildChange, DashboardChildComponent, DashboardChildTitleComponent, DashboardComponent, DashboardModule, DataGridComponent, DataGridModule, DataGridService, DatapointLibraryValidationErrors, DatapointSyncService, DateContextQueryParamNames, DateFilterMapper, DateFormatService, DatePickerComponent, DatePickerModule, DatePipe, DateTimePickerComponent, DateTimePickerModule, DefaultValidationDirective, DeviceBootstrapRealtimeService, DeviceService, DeviceStatusComponent, DeviceStatusModule, DismissAlertStrategy, DocsModule, DocsService, DrawerModule, DrawerOutletComponent, DrawerService, DropAreaComponent, DropAreaModule, DropdownDirectionDirective, DropdownFocusTrapDirective, DynamicBulkDetailsResolver, DynamicBulkIIdentifiedResolver, DynamicComponentAlert, DynamicComponentAlertAggregator, DynamicComponentAlertsComponent, DynamicComponentComponent, DynamicComponentErrorStrategy, DynamicComponentModule, DynamicComponentService, DynamicDatapointsResolver, DynamicFormsModule, DynamicManagedObjectResolver, DynamicResolverService, ES_MAX_TIME_MILLISECONDS, EmailsValidatorDirective, EmptyComponent, EmptyStateComponent, EmptyStateContextDirective, EventRealtimeService, ExpandableRowDirective, ExtensionPointForPlugins, ExtensionPointWithoutStateForPlugins, ExtractArrayValidationErrorsPipe, FeatureCacheService, FeedbackFormComponent, FilePickerComponent, FilePickerFormControlComponent, FilePickerFormControlModule, FilePickerModule, FilesService, FilterByPipe, FilterInputComponent, FilterMapperFactory, FilterMapperModule, FilterMapperPipe, FilterMapperService, FilterNonArrayValidationErrorsPipe, FilteringActionType, FilteringFormRendererComponent, FilteringFormRendererContext, FilteringFormRendererDefDirective, ForOfDirective, FormGroupComponent, FormsModule, GENERIC_FILE_TYPE, GLOBAL_CONTEXT_AUTO_REFRESH, GainsightService, GenericFileIconPipe, GeoService, GetGroupIconPipe, GlobalConfigService, GridDataSource, GroupFragment, GroupService, GroupedFilterChips, GuideDocsComponent, GuideHrefDirective, HOOK_ACTION, HOOK_ACTION_BAR, HOOK_BREADCRUMB, HOOK_COMPONENTS, HOOK_CURRENT_APPLICATION, HOOK_CURRENT_TENANT, HOOK_CURRENT_USER, HOOK_DOCS, HOOK_DYNAMIC_PROVIDER_CONFIG, HOOK_NAVIGATOR_NODES, HOOK_OPTIONS, HOOK_PATTERN_MESSAGES, HOOK_PLUGIN, HOOK_PREVIEW, HOOK_QUERY_PARAM, HOOK_QUERY_PARAM_BOTTOM_DRAWER, HOOK_QUERY_PARAM_MODAL, HOOK_ROUTE, HOOK_SEARCH, HOOK_STEPPER, HOOK_TABS, HOOK_VERSION, HOOK_WIZARD, HeaderBarComponent, HeaderCellRendererDefDirective, HeaderModule, HeaderService, HelpComponent, HelpModule, HighlightComponent, HookProviderTypes, HumanizeAppNamePipe, HumanizePipe, HumanizeValidationMessagePipe, I18nModule, INTERVAL_OPTIONS, IconDirective, IconPanelComponent, IfAllowedDirective, InjectionType, InputGroupListComponent, InputGroupListContainerDirective, InterAppService, IntervalBasedReload, InventorySearchService, IpRangeInputListComponent, JsonValidationPrettifierDirective, LANGUAGES, LAST_DAY, LAST_HOUR, LAST_MINUTE, LAST_MONTH, LAST_WEEK, LOCALE_PATH, LegacyGridConfigMapperService, LegendFieldWrapper, ListDisplaySwitchComponent, ListDisplaySwitchModule, ListGroupComponent, ListGroupModule, ListItemActionComponent, ListItemBodyComponent, ListItemCheckboxComponent, ListItemCollapseComponent, ListItemComponent, ListItemDragHandleComponent, ListItemFooterComponent, ListItemIconComponent, ListItemRadioComponent, ListItemTimelineComponent, LoadMoreComponent, LoadingComponent, MAX_PAGE_SIZE, MESSAGES_CORE_I18N, MOChunkLoaderService, ManagedObjectRealtimeService, ManagedObjectType, MapFunctionPipe, MarkdownToHtmlPipe, MaxValidationDirective, MeasurementRealtimeService, MessageBannerService, MessageDirective, MessagesComponent, MinValidationDirective, MissingTranslationCustomHandler, MoNamePipe, ModalComponent, ModalModule, ModalSelectionMode, ModalService, NEEDED_ROLE_FOR_SETUP, NEW_DASHBOARD_ROUTER_STATE_PROP, NULL_VALUE_PLACEHOLDER, NUMBER_FORMAT_REGEXP, NameTransformPipe, NavigatorBottomModule, NavigatorIconComponent, NavigatorModule, NavigatorNode, NavigatorNodeComponent, NavigatorNodeRoot, NavigatorOutletComponent, NavigatorService, NavigatorTopModule, NewPasswordComponent, NumberPipe, OperationBulkRealtimeService, OperationRealtimeService, OperationResultComponent, OptionsService, OutletDirective, PREVIEW_FEATURE_PROVIDERS, PRODUCT_EXPERIENCE_EVENT_SOURCE, PX_ACTIONS, PX_EVENT_NAME, PackageType, PasswordCheckListComponent, PasswordConfirm, PasswordConfirmModalComponent, PasswordInputComponent, PasswordService, PasswordStrengthCheckerService, PasswordStrengthComponent, PasswordStrengthService, PatternMessagesService, Permissions, PhoneValidationDirective, PlatformDetailsService, PluginLoadedPipe, PluginsExportScopes, PluginsLoaderService, PluginsModule, PluginsResolveService, PluginsService, PopoverConfirmComponent, PreviewFeatureButtonComponent, PreviewFeatureShowNotification, PreviewService, ProductExperienceDirective, ProductExperienceModule, ProgressBarComponent, PropertiesListComponent, PropertiesListModule, PropertyValueTransformService, ProviderConfigurationComponent, ProviderConfigurationModule, ProviderConfigurationNodeFactory, ProviderConfigurationRouteFactory, ProviderConfigurationService, ProviderDefinitionsService, PushStatus, PushStatusLabels, QUERY_PARAM_HANDLER_PROVIDERS, QueryParamBottomDrawerFactory, QueryParamBottomDrawerStateService, QueryParamHandlerService, QueryParamModalFactory, QueryParamModalStateService, QuickLinkComponent, QuickLinkModule, RESOLVING_COMPONENT_WAIT_TIME, RadioFilterMapper, RangeComponent, RangeDirective, RangeDisplayComponent, RangeDisplayModule, RealtimeButtonComponent, RealtimeControlComponent, RealtimeMessage, RealtimeModule, RealtimeService, RealtimeSubjectService, RelativeTimePipe, RequiredInputPlaceholderDirective, ResizableGridComponent, ResolverServerError, RouterModule, RouterService, RouterTabsResolver, SETUP_FINISHED_STEP_ID, SHOW_PREVIEW_FEATURES, SearchComponent, SearchFilters, SearchInputComponent, SearchOutletComponent, SearchResultEmptyComponent, SearchService, SelectComponent, SelectFilterMapper, SelectItemDirective, SelectKeyboardService, SelectLegacyComponent, SelectModalComponent, SelectModalFilterPipe, SelectModalModule, SelectModule, SelectedItemsComponent, SelectedItemsDirective, SendStatus, SendStatusLabels, ServiceRegistry, SetupCompletedComponent, SetupComponent, SetupModule, SetupService, SetupState, SetupStepperFactory, ShortenUserNamePipe, ShouldShowMoPipe, ShowIfFilterPipe, SimpleJsonPathValidatorDirective, SimplifiedAuthService, SkipLinkDirective, SplitViewAlertsComponent, SplitViewComponent, SplitViewDetailsActionsComponent, SplitViewDetailsComponent, SplitViewExtraHeaderComponent, SplitViewFooterComponent, SplitViewHeaderActionsComponent, SplitViewListComponent, SplitViewListItemDirective, SplitViewSelectionService, StateService, Status, StepperModule, StepperOutletComponent, StepperService, Steppers, StringFilterMapper, StringifyObjectPipe, StripHtmlPipe, SupportedApps, TabComponent, TabsModule, TabsOutletComponent, TabsService, TabsetAriaDirective, TenantUiService, TextAreaRowHeightDirective, TextareaAutoresizeDirective, ThemeSwitcherService, TimeIntervalComponent, TimePickerComponent, TimePickerModule, TitleComponent, TitleOutletComponent, TotpChallengeComponent, TotpSetupComponent, TranslateService, TreeNodeCellRendererComponent, TreeNodeColumn, TreeNodeHeaderCellRendererComponent, TypeaheadComponent, TypeaheadFilterMapper, UiSettingsComponent, UiSettingsModule, UniqueInCollectionByPathValidationDirective, UserEditComponent, UserEditModalComponent, UserEngagementsService, UserMenuItemComponent, UserMenuOutletComponent, UserMenuService, UserModule, UserNameInitialsPipe, UserPreferencesConfigurationStrategy, UserPreferencesService, UserPreferencesStorageInventory, UserPreferencesStorageLocal, UserTotpRevokeComponent, UserTotpSetupComponent, VERSION_MODULE_CONFIG, ValidationPattern, VersionListComponent, VersionModule, VersionService, ViewContext, ViewContextServices, VirtualScrollWindowDirective, VirtualScrollWindowStrategy, VirtualScrollerWrapperComponent, VisibleControlsPipe, WIDGET_CONFIGURATION_GRID_SIZE, WIDGET_TYPE_VALUES, WILDCARD_SEARCH_FEATURE_KEY, WebSDKVersionFactory, WidgetActionWrapperComponent, WidgetGlobalAutoRefreshService, WidgetTimeContextActionBarPriority, WidgetTimeContextComponent, WidgetTimeContextDateRangeService, WidgetTimeContextMediatorService, WidgetsDashboardComponent, WidgetsDashboardEventService, WizardBodyComponent, WizardComponent, WizardFooterComponent, WizardHeaderComponent, WizardModalService, WizardModule, WizardOutletComponent, WizardService, ZipService, _virtualScrollWindowStrategyFactory, alertOnError, allEntriesAreEqual, asyncValidateArrayElements, colorValidator, deviceAvailabilityIconMap, extraRoutes, fromFactories, fromTrigger, fromTriggerOnce, getActivatedRoute, getAngularLocalesLanguageString, getBasicInputArrayFormFieldConfig, getDictionaryWithTrimmedKeys, getInjectedHooks, gettext, globalAutoRefreshLoading, hookAction, hookActionBar, hookBreadcrumb, hookComponent, hookCurrentApplication, hookCurrentTenant, hookCurrentUser, hookDataGridActionControls, hookDocs, hookDrawer, hookDynamicProviderConfig, hookFilterMapper, hookGeneric, hookNavigator, hookOptions, hookPatternMessages, hookPlugin, hookPreview, hookQueryParam, hookQueryParamBottomDrawer, hookQueryParamModal, hookRoute, hookSearch, hookService, hookStepper, hookTab, hookUserMenu, hookVersion, hookWidget, hookWizard, internalApps, isEagerDynamicComponents, isExtensionFactory, isLazyDynamicComponents, isPromise, languagesFactory, loadLocale, localeId, localePathFactory, memoize, minColumnGridTrackSize, operationStatusClasses, operationStatusIcons, provideBootstrapMetadata, provideCommonPipes, provideCommonServices, provideDefaultOptionsAppInitializer, provideI18n, provideLanguageSelectorAppInitializer, providePluginsLoaderServiceAppInitializer, provideTranslationServiceInstance, ratiosByColumnTypes, removeContextIndicators, removeDuplicatesIds, resolveInjectedFactories, retryWithDelay, simpleJsonPathValidator, sortByPriority, stateToFactory, statusAlert, statusClasses, statusIcons, throttle, toObservable, toObservableOfArrays, tooltips, trimTranslationKey, uniqueInCollectionByPathValidator, validateArrayElements, validateInternationalPhoneNumber, viewContextRoutes, wrapperLegendFieldConfig };
39391
39651
  //# sourceMappingURL=c8y-ngx-components.mjs.map