@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.
- package/asset-properties/index.d.ts +1 -2
- package/asset-properties/index.d.ts.map +1 -1
- package/context-dashboard/index.d.ts.map +1 -1
- package/datapoint-explorer/view/index.d.ts +8 -0
- package/datapoint-explorer/view/index.d.ts.map +1 -1
- package/datapoint-selector/index.d.ts +14 -1
- package/datapoint-selector/index.d.ts.map +1 -1
- package/echart/index.d.ts +7 -2
- package/echart/index.d.ts.map +1 -1
- package/echart/models/index.d.ts +1 -0
- package/echart/models/index.d.ts.map +1 -1
- package/fesm2022/c8y-ngx-components-asset-properties.mjs +3 -4
- package/fesm2022/c8y-ngx-components-asset-properties.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs +2 -3
- package/fesm2022/c8y-ngx-components-context-dashboard.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs +33 -4
- package/fesm2022/c8y-ngx-components-datapoint-explorer-view.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs +24 -7
- package/fesm2022/c8y-ngx-components-datapoint-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-device-grid.mjs +1 -1
- package/fesm2022/c8y-ngx-components-device-grid.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart-models.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-echart.mjs +128 -52
- package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-global-context.mjs +7 -2
- package/fesm2022/c8y-ngx-components-global-context.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-asset-table.mjs +127 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions-asset-table.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs +3 -3
- package/fesm2022/c8y-ngx-components-widgets-definitions-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +1 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-exports.mjs +8 -1
- package/fesm2022/c8y-ngx-components-widgets-exports.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs +1959 -0
- package/fesm2022/c8y-ngx-components-widgets-implementations-asset-table.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +90 -56
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +1724 -1464
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/global-context/index.d.ts +1 -0
- package/global-context/index.d.ts.map +1 -1
- package/index.d.ts +1453 -1339
- package/index.d.ts.map +1 -1
- package/locales/de.po +213 -3
- package/locales/es.po +213 -3
- package/locales/fr.po +213 -3
- package/locales/ja_JP.po +213 -3
- package/locales/ko.po +213 -3
- package/locales/locales.pot +219 -3
- package/locales/nl.po +213 -3
- package/locales/pl.po +213 -3
- package/locales/pt_BR.po +213 -3
- package/locales/zh_CN.po +213 -3
- package/locales/zh_TW.po +213 -3
- package/package.json +1 -1
- package/widgets/cockpit-exports/index.d.ts +6 -0
- package/widgets/cockpit-exports/index.d.ts.map +1 -1
- package/widgets/definitions/asset-table/index.d.ts +6 -0
- package/widgets/definitions/asset-table/index.d.ts.map +1 -0
- package/widgets/definitions/index.d.ts +1 -0
- package/widgets/definitions/index.d.ts.map +1 -1
- package/widgets/device-management-exports/index.d.ts +6 -0
- package/widgets/device-management-exports/index.d.ts.map +1 -1
- package/widgets/exports/index.d.ts +8 -1
- package/widgets/exports/index.d.ts.map +1 -1
- package/widgets/implementations/asset-table/index.d.ts +229 -0
- package/widgets/implementations/asset-table/index.d.ts.map +1 -0
- package/widgets/implementations/datapoints-graph/index.d.ts +14 -3
- 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,
|
|
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 {
|
|
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
|
|
1022
|
-
|
|
1023
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1026
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
1029
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
1032
|
-
gettext: gettext$1('
|
|
1256
|
+
'^Create bulk operation$': {
|
|
1257
|
+
gettext: gettext$1('Create bulk operation')
|
|
1033
1258
|
},
|
|
1034
|
-
'^
|
|
1035
|
-
gettext: gettext$1('
|
|
1259
|
+
'^Create bulk operation: (.+)$': {
|
|
1260
|
+
gettext: gettext$1('Create bulk operation: {{updatesList}}'),
|
|
1261
|
+
placeholders: bulkOperationAuditLogTextPlaceholders
|
|
1036
1262
|
},
|
|
1037
|
-
'^
|
|
1038
|
-
gettext: gettext$1('
|
|
1039
|
-
placeholders: {
|
|
1040
|
-
tenant: '$2'
|
|
1041
|
-
}
|
|
1263
|
+
'^Delete bulk operation$': {
|
|
1264
|
+
gettext: gettext$1('Delete bulk operation')
|
|
1042
1265
|
},
|
|
1043
|
-
'^
|
|
1044
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
1080
|
-
gettext: gettext$1('
|
|
1081
|
-
placeholders: {
|
|
1082
|
-
profileName: '$1',
|
|
1083
|
-
deviceName: '$2'
|
|
1084
|
-
}
|
|
1270
|
+
'^Update bulk operation$': {
|
|
1271
|
+
gettext: gettext$1('Update bulk operation')
|
|
1085
1272
|
},
|
|
1086
|
-
'^
|
|
1087
|
-
gettext: gettext$1('
|
|
1088
|
-
placeholders:
|
|
1089
|
-
|
|
1090
|
-
|
|
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
|
-
'^
|
|
1094
|
-
gettext: gettext$1('
|
|
1284
|
+
'^Cep module updated$': {
|
|
1285
|
+
gettext: gettext$1('CEP module updated')
|
|
1095
1286
|
},
|
|
1096
|
-
'^
|
|
1097
|
-
gettext: gettext$1('
|
|
1287
|
+
'^Cep module deleted$': {
|
|
1288
|
+
gettext: gettext$1('CEP module deleted')
|
|
1098
1289
|
},
|
|
1099
|
-
'^
|
|
1100
|
-
gettext: gettext$1('
|
|
1290
|
+
'^Cep module "(.+?)" created$': {
|
|
1291
|
+
gettext: gettext$1('CEP module "{{name}}" created'),
|
|
1292
|
+
placeholders: {
|
|
1293
|
+
name: '$1'
|
|
1294
|
+
}
|
|
1101
1295
|
},
|
|
1102
|
-
'^
|
|
1103
|
-
gettext: gettext$1('
|
|
1296
|
+
'^Cep module "(.+?)" updated$': {
|
|
1297
|
+
gettext: gettext$1('CEP module "{{name}}" updated'),
|
|
1104
1298
|
placeholders: {
|
|
1105
|
-
|
|
1299
|
+
name: '$1'
|
|
1106
1300
|
}
|
|
1107
1301
|
},
|
|
1108
|
-
'^
|
|
1109
|
-
gettext: gettext$1('
|
|
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
|
-
"^
|
|
1160
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1360
|
+
moduleName: '$1',
|
|
1361
|
+
statementNumber: '$2',
|
|
1362
|
+
expression: '$3',
|
|
1363
|
+
keyword: '$4'
|
|
1163
1364
|
}
|
|
1164
1365
|
},
|
|
1165
|
-
|
|
1166
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1369
|
+
tenantId: '$1',
|
|
1370
|
+
statement: '$2',
|
|
1371
|
+
httpStatusCode: '$3',
|
|
1372
|
+
message: '$4'
|
|
1169
1373
|
}
|
|
1170
1374
|
},
|
|
1171
|
-
|
|
1172
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
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
|
-
|
|
1178
|
-
|
|
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
|
-
|
|
1187
|
-
gettext: gettext$1('
|
|
1392
|
+
'^Smart rule updated$': {
|
|
1393
|
+
gettext: gettext$1('Smart rule updated.')
|
|
1188
1394
|
},
|
|
1189
|
-
'^
|
|
1190
|
-
gettext: gettext$1('
|
|
1395
|
+
'^Smart rule enabled$': {
|
|
1396
|
+
gettext: gettext$1('Smart rule activated.')
|
|
1191
1397
|
},
|
|
1192
|
-
'^
|
|
1193
|
-
gettext: gettext$1('
|
|
1398
|
+
'^Smart rule disabled$': {
|
|
1399
|
+
gettext: gettext$1('Smart rule deactivated.')
|
|
1194
1400
|
},
|
|
1195
|
-
'^
|
|
1196
|
-
gettext: gettext$1('
|
|
1401
|
+
'^Smart rule deleted$': {
|
|
1402
|
+
gettext: gettext$1('Smart rule deleted.')
|
|
1197
1403
|
},
|
|
1198
|
-
'^
|
|
1199
|
-
gettext: gettext$1('
|
|
1404
|
+
'^Smart rule "(.+?)" created$': {
|
|
1405
|
+
gettext: gettext$1('Smart rule "{{name}}" created.'),
|
|
1200
1406
|
placeholders: {
|
|
1201
1407
|
name: '$1'
|
|
1202
1408
|
}
|
|
1203
1409
|
},
|
|
1204
|
-
'^
|
|
1205
|
-
gettext: gettext$1('
|
|
1410
|
+
'^Smart rule "(.+?)" updated$': {
|
|
1411
|
+
gettext: gettext$1('Smart rule "{{name}}" updated.'),
|
|
1206
1412
|
placeholders: {
|
|
1207
1413
|
name: '$1'
|
|
1208
1414
|
}
|
|
1209
1415
|
},
|
|
1210
|
-
'^
|
|
1211
|
-
gettext: gettext$1('
|
|
1416
|
+
'^Smart rule "(.+?)" enabled$': {
|
|
1417
|
+
gettext: gettext$1('Smart rule "{{name}}" activated.'),
|
|
1212
1418
|
placeholders: {
|
|
1213
1419
|
name: '$1'
|
|
1214
1420
|
}
|
|
1215
1421
|
},
|
|
1216
|
-
'^
|
|
1217
|
-
gettext: gettext$1('
|
|
1422
|
+
'^Smart rule "(.+?)" disabled$': {
|
|
1423
|
+
gettext: gettext$1('Smart rule "{{name}}" deactivated.'),
|
|
1218
1424
|
placeholders: {
|
|
1219
|
-
|
|
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
|
-
'^
|
|
1233
|
-
gettext: gettext$1('
|
|
1428
|
+
'^Smart rule "(.+?)" deleted$': {
|
|
1429
|
+
gettext: gettext$1('Smart rule "{{name}}" deleted.'),
|
|
1234
1430
|
placeholders: {
|
|
1235
|
-
|
|
1236
|
-
keyType: '$2',
|
|
1237
|
-
fingerprint: '$3',
|
|
1238
|
-
host: '$4',
|
|
1239
|
-
port: '$5'
|
|
1431
|
+
name: '$1'
|
|
1240
1432
|
}
|
|
1241
1433
|
},
|
|
1242
|
-
'^
|
|
1243
|
-
gettext: gettext$1('
|
|
1434
|
+
'^(.+) succeeded for volume "(.+)"$': {
|
|
1435
|
+
gettext: gettext$1('Operation "{{operation}}" succeeded for volume "{{volume}}".'),
|
|
1244
1436
|
placeholders: {
|
|
1245
|
-
|
|
1246
|
-
|
|
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
|
-
'^
|
|
1250
|
-
gettext: '{{
|
|
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
|
-
|
|
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
|
-
'^
|
|
1266
|
-
gettext: gettext$1('Could not
|
|
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
|
-
|
|
1457
|
+
failureReason: '$1'
|
|
1269
1458
|
}
|
|
1270
1459
|
},
|
|
1271
|
-
'^
|
|
1272
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
1275
|
-
gettext: gettext$1('
|
|
1276
|
-
placeholders: bulkOperationAuditLogTextPlaceholders
|
|
1463
|
+
'^Failed to extract certificate from PKCS12$': {
|
|
1464
|
+
gettext: gettext$1('Failed to extract certificate from PKCS12.')
|
|
1277
1465
|
},
|
|
1278
|
-
|
|
1279
|
-
gettext: gettext$1('
|
|
1466
|
+
"^Trusted certificate updated on '(.+?)'\\.$": {
|
|
1467
|
+
gettext: gettext$1('Trusted certificate updated on tenant "{{ tenantId }}"'),
|
|
1280
1468
|
placeholders: {
|
|
1281
|
-
|
|
1469
|
+
tenantId: '$1'
|
|
1282
1470
|
}
|
|
1283
1471
|
},
|
|
1284
|
-
|
|
1285
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1475
|
+
tenantId: '$1'
|
|
1291
1476
|
}
|
|
1292
1477
|
},
|
|
1293
|
-
|
|
1294
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1481
|
+
fingerprint: '$1',
|
|
1482
|
+
subjectName: '$2'
|
|
1303
1483
|
}
|
|
1304
1484
|
},
|
|
1305
|
-
|
|
1306
|
-
gettext: gettext$1('
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
|
|
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
|
-
|
|
1312
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
1315
|
-
gettext: gettext$1('
|
|
1316
|
-
|
|
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
|
-
|
|
1346
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1593
|
+
deviceId: '$1'
|
|
1358
1594
|
}
|
|
1359
1595
|
},
|
|
1360
|
-
'^
|
|
1361
|
-
gettext: gettext$1('
|
|
1596
|
+
'^NewDeviceRequest for id = (.+?) already exists.$': {
|
|
1597
|
+
gettext: gettext$1('Device registration request with ID {{id}} already exists.'),
|
|
1362
1598
|
placeholders: {
|
|
1363
|
-
|
|
1599
|
+
id: '$1'
|
|
1364
1600
|
}
|
|
1365
1601
|
},
|
|
1366
|
-
'^
|
|
1367
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1605
|
+
deviceId: '$1'
|
|
1370
1606
|
}
|
|
1371
1607
|
},
|
|
1372
|
-
'^
|
|
1373
|
-
gettext: gettext$1('
|
|
1608
|
+
'^No communication with device since (.+?)$': {
|
|
1609
|
+
gettext: gettext$1('No communication with device since {{timestamp | absoluteDate}}.'),
|
|
1374
1610
|
placeholders: {
|
|
1375
|
-
|
|
1376
|
-
maxCharactersCount: '$2'
|
|
1611
|
+
timestamp: '$1'
|
|
1377
1612
|
}
|
|
1378
1613
|
},
|
|
1379
|
-
'^
|
|
1380
|
-
gettext: gettext$1('
|
|
1614
|
+
'^No data received from device within required interval.$': {
|
|
1615
|
+
gettext: gettext$1('No data received from device within required interval.')
|
|
1381
1616
|
},
|
|
1382
|
-
|
|
1383
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1386
|
-
statementNumber: '$2',
|
|
1387
|
-
expression: '$3',
|
|
1388
|
-
keyword: '$4'
|
|
1620
|
+
deviceId: '$1'
|
|
1389
1621
|
}
|
|
1390
1622
|
},
|
|
1391
|
-
'^
|
|
1392
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1395
|
-
value: '$2'
|
|
1626
|
+
deviceId: '$1'
|
|
1396
1627
|
}
|
|
1397
1628
|
},
|
|
1398
|
-
'^
|
|
1399
|
-
gettext: gettext$1('
|
|
1629
|
+
'^Retrieve configuration snapshot from device (.+?)$': {
|
|
1630
|
+
gettext: gettext$1('Retrieve configuration snapshot from device {{deviceName}}'),
|
|
1400
1631
|
placeholders: {
|
|
1401
|
-
|
|
1632
|
+
deviceName: '$1'
|
|
1402
1633
|
}
|
|
1403
1634
|
},
|
|
1404
|
-
'^
|
|
1405
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
1408
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
1411
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
1414
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1417
|
-
gettext: gettext$1('
|
|
1660
|
+
'^Added new child device to "(.+)" \\(ID: (.+)\\).$': {
|
|
1661
|
+
gettext: gettext$1('Added new child device to "{{parentDeviceName}}" (ID: {{parentDeviceId}}).'),
|
|
1418
1662
|
placeholders: {
|
|
1419
|
-
|
|
1663
|
+
parentDeviceName: '$1',
|
|
1664
|
+
parentDeviceId: '$2'
|
|
1420
1665
|
}
|
|
1421
1666
|
},
|
|
1422
|
-
'^
|
|
1423
|
-
gettext: gettext$1('
|
|
1667
|
+
'^Updated child device of "(.+)" \\(ID: (.+)\\).$': {
|
|
1668
|
+
gettext: gettext$1('Updated child device of "{{parentDeviceName}}" (ID: {{parentDeviceId}}).'),
|
|
1424
1669
|
placeholders: {
|
|
1425
|
-
|
|
1670
|
+
parentDeviceName: '$1',
|
|
1671
|
+
parentDeviceId: '$2'
|
|
1426
1672
|
}
|
|
1427
1673
|
},
|
|
1428
|
-
'^
|
|
1429
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
1432
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
1438
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
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
|
-
'^
|
|
1473
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
1476
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
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
|
-
"
|
|
1482
|
-
gettext: gettext$1('
|
|
1727
|
+
'install "(.+?)" \\(version: (.+?)\\)': {
|
|
1728
|
+
gettext: gettext$1('install "{{ softwareName }}" (version: {{ softwareVersion }})'),
|
|
1483
1729
|
placeholders: {
|
|
1484
|
-
|
|
1730
|
+
softwareName: '$1',
|
|
1731
|
+
softwareVersion: '$2'
|
|
1485
1732
|
}
|
|
1486
1733
|
},
|
|
1487
|
-
"
|
|
1488
|
-
gettext: gettext$1('
|
|
1734
|
+
'install "([^"]+)"(?! \\(version: .+?\\))': {
|
|
1735
|
+
gettext: gettext$1('install "{{ softwareName }}"'),
|
|
1489
1736
|
placeholders: {
|
|
1490
|
-
|
|
1737
|
+
softwareName: '$1'
|
|
1491
1738
|
}
|
|
1492
1739
|
},
|
|
1493
|
-
"
|
|
1494
|
-
gettext: gettext$1('
|
|
1740
|
+
'delete "(.+?)" \\(version: (.+?)\\)': {
|
|
1741
|
+
gettext: gettext$1('delete "{{ softwareName }}" (version: {{ softwareVersion }})'),
|
|
1495
1742
|
placeholders: {
|
|
1496
|
-
|
|
1743
|
+
softwareName: '$1',
|
|
1744
|
+
softwareVersion: '$2'
|
|
1497
1745
|
}
|
|
1498
1746
|
},
|
|
1499
|
-
"
|
|
1500
|
-
gettext: gettext$1('
|
|
1747
|
+
'delete "([^"]+)"(?! \\(version: .+?\\))': {
|
|
1748
|
+
gettext: gettext$1('delete "{{ softwareName }}"'),
|
|
1501
1749
|
placeholders: {
|
|
1502
|
-
|
|
1750
|
+
softwareName: '$1'
|
|
1503
1751
|
}
|
|
1504
1752
|
}
|
|
1505
1753
|
}
|
|
1506
1754
|
}
|
|
1507
1755
|
}
|
|
1508
1756
|
},
|
|
1509
|
-
'^
|
|
1510
|
-
gettext: gettext$1('
|
|
1757
|
+
'^Update firmware to: "?(.+?)"? \\(version: (.+)\\)\\.?$': {
|
|
1758
|
+
gettext: gettext$1('Update firmware to: "{{ name }}" (version: {{ version }})'),
|
|
1511
1759
|
placeholders: {
|
|
1512
|
-
|
|
1513
|
-
|
|
1760
|
+
name: '$1',
|
|
1761
|
+
version: '$2'
|
|
1514
1762
|
}
|
|
1515
1763
|
},
|
|
1516
|
-
'^
|
|
1517
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
1532
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1780
|
+
imageName: '$1'
|
|
1538
1781
|
}
|
|
1539
1782
|
},
|
|
1540
|
-
'^
|
|
1541
|
-
gettext: gettext$1('
|
|
1783
|
+
'^Microservice not available.*$': {
|
|
1784
|
+
gettext: gettext$1('Microservice is not available.')
|
|
1542
1785
|
},
|
|
1543
|
-
'^
|
|
1544
|
-
gettext: gettext$1('
|
|
1786
|
+
'^Started container$': {
|
|
1787
|
+
gettext: gettext$1('Container started.')
|
|
1545
1788
|
},
|
|
1546
|
-
'^
|
|
1547
|
-
gettext: gettext$1('
|
|
1789
|
+
'^Error syncing pod$': {
|
|
1790
|
+
gettext: gettext$1('Pod synchronization error.')
|
|
1548
1791
|
},
|
|
1549
|
-
'^
|
|
1550
|
-
gettext: gettext$1('
|
|
1792
|
+
'^Failed create pod sandbox.$': {
|
|
1793
|
+
gettext: gettext$1('Pod sandbox creation failed.')
|
|
1551
1794
|
},
|
|
1552
|
-
'^
|
|
1553
|
-
gettext: gettext$1('
|
|
1795
|
+
'^Deleted pod: (.+)$': {
|
|
1796
|
+
gettext: gettext$1('Pod "{{imageName}}" deleted.'),
|
|
1554
1797
|
placeholders: {
|
|
1555
|
-
|
|
1798
|
+
imageName: '$1'
|
|
1556
1799
|
}
|
|
1557
1800
|
},
|
|
1558
|
-
'^
|
|
1559
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1565
|
-
templateId: '$2'
|
|
1804
|
+
imageName: '$1'
|
|
1566
1805
|
}
|
|
1567
1806
|
},
|
|
1568
|
-
|
|
1569
|
-
gettext: gettext$1('
|
|
1807
|
+
'^Scaled up replica set (.+) to (\\d+)$': {
|
|
1808
|
+
gettext: gettext$1('Replica set "{{replicaSetName}}" scaled up to "{{scaleNumber}}".'),
|
|
1570
1809
|
placeholders: {
|
|
1571
|
-
|
|
1810
|
+
replicaSetName: '$1',
|
|
1811
|
+
scaleNumber: '$2'
|
|
1572
1812
|
}
|
|
1573
1813
|
},
|
|
1574
|
-
'^
|
|
1575
|
-
gettext: gettext$1('
|
|
1814
|
+
'^Scaled down replica set (.+) to (\\d+)$': {
|
|
1815
|
+
gettext: gettext$1('Replica set "{{replicaSetName}}" scaled down to "{{scaleNumber}}".'),
|
|
1576
1816
|
placeholders: {
|
|
1577
|
-
|
|
1817
|
+
replicaSetName: '$1',
|
|
1818
|
+
scaleNumber: '$2'
|
|
1578
1819
|
}
|
|
1579
1820
|
},
|
|
1580
|
-
'^
|
|
1581
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1827
|
+
imageName: '$1'
|
|
1584
1828
|
}
|
|
1585
1829
|
},
|
|
1586
|
-
'^
|
|
1587
|
-
gettext: gettext$1('
|
|
1830
|
+
'^RESTART (.+?)$': {
|
|
1831
|
+
gettext: gettext$1('RESTART`verb, action` {{service}}'),
|
|
1588
1832
|
placeholders: {
|
|
1589
|
-
|
|
1833
|
+
service: '$1'
|
|
1590
1834
|
}
|
|
1591
1835
|
},
|
|
1592
|
-
'^
|
|
1593
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1839
|
+
service: '$1'
|
|
1608
1840
|
}
|
|
1609
1841
|
},
|
|
1610
|
-
'^
|
|
1611
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1845
|
+
service: '$1'
|
|
1623
1846
|
}
|
|
1624
1847
|
},
|
|
1625
|
-
'^
|
|
1626
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1851
|
+
imageName: '$1',
|
|
1852
|
+
address: '$2'
|
|
1632
1853
|
}
|
|
1633
1854
|
},
|
|
1634
|
-
'^
|
|
1635
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1858
|
+
imageName: '$1'
|
|
1641
1859
|
}
|
|
1642
1860
|
},
|
|
1643
|
-
'^
|
|
1644
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
1659
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
1662
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1665
|
-
credentialsType: '$2'
|
|
1870
|
+
predicates: '$1'
|
|
1666
1871
|
}
|
|
1667
1872
|
},
|
|
1668
|
-
'^
|
|
1669
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1876
|
+
requestMethod: '$1',
|
|
1877
|
+
uri: '$2',
|
|
1878
|
+
protocol: '$3'
|
|
1672
1879
|
}
|
|
1673
1880
|
},
|
|
1674
|
-
'^
|
|
1675
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1884
|
+
requestMethod: '$1',
|
|
1885
|
+
uri: '$2',
|
|
1886
|
+
protocol: '$3'
|
|
1678
1887
|
}
|
|
1679
|
-
}
|
|
1680
|
-
|
|
1681
|
-
|
|
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
|
-
|
|
1896
|
+
minSeconds: '$1'
|
|
1684
1897
|
}
|
|
1685
1898
|
},
|
|
1686
|
-
'^
|
|
1687
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1902
|
+
number: '$1'
|
|
1693
1903
|
}
|
|
1694
1904
|
},
|
|
1695
|
-
'^
|
|
1696
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1908
|
+
number: '$1'
|
|
1705
1909
|
}
|
|
1706
1910
|
},
|
|
1707
|
-
'^
|
|
1708
|
-
gettext: gettext$1('
|
|
1911
|
+
'^Change trace status to (.+).$': {
|
|
1912
|
+
gettext: gettext$1('Change trace status to {{state | translate}}.'),
|
|
1709
1913
|
placeholders: {
|
|
1710
|
-
|
|
1711
|
-
deviceName: '$2'
|
|
1914
|
+
state: '$1'
|
|
1712
1915
|
}
|
|
1713
1916
|
},
|
|
1714
|
-
'^
|
|
1715
|
-
gettext: gettext$1('
|
|
1917
|
+
'^Change relay status to (.+).$': {
|
|
1918
|
+
gettext: gettext$1('Change relay status to {{status | translate}}.'),
|
|
1716
1919
|
placeholders: {
|
|
1717
|
-
|
|
1718
|
-
scaleNumber: '$2'
|
|
1920
|
+
status: '$1'
|
|
1719
1921
|
}
|
|
1720
1922
|
},
|
|
1721
|
-
'^
|
|
1722
|
-
gettext: gettext$1('
|
|
1923
|
+
'^Closing relay (.+).$': {
|
|
1924
|
+
gettext: gettext$1('Closing relay {{number}}.'),
|
|
1723
1925
|
placeholders: {
|
|
1724
|
-
|
|
1725
|
-
configurationType: '$2',
|
|
1726
|
-
deviceName: '$3'
|
|
1926
|
+
number: '$1'
|
|
1727
1927
|
}
|
|
1728
1928
|
},
|
|
1729
|
-
'^
|
|
1730
|
-
gettext: gettext$1('
|
|
1929
|
+
'^Opening relay (.+).$': {
|
|
1930
|
+
gettext: gettext$1('Opening relay {{number}}.'),
|
|
1731
1931
|
placeholders: {
|
|
1732
|
-
|
|
1733
|
-
deviceName: '$2'
|
|
1932
|
+
number: '$1'
|
|
1734
1933
|
}
|
|
1735
1934
|
},
|
|
1736
|
-
'^
|
|
1737
|
-
gettext: gettext$1('
|
|
1935
|
+
'^Operation updated: (.+)$': {
|
|
1936
|
+
gettext: gettext$1('Operation updated: {{updatesList}}'),
|
|
1738
1937
|
placeholders: {
|
|
1739
|
-
|
|
1938
|
+
updatesList: {
|
|
1740
1939
|
capture: '$1',
|
|
1741
1940
|
translate: {
|
|
1742
|
-
'(
|
|
1743
|
-
gettext: gettext$1('"{{
|
|
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
|
-
|
|
1752
|
-
maxValue: '$2'
|
|
1944
|
+
status: '$1'
|
|
1753
1945
|
}
|
|
1754
1946
|
},
|
|
1755
|
-
'(
|
|
1756
|
-
gettext: gettext$1('"{{
|
|
1947
|
+
"description='(.+?)'": {
|
|
1948
|
+
gettext: gettext$1('description: "{{ description | translate }}"'),
|
|
1757
1949
|
placeholders: {
|
|
1758
|
-
|
|
1950
|
+
description: '$1'
|
|
1759
1951
|
}
|
|
1760
1952
|
},
|
|
1761
|
-
'(
|
|
1762
|
-
gettext: gettext$1('"{{
|
|
1953
|
+
"device name='(.+?)'": {
|
|
1954
|
+
gettext: gettext$1('device name: "{{ deviceName }}"'),
|
|
1763
1955
|
placeholders: {
|
|
1764
|
-
|
|
1956
|
+
deviceName: '$1'
|
|
1765
1957
|
}
|
|
1766
1958
|
},
|
|
1767
|
-
'(
|
|
1768
|
-
gettext: gettext$1('"{{
|
|
1959
|
+
"failure reason='(.+?)'": {
|
|
1960
|
+
gettext: gettext$1('failure reason: "{{ failureReason | translate }}"'),
|
|
1769
1961
|
placeholders: {
|
|
1770
|
-
|
|
1962
|
+
failureReason: '$1'
|
|
1771
1963
|
}
|
|
1772
1964
|
}
|
|
1773
1965
|
}
|
|
1774
1966
|
}
|
|
1775
1967
|
}
|
|
1776
1968
|
},
|
|
1777
|
-
|
|
1778
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
1796
|
-
gettext: gettext$1('
|
|
1972
|
+
'^Operation updated$': {
|
|
1973
|
+
gettext: gettext$1('Operation updated.')
|
|
1797
1974
|
},
|
|
1798
|
-
|
|
1799
|
-
gettext: gettext$1('
|
|
1975
|
+
"^Operation created: status='(.+?)'.$": {
|
|
1976
|
+
gettext: gettext$1('Operation created: status: "{{ status | translate }}".'),
|
|
1800
1977
|
placeholders: {
|
|
1801
|
-
|
|
1978
|
+
status: '$1'
|
|
1802
1979
|
}
|
|
1803
1980
|
},
|
|
1804
|
-
'^
|
|
1805
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
1811
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
1817
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
1823
|
-
gettext: gettext$1('
|
|
2010
|
+
'^Global Role (.+?) updated$': {
|
|
2011
|
+
gettext: gettext$1('Global role "{{name}}" updated'),
|
|
1824
2012
|
placeholders: {
|
|
1825
2013
|
name: '$1'
|
|
1826
2014
|
}
|
|
1827
2015
|
},
|
|
1828
|
-
'^
|
|
1829
|
-
gettext: gettext$1('
|
|
2016
|
+
'^Global Role (.+?) updated: (.+)$': {
|
|
2017
|
+
gettext: gettext$1('Global role "{{name}}" updated: {{updatesList}}'),
|
|
1830
2018
|
placeholders: {
|
|
1831
|
-
|
|
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
|
-
'^
|
|
1835
|
-
gettext: gettext$1('
|
|
2043
|
+
'^Global Roles$': {
|
|
2044
|
+
gettext: gettext$1('Global roles')
|
|
1836
2045
|
},
|
|
1837
|
-
'^
|
|
1838
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
2052
|
+
name: '$1'
|
|
1841
2053
|
}
|
|
1842
2054
|
},
|
|
1843
|
-
'^
|
|
1844
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
1847
|
-
address: '$2'
|
|
2061
|
+
name: '$1'
|
|
1848
2062
|
}
|
|
1849
2063
|
},
|
|
1850
|
-
|
|
1851
|
-
|
|
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
|
-
|
|
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
|
-
'^
|
|
1918
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2112
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2126
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2133
|
-
gettext: gettext$1('
|
|
2134
|
-
|
|
2135
|
-
|
|
2136
|
-
|
|
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
|
-
'^
|
|
2140
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2148
|
-
gettext: gettext$1('
|
|
2149
|
-
placeholders: {
|
|
2150
|
-
name: '$1',
|
|
2151
|
-
value: '$2'
|
|
2152
|
-
}
|
|
2367
|
+
'^Availability monitoring record$': {
|
|
2368
|
+
gettext: gettext$1('Availability monitoring record')
|
|
2153
2369
|
},
|
|
2154
|
-
'^
|
|
2155
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2162
|
-
gettext: gettext$1('
|
|
2373
|
+
'^Following mandatory fields should be included: (.+?)$': {
|
|
2374
|
+
gettext: gettext$1('Following mandatory fields should be included: {{fields}}'),
|
|
2163
2375
|
placeholders: {
|
|
2164
|
-
|
|
2376
|
+
fields: '$1'
|
|
2165
2377
|
}
|
|
2166
2378
|
},
|
|
2167
|
-
'^
|
|
2168
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2174
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2180
|
-
gettext: gettext$1('
|
|
2181
|
-
placeholders: {
|
|
2182
|
-
state: '$1'
|
|
2183
|
-
}
|
|
2385
|
+
'^Log file requested$': {
|
|
2386
|
+
gettext: gettext$1('Log file requested.')
|
|
2184
2387
|
},
|
|
2185
|
-
'^
|
|
2186
|
-
gettext: gettext$1('
|
|
2187
|
-
placeholders: {
|
|
2188
|
-
status: '$1'
|
|
2189
|
-
}
|
|
2388
|
+
'^Managed object deleted$': {
|
|
2389
|
+
gettext: gettext$1('Managed object deleted')
|
|
2190
2390
|
},
|
|
2191
|
-
'^
|
|
2192
|
-
gettext: gettext$1('
|
|
2391
|
+
'^Managed object "(.+?)" deleted$': {
|
|
2392
|
+
gettext: gettext$1('Managed object "{{name}}" deleted'),
|
|
2193
2393
|
placeholders: {
|
|
2194
|
-
|
|
2394
|
+
name: '$1'
|
|
2195
2395
|
}
|
|
2196
2396
|
},
|
|
2197
|
-
'^
|
|
2198
|
-
gettext: gettext$1('
|
|
2199
|
-
placeholders: {
|
|
2200
|
-
number: '$1'
|
|
2201
|
-
}
|
|
2397
|
+
'^Maximum file size exceeded$': {
|
|
2398
|
+
gettext: gettext$1('Maximum file size exceeded.')
|
|
2202
2399
|
},
|
|
2203
|
-
'^
|
|
2204
|
-
gettext: gettext$1('
|
|
2400
|
+
'^Maximum age cannot be bigger than 10 years.$': {
|
|
2401
|
+
gettext: gettext$1('Maximum age cannot be bigger than 10 years.')
|
|
2205
2402
|
},
|
|
2206
|
-
'^
|
|
2207
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2211
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
2214
|
-
version: '$2'
|
|
2409
|
+
id: '$1'
|
|
2215
2410
|
}
|
|
2216
2411
|
},
|
|
2217
|
-
'^
|
|
2218
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
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
|
-
'^
|
|
2242
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
2248
|
-
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
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
|
-
|
|
2258
|
-
|
|
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
|
-
'^
|
|
2262
|
-
gettext: gettext$1('
|
|
2458
|
+
'^Simulator state is invalid: (.+)$': {
|
|
2459
|
+
gettext: gettext$1('Simulator state is invalid: {{violations}}'),
|
|
2263
2460
|
placeholders: {
|
|
2264
|
-
|
|
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
|
-
|
|
2268
|
-
|
|
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
|
-
|
|
2505
|
+
endpointName: '$1',
|
|
2506
|
+
userName: '$2'
|
|
2271
2507
|
}
|
|
2272
2508
|
},
|
|
2273
|
-
'^
|
|
2274
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
2284
|
-
|
|
2512
|
+
endpointName: '$1',
|
|
2513
|
+
keyType: '$2',
|
|
2514
|
+
fingerprint: '$3',
|
|
2515
|
+
host: '$4',
|
|
2516
|
+
port: '$5'
|
|
2285
2517
|
}
|
|
2286
2518
|
},
|
|
2287
|
-
'^
|
|
2288
|
-
gettext:
|
|
2519
|
+
'^Could not save object remoteAccessUpdate: (.+)$': {
|
|
2520
|
+
gettext: '{{errorMessages}}',
|
|
2289
2521
|
placeholders: {
|
|
2290
|
-
|
|
2291
|
-
|
|
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
|
-
'^
|
|
2295
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2302
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2305
|
-
gettext: gettext$1('
|
|
2541
|
+
'^Protocol "(.+?)" does not support "(.+?)" credentials type$': {
|
|
2542
|
+
gettext: gettext$1('Protocol "{{protocol}}" does not support "{{credentialsType}}" credentials type.'),
|
|
2306
2543
|
placeholders: {
|
|
2307
|
-
|
|
2308
|
-
|
|
2309
|
-
activeVersionId: '$3'
|
|
2544
|
+
protocol: '$1',
|
|
2545
|
+
credentialsType: '$2'
|
|
2310
2546
|
}
|
|
2311
2547
|
},
|
|
2312
|
-
'^
|
|
2313
|
-
gettext: gettext$1('
|
|
2314
|
-
|
|
2315
|
-
|
|
2316
|
-
|
|
2317
|
-
|
|
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
|
-
'^
|
|
2321
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2328
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2336
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
2342
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
2345
|
-
from: '$2',
|
|
2346
|
-
to: '$3'
|
|
2575
|
+
route: '$1'
|
|
2347
2576
|
}
|
|
2348
2577
|
},
|
|
2349
|
-
'^
|
|
2350
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2359
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2365
|
-
gettext: gettext$1('
|
|
2584
|
+
'^Duplicated connector for instanceUrl (.+?)!$': {
|
|
2585
|
+
gettext: gettext$1('Target URL {{targetUrl}} already used by another connector.'),
|
|
2366
2586
|
placeholders: {
|
|
2367
|
-
|
|
2587
|
+
targetUrl: '$1'
|
|
2368
2588
|
}
|
|
2369
2589
|
},
|
|
2370
|
-
'^
|
|
2371
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
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
|
-
|
|
2435
|
-
gettext: gettext$1('
|
|
2436
|
-
|
|
2437
|
-
|
|
2438
|
-
|
|
2439
|
-
}
|
|
2440
|
-
|
|
2441
|
-
|
|
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
|
-
'^
|
|
2444
|
-
gettext: gettext$1('
|
|
2664
|
+
'^Option "(.+?)" created$': {
|
|
2665
|
+
gettext: gettext$1('Option "{{option}}" created.'),
|
|
2666
|
+
placeholders: {
|
|
2667
|
+
option: '$1'
|
|
2668
|
+
}
|
|
2445
2669
|
},
|
|
2446
|
-
'^
|
|
2447
|
-
gettext: gettext$1('
|
|
2670
|
+
'^Option deleted$': {
|
|
2671
|
+
gettext: gettext$1('Option deleted.')
|
|
2448
2672
|
},
|
|
2449
|
-
'^
|
|
2450
|
-
gettext: gettext$1('
|
|
2673
|
+
'^Option "(.+?)" deleted$': {
|
|
2674
|
+
gettext: gettext$1('Option "{{option}}" deleted.'),
|
|
2675
|
+
placeholders: {
|
|
2676
|
+
option: '$1'
|
|
2677
|
+
}
|
|
2451
2678
|
},
|
|
2452
|
-
'^
|
|
2453
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
2456
|
-
|
|
2457
|
-
|
|
2458
|
-
|
|
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
|
-
|
|
2461
|
-
|
|
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
|
-
'^
|
|
2465
|
-
gettext: gettext$1('
|
|
2700
|
+
'^DATAHUB_MANAGER$': {
|
|
2701
|
+
gettext: gettext$1('DataHub Manager')
|
|
2466
2702
|
},
|
|
2467
|
-
'^
|
|
2468
|
-
gettext: gettext$1('
|
|
2703
|
+
'^Can manage offloading pipelines$': {
|
|
2704
|
+
gettext: gettext$1('Can manage offloading pipelines.')
|
|
2469
2705
|
},
|
|
2470
|
-
'^
|
|
2471
|
-
gettext: gettext$1('
|
|
2706
|
+
'^DATAHUB_READER$': {
|
|
2707
|
+
gettext: gettext$1('DataHub Reader')
|
|
2472
2708
|
},
|
|
2473
|
-
'^
|
|
2474
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
2477
|
-
|
|
2478
|
-
|
|
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
|
-
'^
|
|
2481
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2484
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2487
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2490
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
2493
|
-
gettext: gettext$1('
|
|
2751
|
+
"^LNS connection name can't be null or blank.$": {
|
|
2752
|
+
gettext: gettext$1("LNS connection name can't be empty.")
|
|
2494
2753
|
},
|
|
2495
|
-
'^
|
|
2496
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
2499
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2502
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
2505
|
-
|
|
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
|
-
|
|
2511
|
-
gettext: gettext$1('
|
|
2775
|
+
"^LNS connection to update can't be null.$": {
|
|
2776
|
+
gettext: gettext$1("LNS connection to update can't be empty.")
|
|
2512
2777
|
},
|
|
2513
|
-
|
|
2514
|
-
gettext: gettext$1(
|
|
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
|
-
'^
|
|
2517
|
-
gettext: gettext$1('
|
|
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
|
|
2520
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
2523
|
-
|
|
2524
|
-
|
|
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
|
-
'^
|
|
2527
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2530
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2533
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2536
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2539
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2542
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
2545
|
-
userName: '$2'
|
|
2831
|
+
statusCode: '$1'
|
|
2546
2832
|
}
|
|
2547
2833
|
},
|
|
2548
|
-
'^
|
|
2549
|
-
gettext: gettext$1('
|
|
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
|
-
'^
|
|
2552
|
-
gettext: gettext$1('
|
|
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
|
-
|
|
2843
|
+
seriesParam: '$1',
|
|
2844
|
+
validFormat: '$2'
|
|
2555
2845
|
}
|
|
2556
2846
|
},
|
|
2557
|
-
|
|
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: "
|
|
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
|
|
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 "Edit widgets" to unlock' | translate\"\n tooltip=\"{{ 'Click "Edit widgets" 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 "Edit widgets" to unlock' | translate\"\n tooltip=\"{{ 'Click "Edit widgets" 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 "Edit widgets" to unlock' | translate\"\n tooltip=\"{{ 'Click "Edit widgets" 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 "Edit widgets" to unlock' | translate\"\n tooltip=\"{{ 'Click "Edit widgets" 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
|
|
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
|