{
@@ -193,7 +194,9 @@ export class ScadaSymbolEditObject {
from(import('tooltipster')),
from(import('tooltipster/dist/js/plugins/tooltipster/SVG/tooltipster-SVG.min.js'))
]).subscribe(() => {
- this.setupElements();
+ this.zone.run(() => {
+ this.setupElements();
+ });
});
}
@@ -408,6 +411,10 @@ export class ScadaSymbolEditObject {
this.callbacks.tagsUpdated(this.tags);
}
+ public getTags(): string[] {
+ return this.tags;
+ }
+
public tagHasStateRenderFunction(tag: string): boolean {
return this.callbacks.tagHasStateRenderFunction(tag);
}
@@ -826,6 +833,7 @@ export class ScadaSymbolElement {
private innerAddTagTooltipPosition(_instance: ITooltipsterInstance,
_helper: ITooltipsterHelper, position: ITooltipPosition): ITooltipPosition {
const distance = 10;
+ const parentRect = this.tooltipContainer[0].getBoundingClientRect();
switch (position.side) {
case 'right':
position.coord.top = this.tooltipMouseY - position.size.height / 2;
@@ -851,6 +859,14 @@ export class ScadaSymbolElement {
position.target = this.tooltipMouseX;
break;
}
+ const rightOverflow = parentRect.right - (position.coord.left + position.size.width);
+ if (rightOverflow < 0) {
+ position.coord.left += rightOverflow;
+ }
+ const leftOverflow = parentRect.left - position.coord.left;
+ if (leftOverflow > 0) {
+ position.coord.left += leftOverflow;
+ }
return position;
}
@@ -1087,8 +1103,9 @@ export const generalStateRenderFunctionCompletions = (ctxCompletion: TbEditorCom
ctx: ctxCompletion,
svg: {
meta: 'argument',
- type: '
SVG.Svg',
- description: 'A root svg node. Instance of
SVG.Svg.'
+ type: '
SVG.Svg',
+ description: 'A root svg node. Instance of
SVG.Svg.'
}
});
@@ -1098,8 +1115,9 @@ export const elementStateRenderFunctionCompletions = (ctxCompletion: TbEditorCom
meta: 'argument',
type: 'Element',
description: 'SVG element.
' +
- 'See
Manipulating section to manipulate the element.
' +
- 'See
Animating section to animate the element.'
+ 'See
Manipulating section to manipulate the element.
' +
+ 'See
Animating section to animate the element.'
}
});
@@ -1115,6 +1133,10 @@ export const clickActionFunctionCompletions = (ctxCompletion: TbEditorCompletion
export const scadaSymbolContextCompletion = (metadata: ScadaSymbolMetadata, tags: string[],
customTranslate: CustomTranslatePipe): TbEditorCompletion => {
+
+ const scadaSymbolAnimationLink = HelpLinks.linksMap.scadaSymbolDevAnimation;
+ const scadaSymbolAnimation = `
ScadaSymbolAnimation`;
+
const properties: TbEditorCompletion = {
meta: 'object',
type: 'object',
@@ -1159,9 +1181,9 @@ export const scadaSymbolContextCompletion = (metadata: ScadaSymbolMetadata, tags
type: 'ScadaSymbolApi',
description: 'SCADA symbol API',
children: {
- animate: {
+ cssAnimate: {
meta: 'function',
- description: 'Finishes any previous animation and starts new animation for SVG element.',
+ description: 'Finishes any previous CSS animation and starts new CSS animation for SVG element.',
args: [
{
name: 'element',
@@ -1175,13 +1197,28 @@ export const scadaSymbolContextCompletion = (metadata: ScadaSymbolMetadata, tags
}
],
return: {
- description: 'Instance of SVG.Runner which has the same methods as any element and additional methods to control the runner.',
- type: '
SVG.Runner'
+ description: `Instance of ${scadaSymbolAnimation} class with API to setup and control the animation.`,
+ type: scadaSymbolAnimation
+ }
+ },
+ cssAnimation: {
+ meta: 'function',
+ description: 'Get the current CSS animation applied for the SVG element.',
+ args: [
+ {
+ name: 'element',
+ description: 'SVG element',
+ type: 'Element'
+ }
+ ],
+ return: {
+ description: `Instance of ${scadaSymbolAnimation} class with API to setup and control the animation.`,
+ type: scadaSymbolAnimation
}
},
- resetAnimation: {
+ resetCssAnimation: {
meta: 'function',
- description: 'Stops animation if any and restore SVG element initial state, resets animation timeline.',
+ description: 'Stops CSS animation if any and restore SVG element initial state, removes CSS animation instance.',
args: [
{
name: 'element',
@@ -1190,10 +1227,10 @@ export const scadaSymbolContextCompletion = (metadata: ScadaSymbolMetadata, tags
},
]
},
- finishAnimation: {
+ finishCssAnimation: {
meta: 'function',
- description: 'Finishes animation if any, SVG element state updated according to the end animation values, ' +
- 'resets animation timeline.',
+ description: 'Finishes CSS animation if any, SVG element state updated according to the end animation values, ' +
+ 'removes CSS animation instance.',
args: [
{
name: 'element',
@@ -1247,8 +1284,8 @@ export const scadaSymbolContextCompletion = (metadata: ScadaSymbolMetadata, tags
text: {
meta: 'function',
description: 'Set text to element(s). Only applicable for elements of type ' +
- '
SVG.Text or ' +
- '
SVG.Tspan.',
+ '
SVG.Text or ' +
+ '
SVG.Tspan.',
args: [
{
name: 'element',
@@ -1265,8 +1302,8 @@ export const scadaSymbolContextCompletion = (metadata: ScadaSymbolMetadata, tags
font: {
meta: 'function',
description: 'Set element(s) text font and color. Only applicable for elements of type ' +
- '
SVG.Text or ' +
- '
SVG.Tspan.',
+ '
SVG.Text or ' +
+ '
SVG.Tspan.',
args: [
{
name: 'element',
@@ -1288,7 +1325,7 @@ export const scadaSymbolContextCompletion = (metadata: ScadaSymbolMetadata, tags
icon: {
meta: 'function',
description: 'Draws icon inside element(s). Only applicable for elements of type ' +
- '
SVG.G.',
+ '
SVG.G.',
args: [
{
name: 'element',
@@ -1396,8 +1433,9 @@ export const scadaSymbolContextCompletion = (metadata: ScadaSymbolMetadata, tags
tags: tagsCompletions,
svg: {
meta: 'argument',
- type: '
SVG.Svg',
- description: 'A root svg node. Instance of
SVG.Svg.'
+ type: '
SVG.Svg',
+ description: 'A root svg node. Instance of
SVG.Svg.'
}
}
};
diff --git a/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol-tooltip.components.ts b/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol-tooltip.components.ts
index ef811e9746..4195c8587c 100644
--- a/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol-tooltip.components.ts
+++ b/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol-tooltip.components.ts
@@ -258,7 +258,11 @@ class ScadaSymbolTagPanelComponent extends ScadaSymbolPanelComponent implements
);
const scadaSymbolTagSettingsTooltip = tagSettingsButton.tooltipster('instance');
- setTooltipComponent(this.symbolElement, this.container, ScadaSymbolTagSettingsComponent, scadaSymbolTagSettingsTooltip);
+ const scadaSymbolTagSettingsComponentRef =
+ setTooltipComponent(this.symbolElement, this.container, ScadaSymbolTagSettingsComponent, scadaSymbolTagSettingsTooltip);
+ scadaSymbolTagSettingsTooltip.on('ready', () => {
+ scadaSymbolTagSettingsComponentRef.instance.updateFunctionsState();
+ });
}
if (!this.symbolElement.readonly) {
@@ -400,7 +404,7 @@ class ScadaSymbolTagSettingsComponent extends ScadaSymbolPanelComponent implemen
this.updateFunctionsState();
}
- private updateFunctionsState() {
+ updateFunctionsState() {
this.hasStateRenderFunction = this.symbolElement.hasStateRenderFunction();
this.hasClickAction = this.symbolElement.hasClickAction();
}
diff --git a/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol.component.scss b/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol.component.scss
index cbfe6e6846..06f1c48c2a 100644
--- a/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol.component.scss
+++ b/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol.component.scss
@@ -61,6 +61,7 @@
flex: 1;
min-width: 0;
min-height: 0;
+ width: 50%;
max-width: 50%;
background: #fff;
&.preview {
diff --git a/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol.component.ts b/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol.component.ts
index e4566712e7..755bc99bbc 100644
--- a/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol.component.ts
+++ b/ui-ngx/src/app/modules/home/pages/scada-symbol/scada-symbol.component.ts
@@ -211,6 +211,10 @@ export class ScadaSymbolComponent extends PageComponent
onApplyScadaSymbolConfig() {
if (this.scadaSymbolFormGroup.valid) {
+ if (this.symbolEditor.editorMode === 'xml') {
+ const tags = this.symbolEditor.getTags();
+ this.editObjectCallbacks.tagsUpdated(tags);
+ }
const metadata: ScadaSymbolMetadata = this.scadaSymbolFormGroup.get('metadata').value;
const scadaSymbolContent = this.prepareScadaSymbolContent(metadata);
const file = createFileFromContent(scadaSymbolContent, this.symbolData.imageResource.fileName,
diff --git a/ui-ngx/src/app/modules/home/pages/widget/widget-editor.models.ts b/ui-ngx/src/app/modules/home/pages/widget/widget-editor.models.ts
index e4d2af97af..cb4a3805f3 100644
--- a/ui-ngx/src/app/modules/home/pages/widget/widget-editor.models.ts
+++ b/ui-ngx/src/app/modules/home/pages/widget/widget-editor.models.ts
@@ -21,7 +21,7 @@ import { serviceCompletions } from '@shared/models/ace/service-completion.models
const widgetEditorCompletions: TbEditorCompletions = {
... {self: {
description: 'Built-in variable
self that is a reference to the widget instance',
- type: '
WidgetTypeInstance',
+ type: '
WidgetTypeInstance',
meta: 'object',
children: {
...{
@@ -31,19 +31,19 @@ const widgetEditorCompletions: TbEditorCompletions = {
},
onDataUpdated: {
description: 'Called when the new data is available from the widget subscription.
Latest data can be accessed from ' +
- 'the
defaultSubscription property of
widget context (ctx).',
+ 'the
defaultSubscription property of
widget context (ctx).',
meta: 'function'
},
onResize: {
- description: 'Called when widget container is resized. Latest
width and
height can be obtained from
widget context (ctx).',
+ description: 'Called when widget container is resized. Latest
width and
height can be obtained from
widget context (ctx).',
meta: 'function'
},
onEditModeChanged: {
- description: 'Called when dashboard editing mode is changed. Latest mode is handled by
isEdit property of
widget context (ctx).',
+ description: 'Called when dashboard editing mode is changed. Latest mode is handled by
isEdit property of
widget context (ctx).',
meta: 'function'
},
onMobileModeChanged: {
- description: 'Called when dashboard view width crosses mobile breakpoint. Latest state is handled by
isMobile property of
widget context (ctx).',
+ description: 'Called when dashboard view width crosses mobile breakpoint. Latest state is handled by
isMobile property of
widget context (ctx).',
meta: 'function'
},
onDestroy: {
@@ -51,7 +51,7 @@ const widgetEditorCompletions: TbEditorCompletions = {
meta: 'function'
},
getSettingsSchema: {
- description: 'Optional function returning widget settings schema json as alternative to
Settings tab of
Settings schema section.',
+ description: 'Optional function returning widget settings schema json as alternative to
Settings tab of
Settings schema section.',
meta: 'function',
return: {
description: 'An widget settings schema json',
@@ -59,7 +59,7 @@ const widgetEditorCompletions: TbEditorCompletions = {
}
},
getDataKeySettingsSchema: {
- description: 'Optional function returning particular data key settings schema json as alternative to
Data key settings schema of
Settings schema section.',
+ description: 'Optional function returning particular data key settings schema json as alternative to
Data key settings schema of
Settings schema section.',
meta: 'function',
return: {
description: 'A particular data key settings schema json',
@@ -71,7 +71,7 @@ const widgetEditorCompletions: TbEditorCompletions = {
meta: 'function',
return: {
description: 'An object describing widget datasource parameters.',
- type: '
WidgetTypeParameters'
+ type: '
WidgetTypeParameters'
}
},
actionSources: {
@@ -79,7 +79,7 @@ const widgetEditorCompletions: TbEditorCompletions = {
meta: 'function',
return: {
description: 'A map of action sources by action source id.',
- type: '{[actionSourceId: string]:
WidgetActionSource}'
+ type: '{[actionSourceId: string]:
WidgetActionSource}'
}
}
},
diff --git a/ui-ngx/src/app/shared/components/contact.component.html b/ui-ngx/src/app/shared/components/contact.component.html
index 0f4038abe9..ce9a57ce59 100644
--- a/ui-ngx/src/app/shared/components/contact.component.html
+++ b/ui-ngx/src/app/shared/components/contact.component.html
@@ -20,27 +20,30 @@
formControlName="country"
(selectCountryCode)="changeCountry($event)">
-
-
+
+
contact.city
{{ 'contact.city-max-length' | translate }}
+
-
+
contact.state
{{ 'contact.state-max-length' | translate }}
+
-
+
contact.postal-code
{{ 'contact.postal-code-invalid' | translate }}
+
diff --git a/ui-ngx/src/app/shared/components/country-autocomplete.component.ts b/ui-ngx/src/app/shared/components/country-autocomplete.component.ts
index 7fc3a10bca..95629496eb 100644
--- a/ui-ngx/src/app/shared/components/country-autocomplete.component.ts
+++ b/ui-ngx/src/app/shared/components/country-autocomplete.component.ts
@@ -200,7 +200,7 @@ export class CountryAutocompleteComponent implements OnInit, ControlValueAccesso
private updateView(value: Country | null) {
if (this.modelValue?.name !== value?.name) {
this.modelValue = value;
- this.propagateChange(this.modelValue);
+ this.propagateChange(this.modelValue?.name);
if (value) {
this.selectCountryCode.emit(value.iso2);
}
diff --git a/ui-ngx/src/app/shared/components/dialog/entity-conflict-dialog/entity-conflict-dialog.component.html b/ui-ngx/src/app/shared/components/dialog/entity-conflict-dialog/entity-conflict-dialog.component.html
index 2e16f04498..c1530bf1d8 100644
--- a/ui-ngx/src/app/shared/components/dialog/entity-conflict-dialog/entity-conflict-dialog.component.html
+++ b/ui-ngx/src/app/shared/components/dialog/entity-conflict-dialog/entity-conflict-dialog.component.html
@@ -29,9 +29,7 @@
- {{ 'entity.version-conflict.link' | translate:
- { entityType: (entityTypeTranslations.get(entityId.entityType).type | translate) }
- }}
+ {{ 'entity.version-conflict.link' | translate:{ entityType: entityTypeLabel | translate } }}
{{ 'entity.link' | translate }}.
diff --git a/ui-ngx/src/app/shared/components/dialog/entity-conflict-dialog/entity-conflict-dialog.component.ts b/ui-ngx/src/app/shared/components/dialog/entity-conflict-dialog/entity-conflict-dialog.component.ts
index b4f34ed232..e522fa6c8f 100644
--- a/ui-ngx/src/app/shared/components/dialog/entity-conflict-dialog/entity-conflict-dialog.component.ts
+++ b/ui-ngx/src/app/shared/components/dialog/entity-conflict-dialog/entity-conflict-dialog.component.ts
@@ -42,8 +42,10 @@ interface EntityConflictDialogData {
export class EntityConflictDialogComponent {
entityId: EntityId;
+ entityTypeLabel: string;
readonly entityTypeTranslations = entityTypeTranslations;
+ private readonly defaultEntityLabel = 'entity.entity';
constructor(
@Inject(MAT_DIALOG_DATA) public data: EntityConflictDialogData,
@@ -51,6 +53,9 @@ export class EntityConflictDialogComponent {
private importExportService: ImportExportService,
) {
this.entityId = (data.entity as EntityInfoData).id ?? (data.entity as RuleChainMetaData).ruleChainId;
+ this.entityTypeLabel = entityTypeTranslations.has(this.entityId.entityType)
+ ? (entityTypeTranslations.get(this.entityId.entityType).type)
+ : this.defaultEntityLabel;
}
onCancel(): void {
diff --git a/ui-ngx/src/app/shared/components/entity/entity-list.component.ts b/ui-ngx/src/app/shared/components/entity/entity-list.component.ts
index 2108551031..cfb0f19b1b 100644
--- a/ui-ngx/src/app/shared/components/entity/entity-list.component.ts
+++ b/ui-ngx/src/app/shared/components/entity/entity-list.component.ts
@@ -46,6 +46,7 @@ import { MatChipGrid } from '@angular/material/chips';
import { coerceBooleanProperty } from '@angular/cdk/coercion';
import { SubscriptSizing } from '@angular/material/form-field';
import { coerceBoolean } from '@shared/decorators/coercion';
+import { isArray } from 'lodash';
@Component({
selector: 'tb-entity-list',
@@ -209,7 +210,7 @@ export class EntityListComponent implements ControlValueAccessor, OnInit, AfterV
}
validate(): ValidationErrors | null {
- return this.entityListFormGroup.valid ? null : {
+ return (isArray(this.modelValue) && this.modelValue.length) || !this.required ? null : {
entities: {valid: false}
};
}
diff --git a/ui-ngx/src/app/shared/components/grid/scroll-grid.component.ts b/ui-ngx/src/app/shared/components/grid/scroll-grid.component.ts
index 632351f8ed..34bf0faa89 100644
--- a/ui-ngx/src/app/shared/components/grid/scroll-grid.component.ts
+++ b/ui-ngx/src/app/shared/components/grid/scroll-grid.component.ts
@@ -17,7 +17,7 @@
import {
AfterViewInit, ChangeDetectorRef,
Component,
- Input,
+ Input, NgZone,
OnChanges, OnDestroy,
OnInit,
Renderer2,
@@ -90,7 +90,8 @@ export class ScrollGridComponent
implements OnInit, AfterViewInit, OnChang
constructor(private breakpointObserver: BreakpointObserver,
private cd: ChangeDetectorRef,
- private renderer: Renderer2) {
+ private renderer: Renderer2,
+ private zone: NgZone) {
}
ngOnInit(): void {
@@ -109,7 +110,9 @@ export class ScrollGridComponent implements OnInit, AfterViewInit, OnChang
this.renderer.setStyle(this.viewport._contentWrapper.nativeElement, 'padding', this.gap + 'px');
if (!(typeof this.itemSize === 'number')) {
this.contentResize$ = new ResizeObserver(() => {
- this.onContentResize();
+ this.zone.run(() => {
+ this.onContentResize();
+ });
});
this.contentResize$.observe(this.viewport._contentWrapper.nativeElement);
}
diff --git a/ui-ngx/src/app/shared/components/image/image-gallery.component.ts b/ui-ngx/src/app/shared/components/image/image-gallery.component.ts
index 4a41e5ce86..566fc699ae 100644
--- a/ui-ngx/src/app/shared/components/image/image-gallery.component.ts
+++ b/ui-ngx/src/app/shared/components/image/image-gallery.component.ts
@@ -33,7 +33,7 @@ import {
ElementRef,
EventEmitter,
HostBinding,
- Input,
+ Input, NgZone,
OnDestroy,
OnInit,
Output,
@@ -196,7 +196,8 @@ export class ImageGalleryComponent extends PageComponent implements OnInit, OnDe
private importExportService: ImportExportService,
private elementRef: ElementRef,
private cd: ChangeDetectorRef,
- private fb: FormBuilder) {
+ private fb: FormBuilder,
+ private zone: NgZone) {
super(store);
this.gridImagesFetchFunction = (pageSize, page, filter) => {
@@ -361,11 +362,13 @@ export class ImageGalleryComponent extends PageComponent implements OnInit, OnDe
private initListMode() {
this.destroyListMode$ = new Subject();
this.widgetResize$ = new ResizeObserver(() => {
- const showHidePageSize = this.elementRef.nativeElement.offsetWidth < hidePageSizePixelValue;
- if (showHidePageSize !== this.hidePageSize) {
- this.hidePageSize = showHidePageSize;
- this.cd.markForCheck();
- }
+ this.zone.run(() => {
+ const showHidePageSize = this.elementRef.nativeElement.offsetWidth < hidePageSizePixelValue;
+ if (showHidePageSize !== this.hidePageSize) {
+ this.hidePageSize = showHidePageSize;
+ this.cd.markForCheck();
+ }
+ });
});
this.widgetResize$.observe(this.elementRef.nativeElement);
if (this.pageMode) {
diff --git a/ui-ngx/src/app/shared/components/toggle-header.component.ts b/ui-ngx/src/app/shared/components/toggle-header.component.ts
index 92ccbb76f9..cb42b48a76 100644
--- a/ui-ngx/src/app/shared/components/toggle-header.component.ts
+++ b/ui-ngx/src/app/shared/components/toggle-header.component.ts
@@ -25,7 +25,7 @@ import {
ElementRef,
EventEmitter,
HostBinding,
- Input,
+ Input, NgZone,
OnDestroy,
OnInit,
Output,
@@ -213,7 +213,8 @@ export class ToggleHeaderComponent extends _ToggleBase implements OnInit, AfterV
constructor(protected store: Store,
private cd: ChangeDetectorRef,
private platform: Platform,
- private breakpointObserver: BreakpointObserver) {
+ private breakpointObserver: BreakpointObserver,
+ private zone: NgZone) {
super(store);
}
@@ -296,7 +297,9 @@ export class ToggleHeaderComponent extends _ToggleBase implements OnInit, AfterV
private startObservePagination() {
this.toggleGroupResize$ = new ResizeObserver(() => {
- this.updatePagination();
+ this.zone.run(() => {
+ this.updatePagination();
+ });
});
this.toggleGroupResize$.observe(this.toggleGroupContainer.nativeElement);
}
diff --git a/ui-ngx/src/app/shared/directives/context-menu.directive.ts b/ui-ngx/src/app/shared/directives/context-menu.directive.ts
new file mode 100644
index 0000000000..ada727cfe2
--- /dev/null
+++ b/ui-ngx/src/app/shared/directives/context-menu.directive.ts
@@ -0,0 +1,35 @@
+///
+/// Copyright © 2016-2024 The Thingsboard Authors
+///
+/// Licensed under the Apache License, Version 2.0 (the "License");
+/// you may not use this file except in compliance with the License.
+/// You may obtain a copy of the License at
+///
+/// http://www.apache.org/licenses/LICENSE-2.0
+///
+/// Unless required by applicable law or agreed to in writing, software
+/// distributed under the License is distributed on an "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+/// See the License for the specific language governing permissions and
+/// limitations under the License.
+///
+
+import { Directive, ElementRef, EventEmitter, OnDestroy, Output } from '@angular/core';
+import { TbContextMenuEvent } from '@shared/models/jquery-event.models';
+
+@Directive({
+ selector: '[tbcontextmenu]'
+})
+export class ContextMenuDirective implements OnDestroy {
+
+ @Output()
+ tbcontextmenu = new EventEmitter();
+
+ constructor(private el: ElementRef) {
+ $(this.el.nativeElement).on('tbcontextmenu', (e: TbContextMenuEvent) => this.tbcontextmenu.emit(e));
+ }
+
+ ngOnDestroy() {
+ $(this.el.nativeElement).off('tbcontextmenu');
+ }
+}
diff --git a/ui-ngx/src/app/shared/directives/public-api.ts b/ui-ngx/src/app/shared/directives/public-api.ts
index 6f25320d90..7e0902e223 100644
--- a/ui-ngx/src/app/shared/directives/public-api.ts
+++ b/ui-ngx/src/app/shared/directives/public-api.ts
@@ -16,3 +16,4 @@
export * from './truncate-with-tooltip.directive';
export * from './ellipsis-chip-list.directive';
+export * from './context-menu.directive';
diff --git a/ui-ngx/src/app/shared/import-export/import-export.service.ts b/ui-ngx/src/app/shared/import-export/import-export.service.ts
index 5f246873d7..3963a81c1e 100644
--- a/ui-ngx/src/app/shared/import-export/import-export.service.ts
+++ b/ui-ngx/src/app/shared/import-export/import-export.service.ts
@@ -55,11 +55,7 @@ import { EntityType } from '@shared/models/entity-type.models';
import { UtilsService } from '@core/services/utils.service';
import { WidgetService } from '@core/http/widget.service';
import { WidgetsBundle } from '@shared/models/widgets-bundle.model';
-import {
- EntityInfoData,
- ImportEntitiesResultInfo,
- ImportEntityData
-} from '@shared/models/entity.models';
+import { EntityInfoData, ImportEntitiesResultInfo, ImportEntityData } from '@shared/models/entity.models';
import { RequestConfig } from '@core/http/http-utils';
import { RuleChain, RuleChainImport, RuleChainMetaData, RuleChainType } from '@shared/models/rule-chain.models';
import { RuleChainService } from '@core/http/rule-chain.service';
@@ -85,6 +81,7 @@ import { selectUserSettingsProperty } from '@core/auth/auth.selectors';
import { ActionPreferencesPutUserSettings } from '@core/auth/auth.actions';
import { ExportableEntity } from '@shared/models/base-data';
import { EntityId } from '@shared/models/id/entity-id';
+import { Customer } from '@shared/models/customer.model';
export type editMissingAliasesFunction = (widgets: Array, isSingleWidget: boolean,
customTitle: string, missingEntityAliases: EntityAliases) => Observable;
@@ -366,6 +363,7 @@ export class ImportExportService {
public exportEntity(entityData: EntityInfoData | RuleChainMetaData): void {
const id = (entityData as EntityInfoData).id ?? (entityData as RuleChainMetaData).ruleChainId;
+ let fileName = (entityData as EntityInfoData).name;
let preparedData;
switch (id.entityType) {
case EntityType.DEVICE_PROFILE:
@@ -391,10 +389,14 @@ export class ImportExportService {
case EntityType.DASHBOARD:
preparedData = this.prepareDashboardExport(entityData as Dashboard);
break;
+ case EntityType.CUSTOMER:
+ fileName = (entityData as Customer).title;
+ preparedData = this.prepareExport(entityData);
+ break;
default:
preparedData = this.prepareExport(entityData);
}
- this.exportToPc(preparedData, (entityData as EntityInfoData).name);
+ this.exportToPc(preparedData, fileName);
}
private exportSelectedWidgetsBundle(widgetsBundle: WidgetsBundle): void {
diff --git a/ui-ngx/src/app/shared/models/ace/service-completion.models.ts b/ui-ngx/src/app/shared/models/ace/service-completion.models.ts
index dd7fb74dc8..5efc428194 100644
--- a/ui-ngx/src/app/shared/models/ace/service-completion.models.ts
+++ b/ui-ngx/src/app/shared/models/ace/service-completion.models.ts
@@ -16,101 +16,101 @@
import { FunctionArg, FunctionArgType, TbEditorCompletions } from '@shared/models/ace/completion.models';
-export const entityIdHref = 'EntityId';
+export const entityIdHref = 'EntityId';
-export const baseDataHref = 'Base data';
+export const baseDataHref = 'Base data';
-export const alarmDataHref = 'Alarm data';
+export const alarmDataHref = 'Alarm data';
-export const alarmDataQueryHref = 'Alarm data query';
+export const alarmDataQueryHref = 'Alarm data query';
-export const attributeScopeHref = 'Attribute scope';
+export const attributeScopeHref = 'Attribute scope';
-export const entityTypeHref = 'EntityType';
+export const entityTypeHref = 'EntityType';
-export const pageDataHref = 'PageData';
+export const pageDataHref = 'PageData';
-export const deviceInfoHref = 'DeviceInfo';
+export const deviceInfoHref = 'DeviceInfo';
-export const assetInfoHref = 'AssetInfo';
+export const assetInfoHref = 'AssetInfo';
-export const entityViewInfoHref = 'EntityViewInfo';
+export const entityViewInfoHref = 'EntityViewInfo';
-export const entityRelationsQueryHref = 'EntityRelationsQuery';
+export const entityRelationsQueryHref = 'EntityRelationsQuery';
-export const entityRelationInfoHref = 'EntityRelationInfo';
+export const entityRelationInfoHref = 'EntityRelationInfo';
-export const dashboardInfoHref = 'DashboardInfo';
+export const dashboardInfoHref = 'DashboardInfo';
-export const deviceHref = 'Device';
+export const deviceHref = 'Device';
-export const assetHref = 'Asset';
+export const assetHref = 'Asset';
-export const entityViewHref = 'entityView';
+export const entityViewHref = 'entityView';
-export const entityRelationHref = 'Entity relation';
+export const entityRelationHref = 'Entity relation';
-export const dashboardHref = 'Dashboard';
+export const dashboardHref = 'Dashboard';
-export const customerHref = 'Customer';
+export const customerHref = 'Customer';
-export const attributeDataHref = 'Attribute Data';
+export const attributeDataHref = 'Attribute Data';
-export const timeseriesDataHref = 'Timeseries Data';
+export const timeseriesDataHref = 'Timeseries Data';
-export const aggregationTypeHref = 'Aggregation Type';
+export const aggregationTypeHref = 'Aggregation Type';
-export const dataSortOrderHref = 'Data Sort Order';
+export const dataSortOrderHref = 'Data Sort Order';
-export const userHref = 'User';
+export const userHref = 'User';
-export const entityDataHref = 'Entity data';
+export const entityDataHref = 'Entity data';
-export const entityDataQueryHref = 'Entity Data Query';
+export const entityDataQueryHref = 'Entity Data Query';
-export const deviceCredentialsHref = 'DeviceCredentials';
+export const deviceCredentialsHref = 'DeviceCredentials';
-export const entityFilterHref = 'Entity filter';
+export const entityFilterHref = 'Entity filter';
-export const entityInfoHref = 'Entity info';
+export const entityInfoHref = 'Entity info';
-export const aliasEntityTypeHref = 'Alias Entity Type';
+export const aliasEntityTypeHref = 'Alias Entity Type';
-export const aliasFilterTypeHref = 'Alias filter type';
+export const aliasFilterTypeHref = 'Alias filter type';
-export const entityAliasHref = 'Entity alias';
+export const entityAliasHref = 'Entity alias';
-export const dataKeyTypeHref = 'Data key type';
+export const dataKeyTypeHref = 'Data key type';
-export const subscriptionInfoHref = 'Subscription info';
+export const subscriptionInfoHref = 'Subscription info';
-export const dataSourceHref = 'Datasource';
+export const dataSourceHref = 'Datasource';
-export const stateParamsHref = 'State params';
+export const stateParamsHref = 'State params';
-export const aliasInfoHref = 'Alias info';
+export const aliasInfoHref = 'Alias info';
-export const entityAliasFilterHref = 'Entity alias filter';
+export const entityAliasFilterHref = 'Entity alias filter';
-export const entityAliasFilterResultHref = 'Entity alias filter result';
+export const entityAliasFilterResultHref = 'Entity alias filter result';
-export const importEntityDataHref = 'Import entity data';
+export const importEntityDataHref = 'Import entity data';
-export const importEntitiesResultInfoHref = 'Import entities result info';
+export const importEntitiesResultInfoHref = 'Import entities result info';
-export const customDialogComponentHref = 'CustomDialogComponent';
+export const customDialogComponentHref = 'CustomDialogComponent';
-export const resourceInfoHref = 'Resource info';
+export const resourceInfoHref = 'Resource info';
export const pageLinkArg: FunctionArg = {
name: 'pageLink',
- type: 'PageLink',
+ type: 'PageLink',
description: 'Page link object used to perform paginated request.'
};
export const requestConfigArg: FunctionArg = {
name: 'config',
- type: 'RequestConfig',
+ type: 'RequestConfig',
description: 'HTTP request configuration.',
optional: true
};
@@ -167,9 +167,9 @@ export function observablePageDataReturnType(objectType: string): FunctionArgTyp
export const serviceCompletions: TbEditorCompletions = {
deviceService: {
description: 'Device Service API
' +
- 'See DeviceService for API reference.',
+ 'See DeviceService for API reference.',
meta: 'service',
- type: 'DeviceService',
+ type: 'DeviceService',
children: {
getTenantDeviceInfos: {
description: 'Get tenant devices',
@@ -243,7 +243,7 @@ export const serviceCompletions: TbEditorCompletions = {
args: [
requestConfigArg
],
- return: observableArrayReturnType('EntitySubtype')
+ return: observableArrayReturnType('EntitySubtype')
},
getDeviceCredentials: {
description: 'Get device credentials by device id',
@@ -322,7 +322,7 @@ export const serviceCompletions: TbEditorCompletions = {
description: 'Find devices by search query',
meta: 'function',
args: [
- { name: 'query', type: 'DeviceSearchQuery',
+ { name: 'query', type: 'DeviceSearchQuery',
description: 'Device search query object'},
requestConfigArg
],
@@ -346,7 +346,7 @@ export const serviceCompletions: TbEditorCompletions = {
description: 'Claiming device name'},
requestConfigArg
],
- return: observableReturnType('ClaimResult')
+ return: observableReturnType('ClaimResult')
},
unclaimDevice: {
description: 'Send un-claim device request',
@@ -362,9 +362,9 @@ export const serviceCompletions: TbEditorCompletions = {
},
assetService: {
description: 'Asset Service API
' +
- 'See AssetService for API reference.',
+ 'See AssetService for API reference.',
meta: 'service',
- type: 'AssetService',
+ type: 'AssetService',
children: {
getTenantAssetInfos: {
description: 'Get tenant assets',
@@ -438,7 +438,7 @@ export const serviceCompletions: TbEditorCompletions = {
args: [
requestConfigArg
],
- return: observableArrayReturnType('EntitySubtype')
+ return: observableArrayReturnType('EntitySubtype')
},
makeAssetPublic: {
description: 'Make asset public (available from public dashboard)',
@@ -474,7 +474,7 @@ export const serviceCompletions: TbEditorCompletions = {
args: [
{
name: 'query',
- type: 'AssetSearchQuery',
+ type: 'AssetSearchQuery',
description: 'Asset search query object'
},
requestConfigArg
@@ -497,9 +497,9 @@ export const serviceCompletions: TbEditorCompletions = {
},
entityViewService: {
description: 'EntityView Service API
' +
- 'See EntityViewService for API reference.',
+ 'See EntityViewService for API reference.',
meta: 'service',
- type: 'EntityViewService',
+ type: 'EntityViewService',
children: {
getTenantEntityViewInfos: {
description: 'Get tenant entity view infos',
@@ -564,7 +564,7 @@ export const serviceCompletions: TbEditorCompletions = {
args: [
requestConfigArg
],
- return: observableArrayReturnType('EntitySubtype')
+ return: observableArrayReturnType('EntitySubtype')
},
makeEntityViewPublic: {
description: 'Make entity view public (available from public dashboard)',
@@ -600,7 +600,7 @@ export const serviceCompletions: TbEditorCompletions = {
args: [
{
name: 'query',
- type: 'AssetSearchQuery',
+ type: 'AssetSearchQuery',
description: 'Entity view search query object'
},
requestConfigArg
@@ -611,9 +611,9 @@ export const serviceCompletions: TbEditorCompletions = {
},
customerService: {
description: 'Customer Service API
' +
- 'See CustomerService for API reference.',
+ 'See CustomerService for API reference.',
meta: 'service',
- type: 'CustomerService',
+ type: 'CustomerService',
children: {
getCustomer: {
description: 'Get customer by id',
@@ -655,9 +655,9 @@ export const serviceCompletions: TbEditorCompletions = {
},
dashboardService: {
description: 'Dashboard Service API
' +
- 'See DashboardService for API reference.',
+ 'See DashboardService for API reference.',
meta: 'service',
- type: 'DashboardService',
+ type: 'DashboardService',
children: {
getTenantDashboards: {
description: 'Get tenant dashboards',
@@ -814,9 +814,9 @@ export const serviceCompletions: TbEditorCompletions = {
},
userService: {
description: 'User Service API
' +
- 'See UserService for API reference.',
+ 'See UserService for API reference.',
meta: 'service',
- type: 'UserService',
+ type: 'UserService',
children: {
getUsers: {
description: 'Get users',
@@ -907,9 +907,9 @@ export const serviceCompletions: TbEditorCompletions = {
},
entityRelationService: {
description: 'Entity Relation Service API
' +
- 'See EntityRelationService for API reference.',
+ 'See EntityRelationService for API reference.',
meta: 'service',
- type: 'EntityRelationService',
+ type: 'EntityRelationService',
children: {
saveRelation: {
description: 'Save relation',
@@ -1029,9 +1029,9 @@ export const serviceCompletions: TbEditorCompletions = {
},
attributeService: {
description: 'Attribute Service API
' +
- 'See AttributeService for API reference.',
+ 'See AttributeService for API reference.',
meta: 'service',
- type: 'AttributeService',
+ type: 'AttributeService',
children: {
getEntityAttributes: {
description: 'Get entity attributes by id',
@@ -1109,9 +1109,9 @@ export const serviceCompletions: TbEditorCompletions = {
},
entityService: {
description: 'Entity Service API
' +
- 'See EntityService for API reference.',
+ 'See EntityService for API reference.',
meta: 'service',
- type: 'EntityService',
+ type: 'EntityService',
children: {
getEntity: {
description: 'Get entity by id',
@@ -1304,9 +1304,9 @@ export const serviceCompletions: TbEditorCompletions = {
},
resourceService: {
description: 'Resource Service API
' +
- 'See ResourceService for API reference.',
+ 'See ResourceService for API reference.',
meta: 'service',
- type: 'ResourceService',
+ type: 'ResourceService',
children: {
getResources: {
description: 'Find resources by search text',
@@ -1321,9 +1321,9 @@ export const serviceCompletions: TbEditorCompletions = {
},
dialogs: {
description: 'Dialogs Service API
' +
- 'See DialogService for API reference.',
+ 'See DialogService for API reference.',
meta: 'service',
- type: 'DialogService',
+ type: 'DialogService',
children: {
confirm: {
description: 'Confirm',
@@ -1382,9 +1382,9 @@ export const serviceCompletions: TbEditorCompletions = {
},
customDialog: {
description: 'Custom Dialog Service API
' +
- 'See CustomDialogService for API reference.',
+ 'See CustomDialogService for API reference.',
meta: 'service',
- type: 'CustomDialogService',
+ type: 'CustomDialogService',
children: {
customDialog: {
description: 'Custom Dialog',
@@ -1400,32 +1400,32 @@ export const serviceCompletions: TbEditorCompletions = {
},
date: {
description: 'Date Pipe
Formats a date value according to locale rules.
' +
- 'See DatePipe for API reference.',
+ 'See DatePipe for API reference.',
meta: 'service',
- type: 'DatePipe'
+ type: 'DatePipe'
},
translate: {
description: 'Translate Service API
' +
- 'See TranslateService for API reference.',
+ 'See TranslateService for API reference.',
meta: 'service',
- type: 'TranslateService'
+ type: 'TranslateService'
},
http: {
description: 'HTTP Client Service
' +
- 'See HttpClient for API reference.',
+ 'See HttpClient for API reference.',
meta: 'service',
- type: 'HttpClient'
+ type: 'HttpClient'
},
sanitizer: {
description: 'DomSanitizer Service
' +
- 'See DomSanitizer for API reference.',
+ 'See DomSanitizer for API reference.',
meta: 'service',
- type: 'DomSanitizer'
+ type: 'DomSanitizer'
},
router: {
description: 'Router Service
' +
- 'See Router for API reference.',
+ 'See Router for API reference.',
meta: 'service',
- type: 'Router'
+ type: 'Router'
}
};
diff --git a/ui-ngx/src/app/shared/models/ace/widget-completion.models.ts b/ui-ngx/src/app/shared/models/ace/widget-completion.models.ts
index e54e52bdbc..b2b0b6235d 100644
--- a/ui-ngx/src/app/shared/models/ace/widget-completion.models.ts
+++ b/ui-ngx/src/app/shared/models/ace/widget-completion.models.ts
@@ -20,7 +20,7 @@ import { entityIdHref, serviceCompletions } from '@shared/models/ace/service-com
export const timewindowCompletion: TbEditorCompletion = {
description: 'Timewindow configuration object',
meta: 'property',
- type: 'Timewindow',
+ type: 'Timewindow',
children: {
displayValue: {
description: 'Current timewindow display value.',
@@ -50,7 +50,7 @@ export const timewindowCompletion: TbEditorCompletion = {
realtime: {
description: 'Realtime timewindow configuration object.',
meta: 'property',
- type: 'IntervalWindow',
+ type: 'IntervalWindow',
children: {
interval: {
description: 'Timewindow aggregation interval in milliseconds',
@@ -67,7 +67,7 @@ export const timewindowCompletion: TbEditorCompletion = {
history: {
description: 'History timewindow configuration object.',
meta: 'property',
- type: 'HistoryWindow',
+ type: 'HistoryWindow',
children: {
historyType: {
description: 'History timewindow type (0 - last interval, 1 - fixed)',
@@ -87,7 +87,7 @@ export const timewindowCompletion: TbEditorCompletion = {
fixedTimewindow: {
description: 'Fixed history timewindow configuration object',
meta: 'property',
- type: 'FixedWindow',
+ type: 'FixedWindow',
children: {
startTimeMs: {
description: 'Timewindow start time in UTC milliseconds',
@@ -106,7 +106,7 @@ export const timewindowCompletion: TbEditorCompletion = {
aggregation: {
description: 'Timewindow aggregation configuration object.',
meta: 'property',
- type: 'Aggregation',
+ type: 'Aggregation',
children: {
interval: {
description: 'Aggregation interval in milliseconds',
@@ -116,7 +116,7 @@ export const timewindowCompletion: TbEditorCompletion = {
type: {
description: 'Aggregation type',
meta: 'property',
- type: 'AggregationType'
+ type: 'AggregationType'
},
limit: {
description: 'Maximum allowed datapoints when aggregation is disabled (AggregationType == \'NONE\')',
@@ -132,7 +132,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
ctx: {
description: 'A reference to widget context that has all necessary API
and data used by widget instance.',
meta: 'object',
- type: 'WidgetContext',
+ type: 'WidgetContext',
children: {
...{
$container: {
@@ -143,7 +143,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
$scope: {
description: 'Reference to the current widget component.
Can be used to access/modify component properties when widget is built using Angular approach.',
meta: 'property',
- type: 'IDynamicWidgetComponent'
+ type: 'IDynamicWidgetComponent'
},
width: {
description: 'Current width of widget container in pixels.',
@@ -168,7 +168,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
widgetConfig: {
description: 'Common widget configuration containing properties such as color (text color), backgroundColor (widget background color), etc.',
meta: 'property',
- type: 'WidgetConfig',
+ type: 'WidgetConfig',
children: {
title: {
description: 'Widget title.',
@@ -233,17 +233,17 @@ export const widgetContextCompletions: TbEditorCompletions = {
legendConfig: {
description: 'Legend configuration.',
meta: 'property',
- type: 'LegendConfig',
+ type: 'LegendConfig',
children: {
position: {
description: 'Legend position. Possible values: \'top\', \'bottom\', \'left\', \'right\'',
meta: 'property',
- type: 'LegendPosition',
+ type: 'LegendPosition',
},
direction: {
description: 'Legend direction. Possible values: \'column\', \'row\'',
meta: 'property',
- type: 'LegendDirection',
+ type: 'LegendDirection',
},
showMin: {
description: 'Whether to display aggregated min values.',
@@ -331,12 +331,12 @@ export const widgetContextCompletions: TbEditorCompletions = {
alarmSource: {
description: 'Configured alarm source for alarm widget type.',
meta: 'property',
- type: 'Datasource'
+ type: 'Datasource'
},
alarmSearchStatus: {
description: 'Configured default alarm search status for alarm widget type.',
meta: 'property',
- type: 'AlarmSearchStatus'
+ type: 'AlarmSearchStatus'
},
alarmsPollingInterval: {
description: 'Configured alarms polling interval for alarm widget type.',
@@ -356,29 +356,29 @@ export const widgetContextCompletions: TbEditorCompletions = {
datasources: {
description: 'Array of configured widget datasources.',
meta: 'property',
- type: 'Array<Datasource>'
+ type: 'Array<Datasource>'
}
}
},
settings: {
- description: 'Widget settings containing widget specific properties according to the defined settings json schema',
+ description: 'Widget settings containing widget specific properties according to the defined settings json schema',
meta: 'property',
type: 'object'
},
datasources: {
description: 'Array of resolved widget datasources.',
meta: 'property',
- type: 'Array<Datasource>'
+ type: 'Array<Datasource>'
},
data: {
description: 'Array of latest datasources data.',
meta: 'property',
- type: 'Array<DatasourceData>'
+ type: 'Array<DatasourceData>'
},
timeWindow: {
description: 'Current widget timewindow (applicable for timeseries widgets).',
meta: 'property',
- type: 'WidgetTimewindow'
+ type: 'WidgetTimewindow'
},
units: {
description: 'Optional property defining units text of values displayed by widget. Useful for simple widgets like cards or gauges.',
@@ -393,7 +393,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
currentUser: {
description: 'Current user object.',
meta: 'property',
- type: 'AuthUser',
+ type: 'AuthUser',
children: {
sub: {
description: 'User subject (email).',
@@ -443,7 +443,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
authority: {
description: 'User authority. Possible values: SYS_ADMIN, TENANT_ADMIN, CUSTOMER_USER',
meta: 'property',
- type: 'Authority'
+ type: 'Authority'
}
}
},
@@ -468,12 +468,12 @@ export const widgetContextCompletions: TbEditorCompletions = {
defaultSubscription: {
description: 'Default widget subscription object contains all subscription information,
including current data, according to the widget type.',
meta: 'property',
- type: 'IWidgetSubscription'
+ type: 'IWidgetSubscription'
},
timewindowFunctions: {
description: 'Object with timewindow functions used to manage widget data time frame. Can by used by Time-series or Alarm widgets.',
meta: 'property',
- type: 'TimewindowFunctions',
+ type: 'TimewindowFunctions',
children: {
onUpdateTimewindow: {
description: 'This function can be used to update current subscription time frame
to historical one identified by startTimeMs and endTimeMs arguments.',
@@ -500,7 +500,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
controlApi: {
description: 'Object that provides API functions for RPC (Control) widgets.',
meta: 'property',
- type: 'RpcApi',
+ type: 'RpcApi',
children: {
sendOneWayCommand: {
description: 'Sends one way (without response) RPC command to the device.',
@@ -585,7 +585,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
actionsApi: {
description: 'Set of API functions to work with user defined actions.',
meta: 'property',
- type: 'WidgetActionsApi',
+ type: 'WidgetActionsApi',
children: {
getActionDescriptors: {
description: 'Get list of action descriptors for provided actionSourceId.',
@@ -599,7 +599,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
],
return: {
description: 'The list of action descriptors',
- type: 'Array<WidgetActionDescriptor>'
+ type: 'Array<WidgetActionDescriptor>'
}
},
handleWidgetAction: {
@@ -614,7 +614,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
{
name: 'descriptor',
description: 'An action descriptor.',
- type: 'WidgetActionDescriptor'
+ type: 'WidgetActionDescriptor'
},
{
name: 'entityId',
@@ -635,7 +635,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
stateController: {
description: 'Reference to Dashboard state controller, providing API to manage current dashboard state.',
meta: 'property',
- type: 'IStateController',
+ type: 'IStateController',
children: {
openState: {
description: 'Navigate to new dashboard state.',
@@ -649,7 +649,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
{
name: 'params',
description: 'An object with state parameters to use by the new state.',
- type: 'StateParams',
+ type: 'StateParams',
optional: true
},
{
@@ -667,7 +667,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
{
name: 'id',
description: 'An array state object of the target dashboard state.',
- type: 'Array StateObject',
+ type: 'Array StateObject',
},
{
name: 'openRightLayout',
@@ -690,7 +690,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
{
name: 'params',
description: 'An object with state parameters to update current state parameters.',
- type: 'StateParams',
+ type: 'StateParams',
optional: true
},
{
@@ -714,7 +714,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
meta: 'function',
return: {
description: 'current dashboard state parameters.',
- type: 'StateParams'
+ type: 'StateParams'
}
},
getStateParamsByStateId: {
@@ -729,7 +729,7 @@ export const widgetContextCompletions: TbEditorCompletions = {
],
return: {
description: 'current dashboard state parameters.',
- type: 'StateParams'
+ type: 'StateParams'
}
}
}
diff --git a/ui-ngx/src/app/shared/models/alarm.models.ts b/ui-ngx/src/app/shared/models/alarm.models.ts
index 57509368d5..8cc1e1b88c 100644
--- a/ui-ngx/src/app/shared/models/alarm.models.ts
+++ b/ui-ngx/src/app/shared/models/alarm.models.ts
@@ -27,6 +27,7 @@ import { AlarmCommentId } from '@shared/models/id/alarm-comment-id';
import { UserId } from '@shared/models/id/user-id';
import { AlarmFilter } from '@shared/models/query/query.models';
import { HasTenantId } from '@shared/models/entity.models';
+import { isNotEmptyStr } from '@core/utils';
export enum AlarmsMode {
ALL,
@@ -127,7 +128,7 @@ export interface AlarmComment extends BaseData {
text: string;
edited?: boolean;
editedOn?: number;
- }
+ };
}
export interface AlarmCommentInfo extends AlarmComment {
@@ -173,9 +174,9 @@ export const simulatedAlarm: AlarmInfo = {
originatorName: 'Simulated',
originatorLabel: 'Simulated',
assignee: {
- firstName: "",
- lastName: "",
- email: "test@example.com",
+ firstName: '',
+ lastName: '',
+ email: 'test@example.com',
},
originator: {
entityType: EntityType.DEVICE,
@@ -350,3 +351,36 @@ export class AlarmQueryV2 {
}
}
+
+export const getUserDisplayName = (alarmAssignee: AlarmAssignee | AlarmCommentInfo) => {
+ let displayName = '';
+ if (isNotEmptyStr(alarmAssignee.firstName) || isNotEmptyStr(alarmAssignee.lastName)) {
+ if (alarmAssignee.firstName) {
+ displayName += alarmAssignee.firstName;
+ }
+ if (alarmAssignee.lastName) {
+ if (displayName.length > 0) {
+ displayName += ' ';
+ }
+ displayName += alarmAssignee.lastName;
+ }
+ } else {
+ displayName = alarmAssignee.email;
+ }
+ return displayName;
+};
+
+export const getUserInitials = (alarmAssignee: AlarmAssignee): string => {
+ let initials = '';
+ if (isNotEmptyStr(alarmAssignee.firstName) || isNotEmptyStr(alarmAssignee.lastName)) {
+ if (alarmAssignee.firstName) {
+ initials += alarmAssignee.firstName.charAt(0);
+ }
+ if (alarmAssignee.lastName) {
+ initials += alarmAssignee.lastName.charAt(0);
+ }
+ } else {
+ initials += alarmAssignee.email.charAt(0);
+ }
+ return initials.toUpperCase();
+};
diff --git a/ui-ngx/src/app/shared/models/constants.ts b/ui-ngx/src/app/shared/models/constants.ts
index 36600eec72..1a681972bf 100644
--- a/ui-ngx/src/app/shared/models/constants.ts
+++ b/ui-ngx/src/app/shared/models/constants.ts
@@ -187,6 +187,7 @@ export const HelpLinks = {
gatewayInstall: `${helpBaseUrl}/docs/iot-gateway/install/docker-installation`,
scada: `${helpBaseUrl}/docs${docPlatformPrefix}/user-guide/scada`,
scadaSymbolDev: `${helpBaseUrl}/docs${docPlatformPrefix}/user-guide/scada/symbols-dev-guide`,
+ scadaSymbolDevAnimation: `${helpBaseUrl}/docs${docPlatformPrefix}/user-guide/scada/scada-symbols-dev-guide/#scadasymbolanimation`
}
};
/* eslint-enable max-len */
diff --git a/ui-ngx/src/app/shared/models/jquery-event.models.ts b/ui-ngx/src/app/shared/models/jquery-event.models.ts
new file mode 100644
index 0000000000..b893da758c
--- /dev/null
+++ b/ui-ngx/src/app/shared/models/jquery-event.models.ts
@@ -0,0 +1,79 @@
+///
+/// Copyright © 2016-2024 The Thingsboard Authors
+///
+/// Licensed under the Apache License, Version 2.0 (the "License");
+/// you may not use this file except in compliance with the License.
+/// You may obtain a copy of the License at
+///
+/// http://www.apache.org/licenses/LICENSE-2.0
+///
+/// Unless required by applicable law or agreed to in writing, software
+/// distributed under the License is distributed on an "AS IS" BASIS,
+/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+/// See the License for the specific language governing permissions and
+/// limitations under the License.
+///
+
+import Timeout = NodeJS.Timeout;
+
+export interface TbContextMenuEvent extends Event {
+ clientX: number;
+ clientY: number;
+ ctrlKey: boolean;
+ metaKey: boolean;
+}
+
+const isIOSDevice = (): boolean =>
+ /iPhone|iPad|iPod/i.test(navigator.userAgent) || (navigator.userAgent.includes('Mac') && 'ontouchend' in document);
+
+export const initCustomJQueryEvents = () => {
+ $.event.special.tbcontextmenu = {
+ setup(this: HTMLElement) {
+ const el = $(this);
+ if (isIOSDevice()) {
+ let timeoutId: Timeout;
+
+ el.on('touchstart', (e) => {
+ e.stopPropagation();
+ timeoutId = setTimeout(() => {
+ timeoutId = null;
+ const touch = e.originalEvent.changedTouches[0];
+ const event = $.Event('tbcontextmenu', {
+ clientX: touch.clientX,
+ clientY: touch.clientY,
+ ctrlKey: false,
+ metaKey: false,
+ originalEvent: e
+ });
+ el.trigger(event, e);
+ }, 500);
+ });
+
+ el.on('touchend touchmove', () => {
+ if (timeoutId) {
+ clearTimeout(timeoutId);
+ }
+ });
+ } else {
+ el.on('contextmenu', (e) => {
+ const event = $.Event('tbcontextmenu', {
+ clientX: e.originalEvent.clientX,
+ clientY: e.originalEvent.clientY,
+ ctrlKey: e.originalEvent.ctrlKey,
+ metaKey: e.originalEvent.metaKey,
+ originalEvent: e
+ });
+ el.trigger(event, e);
+ });
+ }
+ },
+ teardown(this: HTMLElement) {
+ const el = $(this);
+ if (isIOSDevice()) {
+ el.off('touchstart touchend touchmove');
+ } else {
+ el.off('contextmenu');
+ }
+ }
+ };
+};
diff --git a/ui-ngx/src/app/shared/shared.module.ts b/ui-ngx/src/app/shared/shared.module.ts
index 130e272c21..309a3e2bf3 100644
--- a/ui-ngx/src/app/shared/shared.module.ts
+++ b/ui-ngx/src/app/shared/shared.module.ts
@@ -68,6 +68,7 @@ import { NgxHmCarouselModule } from 'ngx-hm-carousel';
import { EditorModule, TINYMCE_SCRIPT_SRC } from '@tinymce/tinymce-angular';
import { UserMenuComponent } from '@shared/components/user-menu.component';
import { TruncateWithTooltipDirective } from '@shared/directives/truncate-with-tooltip.directive';
+import { ContextMenuDirective } from '@shared/directives/context-menu.directive';
import { NospacePipe } from '@shared/pipe/nospace.pipe';
import { TranslateModule } from '@ngx-translate/core';
import { TbCheckboxComponent } from '@shared/components/tb-checkbox.component';
@@ -371,6 +372,7 @@ export function MarkedOptionsFactory(markedOptionsService: MarkedOptionsService)
LedLightComponent,
MarkdownEditorComponent,
TruncateWithTooltipDirective,
+ ContextMenuDirective,
NospacePipe,
MillisecondsToTimeStringPipe,
EnumToArrayPipe,
@@ -633,6 +635,7 @@ export function MarkedOptionsFactory(markedOptionsService: MarkedOptionsService)
LedLightComponent,
MarkdownEditorComponent,
TruncateWithTooltipDirective,
+ ContextMenuDirective,
NospacePipe,
MillisecondsToTimeStringPipe,
EnumToArrayPipe,
diff --git a/ui-ngx/src/assets/dashboard/sys_admin_home_page.json b/ui-ngx/src/assets/dashboard/sys_admin_home_page.json
index 20e3b0b48a..310dac83ae 100644
--- a/ui-ngx/src/assets/dashboard/sys_admin_home_page.json
+++ b/ui-ngx/src/assets/dashboard/sys_admin_home_page.json
@@ -1092,7 +1092,7 @@
"useMarkdownTextFunction": false,
"markdownTextPattern": "\n
\n \n
${tenantsCount:0}
\n
\n
\n
",
"applyDefaultMarkdownStyle": false,
- "markdownCss": ".tb-card-content {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: row;\n}\n\n.tb-content-container {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n}\n\n.tb-small-button-container {\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n\n.tb-card-header {\n height: 36px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n}\n\n.tb-count {\n font-style: normal;\n font-weight: 500;\n font-size: 28px;\n line-height: 36px;\n}\n\n@media screen and (min-width: 960px) and (max-width: 1819px) {\n .tb-count {\n font-size: 18px;\n line-height: 24px;\n }\n}\n"
+ "markdownCss": ".tb-card-content {\n width: 100%;\n height: 100%;\n display: flex;\n flex-direction: row;\n white-space: nowrap;\n}\n\n.tb-content-container {\n flex: 1;\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n}\n\n.tb-small-button-container {\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n\n.tb-card-header {\n height: 36px;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n}\n\n.tb-count {\n font-style: normal;\n font-weight: 500;\n font-size: 28px;\n line-height: 36px;\n}\n\n@media screen and (min-width: 960px) and (max-width: 1819px) {\n .tb-count {\n font-size: 18px;\n line-height: 24px;\n }\n}\n"
},
"title": "Tenants",
"showTitleIcon": false,
diff --git a/ui-ngx/src/assets/dashboard/tenant_admin_home_page.json b/ui-ngx/src/assets/dashboard/tenant_admin_home_page.json
index e3277ac88a..59eb61a935 100644
--- a/ui-ngx/src/assets/dashboard/tenant_admin_home_page.json
+++ b/ui-ngx/src/assets/dashboard/tenant_admin_home_page.json
@@ -1208,7 +1208,7 @@
"dropShadow": false,
"enableFullscreen": false,
"widgetStyle": {},
- "widgetCss": " .tb-widget-container > .tb-widget > .tb-widget-content .tb-widget-title > .title-row > .title {\n padding: 0;\n}\n\n .tb-widget-container > .tb-widget > .tb-widget-content .tb-widget-title > .title-row > .title {\n padding-bottom: 8px;\n font-weight: 600;\n font-size: 20px;\n line-height: 24px;\n letter-spacing: 0.1px;\n color: rgba(0, 0, 0, 0.76);\n}\n\n.tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel {\n padding: 0;\n}\n\n@media screen and (min-width: 960px) and (max-width: 1819px) {\n .tb-widget-container > .tb-widget > .tb-widget-content .tb-widget-title > .title-row > .title {\n padding-bottom: 0;\n font-weight: 500;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0.25px;\n }\n}\n\n@media screen and (min-width: 960px) and (max-width: 1182px) {\n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel {\n gap: 0;\n }\n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-qrcode {\n min-width: 150px;\n }\n}\n\n@media screen and (max-width: 960px) {\n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-qrcode {\n max-width: 120px;\n }\n \n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-badges {\n max-width: 160px;\n }\n}\n\n@media screen and (min-width: 1819px) {\n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-qrcode {\n max-width: 125px;\n }\n \n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-badges {\n max-width: 160px;\n }\n}\n\n@media screen and (min-width: 960px) and (max-height: 960px) {\n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-qrcode-label {\n display: none;\n }\n}",
+ "widgetCss": " .tb-widget-container > .tb-widget > .tb-widget-content .tb-widget-title > .title-row > .title {\n padding: 0;\n}\n\n .tb-widget-container > .tb-widget > .tb-widget-content .tb-widget-title > .title-row > .title {\n padding-bottom: 8px;\n font-weight: 600;\n font-size: 20px;\n line-height: 24px;\n letter-spacing: 0.1px;\n color: rgba(0, 0, 0, 0.76);\n}\n\n.tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel {\n padding: 0;\n}\n\n@media screen and (min-width: 960px) and (max-width: 1819px) {\n .tb-widget-container > .tb-widget > .tb-widget-content .tb-widget-title > .title-row > .title {\n padding-bottom: 0;\n font-weight: 500;\n font-size: 14px;\n line-height: 20px;\n letter-spacing: 0.25px;\n }\n}\n\n@media screen and (min-width: 960px) and (max-width: 1182px) {\n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel {\n gap: 0;\n }\n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-qrcode {\n min-width: 150px;\n }\n}\n\n@media screen and (max-width: 960px) {\n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-qrcode {\n max-width: 120px;\n }\n \n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-badges {\n max-width: 160px;\n }\n}\n\n@media screen and (min-width: 1819px) {\n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-qrcode {\n max-width: 125px;\n }\n \n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-badges {\n max-width: 160px;\n }\n}\n\n@media screen and (min-width: 960px) and (max-height: 965px) {\n .tb-widget-container > .tb-widget > .tb-widget-content > .tb-widget .tb-mobile-app-qrcode-panel .tb-qrcode-label {\n display: none;\n }\n}",
"showTitleIcon": false,
"titleTooltip": "",
"titleStyle": null,
diff --git a/ui-ngx/src/assets/help/en_US/scada/symbol_state_render_fn.md b/ui-ngx/src/assets/help/en_US/scada/symbol_state_render_fn.md
index bdb0d45234..9a2c811817 100644
--- a/ui-ngx/src/assets/help/en_US/scada/symbol_state_render_fn.md
+++ b/ui-ngx/src/assets/help/en_US/scada/symbol_state_render_fn.md
@@ -10,9 +10,9 @@ A JavaScript function used to render SCADA symbol state.
**Parameters:**
- - ctx:
ScadaSymbolContext - Context of the SCADA symbol.
+ - ctx:
ScadaSymbolContext - Context of the SCADA symbol.
- - svg:
SVG.Svg - A root svg node. Instance of SVG.Svg.
+ - svg:
SVG.Svg - A root svg node. Instance of SVG.Svg.
@@ -20,8 +20,44 @@ A JavaScript function used to render SCADA symbol state.
##### Examples
-
-
-TODO
-
-
+This JavaScript snippet manages the enablement and appearance of SVG buttons used to control volume settings based on device connectivity and value thresholds.
+The 'Up' button is disabled when the volume reaches its maximum allowable value (`maxValue`), and the 'Down' button is disabled when the volume is at its minimum allowable value (`minValue`).
+Both buttons are disabled when the device is offline. The visual cues for enabled/disabled states are represented by color changes.
+
+```javascript
+
+var levelUpButton = ctx.tags.levelUpButton; // Button for increasing volume
+var levelDownButton = ctx.tags.levelDownButton; // Button for decreasing volume
+var levelArrowUp = ctx.tags.levelArrowUp; // Visual arrow for 'Up' button
+var levelArrowDown = ctx.tags.levelArrowDown; // Visual arrow for 'Down' button
+
+var active = ctx.values.active; // Device connectivity status
+var value = ctx.values.value; // Current volume level
+var minValue = ctx.properties.minValue; // Minimum volume level
+var maxValue = ctx.properties.maxValue; // Maximum volume level
+
+var enabledColor = '#4CAF50'; // Color for enabled state
+var disabledColor = '#A1ADB1'; // Color for disabled state
+
+// Determine if the 'Up' button should be enabled
+var levelUpEnabled = active && value < maxValue;
+if (levelUpEnabled) {
+ ctx.api.enable(levelUpButton); // Enable 'Up' button
+ levelArrowUp[0].attr({fill: enabledColor}); // Set arrow color to indicate enabled state
+} else {
+ ctx.api.disable(levelUpButton); // Disable 'Up' button
+ levelArrowUp[0].attr({fill: disabledColor}); // Set arrow color to indicate disabled state
+}
+
+// Determine if the 'Down' button should be enabled
+var levelDownEnabled = active && value > minValue;
+if (levelDownEnabled) {
+ ctx.api.enable(levelDownButton); // Enable 'Down' button
+ levelArrowDown[0].attr({fill: enabledColor}); // Set arrow color to indicate enabled state
+} else {
+ ctx.api.disable(levelDownButton); // Disable 'Down' button
+ levelArrowDown[0].attr({fill: disabledColor}); // Set arrow color to indicate disabled state
+}
+
+{:copy-code}
+```
diff --git a/ui-ngx/src/assets/help/en_US/scada/tag_click_action_fn.md b/ui-ngx/src/assets/help/en_US/scada/tag_click_action_fn.md
index 26ec4f9bb3..8675419803 100644
--- a/ui-ngx/src/assets/help/en_US/scada/tag_click_action_fn.md
+++ b/ui-ngx/src/assets/help/en_US/scada/tag_click_action_fn.md
@@ -10,11 +10,10 @@ A JavaScript function invoked when user clicks on SVG element with specific tag.
**Parameters:**
- - ctx:
ScadaSymbolContext - Context of the SCADA symbol.
+ - ctx:
ScadaSymbolContext - Context of the SCADA symbol.
- - element:
Element - SVG element.
- See Manipulating section to manipulate the element.
- See Animating section to animate the element.
+ - element:
Element - SVG.js element.
+ See the examples below to learn how to manipulate and animate elements.
- event:
Event - DOM event.
@@ -24,6 +23,28 @@ A JavaScript function invoked when user clicks on SVG element with specific tag.
##### Examples
-
+The example demonstrates how to dynamically call the 'turnOn' or 'turnOff' actions based on the 'active' status from the context. The actions are implemented using the following methods from the Scada Symbol API:
-TODO
+- **callAction**: *(event: Event, behaviorId: string, value?: any, observer?: Partial\\>): void* - Triggers a specific behavior action identified by its ID, allowing for the optional passing of values and observer callbacks.
+
+- **setValue**: *(valueId: string, value: any): void* - Updates a specific value within the `ctx.values` object and initiates all related rendering functions.
+
+For more detailed guidelines on device interaction, consider reviewing the best practices.
+
+```javascript
+var active = ctx.values.active; // Current active status from context
+var action = active ? 'turnOn' : 'turnOff'; // Determine action based on active status
+var parameter = "any object or primitive"; // Parameter to pass with the action
+
+// Call the action with observer callbacks for next and error handling
+ctx.api.callAction(event, action, parameter, {
+ next: () => {
+ // Action succeeded; toggle the 'activate' status for debugging
+ ctx.api.setValue('activate', !active);
+ },
+ error: () => {
+ // Action failed; reset the 'activate' status for debugging
+ ctx.api.setValue('activate', active);
+ }
+});
+```
diff --git a/ui-ngx/src/assets/help/en_US/scada/tag_state_render_fn.md b/ui-ngx/src/assets/help/en_US/scada/tag_state_render_fn.md
index caed8060d4..c16ad96c58 100644
--- a/ui-ngx/src/assets/help/en_US/scada/tag_state_render_fn.md
+++ b/ui-ngx/src/assets/help/en_US/scada/tag_state_render_fn.md
@@ -10,11 +10,10 @@ A JavaScript function used to render SCADA symbol element with specific tag.
**Parameters:**
- - ctx:
ScadaSymbolContext - Context of the SCADA symbol.
+ - ctx:
ScadaSymbolContext - Context of the SCADA symbol.
- - element:
Element - SVG element.
- See Manipulating section to manipulate the element.
- See Animating section to animate the element.
+ - element:
Element - SVG.js element.
+ See the examples below to learn how to manipulate and animate elements.
@@ -22,6 +21,46 @@ A JavaScript function used to render SCADA symbol element with specific tag.
##### Examples
-
+* Change the background of the element based on the value of the “active”
-TODO
+```javascript
+if(ctx.values.active){
+ element.attr({fill: ctx.properties.activeColor});
+} else {
+ element.attr({fill: ctx.properties.inactiveColor});
+}
+{:copy-code}
+```
+
+* Enable and disable the “On” button based on the state of the "active" (avoid or prevent click action)
+
+```javascript
+if (ctx.values.active) {
+ ctx.api.disable(element);
+} else {
+ ctx.api.enable(element);
+}
+{:copy-code}
+```
+
+* Smooth infinite rotation animation based on the value of the “active” with speed based on the value of the “speed”
+
+```javascript
+var on = ctx.values.active;
+var speed = ctx.values.speed ? ctx.values.speed / 60 : 1;
+var animation = ctx.api.cssAnimation(element);
+
+if (on) {
+ if (!animation) {
+ animation = ctx.api.cssAnimate(element, 2000)
+ .rotate(360).loop().speed(speed);
+ } else {
+ animation.speed(speed).play();
+ }
+} else {
+ if (animation) {
+ animation.pause();
+ }
+}
+{:copy-code}
+```
diff --git a/ui-ngx/src/assets/locale/locale.constant-en_US.json b/ui-ngx/src/assets/locale/locale.constant-en_US.json
index f5f26beeeb..bb4fc57e8a 100644
--- a/ui-ngx/src/assets/locale/locale.constant-en_US.json
+++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json
@@ -323,6 +323,7 @@
"mobile-package-hint": "For Android: your own unique Application ID. For iOS: Product bundle identifier.",
"mobile-package-unique": "Application package must be unique.",
"mobile-package-max-length": "Application package should be less than 256",
+ "mobile-package-spaces": "Application package should not contain spaces",
"mobile-app-secret": "Application secret",
"mobile-app-secret-hint": "Base64 encoded string representing at least 512 bits of data.",
"mobile-app-secret-required": "Application secret is required.",
@@ -594,6 +595,7 @@
"assignee-last-name": "Assignee last name",
"assignee-email": "Assignee email",
"unassigned": "Unassigned",
+ "user-deleted": "User deleted",
"assignee-not-set": "All",
"status": "Status",
"alarm-details": "Alarm details",
@@ -1209,7 +1211,7 @@
"layout-type-default": "Default",
"layout-type-scada": "SCADA",
"layout-type-divider": "Divider",
- "layout-settings-type": "Layout settings: {{ type }}",
+ "layout-settings-type": "Layout settings: {{ type }} breakpoint",
"columns-count": "Columns count",
"columns-count-required": "Columns count is required.",
"min-columns-count-message": "Only 10 minimum column count is allowed.",
@@ -2934,6 +2936,7 @@
"details": "Details",
"delete-mapping-title": "Delete mapping?",
"delete-slave-title": "Delete slave?",
+ "divider": "Divider",
"download-configuration-file": "Download configuration file",
"download-docker-compose": "Download docker-compose.yml for your gateway",
"enable-remote-logging": "Enable remote logging",
@@ -3033,6 +3036,7 @@
"grpc-max-pings-without-data-required": "Max pings without data is required",
"grpc-max-pings-without-data-min": "Max pings without data can not be less then 1",
"grpc-max-pings-without-data-pattern": "Max pings without data is not valid",
+ "info": "Info",
"identity": "Identity",
"inactivity-check-period-seconds": "Inactivity check period (in sec)",
"inactivity-check-period-seconds-required": "Inactivity check period is required",
@@ -3089,8 +3093,11 @@
"min-pack-send-delay-required": "Min pack send delay is required",
"min-pack-send-delay-min": "Min pack send delay can not be less then 10",
"min-pack-send-delay-pattern": "Min pack send delay is not valid",
+ "multiplier": "Multiplier",
"mode": "Mode",
"model-name": "Model name",
+ "modifier": "Modifier",
+ "modifier-invalid": "Modifier is not valid",
"mqtt-version": "MQTT version",
"name": "Name",
"name-required": "Name is required.",
@@ -3136,10 +3143,11 @@
"title": "{{type}} Connector RPC parameters",
"templates-title": "Connector RPC Templates",
"methodFilter": "Method filter",
+ "method-name": "Method name",
"requestTopicExpression": "Request topic expression",
"responseTopicExpression": "Response topic expression",
- "responseTimeout": "Response Time",
- "valueExpression": "Value Expression",
+ "responseTimeout": "Response timeout",
+ "valueExpression": "Value expression",
"tag": "Tag",
"type": "Type",
"functionCode": "Function Code",
@@ -3178,6 +3186,11 @@
"tries": "Tries",
"httpHeaders": "HTTP Headers",
"header-name": "Header name",
+ "hint": {
+ "modbus-response-reading": "RPC response will return all subtracted values from all connected devices when the reading functions are selected.",
+ "modbus-writing-functions": "RPC will write a filled value to all connected devices when the writing functions are selected.",
+ "opc-method": "A filled method name is the OPC-UA method that will processed on the server side (make sure your node has the requested method)."
+ },
"security-name": "Security name",
"value": "Value",
"security": "Security",
@@ -3254,6 +3267,7 @@
"sub-check-period": "Subscription check period (ms)",
"sub-check-period-error": "Subscription check period should be at least {{min}} (ms).",
"security": "Security",
+ "security-policy": "Security policy",
"security-type": "Security type",
"security-types": {
"access-token": "Access Token",
@@ -3304,7 +3318,7 @@
"check-connectors-configuration-min": "Check connectors configuration can not be less then 1",
"check-connectors-configuration-pattern": "Check connectors configuration is not valid",
"add": "Add command",
- "timeout": "Timeout",
+ "timeout": "Timeout (in sec)",
"timeout-ms": "Timeout (in ms)",
"timeout-required": "Timeout is required",
"timeout-min": "Timeout can not be less then 1",
@@ -3348,6 +3362,13 @@
"memory-storage": "Memory storage",
"sqlite": "SQLITE"
},
+ "report-strategy": {
+ "label": "Report strategy",
+ "on-change": "On value change",
+ "on-report-period": "On report period",
+ "on-change-or-report-period": "On value change or report period",
+ "report-period": "Report period"
+ },
"source-type": {
"msg": "Extract from message",
"topic": "Extract from topic",
@@ -3460,6 +3481,7 @@
"file": "Your data will be stored in separated files and will be saved even after the gateway restart.",
"sqlite": "Your data will be stored in file based database. And will be saved even after the gateway restart.",
"opc-timeout": "Timeout in milliseconds for connecting to OPC-UA server.",
+ "security-policy": "Security Policy defines the security mechanisms to be applied.",
"scan-period": "Period in milliseconds to rescan the server.",
"sub-check-period": "Period to check the subscriptions in the OPC-UA server.",
"enable-subscription": "If true - the gateway will subscribe to interesting nodes and wait for data update and if false - the gateway will rescan OPC-UA server every scanPeriodInMillis.",
@@ -3493,7 +3515,8 @@
"objects-count": "Depends on the selected type.",
"address": "Register address to verify.",
"key": "Key to be used as the attribute key for the platform instance.",
- "data-keys": "For more information about function codes and data types click on help icon"
+ "data-keys": "For more information about function codes and data types click on help icon",
+ "modifier": "The retrieved value will be adjusted (by multiplying or dividing it) based on the specified modifier value."
}
}
},
diff --git a/ui-ngx/src/assets/locale/locale.constant-lt_LT.json b/ui-ngx/src/assets/locale/locale.constant-lt_LT.json
index 23e0682d6e..df1659e112 100644
--- a/ui-ngx/src/assets/locale/locale.constant-lt_LT.json
+++ b/ui-ngx/src/assets/locale/locale.constant-lt_LT.json
@@ -1826,9 +1826,10 @@
"condition-duration-value-required": "Duration value is required.",
"condition-duration-time-unit-required": "Time unit is required.",
"advanced-settings": "Advanced settings",
- "alarm-rule-details": "Details",
- "alarm-rule-details-hint": "Hint: use ${keyName} to substitute values of the attribute or telemetry keys that are used in alarm rule condition.",
- "add-alarm-rule-details": "Add details",
+ "alarm-rule-additional-info": "Papildoma informacija",
+ "edit-alarm-rule-additional-info": "Redaguoti papildomą informaciją",
+ "alarm-rule-additional-info-placeholder": "Pateikite savo komentarus ir patikslinimus čia, kad jie būtų rodomi pavojaus signalo detalių skiltyje „Papildoma informacija“.",
+ "alarm-rule-additional-info-hint": "Hint: use ${keyName} to substitute values of the attribute or telemetry keys that are used in alarm rule condition.",
"alarm-rule-mobile-dashboard": "Mobile dashboard",
"alarm-rule-mobile-dashboard-hint": "Used by mobile application as an alarm details dashboard",
"alarm-rule-no-mobile-dashboard": "No dashboard selected",
@@ -1838,7 +1839,6 @@
"propagate-alarm-to-owner": "Propagate alarm to entity owner (Customer or Tenant)",
"propagate-alarm-to-owner-hierarchy": "Propagate alarm to entity owners hierarchy",
"propagate-alarm-to-tenant": "Propagate alarm to Tenant",
- "alarm-details": "Alarm details",
"alarm-rule-condition": "Alarm rule condition",
"enter-alarm-rule-condition-prompt": "Please add alarm rule condition",
"edit-alarm-rule-condition": "Edit alarm rule condition",
diff --git a/ui-ngx/src/assets/locale/locale.constant-nl_BE.json b/ui-ngx/src/assets/locale/locale.constant-nl_BE.json
index 2188379a4b..afe23e039a 100644
--- a/ui-ngx/src/assets/locale/locale.constant-nl_BE.json
+++ b/ui-ngx/src/assets/locale/locale.constant-nl_BE.json
@@ -509,17 +509,17 @@
"acknowledge": "Erkennen",
"clear": "Duidelijk",
"search": "Alarmen zoeken",
- "selected-alarms": "{ count, plural, =1 {1 alarm} andere {# alarms} } geselecteerd",
+ "selected-alarms": "{ count, plural, =1 {1 alarm} other {# alarms} } geselecteerd",
"no-data": "Geen gegevens om weer te geven",
"polling-interval": "Polling-interval alarmen (sec)",
"polling-interval-required": "Alarmen polling-interval is vereist.",
"min-polling-interval-message": "Minimaal 1 sec polling-interval is toegestaan.",
- "aknowledge-alarms-title": "Erken { count, plural, =1 {1 alarm} andere {# alarms} }",
- "aknowledge-alarms-text": "Weet je zeker dat je { count, plural, =1 {1 alarm} andere {# alarms} } wilt erkennen?",
+ "aknowledge-alarms-title": "Erken { count, plural, =1 {1 alarm} other {# alarms} }",
+ "aknowledge-alarms-text": "Weet je zeker dat je { count, plural, =1 {1 alarm} other {# alarms} } wilt erkennen?",
"aknowledge-alarm-title": "Alarm bevestigen",
"aknowledge-alarm-text": "Weet u zeker dat u Alarm wilt erkennen?",
- "clear-alarms-title": "Wis { count, plural, =1 {1 alarm} andere {# alarms} }",
- "clear-alarms-text": "Weet u zeker dat u { count, plural, =1 {1 alarm} andere {# alarms} } wilt wissen?",
+ "clear-alarms-title": "Wis { count, plural, =1 {1 alarm} other {# alarms} }",
+ "clear-alarms-text": "Weet u zeker dat u { count, plural, =1 {1 alarm} other {# alarms} } wilt wissen?",
"clear-alarm-title": "Alarm wissen",
"clear-alarm-text": "Weet u zeker dat u Alarm wilt wissen?",
"alarm-status-filter": "Alarm Status Filter",
@@ -670,17 +670,17 @@
"add-asset-text": "Nieuw asset toevoegen",
"asset-details": "Details van het bedrijfsmiddel",
"assign-assets": "Middelen toewijzen",
- "assign-assets-text": "Wijs { count, plural, =1 {1 asset} andere {# assets} } toe aan de klant",
+ "assign-assets-text": "Wijs { count, plural, =1 {1 asset} other {# assets} } toe aan de klant",
"assign-asset-to-edge-title": "Asset(s) toewijzen aan Edge",
"assign-asset-to-edge-text": "Selecteer de assets die u aan de edge wilt toewijzen",
"delete-assets": "Assets verwijderen",
"unassign-assets": "Toewijzing van assets ongedaan maken",
- "unassign-assets-action-title": "Toewijzing { count, plural, =1 {1 asset} andere {# assets} } van klant ongedaan maken",
+ "unassign-assets-action-title": "Toewijzing { count, plural, =1 {1 asset} other {# assets} } van klant ongedaan maken",
"assign-new-asset": "Nieuw asset toewijzen",
"delete-asset-title": "Weet je zeker dat je de asset '{{assetName}}' wilt verwijderen?",
"delete-asset-text": "Opgelet, na de bevestiging worden de asset en alle gerelateerde gegevens onherstelbaar.",
- "delete-assets-title": "Weet u zeker dat u { count, plural, =1 {1 asset} andere {# assets} } wilt verwijderen?",
- "delete-assets-action-title": "Verwijder { count, plural, =1 {1 asset} andere {# assets} }",
+ "delete-assets-title": "Weet u zeker dat u { count, plural, =1 {1 asset} other {# assets} } wilt verwijderen?",
+ "delete-assets-action-title": "Verwijder { count, plural, =1 {1 asset} other {# assets} }",
"delete-assets-text": "Opgelet, na de bevestiging worden alle geselecteerde assets verwijderd en kunnen alle gerelateerde gegevens niet meer worden hersteld.",
"make-public-asset-title": "Weet je zeker dat je de asset '{{assetName}}' openbaar wilt maken?",
"make-public-asset-text": "Na de bevestiging worden de asset en alle bijbehorende gegevens openbaar en toegankelijk gemaakt voor anderen.",
@@ -689,7 +689,7 @@
"unassign-asset-title": "Weet je zeker dat je de toewijzing van de asset '{{assetName}}' ongedaan wilt maken?",
"unassign-asset-text": "Na de bevestiging wordt de toewijzing van de asset ongedaan gemaakt en is het niet toegankelijk voor de klant.",
"unassign-asset": "Toewijzing van asset ongedaan maken",
- "unassign-assets-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 asset} andere {# assets} } wilt opheffen?",
+ "unassign-assets-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 asset} other {# assets} } wilt opheffen?",
"unassign-assets-text": "Na de bevestiging worden alle geselecteerde assets ongedaan gemaakt en zijn ze niet toegankelijk voor de klant.",
"copyId": "Item-ID kopiëren",
"idCopiedMessage": "Item-ID is gekopieerd naar het klembord",
@@ -701,9 +701,9 @@
"search": "Assets zoeken",
"select-group-to-add": "Selecteer doelgroep om geselecteerde assets toe te voegen",
"select-group-to-move": "Selecteer de doelgroep om geselecteerde assets te verplaatsen",
- "remove-assets-from-group": "Weet je zeker dat je { count, plural, =1 {1 asset} andere {# assets} } uit groep '{{entityGroup}}' wilt verwijderen?",
+ "remove-assets-from-group": "Weet je zeker dat je { count, plural, =1 {1 asset} other {# assets} } uit groep '{{entityGroup}}' wilt verwijderen?",
"group": "Groep van assets",
- "list-of-groups": "{ count, plural, =1 {One asset group} andere {List of # asset groups} }",
+ "list-of-groups": "{ count, plural, =1 {One asset group} other {List of # asset groups} }",
"group-name-starts-with": "Asset groepen waarvan de naam begint met '{{prefix}}'",
"import": "Asset importeren",
"asset-file": "Asset bestand",
@@ -712,9 +712,9 @@
"unassign-asset-from-edge": "Toewijzing van asset ongedaan maken",
"unassign-asset-from-edge-title": "Weet je zeker dat je de toewijzing van de asset '{{assetName}}' ongedaan wilt maken?",
"unassign-asset-from-edge-text": "Na de bevestiging wordt de toewijzing van de asset ongedaan gemaakt en is het niet toegankelijk via de edge.",
- "unassign-assets-from-edge-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 asset} andere {# assets} } wilt opheffen?",
+ "unassign-assets-from-edge-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 asset} other {# assets} } wilt opheffen?",
"unassign-assets-from-edge-text": "Na de bevestiging worden alle geselecteerde assets ongedaan gemaakt en zijn ze niet toegankelijk via de edge.",
- "selected-assets": "{ count, plural, =1 {1 asset} andere {# assets} } geselecteerd"
+ "selected-assets": "{ count, plural, =1 {1 asset} other {# assets} } geselecteerd"
},
"attribute": {
"attributes": "Attributen",
@@ -732,7 +732,7 @@
"key-required": "Attribuutsleutel is vereist.",
"value": "Waarde",
"value-required": "Kenmerkwaarde is vereist.",
- "delete-attributes-title": "Weet u zeker dat u { count, plural, =1 {1 attribute} andere {# attributes} } wilt verwijderen?",
+ "delete-attributes-title": "Weet u zeker dat u { count, plural, =1 {1 attribute} other {# attributes} } wilt verwijderen?",
"delete-attributes-text": "Opgelet, na de bevestiging worden alle geselecteerde attributen verwijderd.",
"delete-attributes": "Attributen verwijderen",
"enter-attribute-value": "Kenmerkwaarde invoeren",
@@ -742,8 +742,8 @@
"prev-widget": "Vorige widget",
"add-to-dashboard": "Toevoegen aan dashboard",
"add-widget-to-dashboard": "Widget toevoegen aan dashboard",
- "selected-attributes": "{ count, plural, =1 {1 attribute} andere {# attributes} } geselecteerd",
- "selected-telemetry": "{ count, plural, =1 {1 telemetry unit} andere {# telemetry units} } geselecteerd",
+ "selected-attributes": "{ count, plural, =1 {1 attribute} other {# attributes} } geselecteerd",
+ "selected-telemetry": "{ count, plural, =1 {1 telemetry unit} other {# telemetry units} } geselecteerd",
"no-attributes-text": "Geen attributen gevonden",
"no-telemetry-text": "Geen telemetrie gevonden",
"copy-key": "Kopieer sleutel",
@@ -911,11 +911,11 @@
"management": "Beheer van dataconverters",
"add-converter-text": "Nieuwe gegevensconverter toevoegen",
"no-converters-text": "Geen dataconverters gevonden",
- "selected-converters": "{ count, plural, =1 {1 data converter} andere {# data converters} } geselecteerd",
+ "selected-converters": "{ count, plural, =1 {1 data converter} other {# data converters} } geselecteerd",
"delete-converter-title": "Weet u zeker dat u de dataconverter '{{converterName}}' wilt verwijderen?",
"delete-converter-text": "Opgelet, na de bevestiging worden de gegevensomzetter en alle gerelateerde gegevens onherstelbaar.",
- "delete-converters-title": "Weet u zeker dat u { count, plural, =1 {1 data converter} andere {# data converters} } wilt verwijderen?",
- "delete-converters-action-title": "Verwijder { count, plural, =1 {1 data converter} andere {# data converters} }",
+ "delete-converters-title": "Weet u zeker dat u { count, plural, =1 {1 data converter} other {# data converters} } wilt verwijderen?",
+ "delete-converters-action-title": "Verwijder { count, plural, =1 {1 data converter} other {# data converters} }",
"delete-converters-text": "Opgelet, na de bevestiging worden alle geselecteerde gegevensconverters verwijderd en kunnen alle gerelateerde gegevens niet meer worden hersteld.",
"events": "Events",
"add": "Gegevensconverter toevoegen",
@@ -1012,8 +1012,8 @@
"customer-details": "Klantgegevens",
"delete-customer-title": "Weet je zeker dat je de '{{customerTitle}}' van de klant wilt verwijderen?",
"delete-customer-text": "Let op, na de bevestiging worden de klant en alle gerelateerde gegevens onherstelbaar.",
- "delete-customers-title": "Weet u zeker dat u { count, plural, =1 {1 customer} andere {# customers} } wilt verwijderen?",
- "delete-customers-action-title": "Verwijder { count, plural, =1 {1 customer} andere {# customers} }",
+ "delete-customers-title": "Weet u zeker dat u { count, plural, =1 {1 customer} other {# customers} } wilt verwijderen?",
+ "delete-customers-action-title": "Verwijder { count, plural, =1 {1 customer} other {# customers} }",
"delete-customers-text": "Opgelet, na de bevestiging worden alle geselecteerde klanten verwijderd en kunnen alle gerelateerde gegevens niet meer worden hersteld.",
"manage-user-groups": "Gebruikersgroepen beheren",
"manage-asset-groups": "Asset groepen beheren",
@@ -1039,16 +1039,16 @@
"customer-required": "Klant is verplicht",
"select-group-to-add": "Selecteer doelgroep om geselecteerde klanten toe te voegen",
"select-group-to-move": "Selecteer doelgroep om geselecteerde klanten te verhuizen",
- "remove-customers-from-group": "Weet je zeker dat je { count, plural, =1 {1 customer} andere {# customers} } uit groep '{{entityGroup}}' wilt verwijderen?",
+ "remove-customers-from-group": "Weet je zeker dat je { count, plural, =1 {1 customer} other {# customers} } uit groep '{{entityGroup}}' wilt verwijderen?",
"group": "Groep klanten",
- "list-of-groups": "{ count, plural, =1 {One customer group} andere {List of # customer groups} }",
+ "list-of-groups": "{ count, plural, =1 {One customer group} other {List of # customer groups} }",
"group-name-starts-with": "Klantgroepen waarvan de naam begint met '{{prefix}}'",
"select-default-customer": "Selecteer standaardklant",
"default-customer": "Standaard klant",
"default-customer-required": "Standaardklant is vereist om fouten op te sporen in het dashboard op tenantniveau",
"allow-white-labeling": "White Labeling toestaan",
"search": "Klanten zoeken",
- "selected-customers": "{ count, plural, =1 {1 customer} andere {# customers} } geselecteerd",
+ "selected-customers": "{ count, plural, =1 {1 customer} other {# customers} } geselecteerd",
"edges": "Edge-instanties van de klant",
"manage-edges": "Edge beheren"
},
@@ -1125,20 +1125,20 @@
"add-dashboard-text": "Nieuw dashboard toevoegen",
"assign-dashboards": "Dashboards toewijzen",
"assign-new-dashboard": "Nieuw dashboard toewijzen",
- "assign-dashboards-text": "Wijs { count, plural, =1 {1 dashboard} andere {# dashboards} } toe aan klanten",
- "unassign-dashboards-action-text": "Toewijzing { count, plural, =1 {1 dashboard} andere {# dashboards} } van klanten ongedaan maken",
+ "assign-dashboards-text": "Wijs { count, plural, =1 {1 dashboard} other {# dashboards} } toe aan klanten",
+ "unassign-dashboards-action-text": "Toewijzing { count, plural, =1 {1 dashboard} other {# dashboards} } van klanten ongedaan maken",
"delete-dashboards": "Dashboards verwijderen",
"unassign-dashboards": "Toewijzing van dashboards ongedaan maken",
- "unassign-dashboards-action-title": "Toewijzing { count, plural, =1 {1 dashboard} andere {# dashboards} } van klant ongedaan maken",
+ "unassign-dashboards-action-title": "Toewijzing { count, plural, =1 {1 dashboard} other {# dashboards} } van klant ongedaan maken",
"delete-dashboard-title": "Weet je zeker dat je de '{{dashboardTitle}}' van het dashboard wilt verwijderen?",
"delete-dashboard-text": "Opgelet, na de bevestiging worden het dashboard en alle gerelateerde gegevens onherstelbaar.",
- "delete-dashboards-title": "Weet u zeker dat u { count, plural, =1 {1 dashboard} andere {# dashboards} } wilt verwijderen?",
- "delete-dashboards-action-title": "Verwijder { count, plural, =1 {1 dashboard} andere {# dashboards} }",
+ "delete-dashboards-title": "Weet u zeker dat u { count, plural, =1 {1 dashboard} other {# dashboards} } wilt verwijderen?",
+ "delete-dashboards-action-title": "Verwijder { count, plural, =1 {1 dashboard} other {# dashboards} }",
"delete-dashboards-text": "Opgelet, na de bevestiging worden alle geselecteerde dashboards verwijderd en worden alle gerelateerde gegevens onherstelbaar.",
"unassign-dashboard-title": "Weet u zeker dat u de toewijzing van het dashboard '{{dashboardTitle}}' wilt opheffen?",
"unassign-dashboard-text": "Na de bevestiging wordt de toewijzing van het dashboard ongedaan gemaakt en is het niet toegankelijk voor de klant.",
"unassign-dashboard": "Toewijzing dashboard ongedaan maken",
- "unassign-dashboards-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 dashboard} andere {# dashboards} } wilt opheffen?",
+ "unassign-dashboards-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 dashboard} other {# dashboards} } wilt opheffen?",
"unassign-dashboards-text": "Na de bevestiging worden alle geselecteerde dashboards ongedaan gemaakt en zijn ze niet toegankelijk voor de klant.",
"public-dashboard-title": "Dashboard is nu openbaar",
"public-dashboard-text": "De {{dashboardTitle}} van uw dashboard is nu openbaar en toegankelijk via de volgende openbare link:",
@@ -1242,7 +1242,7 @@
"manage-states": "Dashboardstatussen beheren",
"states": "Statussen van dashboards",
"search-states": "Statussen van zoekdashboard",
- "selected-states": "{ count, plural, =1 {1 dashboard state} andere {# dashboard states} } geselecteerd",
+ "selected-states": "{ count, plural, =1 {1 dashboard state} other {# dashboard states} } geselecteerd",
"edit-state": "Dashboardstatus bewerken",
"delete-state": "Dashboardstatus verwijderen",
"add-state": "Dashboardstatus toevoegen",
@@ -1261,17 +1261,17 @@
"select-state": "Selecteer de doelstatus",
"state-controller": "Controle van de staat",
"search": "Dashboards doorzoeken",
- "selected-dashboards": "{ count, plural, =1 {1 dashboard} andere {# dashboards} } geselecteerd",
+ "selected-dashboards": "{ count, plural, =1 {1 dashboard} other {# dashboards} } geselecteerd",
"home-dashboard": "Startpagina dashboard",
"home-dashboard-hide-toolbar": "Verberg de werkbalk van het startdashboard",
"select-group-to-add": "Selecteer doelgroep om geselecteerde dashboards toe te voegen",
"select-group-to-move": "Selecteer de doelgroep om geselecteerde dashboards te verplaatsen",
- "remove-dashboards-from-group": "Weet je zeker dat je { count, plural, =1 {1 dashboard} andere {# dashboards} } uit groep '{{entityGroup}}' wilt verwijderen?",
+ "remove-dashboards-from-group": "Weet je zeker dat je { count, plural, =1 {1 dashboard} other {# dashboards} } uit groep '{{entityGroup}}' wilt verwijderen?",
"group": "Groep dashboards",
- "list-of-groups": "{ count, plural, =1 {One dashboard group} andere {List of # dashboard groups} }",
+ "list-of-groups": "{ count, plural, =1 {One dashboard group} other {List of # dashboard groups} }",
"group-name-starts-with": "Dashboardgroepen waarvan de naam begint met '{{prefix}}'",
"unassign-dashboard-from-edge-text": "Na de bevestiging wordt de toewijzing van het dashboard ongedaan gemaakt en is het niet toegankelijk voor de edge.",
- "unassign-dashboards-from-edge-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 dashboard} andere {# dashboards} } wilt opheffen?",
+ "unassign-dashboards-from-edge-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 dashboard} other {# dashboards} } wilt opheffen?",
"unassign-dashboards-from-edge-text": "Na de bevestiging worden alle geselecteerde dashboards ongedaan gemaakt en zijn ze niet toegankelijk voor de edge.",
"assign-dashboard-to-edge": "Dashboard(s) toewijzen aan Edge",
"assign-dashboard-to-edge-text": "Selecteer de dashboards die u aan de edge wilt toewijzen",
@@ -1294,7 +1294,7 @@
"timeseries-required": "Timeseries van entiteiten zijn vereist.",
"timeseries-or-attributes-required": "Timeseries/attributen van entiteiten zijn vereist.",
"alarm-fields-timeseries-or-attributes-required": "Alarmvelden of tijdreeksen/attributen van entiteiten zijn vereist.",
- "maximum-timeseries-or-attributes": "Maximaal { count, plural, =1 {1 timeseries/attribute is allowed.} andere {# timeseries/attributes are allowed} }",
+ "maximum-timeseries-or-attributes": "Maximaal { count, plural, =1 {1 timeseries/attribute is allowed.} other {# timeseries/attributes are allowed} }",
"alarm-fields-required": "Alarmvelden zijn verplicht.",
"function-types": "Soorten functies",
"function-type": "Soort functie",
@@ -1311,7 +1311,7 @@
"timeseries-key": "Gegevenssleutel tijdreeksen",
"timeseries-key-functions": "Timeseries belangrijkste functies",
"timeseries-key-function": "Tijdreeks-sleutelfunctie",
- "maximum-function-types": "Maximaal { count, plural, =1 {1 function type is allowed.} andere {# function types are allowed} }",
+ "maximum-function-types": "Maximaal { count, plural, =1 {1 function type is allowed.} other {# function types are allowed} }",
"time-description": "tijdstempel van de huidige waarde;",
"value-description": "de huidige waarde;",
"prev-value-description": "resultaat van de vorige functieaanroep;",
@@ -1392,11 +1392,11 @@
"manage-credentials": "Inloggegevens beheren",
"delete": "Device verwijderen",
"assign-devices": "Devices toewijzen",
- "assign-devices-text": "Wijs { count, plural, =1 {1 device} andere {# devices} } toe aan de klant",
+ "assign-devices-text": "Wijs { count, plural, =1 {1 device} other {# devices} } toe aan de klant",
"delete-devices": "Devices verwijderen",
"unassign-from-customer": "Toewijzing van klant ongedaan maken",
"unassign-devices": "Toewijzing van devices ongedaan maken",
- "unassign-devices-action-title": "Toewijzing { count, plural, =1 {1 device} andere {# devices} } van klant ongedaan maken",
+ "unassign-devices-action-title": "Toewijzing { count, plural, =1 {1 device} other {# devices} } van klant ongedaan maken",
"unassign-device-from-edge-title": "Weet u zeker dat u de toewijzing van het device '{{deviceName}}' wilt opheffen?",
"unassign-device-from-edge-text": "Na de bevestiging wordt de toewijzing van het device ongedaan gemaakt en is het niet toegankelijk via de edge.",
"unassign-devices-from-edge": "Toewijzing van devices aan de edge ongedaan maken",
@@ -1408,13 +1408,13 @@
"view-credentials": "Inloggegevens bekijken",
"delete-device-title": "Weet u zeker dat u de '{{deviceName}}' van het device wilt verwijderen?",
"delete-device-text": "Opgelet, na de bevestiging worden het device en alle gerelateerde gegevens onherstelbaar.",
- "delete-devices-title": "Weet u zeker dat u { count, plural, =1 {1 device} andere {# devices} } wilt verwijderen?",
- "delete-devices-action-title": "Verwijder { count, plural, =1 {1 device} andere {# devices} }",
+ "delete-devices-title": "Weet u zeker dat u { count, plural, =1 {1 device} other {# devices} } wilt verwijderen?",
+ "delete-devices-action-title": "Verwijder { count, plural, =1 {1 device} other {# devices} }",
"delete-devices-text": "Opgelet, na de bevestiging worden alle geselecteerde devices verwijderd en kunnen alle gerelateerde gegevens niet meer worden hersteld.",
"unassign-device-title": "Weet u zeker dat u de toewijzing van het device '{{deviceName}}' wilt opheffen?",
"unassign-device-text": "Na de bevestiging wordt de toewijzing van het device ongedaan gemaakt en is het niet toegankelijk voor de klant.",
"unassign-device": "Toewijzing van device ongedaan maken",
- "unassign-devices-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 device} andere {# devices} } wilt opheffen?",
+ "unassign-devices-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 device} other {# devices} } wilt opheffen?",
"unassign-devices-text": "Na de bevestiging worden alle geselecteerde devices ongedaan gemaakt en zijn ze niet toegankelijk voor de klant.",
"device-credentials": "Inloggegevens van het device",
"loading-device-credentials": "Devicereferenties worden geladen...",
@@ -1511,14 +1511,14 @@
"select-device": "Selecteer device",
"select-group-to-add": "Selecteer de doelgroep om geselecteerde devices toe te voegen",
"select-group-to-move": "Selecteer de doelgroep om geselecteerde devices te verplaatsen",
- "remove-devices-from-group": "Weet je zeker dat je { count, plural, =1 {1 device} andere {# devices} } uit groep '{{entityGroup}}' wilt verwijderen?",
+ "remove-devices-from-group": "Weet je zeker dat je { count, plural, =1 {1 device} other {# devices} } uit groep '{{entityGroup}}' wilt verwijderen?",
"group": "Device groep",
- "list-of-groups": "{ count, plural, =1 {One device group} andere {List of # device groups} }",
+ "list-of-groups": "{ count, plural, =1 {One device group} other {List of # device groups} }",
"group-name-starts-with": "Asset groepen waarvan de naam begint met '{{prefix}}'",
"import": "Device importeren",
"device-file": "Device bestand",
"search": "Devices zoeken",
- "selected-devices": "{ count, plural, =1 {1 device} andere {# devices} } geselecteerd",
+ "selected-devices": "{ count, plural, =1 {1 device} other {# devices} } geselecteerd",
"device-configuration": "Configuratie van het device",
"transport-configuration": "Configuratie van het transport",
"wizard": {
@@ -1530,7 +1530,7 @@
"customer-to-assign-device": "Klant om het device toe te wijzen",
"add-credentials": "Inloggegevens toevoegen"
},
- "unassign-devices-from-edge-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 device} andere {# devices} } wilt opheffen?",
+ "unassign-devices-from-edge-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 device} other {# devices} } wilt opheffen?",
"unassign-devices-from-edge-text": "Na de bevestiging worden alle geselecteerde devices ongedaan gemaakt en zijn ze niet toegankelijk via de edge."
},
"asset-profile": {
@@ -1542,7 +1542,7 @@
"asset-profile-details": "Details van de asset profiel",
"no-asset-profiles-text": "Geen assetprofielen gevonden",
"search": "Assetprofielen zoeken",
- "selected-asset-profiles": "{ count, plural, =1 {1 asset profile} andere {# asset profiles} } geselecteerd",
+ "selected-asset-profiles": "{ count, plural, =1 {1 asset profile} other {# asset profiles} } geselecteerd",
"no-asset-profiles-matching": "Er zijn geen asset profielen gevonden die overeenkomen met '{{entity}}'.",
"asset-profile-required": "Asset profiel is vereist",
"idCopiedMessage": "De ID van het itemprofiel is gekopieerd naar het klembord",
@@ -1565,7 +1565,7 @@
"select-queue-hint": "Maak een keuze uit een vervolgkeuzelijst.",
"delete-asset-profile-title": "Weet je zeker dat je de asset profiel '{{assetProfileName}}' wilt verwijderen?",
"delete-asset-profile-text": "Let op, na de bevestiging worden de asset profiel en alle gerelateerde gegevens onherstelbaar.",
- "delete-asset-profiles-title": "Weet u zeker dat u { count, plural, =1 {1 asset profile} andere {# asset profiles} } wilt verwijderen?",
+ "delete-asset-profiles-title": "Weet u zeker dat u { count, plural, =1 {1 asset profile} other {# asset profiles} } wilt verwijderen?",
"delete-asset-profiles-text": "Opgelet, na de bevestiging worden alle geselecteerde asset profielen verwijderd en worden alle gerelateerde gegevens onherstelbaar.",
"set-default-asset-profile-title": "Weet u zeker dat u de asset profiel standaard op '{{assetProfileName}}' wilt zetten?",
"set-default-asset-profile-text": "Na de bevestiging wordt de asset profiel gemarkeerd als standaard en wordt het gebruikt voor nieuwe asset waarvoor geen profiel is opgegeven.",
@@ -1587,7 +1587,7 @@
"device-profile-details": "Details van device profiel",
"no-device-profiles-text": "Geen device profielen gevonden",
"search": "Device profielen zoeken",
- "selected-device-profiles": "{ count, plural, =1 {1 device profile} andere {# device profiles} } geselecteerd",
+ "selected-device-profiles": "{ count, plural, =1 {1 device profile} other {# device profiles} } geselecteerd",
"no-device-profiles-matching": "Er zijn geen device profielen gevonden die overeenkomen met '{{entity}}'.",
"device-profile-required": "Device profiel is vereist",
"idCopiedMessage": "Device profiel-ID is gekopieerd naar klembord",
@@ -1627,7 +1627,7 @@
"select-queue-hint": "Maak een keuze uit een vervolgkeuzelijst.",
"delete-device-profile-title": "Weet u zeker dat u het device profiel '{{deviceProfileName}}' wilt verwijderen?",
"delete-device-profile-text": "Opgelet, na de bevestiging worden het device profiel en alle gerelateerde gegevens, inclusief bijbehorende OTA-updates, onherstelbaar.",
- "delete-device-profiles-title": "Weet u zeker dat u { count, plural, =1 {1 device profile} andere {# device profiles} } wilt verwijderen?",
+ "delete-device-profiles-title": "Weet u zeker dat u { count, plural, =1 {1 device profile} other {# device profiles} } wilt verwijderen?",
"delete-device-profiles-text": "Opgelet, na de bevestiging worden alle geselecteerde device profielen verwijderd en kunnen alle gerelateerde gegevens, inclusief bijbehorende OTA-updates, niet meer worden hersteld.",
"set-default-device-profile-title": "Weet u zeker dat u het device profiel standaard '{{deviceProfileName}}' wilt maken?",
"set-default-device-profile-text": "Na de bevestiging wordt het device profiel als standaard gemarkeerd en wordt het gebruikt voor nieuwe devices waarvoor geen profiel is opgegeven.",
@@ -1713,9 +1713,10 @@
"condition-duration-value-required": "Duurwaarde is vereist.",
"condition-duration-time-unit-required": "Tijdseenheid is vereist.",
"advanced-settings": "Geavanceerde instellingen",
- "alarm-rule-details": "Details",
- "alarm-rule-details-hint": "Tip: gebruik ${keyName} om waarden van de attribuut- of telemetriesleutels te vervangen die worden gebruikt in de alarmregelvoorwaarde.",
- "add-alarm-rule-details": "Voeg details toe",
+ "alarm-rule-additional-info": "Extra info",
+ "edit-alarm-rule-additional-info": "Extra informatie bewerken",
+ "alarm-rule-additional-info-placeholder": "Geef hier uw opmerkingen en aanpassingen op om ze weer te geven in Alarmdetails onder Extra info",
+ "alarm-rule-additional-info-hint": "Tip: gebruik ${keyName} om waarden van de attribuut- of telemetriesleutels te vervangen die worden gebruikt in de alarmregelvoorwaarde.",
"alarm-rule-mobile-dashboard": "Mobiel dashboard",
"alarm-rule-mobile-dashboard-hint": "Gebruikt door mobiele applicatie als dashboard met alarmdetails",
"alarm-rule-no-mobile-dashboard": "Geen dashboard geselecteerd",
@@ -1725,7 +1726,6 @@
"propagate-alarm-to-owner": "Alarm doorgeven aan entiteitseigenaar (klant of tenant)",
"propagate-alarm-to-owner-hierarchy": "Alarm doorgeven aan de hiërarchie van entiteitseigenaren",
"propagate-alarm-to-tenant": "Alarm doorgeven aan tenant",
- "alarm-details": "Details van het alarm",
"alarm-rule-condition": "Voorwaarde van de alarmregel",
"enter-alarm-rule-condition-prompt": "Voeg de voorwaarde van de alarmregel toe",
"edit-alarm-rule-condition": "Voorwaarde van de alarmregel bewerken",
@@ -1766,8 +1766,8 @@
"condition-repeating-value-range": "Het aantal gebeurtenissen moet tussen 1 en 2147483647 liggen.",
"condition-repeating-value-pattern": "Het aantal gebeurtenissen moet gehele getallen zijn.",
"condition-repeating-value-required": "Het aantal gebeurtenissen is vereist.",
- "condition-repeat-times": "Herhalingen { count, plural, =1 {1 time} andere {# times} }",
- "condition-repeat-times-dynamic": "Herhaalt \"{ attribute }\" ({ count, plural, =1 {1 time} andere {# times} })",
+ "condition-repeat-times": "Herhalingen { count, plural, =1 {1 time} other {# times} }",
+ "condition-repeat-times-dynamic": "Herhaalt \"{ attribute }\" ({ count, plural, =1 {1 time} other {# times} })",
"schedule-type": "Type planner",
"schedule-type-required": "Het type planner is vereist.",
"schedule": "Rooster",
@@ -2015,7 +2015,7 @@
"delete": "Edge verwijderen",
"delete-edge-title": "Weet je zeker dat je de edge '{{edgeName}}' wilt verwijderen?",
"delete-edge-text": "Opgelet, na de bevestiging worden de edge en alle gerelateerde gegevens onherstelbaar.",
- "delete-edges-title": "Weet je zeker dat je { count, plural, =1 {1 edge} andere {# edges} } wilt bevoordelen?",
+ "delete-edges-title": "Weet je zeker dat je { count, plural, =1 {1 edge} other {# edges} } wilt bevoordelen?",
"delete-edges-text": "Opgelet, na de bevestiging worden alle geselecteerde edges verwijderd en kunnen alle gerelateerde gegevens niet meer worden hersteld.",
"name": "Naam",
"name-starts-with": "Edge naam begint met",
@@ -2050,7 +2050,7 @@
"unassign-from-customer": "Toewijzing van klant ongedaan maken",
"unassign-edge-title": "Weet u zeker dat u de toewijzing van de edge '{{edgeName}}' wilt opheffen?",
"unassign-edge-text": "Na de bevestiging wordt de toewijzing van de edge ongedaan gemaakt en is deze niet toegankelijk voor de klant.",
- "unassign-edges-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 edge} andere {# edges} } wilt opheffen?",
+ "unassign-edges-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 edge} other {# edges} } wilt opheffen?",
"unassign-edges-text": "Na de bevestiging worden alle geselecteerde edges ongedaan gemaakt en zijn ze niet toegankelijk voor de klant.",
"make-public": "Edge openbaar maken",
"make-public-edge-title": "Weet je zeker dat je de edge '{{edgeName}}' openbaar wilt maken?",
@@ -2090,7 +2090,7 @@
"rulechains": "Edge rule chains",
"integrations": "Integraties",
"search": "Edge zoeken",
- "selected-edges": "{ count, plural, =1 {1 edge} andere {# edges} } geselecteerd",
+ "selected-edges": "{ count, plural, =1 {1 edge} other {# edges} } geselecteerd",
"any-edge": "Elke edge",
"no-edge-types-matching": "Er zijn geen edge typen gevonden die overeenkomen met '{{entitySubtype}}'.",
"edge-type-list-empty": "Geen edge typen geselecteerd.",
@@ -2116,9 +2116,9 @@
"manage-edge-scheduler-events": "Edge-scheduler events beheren",
"select-group-to-add": "Selecteer de doelgroep om geselecteerde edges toe te voegen",
"select-group-to-move": "Selecteer de doelgroep om geselecteerde edges te verplaatsen",
- "remove-edges-from-group": "Weet je zeker dat je { count, plural, =1 {1 edge} andere {# edges} } uit groep '{entityGroup}' wilt verwijderen?",
+ "remove-edges-from-group": "Weet je zeker dat je { count, plural, =1 {1 edge} other {# edges} } uit groep '{entityGroup}' wilt verwijderen?",
"group": "Groep edges",
- "list-of-groups": "{ count, plural, =1 {One edge group} andere {List of # edge groups} }",
+ "list-of-groups": "{ count, plural, =1 {One edge group} other {List of # edge groups} }",
"group-name-starts-with": "Edge-groepen waarvan de naam begint met '{{prefix}}'",
"unassign-entity-group-from-edge-title": "Weet u zeker dat u de toewijzing van de entiteitsgroep '{{ entityGroupName }}' wilt opheffen?",
"unassign-entity-group-from-edge-text": "Na de bevestiging wordt de toewijzing van de entiteitsgroep ongedaan gemaakt en is deze niet toegankelijk via de edge.",
@@ -2129,7 +2129,7 @@
"unassign-scheduler-events-from-edge": "Toewijzing van scheduler events van edge ongedaan maken",
"unassign-scheduler-event-from-edge-title": "Weet u zeker dat u de toewijzing van de '{{schedulerEventName}}' van de planningsgebeurtenis wilt intrekken?",
"unassign-scheduler-event-from-edge-text": "Na de bevestiging wordt de toewijzing van de planningsgebeurtenis ongedaan gemaakt en is deze niet toegankelijk via de edge.",
- "unassign-scheduler-events-from-edge-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 scheduler event} andere {# scheduler events} } wilt opheffen?",
+ "unassign-scheduler-events-from-edge-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 scheduler event} other {# scheduler events} } wilt opheffen?",
"unassign-scheduler-events-from-edge-text": "Na de bevestiging worden alle geselecteerde scheduler events ongedaan gemaakt en zijn ze niet toegankelijk voor de edge.",
"manage-user-groups": "Gebruikersgroepen beheren",
"manage-asset-groups": "Asset groepen beheren",
@@ -2249,71 +2249,71 @@
"type-required": "Entiteitstype is vereist.",
"type-device": "Device",
"type-devices": "Devices",
- "list-of-devices": "{ count, plural, =1 {One device} andere {List of # devices} }",
+ "list-of-devices": "{ count, plural, =1 {One device} other {List of # devices} }",
"device-name-starts-with": "Devices waarvan de naam begint met '{{prefix}}'",
"type-device-profile": "Device profiel",
"type-device-profiles": "Device profielen",
- "list-of-device-profiles": "{ count, plural, =1 {One device profile} andere {List of # device profiles} }",
+ "list-of-device-profiles": "{ count, plural, =1 {One device profile} other {List of # device profiles} }",
"device-profile-name-starts-with": "Device profielen waarvan de naam begint met '{{prefix}}'",
"type-asset-profile": "Asset profiel",
"type-asset-profiles": "Asset profielen",
- "list-of-asset-profiles": "{ count, plural, =1 {One asset profile} andere {List of # asset profiles} }",
+ "list-of-asset-profiles": "{ count, plural, =1 {One asset profile} other {List of # asset profiles} }",
"asset-profile-name-starts-with": "Assetprofielen waarvan de naam begint met '{{prefix}}'",
"type-asset": "Asset",
"type-assets": "Assets",
- "list-of-assets": "{ count, plural, =1 {One asset} andere {List of # assets} }",
+ "list-of-assets": "{ count, plural, =1 {One asset} other {List of # assets} }",
"asset-name-starts-with": "Assets waarvan de naam begint met '{{prefix}}'",
"type-entity-view": "Entiteit Weergave",
"type-entity-views": "Entiteitsweergaven",
- "list-of-entity-views": "{ count, plural, =1 {One entity view} andere {List of # entity views} }",
+ "list-of-entity-views": "{ count, plural, =1 {One entity view} other {List of # entity views} }",
"entity-view-name-starts-with": "Entiteitsweergaven waarvan de naam begint met '{{prefix}}'",
"type-rule": "Regel",
"type-rules": "Reglement",
- "list-of-rules": "{ count, plural, =1 {One rule} andere {List of # rules} }",
+ "list-of-rules": "{ count, plural, =1 {One rule} other {List of # rules} }",
"rule-name-starts-with": "Regels waarvan de naam begint met '{{prefix}}'",
"type-plugin": "Plug-in",
"type-plugins": "Insteekplaatsen",
- "list-of-plugins": "{ count, plural, =1 {One plugin} andere {List of # plugins} }",
+ "list-of-plugins": "{ count, plural, =1 {One plugin} other {List of # plugins} }",
"plugin-name-starts-with": "Plug-ins waarvan de naam begint met '{{prefix}}'",
"type-tenant": "Tenant",
"type-tenants": "Tenants",
- "list-of-tenants": "{ count, plural, =1 {One tenant} andere {List of # tenants} }",
+ "list-of-tenants": "{ count, plural, =1 {One tenant} other {List of # tenants} }",
"tenant-name-starts-with": "Tenants van wie de naam begint met '{{prefix}}'",
"type-tenant-profile": "Profiel van de tenant",
"type-tenant-profiles": "Profielen van tenants",
- "list-of-tenant-profiles": "{ count, plural, =1 {One tenant profile} andere {List of # tenant profiles} }",
+ "list-of-tenant-profiles": "{ count, plural, =1 {One tenant profile} other {List of # tenant profiles} }",
"tenant-profile-name-starts-with": "Tentant profielen waarvan de naam begint met '{{prefix}}'",
"type-customer": "Klant",
"type-customers": "Klanten",
- "list-of-customers": "{ count, plural, =1 {One customer} andere {List of # customers} }",
+ "list-of-customers": "{ count, plural, =1 {One customer} other {List of # customers} }",
"customer-name-starts-with": "Klanten van wie de naam begint met '{{prefix}}'",
"type-user": "Gebruiker",
"type-users": "Gebruikers",
- "list-of-users": "{ count, plural, =1 {One user} andere {List of # users} }",
+ "list-of-users": "{ count, plural, =1 {One user} other {List of # users} }",
"user-name-starts-with": "Gebruikers van wie de naam begint met '{{prefix}}'",
"type-dashboard": "Dashboard",
"type-dashboards": "Dashboards",
- "list-of-dashboards": "{ count, plural, =1 {One dashboard} andere {List of # dashboards} }",
+ "list-of-dashboards": "{ count, plural, =1 {One dashboard} other {List of # dashboards} }",
"dashboard-name-starts-with": "Dashboards waarvan de naam begint met '{{prefix}}'",
"type-alarm": "Alarm",
"type-alarms": "Alarmen",
- "list-of-alarms": "{ count, plural, =1 {One alarm} andere {List of # alarms} }",
+ "list-of-alarms": "{ count, plural, =1 {One alarm} other {List of # alarms} }",
"alarm-name-starts-with": "Alarmen waarvan de naam begint met '{{prefix}}'",
"type-rulechain": "Rule chains",
"type-rulechains": "Rule chains",
- "list-of-rulechains": "{ count, plural, =1 {One rule chain} andere {List of # rule chains} }",
+ "list-of-rulechains": "{ count, plural, =1 {One rule chain} other {List of # rule chains} }",
"rulechain-name-starts-with": "Rule chains waarvan de naam begint met '{{prefix}}'",
"type-scheduler-event": "Scheduler-event",
"type-scheduler-events": "Scheduler-events",
- "list-of-scheduler-events": "{ count, plural, =1 {One scheduler event} andere {List of # scheduler events} }",
+ "list-of-scheduler-events": "{ count, plural, =1 {One scheduler event} other {List of # scheduler events} }",
"scheduler-event-name-starts-with": "Scheduler-events waarvan de naam begint met '{{prefix}}'",
"type-blob-entity": "Blob-entiteit",
"type-blob-entities": "Blob-entiteiten",
- "list-of-blob-entities": "{ count, plural, =1 {One blob entity} andere {List of # blob entities} }",
+ "list-of-blob-entities": "{ count, plural, =1 {One blob entity} other {List of # blob entities} }",
"blob-entity-name-starts-with": "Blob-entiteiten waarvan de naam begint met '{{prefix}}'",
"type-rulenode": "Rule node",
"type-rulenodes": "Rule nodes",
- "list-of-rulenodes": "{ count, plural, =1 {One rule node} andere {List of # rule nodes} }",
+ "list-of-rulenodes": "{ count, plural, =1 {One rule node} other {List of # rule nodes} }",
"rulenode-name-starts-with": "Rule node waarvan de naam begint met '{{prefix}}'",
"type-current-customer": "Huidige klant",
"type-current-tenant": "Huidige tenant",
@@ -2321,9 +2321,9 @@
"type-current-user-owner": "Huidige gebruikerseigenaar",
"type-widgets-bundle": "Widgets bundel",
"type-widgets-bundles": "Widgets bundels",
- "list-of-widgets-bundles": "{ count, plural, =1 {One widgets bundle} andere {List of # widget bundles} }",
+ "list-of-widgets-bundles": "{ count, plural, =1 {One widgets bundle} other {List of # widget bundles} }",
"search": "Entiteiten zoeken",
- "selected-entities": "{ count, plural, =1 {1 entity} andere {# entities} } geselecteerd",
+ "selected-entities": "{ count, plural, =1 {1 entity} other {# entities} } geselecteerd",
"entity-name": "Naam van de entiteit",
"entity-label": "Entiteitslabel",
"details": "Gegevens van de entiteit",
@@ -2334,20 +2334,20 @@
"type-entity-group": "Entiteitsgroep",
"type-converter": "Gegevens converteren",
"type-converters": "Data-converters",
- "list-of-converters": "{ count, plural, =1 {One data converter} andere {List of # data converters} }",
+ "list-of-converters": "{ count, plural, =1 {One data converter} other {List of # data converters} }",
"converter-name-starts-with": "Dataconverters waarvan de naam begint met \"{{prefix}}\"",
"type-integration": "Integratie",
"type-integrations": "Integraties",
- "list-of-integrations": "{ count, plural, =1 {One integration} andere {List of # integrations} }",
+ "list-of-integrations": "{ count, plural, =1 {One integration} other {List of # integrations} }",
"integration-name-starts-with": "Integraties waarvan de naam begint met '{{prefix}}'",
"type-role": "Rol",
"type-roles": "Rollen",
- "list-of-roles": "{ count, plural, =1 {One role} andere {List of # roles} }",
+ "list-of-roles": "{ count, plural, =1 {One role} other {List of # roles} }",
"role-name-starts-with": "Rollen waarvan de naam begint met '{{prefix}}'",
"type-group-permission": "Toestemming voor groepen",
"type-edge": "Edge",
"type-edges": "Edge",
- "list-of-edges": "{ count, plural, =1 {One edge} andere {List of # edges} }",
+ "list-of-edges": "{ count, plural, =1 {One edge} other {List of # edges} }",
"edge-name-starts-with": "Edge waarvan de naam begint met '{{prefix}}'",
"type-tb-resource": "Hulpbron",
"type-ota-package": "OTA-pakket",
@@ -2394,12 +2394,12 @@
"add-entity-group-text": "Nieuwe entiteitsgroep toevoegen",
"no-entity-groups-text": "Geen entiteitsgroepen gevonden",
"entity-group-details": "Details van entiteitsgroep",
- "selected-entity-groups": "{ count, plural, =1 {1 entity group} andere {# entity groups} } geselecteerd",
+ "selected-entity-groups": "{ count, plural, =1 {1 entity group} other {# entity groups} } geselecteerd",
"delete-entity-groups": "Entiteitsgroepen verwijderen",
"delete-entity-group-title": "Weet u zeker dat u de entiteitsgroep '{{entityGroupName}}' wilt verwijderen?",
"delete-entity-group-text": "Let op, na de bevestiging worden de entiteitsgroep en alle gerelateerde gegevens onherstelbaar.",
- "delete-entity-groups-title": "Weet u zeker dat u { count, plural, =1 {1 entity group} andere {# entity groups} } wilt verwijderen?",
- "delete-entity-groups-action-title": "Verwijder { count, plural, =1 {1 entity group} andere {# entity groups} }",
+ "delete-entity-groups-title": "Weet u zeker dat u { count, plural, =1 {1 entity group} other {# entity groups} } wilt verwijderen?",
+ "delete-entity-groups-action-title": "Verwijder { count, plural, =1 {1 entity group} other {# entity groups} }",
"delete-entity-groups-text": "Opgelet, na de bevestiging worden alle geselecteerde entiteitsgroepen verwijderd en kunnen alle gerelateerde gegevens niet meer worden hersteld.",
"device-groups": "Asset groepen",
"shared-device-groups": "Groepen met gedeelde devices",
@@ -2466,7 +2466,7 @@
"select-target-owner": "Selecteer doeleigenaar",
"no-owners-matching": "Er zijn geen eigenaren gevonden die overeenkomen met '{{owner}}'.",
"target-owner-required": "Doeleigenaar is vereist.",
- "confirm-change-owner-title": "Weet u zeker dat u van eigenaar wilt veranderen voor { count, plural, =1 {1 selected entity} andere {# selected entities} }?",
+ "confirm-change-owner-title": "Weet u zeker dat u van eigenaar wilt veranderen voor { count, plural, =1 {1 selected entity} other {# selected entities} }?",
"confirm-change-owner-text": "Opgelet, na de bevestiging worden alle geselecteerde entiteiten verwijderd van de huidige eigenaar en worden ze geplaatst in de groep 'Alle' van de doeleigenaar.",
"add-to-group": "Toevoegen aan groep",
"move-to-group": "Verplaatsen naar groep",
@@ -2590,18 +2590,18 @@
"add-entity-view-text": "Nieuwe entiteitsweergave toevoegen",
"delete": "Entiteitsweergave verwijderen",
"assign-entity-views": "Entiteitsweergaven toewijzen",
- "assign-entity-views-text": "Wijs { count, plural, =1 {1 entity view} andere {# entity views} } toe aan de klant",
+ "assign-entity-views-text": "Wijs { count, plural, =1 {1 entity view} other {# entity views} } toe aan de klant",
"delete-entity-views": "Entiteitsweergaven verwijderen",
"make-public": "Entiteitsweergave openbaar maken",
"make-private": "Entiteitsweergave privé maken",
"unassign-from-customer": "Toewijzing van klant ongedaan maken",
"unassign-entity-views": "Toewijzing van entiteitsweergaven intrekken",
- "unassign-entity-views-action-title": "Toewijzing { count, plural, =1 {1 entity view} andere {# entity views} } van klant ongedaan maken",
+ "unassign-entity-views-action-title": "Toewijzing { count, plural, =1 {1 entity view} other {# entity views} } van klant ongedaan maken",
"assign-new-entity-view": "Nieuwe entiteitsweergave toewijzen",
"delete-entity-view-title": "Weet u zeker dat u de entiteitsweergave '{{entityViewName}}' wilt verwijderen?",
"delete-entity-view-text": "Opgelet, na de bevestiging worden de entiteitsweergave en alle gerelateerde gegevens onherstelbaar.",
- "delete-entity-views-title": "Weet u zeker dat u { count, plural, =1 {1 entity view} andere {# entity views} } wilt verwijderen?",
- "delete-entity-views-action-title": "Verwijder { count, plural, =1 {1 entity view} andere {# entity views} }",
+ "delete-entity-views-title": "Weet u zeker dat u { count, plural, =1 {1 entity view} other {# entity views} } wilt verwijderen?",
+ "delete-entity-views-action-title": "Verwijder { count, plural, =1 {1 entity view} other {# entity views} }",
"delete-entity-views-text": "Opgelet, na de bevestiging worden alle geselecteerde entiteitsweergaven verwijderd en kunnen alle gerelateerde gegevens niet meer worden hersteld.",
"make-public-entity-view-title": "Weet u zeker dat u de entiteitsweergave '{{entityViewName}}' openbaar wilt maken?",
"make-public-entity-view-text": "Na de bevestiging worden de entiteitsweergave en al haar gegevens openbaar en toegankelijk gemaakt voor anderen.",
@@ -2610,7 +2610,7 @@
"unassign-entity-view-title": "Weet u zeker dat u de toewijzing van de entiteitsweergave '{{entityViewName}}' wilt opheffen?",
"unassign-entity-view-text": "Na de bevestiging wordt de toewijzing van de entiteitsweergave ongedaan gemaakt en is deze niet toegankelijk voor de klant.",
"unassign-entity-view": "Toewijzing van entiteitsweergave ongedaan maken",
- "unassign-entity-views-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 entity view} andere {# entity views} } wilt opheffen?",
+ "unassign-entity-views-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 entity view} other {# entity views} } wilt opheffen?",
"unassign-entity-views-text": "Na de bevestiging worden alle geselecteerde entiteitsweergaven ongedaan gemaakt en zijn ze niet toegankelijk voor de klant.",
"entity-view-type": "Type entiteitsweergave",
"entity-view-type-required": "Het type Entiteitsweergave is vereist.",
@@ -2654,19 +2654,19 @@
"timeseries-data-hint": "Configureer timeseries sleutels van de doelentiteit die toegankelijk zijn voor de entiteitsweergave. Deze timeseries gegevens zijn niet editeerbaar.",
"select-group-to-add": "Selecteer de doelgroep om geselecteerde entiteitsweergaven toe te voegen",
"select-group-to-move": "Selecteer de doelgroep om geselecteerde entiteitsweergaven te verplaatsen",
- "remove-entity-views-from-group": "Weet je zeker dat je { count, plural, =1 {1 entity view} andere {# entity views} } uit groep '{{entityGroup}}' wilt verwijderen?",
+ "remove-entity-views-from-group": "Weet je zeker dat je { count, plural, =1 {1 entity view} other {# entity views} } uit groep '{{entityGroup}}' wilt verwijderen?",
"group": "Groep entiteitsweergaven",
- "list-of-groups": "{ count, plural, =1 {One entity view group} andere {List of # entity view groups} }",
+ "list-of-groups": "{ count, plural, =1 {One entity view group} other {List of # entity view groups} }",
"group-name-starts-with": "Entiteitsweergavegroepen waarvan de naam begint met '{{prefix}}'",
"search": "Entiteitsweergaven zoeken",
- "selected-entity-views": "{ count, plural, =1 {1 entity view} andere {# entity views} } geselecteerd",
+ "selected-entity-views": "{ count, plural, =1 {1 entity view} other {# entity views} } geselecteerd",
"assign-entity-view-to-edge": "Entiteitsweergave(n) toewijzen aan edge",
"assign-entity-view-to-edge-text": "Selecteer de entiteitsweergaven die u aan de edge wilt toewijzen",
"unassign-entity-view-from-edge-title": "Weet u zeker dat u de toewijzing van de entiteitsweergave '{{entityViewName}}' wilt opheffen?",
"unassign-entity-view-from-edge-text": "Na de bevestiging wordt de toewijzing van de entiteitsweergave ongedaan gemaakt en is deze niet toegankelijk via de edge.",
- "unassign-entity-views-from-edge-action-title": "Toewijzing { count, plural, =1 {1 entity view} andere {# entity views} } van edge ongedaan maken",
+ "unassign-entity-views-from-edge-action-title": "Toewijzing { count, plural, =1 {1 entity view} other {# entity views} } van edge ongedaan maken",
"unassign-entity-view-from-edge": "Toewijzing van entiteitsweergave ongedaan maken",
- "unassign-entity-views-from-edge-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 entity view} andere {# entity views} } wilt opheffen?",
+ "unassign-entity-views-from-edge-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 entity view} other {# entity views} } wilt opheffen?",
"unassign-entity-views-from-edge-text": "Na de bevestiging worden alle geselecteerde entiteitsweergaven ongedaan gemaakt en zijn ze niet toegankelijk via de edge."
},
"event": {
@@ -2725,7 +2725,7 @@
},
"extension": {
"extensions": "Extensies",
- "selected-extensions": "{ count, plural, =1 {1 extension} andere {# extensions} } geselecteerd",
+ "selected-extensions": "{ count, plural, =1 {1 extension} other {# extensions} } geselecteerd",
"type": "Type",
"key": "Sleutel",
"value": "Waarde",
@@ -2740,7 +2740,7 @@
"view": "Bekijk extensie",
"delete-extension-title": "Weet je zeker dat je de extensie '{{extensionId}}' wilt verwijderen?",
"delete-extension-text": "Opgelet, na de bevestiging worden de extensie en alle gerelateerde gegevens onherstelbaar.",
- "delete-extensions-title": "Weet u zeker dat u { count, plural, =1 {1 extension} andere {# extensions} } wilt verwijderen?",
+ "delete-extensions-title": "Weet u zeker dat u { count, plural, =1 {1 extension} other {# extensions} } wilt verwijderen?",
"delete-extensions-text": "Opgelet, na de bevestiging worden alle geselecteerde extensies verwijderd.",
"converters": "Converters",
"converter-id": "Converter-id",
@@ -3069,8 +3069,8 @@
"grid": {
"delete-item-title": "Weet u zeker dat u dit item wilt verwijderen?",
"delete-item-text": "Opgelet, na de bevestiging zullen dit item en alle gerelateerde gegevens onherstelbaar worden.",
- "delete-items-title": "Weet u zeker dat u { count, plural, =1 {1 item} andere {# items} } wilt verwijderen?",
- "delete-items-action-title": "Verwijder { count, plural, =1 {1 item} andere {# items} }",
+ "delete-items-title": "Weet u zeker dat u { count, plural, =1 {1 item} other {# items} } wilt verwijderen?",
+ "delete-items-action-title": "Verwijder { count, plural, =1 {1 item} other {# items} }",
"delete-items-text": "Opgelet, na de bevestiging worden alle geselecteerde items verwijderd en kunnen alle gerelateerde gegevens niet meer worden hersteld.",
"add-item-text": "Nieuw item toevoegen",
"no-items-text": "Geen items gevonden",
@@ -3180,11 +3180,11 @@
"management": "Beheer van integraties",
"add-integration-text": "Nieuwe integratie toevoegen",
"no-integrations-text": "Geen integraties gevonden",
- "selected-integrations": "{ count, plural, =1 {1 integration} andere {# integrations} } geselecteerd",
+ "selected-integrations": "{ count, plural, =1 {1 integration} other {# integrations} } geselecteerd",
"delete-integration-title": "Weet je zeker dat je de integratie '{{integrationName}}' wilt verwijderen?",
"delete-integration-text": "Opgelet, na de bevestiging worden de integratie en alle gerelateerde gegevens onherstelbaar.",
- "delete-integrations-title": "Weet u zeker dat u { count, plural, =1 {1 integration} andere {# integrations} } wilt verwijderen?",
- "delete-integrations-action-title": "Verwijder { count, plural, =1 {1 integration} andere {# integrations} }",
+ "delete-integrations-title": "Weet u zeker dat u { count, plural, =1 {1 integration} other {# integrations} } wilt verwijderen?",
+ "delete-integrations-action-title": "Verwijder { count, plural, =1 {1 integration} other {# integrations} }",
"delete-integrations-text": "Opgelet, na de bevestiging worden alle geselecteerde integraties verwijderd en worden alle gerelateerde gegevens onherstelbaar.",
"events": "Events",
"enabled": "Integratie inschakelen",
@@ -3588,7 +3588,7 @@
"coap-dtls-endpoint-url-copied-message": "De URL van het CoAP DTLS-eindpunt is gekopieerd naar het klembord",
"unassign-integration-title": "Weet je zeker dat je de toewijzing van de integratie '{{integrationName}}' ongedaan wilt maken?",
"unassign-integration-from-edge-text": "Na de bevestiging wordt de toewijzing van de integratie ongedaan gemaakt en is deze niet toegankelijk voor de edge.",
- "unassign-integrations-from-edge-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 integration} andere {# integrations} } wilt opheffen?",
+ "unassign-integrations-from-edge-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 integration} other {# integrations} } wilt opheffen?",
"unassign-integrations-from-edge-text": "Na de bevestiging worden alle geselecteerde integraties ongedaan gemaakt en zijn ze niet toegankelijk voor de edge.",
"unassign-integrations": "Toewijzing van integraties ongedaan maken",
"edge-placeholder-hint": "U kunt tijdelijke aanduiding ${{ATTRIBUTE_KEY}} gebruiken om het integratieveld te vervangen door de kenmerkwaarde van een specifieke Edge-entiteit. 'Edge A' heeft bijvoorbeeld het kenmerk 'baseUrl' dat gelijk is aan 'http://localhost:9999'. U kunt $ {{baseUrl}} instellen als een van de integratievelden, en het wordt vervangen door 'http://localhost:9999' tijdens de toewijzing van deze integratie aan 'Edge A'. Bovendien, als 'Edge A' attribuut 'baseUrl' wordt bijgewerkt, wordt de integratie met de nieuwe bijgewerkte waarde automatisch ingericht voor 'Edge A'.",
@@ -3716,7 +3716,7 @@
"verify-your-identity": "Verifieer uw identiteit",
"select-way-to-verify": "Selecteer een manier om te verifiëren",
"resend-code": "Code opnieuw verzenden",
- "resend-code-wait": "Code opnieuw verzenden in { time, plural, =1 {1 second} andere {# seconds} }",
+ "resend-code-wait": "Code opnieuw verzenden in { time, plural, =1 {1 second} other {# seconds} }",
"try-another-way": "Probeer een andere manier",
"totp-auth-description": "Voer de beveiligingscode van je authenticator-app in.",
"totp-auth-placeholder": "Code",
@@ -3791,23 +3791,23 @@
"delete-notification-text": "Opgelet, na de bevestiging wordt de melding onherstelbaar.",
"delete-notification-title": "Weet je zeker dat je de melding wilt verwijderen?",
"delete-notifications-text": "Opgelet, na de bevestiging worden meldingen onherstelbaar.",
- "delete-notifications-title": "Weet u zeker dat u { count, plural, =1 {1 notification} andere {# notifications} } wilt verwijderen?",
+ "delete-notifications-title": "Weet u zeker dat u { count, plural, =1 {1 notification} other {# notifications} } wilt verwijderen?",
"delete-recipient-text": "Let op, na de bevestiging wordt de ontvanger onherstelbaar.",
"delete-recipient-title": "Weet u zeker dat u de '{{recipientName}}' van de ontvanger wilt verwijderen?",
"delete-recipients-text": "Opgelet, na de bevestiging worden ontvangers onherstelbaar.",
- "delete-recipients-title": "Weet u zeker dat u { count, plural, =1 {1 recipient} andere {# recipients} } wilt verwijderen?",
+ "delete-recipients-title": "Weet u zeker dat u { count, plural, =1 {1 recipient} other {# recipients} } wilt verwijderen?",
"delete-request-text": "Opgelet, na het bevestigingsverzoek wordt het onherstelbaar.",
"delete-request-title": "Weet je zeker dat je een verzoek wilt verwijderen?",
"delete-requests-text": "Opgelet, na de bevestiging worden verzoeken onherstelbaar.",
- "delete-requests-title": "Weet u zeker dat u { count, plural, =1 {1 request} andere {# requests} } wilt verwijderen?",
+ "delete-requests-title": "Weet u zeker dat u { count, plural, =1 {1 request} other {# requests} } wilt verwijderen?",
"delete-rule-text": "Opgelet, nadat de bevestigingsregel onherstelbaar wordt.",
"delete-rule-title": "Weet u zeker dat u rule '{{ruleName}}' wilt verwijderen?",
"delete-rules-text": "Opgelet, na de bevestiging worden de regels onherstelbaar.",
- "delete-rules-title": "Weet u zeker dat u { count, plural, =1 {1 rule} andere {# rules} } wilt verwijderen?",
+ "delete-rules-title": "Weet u zeker dat u { count, plural, =1 {1 rule} other {# rules} } wilt verwijderen?",
"delete-template-text": "Opgelet, nadat de bevestigingssjabloon onherstelbaar wordt.",
"delete-template-title": "Weet u zeker dat u sjabloon '{{templateName}}' wilt verwijderen?",
"delete-templates-text": "Opgelet, nadat de bevestigingssjablonen onherstelbaar zijn geworden.",
- "delete-templates-title": "Weet u zeker dat u { count, plural, =1 {1 template} andere {# templates} } wilt verwijderen?",
+ "delete-templates-title": "Weet u zeker dat u { count, plural, =1 {1 template} other {# templates} } wilt verwijderen?",
"deleted": "Verwijderd",
"delivery-method": {
"delivery-method": "Wijze van levering",
@@ -3838,7 +3838,7 @@
"entity-type": "Type entiteit",
"escalation-chain": "Escalatie keten",
"failed-send": "Fouten verzenden",
- "fails": "{ count, plural, =1 {1 fail} andere {# fails} }",
+ "fails": "{ count, plural, =1 {1 fail} other {# fails} }",
"filter": "Filter",
"first-recipient": "Eerste ontvanger",
"inactive": "Inactief",
@@ -3912,7 +3912,7 @@
},
"recipients": "Ontvangers",
"notification-recipients": "Meldingen / Ontvangers",
- "recipients-count": "{ count, plural, =1 {1 recipient} andere {# recipients} }",
+ "recipients-count": "{ count, plural, =1 {1 recipient} other {# recipients} }",
"recipients-required": "Ontvangers zijn verplicht",
"refresh-allow-delivery-method": "Vernieuwen Bezorgmethode toestaan",
"request-search": "Zoekopdracht aanvragen",
@@ -3937,11 +3937,11 @@
"search-rules": "Zoekregels",
"search-templates": "Sjablonen zoeken",
"see-documentation": "Zie documentatie",
- "selected-notifications": "{ count, plural, =1 {1 notification} andere {# notifications} } geselecteerd",
- "selected-recipients": "{ count, plural, =1 {1 recipient} andere {# recipients} } geselecteerd",
- "selected-requests": "{ count, plural, =1 {1 request} andere {# requests} } geselecteerd",
- "selected-rules": "{ count, plural, =1 {1 rule} andere {# rules} } geselecteerd",
- "selected-template": "{ count, plural, =1 {1 template} andere {# templates} } geselecteerd",
+ "selected-notifications": "{ count, plural, =1 {1 notification} other {# notifications} } geselecteerd",
+ "selected-recipients": "{ count, plural, =1 {1 recipient} other {# recipients} } geselecteerd",
+ "selected-requests": "{ count, plural, =1 {1 request} other {# requests} } geselecteerd",
+ "selected-rules": "{ count, plural, =1 {1 rule} other {# rules} } geselecteerd",
+ "selected-template": "{ count, plural, =1 {1 template} other {# templates} } geselecteerd",
"send-notification": "Notificatie versturen",
"sent": "Verzonden",
"notification-sent": "Notificaties / Verzonden",
@@ -4017,8 +4017,8 @@
"checksum-hint": "Als de checksum leeg is, wordt deze automatisch gegenereerd",
"checksum-algorithm": "Checksum-algoritme",
"checksum-copied-message": "De controlesom van het pakket is gekopieerd naar het klembord",
- "change-firmware": "Wijziging van de firmware kan leiden tot een update van { count, plural, =1 {1 device} andere {# devices} }.",
- "change-software": "Wijziging van de software kan leiden tot een update van { count, plural, =1 {1 device} andere {# devices} }.",
+ "change-firmware": "Wijziging van de firmware kan leiden tot een update van { count, plural, =1 {1 device} other {# devices} }.",
+ "change-software": "Wijziging van de software kan leiden tot een update van { count, plural, =1 {1 device} other {# devices} }.",
"chose-compatible-device-profile": "Het geüploade pakket is alleen beschikbaar voor devices met het gekozen profiel.",
"chose-firmware-distributed-device": "Kies firmware die naar de devices wordt gedistribueerd",
"chose-software-distributed-device": "Kies software die naar de devices wordt gedistribueerd",
@@ -4031,7 +4031,7 @@
"delete-ota-update-text": "Opgelet, na de bevestiging wordt de OTA-update onherstelbaar.",
"delete-ota-update-title": "Weet je zeker dat je de OTA-update '{{title}}' wilt verwijderen?",
"delete-ota-updates-text": "Opgelet, na de bevestiging worden alle geselecteerde OTA-updates verwijderd.",
- "delete-ota-updates-title": "Weet u zeker dat u { count, plural, =1 {1 OTA update} andere {# OTA updates} } wilt verwijderen?",
+ "delete-ota-updates-title": "Weet u zeker dat u { count, plural, =1 {1 OTA update} other {# OTA updates} } wilt verwijderen?",
"description": "Omschrijving: __________",
"direct-url": "Directe URL",
"direct-url-copied-message": "De directe URL van het pakket is gekopieerd naar het klembord",
@@ -4054,7 +4054,7 @@
"package-type": "Soort verpakking",
"packages-repository": "Pakketten repository",
"search": "Pakketten zoeken",
- "selected-package": "{ count, plural, =1 {1 package} andere {# packages} } geselecteerd",
+ "selected-package": "{ count, plural, =1 {1 package} other {# packages} } geselecteerd",
"title": "Titel",
"title-required": "Titel is vereist.",
"title-max-length": "Titel moet kleiner zijn dan 256 tekens",
@@ -4150,17 +4150,17 @@
},
"password-requirement": {
"at-least": "Minstens:",
- "character": "{ count, plural, =1 {1 character} andere {# characters} }",
- "digit": "{ count, plural, =1 {1 digit} andere {# digits} }",
+ "character": "{ count, plural, =1 {1 character} other {# characters} }",
+ "digit": "{ count, plural, =1 {1 digit} other {# digits} }",
"incorrect-password-try-again": "Onjuist wachtwoord. Probeer het opnieuw",
- "lowercase-letter": "{ count, plural, =1 {1 lowercase letter} andere {# lowercase letters} }",
+ "lowercase-letter": "{ count, plural, =1 {1 lowercase letter} other {# lowercase letters} }",
"new-passwords-not-match": "Nieuw wachtwoord komt niet overeen",
"password-should-not-contain-spaces": "Uw wachtwoord mag geen spaties bevatten",
"password-not-meet-requirements": "Wachtwoord voldeed niet aan de vereisten",
"password-requirements": "Vereisten voor wachtwoorden",
"password-should-difference": "Het nieuwe wachtwoord moet anders zijn dan het huidige",
- "special-character": "{ count, plural, =1 {1 special character} andere {# special characters} }",
- "uppercase-letter": "{ count, plural, =1 {1 uppercase letter} andere {# uppercase letters} }"
+ "special-character": "{ count, plural, =1 {1 special character} other {# special characters} }",
+ "uppercase-letter": "{ count, plural, =1 {1 uppercase letter} other {# uppercase letters} }"
}
},
"relation": {
@@ -4176,7 +4176,7 @@
},
"from-relations": "Uitgaande relaties",
"to-relations": "Inkomende relaties",
- "selected-relations": "{ count, plural, =1 {1 relation} andere {# relations} } geselecteerd",
+ "selected-relations": "{ count, plural, =1 {1 relation} other {# relations} } geselecteerd",
"type": "Type",
"to-entity-type": "Naar entiteitstype",
"to-entity-name": "Naar entiteitsnaam",
@@ -4194,11 +4194,11 @@
"view": "Bekijk relatie",
"delete-to-relation-title": "Weet u zeker dat u de relatie met de entiteit '{{entityName}}' wilt verwijderen?",
"delete-to-relation-text": "Let op, na de bevestiging is de entiteit '{{entityName}}' niet meer gerelateerd aan de huidige entiteit.",
- "delete-to-relations-title": "Weet u zeker dat u { count, plural, =1 {1 relation} andere {# relations} } wilt verwijderen?",
+ "delete-to-relations-title": "Weet u zeker dat u { count, plural, =1 {1 relation} other {# relations} } wilt verwijderen?",
"delete-to-relations-text": "Opgelet, na de bevestiging worden alle geselecteerde relaties verwijderd en worden de bijbehorende entiteiten losgekoppeld van de huidige entiteit.",
"delete-from-relation-title": "Weet u zeker dat u de relatie uit de entiteit '{{entityName}}' wilt verwijderen?",
"delete-from-relation-text": "Opgelet, na de bevestiging zal de huidige entiteit niet meer gerelateerd zijn aan de entiteit '{{entityName}}'.",
- "delete-from-relations-title": "Weet u zeker dat u { count, plural, =1 {1 relation} andere {# relations} } wilt verwijderen?",
+ "delete-from-relations-title": "Weet u zeker dat u { count, plural, =1 {1 relation} other {# relations} } wilt verwijderen?",
"delete-from-relations-text": "Opgelet, na de bevestiging worden alle geselecteerde relaties verwijderd en wordt de huidige entiteit losgekoppeld van de corresponderende entiteiten.",
"remove-relation-filter": "Relatiefilter verwijderen",
"add-relation-filter": "Relatiefilter toevoegen",
@@ -4214,9 +4214,9 @@
"delete": "Bron verwijderen",
"delete-resource-text": "Opgelet, na de bevestiging wordt de bron onherstelbaar.",
"delete-resource-title": "Weet u zeker dat u de bron '{{resourceTitle}}' wilt verwijderen?",
- "delete-resources-action-title": "Verwijder { count, plural, =1 {1 resource} andere {# resources} }",
+ "delete-resources-action-title": "Verwijder { count, plural, =1 {1 resource} other {# resources} }",
"delete-resources-text": "Houd er rekening mee dat de geselecteerde bronnen, zelfs als ze in device profielen worden gebruikt, worden verwijderd.",
- "delete-resources-title": "Weet u zeker dat u { count, plural, =1 {1 resource} andere {# resources} } wilt verwijderen?",
+ "delete-resources-title": "Weet u zeker dat u { count, plural, =1 {1 resource} other {# resources} } wilt verwijderen?",
"download": "Bron downloaden",
"drop-file": "Zet een bronbestand neer of klik om een bestand te selecteren om te uploaden.",
"drop-resource-file-or": "Sleep een bronbestand of",
@@ -4231,7 +4231,7 @@
"resource-type": "Type bron",
"resources-library": "Bibliotheek met bronnen",
"search": "Bronnen zoeken",
- "selected-resources": "{ count, plural, =1 {1 resource} andere {# resources} } geselecteerd",
+ "selected-resources": "{ count, plural, =1 {1 resource} other {# resources} } geselecteerd",
"system": "Systeem",
"title": "Titel",
"title-required": "Titel is vereist.",
@@ -4253,8 +4253,8 @@
"set-root-rulechain-text": "Na de bevestiging wordt de rule chain de bron en worden alle inkomende transportberichten afgehandeld.",
"delete-rulechain-title": "Weet u zeker dat u de rule chain '{{ruleChainName}}' wilt verwijderen?",
"delete-rulechain-text": "Opgelet, na de bevestiging worden de rule chain en alle gerelateerde gegevens onherstelbaar.",
- "delete-rulechains-title": "Weet u zeker dat u { count, plural, =1 {1 rule chain} andere {# rule chains} } wilt verwijderen?",
- "delete-rulechains-action-title": "Verwijder { count, plural, =1 {1 rule chain} andere {# rule chains} }",
+ "delete-rulechains-title": "Weet u zeker dat u { count, plural, =1 {1 rule chain} other {# rule chains} } wilt verwijderen?",
+ "delete-rulechains-action-title": "Verwijder { count, plural, =1 {1 rule chain} other {# rule chains} }",
"delete-rulechains-text": "Opgelet, na de bevestiging worden alle geselecteerde rule chains verwijderd en worden alle gerelateerde gegevens onherstelbaar.",
"add-rulechain-text": "Nieuwe rule chain toevoegen",
"no-rulechains-text": "Geen rule chains gevonden",
@@ -4276,13 +4276,13 @@
"management": "Beheer van rule chains",
"debug-mode": "Foutopsporingsmodus",
"search": "Rule chains zoeken",
- "selected-rulechains": "{ count, plural, =1 {1 rule chain} andere {# rule chains} } geselecteerd",
+ "selected-rulechains": "{ count, plural, =1 {1 rule chain} other {# rule chains} } geselecteerd",
"open-rulechain": "Rule chain openen",
"edge-template-root": "Sjabloon Wortel",
"assign-to-edge": "Toewijzen aan Edge",
"edge-rulechain": "Edge rule chain",
"unassign-rulechain-from-edge-text": "Na de bevestiging wordt de toewijzing van de rule chain ongedaan gemaakt en is deze niet toegankelijk voor de edge.",
- "unassign-rulechains-from-edge-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 rulechain} andere {# rulechains} } wilt opheffen?",
+ "unassign-rulechains-from-edge-title": "Weet u zeker dat u de toewijzing van { count, plural, =1 {1 rulechain} other {# rulechains} } wilt opheffen?",
"unassign-rulechains-from-edge-text": "Na de bevestiging worden alle geselecteerde rule chains ongedaan gemaakt en zijn ze niet toegankelijk via de edge.",
"assign-rulechain-to-edge-title": "Regel Chain(s) toewijzen aan Edge",
"assign-rulechain-to-edge-text": "Selecteer de rule chains die u aan de edge wilt toewijzen",
@@ -4385,7 +4385,7 @@
"add": "Rol toevoegen",
"view": "Bekijk rol",
"search": "Rollen zoeken",
- "selected-roles": "{ count, plural, =1 {1 role} andere {# roles} } geselecteerd",
+ "selected-roles": "{ count, plural, =1 {1 role} other {# roles} } geselecteerd",
"no-roles-text": "Geen rollen gevonden",
"role-details": "Details van de rol",
"add-role-text": "Nieuwe rol toevoegen",
@@ -4393,8 +4393,8 @@
"delete-roles": "Rollen verwijderen",
"delete-role-title": "Weet je zeker dat je de rol '{{roleName}}' wilt verwijderen?",
"delete-role-text": "Opgelet, na de bevestiging worden de rol en alle gerelateerde gegevens onherstelbaar.",
- "delete-roles-title": "Weet u zeker dat u { count, plural, =1 {1 role} andere {# roles} } wilt verwijderen?",
- "delete-roles-action-title": "Verwijder { count, plural, =1 {1 role} andere {# roles} }",
+ "delete-roles-title": "Weet u zeker dat u { count, plural, =1 {1 role} other {# roles} } wilt verwijderen?",
+ "delete-roles-action-title": "Verwijder { count, plural, =1 {1 role} other {# roles} }",
"delete-roles-text": "Opgelet, na de bevestiging worden alle geselecteerde rollen verwijderd en worden alle gerelateerde gegevens onherstelbaar.",
"role-type": "Soort rol",
"role-type-required": "Roltype is vereist.",
@@ -4433,11 +4433,11 @@
"user-group-owner": "Eigenaar van gebruikersgroep",
"edit": "Machtigingen bewerken",
"delete": "Machtigingen verwijderen",
- "selected-group-permissions": "{ count, plural, =1 {1 group permission} andere {# group permissions} } geselecteerd",
+ "selected-group-permissions": "{ count, plural, =1 {1 group permission} other {# group permissions} } geselecteerd",
"delete-group-permission-title": "Weet je zeker dat je de groepsrechten '{{roleName}}' wilt verwijderen?",
"delete-group-permission-text": "Opgelet, na de bevestiging worden de groepstoestemming en alle gerelateerde gegevens onherstelbaar.",
"delete-group-permission": "Groepsmachtiging verwijderen",
- "delete-group-permissions-title": "Weet u zeker dat u { count, plural, =1 {1 group permission} andere {# group permission} } wilt verwijderen?",
+ "delete-group-permissions-title": "Weet u zeker dat u { count, plural, =1 {1 group permission} other {# group permission} } wilt verwijderen?",
"delete-group-permissions-text": "Opgelet, na de bevestiging worden alle geselecteerde groepsmachtigingen verwijderd en verliezen de bijbehorende gebruikers de toegang tot gespecificeerde bronnen.",
"delete-group-permissions": "Groepsmachtigingen verwijderen",
"add-group-permission": "Groepsmachtiging toevoegen",
@@ -4552,10 +4552,10 @@
"view-scheduler-event": "Scheduler event weergeven",
"delete-scheduler-event": "Scheduler-event verwijderen",
"no-scheduler-events": "Geen planner-gebeurtenissen gevonden",
- "selected-scheduler-events": "{ count, plural, =1 {1 scheduler event} andere {# scheduler events} } geselecteerd",
+ "selected-scheduler-events": "{ count, plural, =1 {1 scheduler event} other {# scheduler events} } geselecteerd",
"delete-scheduler-event-title": "Weet u zeker dat u de '{{schedulerEventName}}' van de planningsgebeurtenis wilt verwijderen?",
"delete-scheduler-event-text": "Opgelet, na de bevestiging worden de event van de planner en alle gerelateerde gegevens onherstelbaar.",
- "delete-scheduler-events-title": "Weet u zeker dat u { count, plural, =1 {1 scheduler event} andere {# scheduler events} } wilt verwijderen?",
+ "delete-scheduler-events-title": "Weet u zeker dat u { count, plural, =1 {1 scheduler event} other {# scheduler events} } wilt verwijderen?",
"delete-scheduler-events-text": "Opgelet, na de bevestiging worden alle geselecteerde scheduler events verwijderd en kunnen alle gerelateerde gegevens niet meer worden hersteld.",
"create": "Scheduler-event maken",
"edit": "Scheduler-event bewerken",
@@ -4567,10 +4567,10 @@
"repeats": "Herhaalt",
"daily": "Dagelijks",
"every-n-days": "Elke N dagen",
- "every-n-days-text": "Elke { days, plural, =1 {day} andere {# days} }",
+ "every-n-days-text": "Elke { days, plural, =1 {day} other {# days} }",
"weekly": "Wekelijks",
"every-n-weeks": "Elke N weken",
- "every-n-weeks-text": "Elke { weeks, plural, =1 {week} andere {# weeks} }",
+ "every-n-weeks-text": "Elke { weeks, plural, =1 {week} other {# weeks} }",
"monthly": "Maandelijks",
"yearly": "Jaarlijks",
"timer": "Op basis van een timer",
@@ -4646,9 +4646,9 @@
"seconds": "Seconden",
"time-interval-required": "Tijdsinterval is vereist",
"time-unit-required": "Tijdseenheid is vereist",
- "every-hour": "elke { count, plural, =1 {hour} andere {# hours} }",
- "every-minute": "elke { count, plural, =1 {minute} andere {# minutes} }",
- "every-second": "elke { count, plural, =1 {second} andere {# seconds} }",
+ "every-hour": "elke { count, plural, =1 {hour} other {# hours} }",
+ "every-minute": "elke { count, plural, =1 {minute} other {# minutes} }",
+ "every-second": "elke { count, plural, =1 {second} other {# seconds} }",
"invalid-time": "Ongeldige tijd"
},
"report": {
@@ -4692,12 +4692,12 @@
"name": "Naam",
"type": "Type",
"created_customer": "Gemaakt door de klant",
- "selected-blob-entities": "{ count, plural, =1 {1 file} andere {# files} } geselecteerd",
+ "selected-blob-entities": "{ count, plural, =1 {1 file} other {# files} } geselecteerd",
"download-blob-entity": "Bestand downloaden",
"delete-blob-entity": "Bestand verwijderen",
"delete-blob-entity-title": "Weet u zeker dat u bestand '{{blobEntityName}}' wilt verwijderen?",
"delete-blob-entity-text": "Opgelet, na de bevestiging worden de gegevens van het bestand onherstelbaar.",
- "delete-blob-entities-title": "Weet u zeker dat u { count, plural, =1 {1 file} andere {# files} } wilt verwijderen?",
+ "delete-blob-entities-title": "Weet u zeker dat u { count, plural, =1 {1 file} other {# files} } wilt verwijderen?",
"delete-blob-entities-text": "Opgelet, na de bevestiging worden alle geselecteerde bestanden verwijderd en kunnen alle gerelateerde gegevens niet meer worden hersteld."
},
"timezone": {
@@ -4738,9 +4738,9 @@
"submit-strategy-type-required": "Strategietype indienen is vereist!",
"processing-strategy-type-required": "Het type verwerkingsstrategie is vereist!",
"queues": "Queues",
- "selected-queues": "{ count, plural, =1 {1 queue} andere {# queues} } geselecteerd",
+ "selected-queues": "{ count, plural, =1 {1 queue} other {# queues} } geselecteerd",
"delete-queue-title": "Weet je zeker dat je de queue '{{queueName}}' wilt verwijderen?",
- "delete-queues-title": "Weet u zeker dat u { count, plural, =1 {1 queue} andere {# queues} } wilt verwijderen?",
+ "delete-queues-title": "Weet u zeker dat u { count, plural, =1 {1 queue} other {# queues} } wilt verwijderen?",
"delete-queue-text": "Opgelet, na de bevestiging worden de queue en alle gerelateerde gegevens onherstelbaar.",
"delete-queues-text": "Na de bevestiging worden alle geselecteerde queues verwijderd en zijn ze niet meer toegankelijk.",
"search": "Queue zoeken",
@@ -4824,8 +4824,8 @@
"title-max-length": "Titel moet kleiner zijn dan 256 tekens",
"delete-tenant-title": "Weet u zeker dat u de tenant '{{tenantTitle}}' wilt verwijderen?",
"delete-tenant-text": "Let op, na de bevestiging worden de tenant en alle gerelateerde gegevens onherstelbaar.",
- "delete-tenants-title": "Weet u zeker dat u { count, plural, =1 {1 tenant} andere {# tenants} } wilt verwijderen?",
- "delete-tenants-action-title": "Verwijder { count, plural, =1 {1 tenant} andere {# tenants} }",
+ "delete-tenants-title": "Weet u zeker dat u { count, plural, =1 {1 tenant} other {# tenants} } wilt verwijderen?",
+ "delete-tenants-action-title": "Verwijder { count, plural, =1 {1 tenant} other {# tenants} }",
"delete-tenants-text": "Let op, na de bevestiging worden alle geselecteerde tenants verwijderd en worden alle gerelateerde gegevens onherstelbaar.",
"title": "Titel",
"title-required": "Titel is vereist.",
@@ -4840,7 +4840,7 @@
"allow-white-labeling": "White Labeling toestaan",
"allow-customer-white-labeling": "White labeling van klanten toestaan",
"search": "Tenants zoeken",
- "selected-tenants": "{ count, plural, =1 {1 tenant} andere {# tenants} } geselecteerd",
+ "selected-tenants": "{ count, plural, =1 {1 tenant} other {# tenants} } geselecteerd",
"isolated-tb-rule-engine": "Verwerking in geïsoleerde ThingsBoard Rule Engine-container",
"isolated-tb-rule-engine-details": "Vereist afzonderlijke microservice(s) per geïsoleerde tenant"
},
@@ -4854,7 +4854,7 @@
"no-tenant-profiles-text": "Geen tenantsprofielen gevonden",
"name-max-length": "Naam moet kleiner zijn dan 256 tekens",
"search": "Tentant profielen zoeken",
- "selected-tenant-profiles": "{ count, plural, =1 {1 tenant profile} andere {# tenant profiles} } geselecteerd",
+ "selected-tenant-profiles": "{ count, plural, =1 {1 tenant profile} other {# tenant profiles} } geselecteerd",
"no-tenant-profiles-matching": "Er zijn geen tenantprofielen gevonden die overeenkomen met '{{entity}}'.",
"tenant-profile-required": "Huurdersprofiel is vereist",
"idCopiedMessage": "De profiel-id van de tenant is gekopieerd naar het klembord",
@@ -4869,7 +4869,7 @@
"default": "Verstek",
"delete-tenant-profile-title": "Weet u zeker dat u het tenantsprofiel '{{tenantProfileName}}' wilt verwijderen?",
"delete-tenant-profile-text": "Let op, na de bevestiging wordt het tenantsprofiel en alle gerelateerde gegevens onherstelbaar.",
- "delete-tenant-profiles-title": "Weet u zeker dat u { count, plural, =1 {1 tenant profile} andere {# tenant profiles} } wilt verwijderen?",
+ "delete-tenant-profiles-title": "Weet u zeker dat u { count, plural, =1 {1 tenant profile} other {# tenant profiles} } wilt verwijderen?",
"delete-tenant-profiles-text": "Opgelet, na de bevestiging worden alle geselecteerde tenantsprofielen verwijderd en kunnen alle gerelateerde gegevens niet meer worden hersteld.",
"set-default-tenant-profile-title": "Weet u zeker dat u het tenantsprofiel standaard '{{tenantProfileName}}' wilt maken?",
"set-default-tenant-profile-text": "Na de bevestiging wordt het tenantsprofiel als standaard gemarkeerd en wordt het gebruikt voor nieuwe tenants waarvoor geen profiel is opgegeven.",
@@ -5028,10 +5028,10 @@
}
},
"timeinterval": {
- "seconds-interval": "{ seconds, plural, =1 {1 second} andere {# seconds} }",
- "minutes-interval": "{ minutes, plural, =1 {1 minute} andere {# minutes} }",
- "hours-interval": "{ hours, plural, =1 {1 hour} andere {# hours} }",
- "days-interval": "{ days, plural, =1 {1 day} andere {# days} }",
+ "seconds-interval": "{ seconds, plural, =1 {1 second} other {# seconds} }",
+ "minutes-interval": "{ minutes, plural, =1 {1 minute} other {# minutes} }",
+ "hours-interval": "{ hours, plural, =1 {1 hour} other {# hours} }",
+ "days-interval": "{ days, plural, =1 {1 day} other {# days} }",
"days": "Dagen",
"hours": "Uren",
"minutes": "Notulen",
@@ -5072,19 +5072,19 @@
"days": "Dagen"
},
"timewindow": {
- "years": "{ years, plural, =1 { year } andere {# years } }",
- "months": "{ months, plural, =1 { month } andere {# months } }",
- "weeks": "{ weeks, plural, =1 { week } andere {# weeks } }",
- "days": "{ days, plural, =1 { day } andere {# days } }",
- "hours": "{ hours, plural, =0 { hour } =1 {1 hour } andere {# hours } }",
+ "years": "{ years, plural, =1 { year } other {# years } }",
+ "months": "{ months, plural, =1 { month } other {# months } }",
+ "weeks": "{ weeks, plural, =1 { week } other {# weeks } }",
+ "days": "{ days, plural, =1 { day } other {# days } }",
+ "hours": "{ hours, plural, =0 { hour } =1 {1 hour } other {# hours } }",
"hr": "{{ hr }} uur",
- "minutes": "{ minutes, plural, =0 { minute } =1 {1 minute } andere {# minutes } }",
+ "minutes": "{ minutes, plural, =0 { minute } =1 {1 minute } other {# minutes } }",
"min": "{{ min }} min",
- "seconds": "{ seconds, plural, =0 { second } =1 {1 second } andere {# seconds } }",
+ "seconds": "{ seconds, plural, =0 { second } =1 {1 second } other {# seconds } }",
"sec": "{{ sec }} sec",
"short": {
- "days": "{ days, plural, =1 {1 day } andere {# days } }",
- "hours": "{ hours, plural, =1 {1 hour } andere {# hours } }",
+ "days": "{ days, plural, =1 {1 day } other {# days } }",
+ "hours": "{ hours, plural, =1 {1 hour } other {# hours } }",
"minutes": "{{minutes}} min",
"seconds": "{{seconds}} sec"
},
@@ -5123,8 +5123,8 @@
"delete-users": "Gebruikers verwijderen",
"delete-user-title": "Weet u zeker dat u de '{{userEmail}}' van de gebruiker wilt verwijderen?",
"delete-user-text": "Opgelet, na de bevestiging worden de gebruiker en alle gerelateerde gegevens onherstelbaar.",
- "delete-users-title": "Weet u zeker dat u { count, plural, =1 {1 user} andere {# users} } wilt verwijderen?",
- "delete-users-action-title": "Verwijder { count, plural, =1 {1 user} andere {# users} }",
+ "delete-users-title": "Weet u zeker dat u { count, plural, =1 {1 user} other {# users} } wilt verwijderen?",
+ "delete-users-action-title": "Verwijder { count, plural, =1 {1 user} other {# users} }",
"delete-users-text": "Opgelet, na de bevestiging worden alle geselecteerde gebruikers verwijderd en kunnen alle gerelateerde gegevens niet meer worden hersteld.",
"activation-email-sent-message": "Activeringsmail is succesvol verzonden!",
"resend-activation": "Activering opnieuw verzenden",
@@ -5151,12 +5151,12 @@
"login-as-customer-user": "Inloggen als klantgebruiker",
"select-group-to-add": "Selecteer doelgroep om geselecteerde gebruikers toe te voegen",
"select-group-to-move": "Selecteer de doelgroep om geselecteerde gebruikers te verplaatsen",
- "remove-users-from-group": "Weet je zeker dat je { count, plural, =1 {1 user} andere {# users} } uit groep '{{entityGroup}}' wilt verwijderen?",
+ "remove-users-from-group": "Weet je zeker dat je { count, plural, =1 {1 user} other {# users} } uit groep '{{entityGroup}}' wilt verwijderen?",
"group": "Groep gebruikers",
- "list-of-groups": "{ count, plural, =1 {One user group} andere {List of # user groups} }",
+ "list-of-groups": "{ count, plural, =1 {One user group} other {List of # user groups} }",
"group-name-starts-with": "Gebruikersgroepen waarvan de naam begint met '{{prefix}}'",
"search": "Gebruikers zoeken",
- "selected-users": "{ count, plural, =1 {1 user} andere {# users} } geselecteerd",
+ "selected-users": "{ count, plural, =1 {1 user} other {# users} } geselecteerd",
"disable-account": "Gebruikersaccount uitschakelen",
"enable-account": "Gebruikersaccount inschakelen",
"enable-account-message": "Gebruikersaccount is succesvol ingeschakeld!",
@@ -5228,7 +5228,7 @@
"previous-difference": "Vorig verschil",
"next-difference": "Volgende Verschil",
"current": "Actueel",
- "differences": "{ count, plural, =1 {1 difference} andere {# differences} }",
+ "differences": "{ count, plural, =1 {1 difference} other {# differences} }",
"create-entities-version": "Versie van entiteiten maken",
"default-sync-strategy": "Standaard synchronisatiestrategie",
"sync-strategy-merge": "Fuseren",
@@ -5241,7 +5241,7 @@
"no-entities-to-restore-prompt": "Geef entiteiten op die u wilt herstellen",
"add-entity-type": "Entiteitstype toevoegen",
"remove-all": "Alles verwijderen",
- "version-create-result": "{ added, plural, =0 {No entities} =1 {1 entity} andere {# entities} } toegevoegd.
{ modified, plural, =0 {No entities} =1 {1 entity} andere {# entities} } gewijzigd.
{ removed, plural, =0 {No entities} =1 {1 entity} andere {# entities} } verwijderd.",
+ "version-create-result": "{ added, plural, =0 {No entities} =1 {1 entity} other {# entities} } toegevoegd.
{ modified, plural, =0 {No entities} =1 {1 entity} other {# entities} } gewijzigd.
{ removed, plural, =0 {No entities} =1 {1 entity} other {# entities} } verwijderd.",
"remove-other-entities": "Andere entiteiten verwijderen",
"find-existing-entity-by-name": "Bestaande entiteit zoeken op naam",
"restore-entities-from-version": "Entiteiten herstellen vanaf versie '{{versionName}}'",
@@ -5250,9 +5250,9 @@
"created": "{{created}} gemaakt",
"updated": "{{updated}} geüpdatet",
"deleted": "{{deleted}} geschrapt",
- "groups-created": "{ created, plural, =1 {1 group} andere {# groups} } gemaakt",
- "groups-updated": "{ updated, plural, =1 {1 group} andere {# groups} } bijgewerkt",
- "groups-deleted": "{ deleted, plural, =1 {1 group} andere {# groups} } verwijderd",
+ "groups-created": "{ created, plural, =1 {1 group} other {# groups} } gemaakt",
+ "groups-updated": "{ updated, plural, =1 {1 group} other {# groups} } bijgewerkt",
+ "groups-deleted": "{ deleted, plural, =1 {1 group} other {# groups} } verwijderd",
"remove-other-entities-confirm-text": "Opgelet! Hiermee worden alle huidige entiteiten
die niet aanwezig zijn in de versie die u wilt herstellen, permanent verwijderd.
Typ andere entiteiten verwijderen om te bevestigen.",
"auto-commit-to-branch": "Automatisch vastleggen op {{ branch }} filiaal",
"default-create-entity-version-name": "{{entityName}} update",
@@ -5414,8 +5414,8 @@
"widgets-bundle-details": "Details van de widgetsbundel",
"delete-widgets-bundle-title": "Weet je zeker dat je de widgets bundel '{{widgetsBundleTitle}}' wilt verwijderen?",
"delete-widgets-bundle-text": "Opgelet, na de bevestiging worden de widgetbundel en alle gerelateerde gegevens onherstelbaar.",
- "delete-widgets-bundles-title": "Weet u zeker dat u { count, plural, =1 {1 widgets bundle} andere {# widgets bundles} } wilt verwijderen?",
- "delete-widgets-bundles-action-title": "Verwijder { count, plural, =1 {1 widgets bundle} andere {# widgets bundles} }",
+ "delete-widgets-bundles-title": "Weet u zeker dat u { count, plural, =1 {1 widgets bundle} other {# widgets bundles} } wilt verwijderen?",
+ "delete-widgets-bundles-action-title": "Verwijder { count, plural, =1 {1 widgets bundle} other {# widgets bundles} }",
"delete-widgets-bundles-text": "Opgelet, na de bevestiging worden alle geselecteerde widgetbundels verwijderd en worden alle gerelateerde gegevens onherstelbaar.",
"no-widgets-bundles-matching": "Er zijn geen widgetbundels gevonden die overeenkomen met '{{widgetsBundle}}'.",
"widgets-bundle-required": "Widgets-bundel is vereist.",
@@ -5427,7 +5427,7 @@
"widgets-bundle-file": "Widgets bundel bestand",
"invalid-widgets-bundle-file-error": "Kan widgetbundel niet importeren: Ongeldige widgetbundel gegevensstructuur.",
"search": "Widgetbundels zoeken",
- "selected-widgets-bundles": "{ count, plural, =1 {1 widgets bundle} andere {# widgets bundles} } geselecteerd",
+ "selected-widgets-bundles": "{ count, plural, =1 {1 widgets bundle} other {# widgets bundles} } geselecteerd",
"open-widgets-bundle": "Widgets-bundel openen",
"loading-widgets-bundles": "Widgets bundels worden geladen..."
},
@@ -5462,7 +5462,7 @@
"legend": "Legende",
"display-legend": "Legende weergeven",
"datasources": "Gegevensbronnen",
- "maximum-datasources": "Maximaal { count, plural, =1 {1 datasource is allowed.} andere {# datasources are allowed} }",
+ "maximum-datasources": "Maximaal { count, plural, =1 {1 datasource is allowed.} other {# datasources are allowed} }",
"timeseries-key-error": "Er moet ten minste één tijdreeksgegevenssleutel worden opgegeven",
"datasource-type": "Type",
"datasource-parameters": "Parameters",
@@ -6172,7 +6172,7 @@
},
"label-widget": {
"label-pattern": "Patroon",
- "label-pattern-hint": "Tip: bijv. 'Text <span style=\"color: #000;\">${keyName<span style=\"color: #000;\">} eenheden.' of <span style=\"color: #000;\">${#<key index><span style=\"color: #000;\">} eenheden'",
+ "label-pattern-hint": "Tip: bijv. 'Text ${keyName} eenheden.' of ${#<key index>}",
"label-pattern-required": "Patroon is vereist",
"label-position": "Positie (percentage ten opzichte van achtergrond)",
"x-pos": "X",
@@ -6722,10 +6722,10 @@
"title": "Licentie info",
"view-all": "Alles weergeven",
"license-portal": "Licentie portaal",
- "devices-info": "{count} / { max, plural, =0 {∞} andere {#} } Devices",
- "assets-info": "{count} / { max, plural, =0 {∞} andere {#} } Assets",
- "dashboards-info": "{count} / { max, plural, =0 {∞} andere {#} } Dashboards",
- "integrations-info": "{count} / { max, plural, =0 {∞} andere {#} } Integraties",
+ "devices-info": "{count} / { max, plural, =0 {∞} other {#} } Devices",
+ "assets-info": "{count} / { max, plural, =0 {∞} other {#} } Assets",
+ "dashboards-info": "{count} / { max, plural, =0 {∞} other {#} } Dashboards",
+ "integrations-info": "{count} / { max, plural, =0 {∞} other {#} } Integraties",
"community-support": "Ondersteuning van de gemeenschap",
"white-labeling": "White labelling",
"unlimited-datapoints-and-messages": "Onbeperkt aantal datapunten en berichten",
diff --git a/ui-ngx/src/assets/locale/locale.constant-pl_PL.json b/ui-ngx/src/assets/locale/locale.constant-pl_PL.json
index bec945acf9..8f35a7daa2 100644
--- a/ui-ngx/src/assets/locale/locale.constant-pl_PL.json
+++ b/ui-ngx/src/assets/locale/locale.constant-pl_PL.json
@@ -1832,9 +1832,10 @@
"condition-duration-value-required": "Wartość czasu trwania jest wymagana.",
"condition-duration-time-unit-required": "Jednostka czasu jest wymagana.",
"advanced-settings": "Zaawansowane ustawienia",
- "alarm-rule-details": "Szczegóły",
- "alarm-rule-details-hint": "Wskazówka: użyj ${NazwaKlucza} w celu zastąpienia wartości atrybutu lub kluczy telemetrycznych używanych w warunku reguły alarmowej.",
- "add-alarm-rule-details": "Dodaj szczegóły",
+ "alarm-rule-additional-info": "Szczegóły",
+ "edit-alarm-rule-additional-info": "Extra informatie bewerken",
+ "alarm-rule-additional-info-placeholder": "Komentarze i poprawki należy wprowadzić tutaj, aby wyświetlić je w szczegółach alarmu w sekcji Dodatkowe informacje.",
+ "alarm-rule-additional-info-hint": "Wskazówka: użyj ${NazwaKlucza} w celu zastąpienia wartości atrybutu lub kluczy telemetrycznych używanych w warunku reguły alarmowej.",
"alarm-rule-mobile-dashboard": "Mobilny panel",
"alarm-rule-mobile-dashboard-hint": "Używany przez aplikację mobilną jako panel ze szczegółami alarmów",
"alarm-rule-no-mobile-dashboard": "Nie wybrano żadnego panelu",
@@ -1844,7 +1845,6 @@
"propagate-alarm-to-owner": "Prześlij alarm do właściciela obiektu (Klienta lub Najemcy)",
"propagate-alarm-to-owner-hierarchy": "Propaguj alarm w hierarchii właścicieli jednostek",
"propagate-alarm-to-tenant": "Przekaż alarm do Najemcy",
- "alarm-details": "Szczegóły alarmu",
"alarm-rule-condition": "Warunek reguły alarmowej",
"enter-alarm-rule-condition-prompt": "Dodaj warunek reguły alarmowej",
"edit-alarm-rule-condition": "Edytuj warunek reguły alarmowej",
diff --git a/ui-ngx/src/assets/metadata/connector-default-configs/modbus.json b/ui-ngx/src/assets/metadata/connector-default-configs/modbus.json
index 38bb44e036..019d2062f8 100644
--- a/ui-ngx/src/assets/metadata/connector-default-configs/modbus.json
+++ b/ui-ngx/src/assets/metadata/connector-default-configs/modbus.json
@@ -3,7 +3,6 @@
"master": {
"slaves": [
{
- "name": "Slave 1",
"host": "127.0.0.1",
"port": 5021,
"type": "tcp",
@@ -18,7 +17,6 @@
"unitId": 1,
"deviceName": "Temp Sensor",
"deviceType": "default",
- "sendDataOnlyOnChange": true,
"connectAttemptTimeMs": 5000,
"connectAttemptCount": 5,
"waitAfterFailedAttemptsMs": 300000,
@@ -232,10 +230,10 @@
"attributes": [
{
"address": 5,
- "type": "string",
- "tag": "sm",
+ "type": "8int",
+ "tag": "coil",
"objectsCount": 1,
- "value": "12"
+ "value": 0
}
],
"timeseries": [],
diff --git a/ui-ngx/src/form.scss b/ui-ngx/src/form.scss
index 83c773cbbb..2a7ee6e7eb 100644
--- a/ui-ngx/src/form.scss
+++ b/ui-ngx/src/form.scss
@@ -205,6 +205,12 @@
&.space-between {
justify-content: space-between;
}
+ &.flex-wrap {
+ flex-wrap: wrap;
+ }
+ &.overflow-auto {
+ overflow: auto;
+ }
.mat-divider-vertical {
height: 56px;
margin-top: -7px;
diff --git a/ui-ngx/src/typings/jquery.typings.d.ts b/ui-ngx/src/typings/jquery.typings.d.ts
index d457729ace..a058373022 100644
--- a/ui-ngx/src/typings/jquery.typings.d.ts
+++ b/ui-ngx/src/typings/jquery.typings.d.ts
@@ -14,6 +14,9 @@
/// limitations under the License.
///
+import { TbContextMenuEvent } from '@shared/models/jquery-event.models';
+
interface JQuery {
terminal(options?: any): any;
+ on(events: 'tbcontextmenu', handler: (e: TbContextMenuEvent) => void): this;
}
diff --git a/ui-ngx/yarn.lock b/ui-ngx/yarn.lock
index 51bfe8f56e..cc6762eb57 100644
--- a/ui-ngx/yarn.lock
+++ b/ui-ngx/yarn.lock
@@ -3052,10 +3052,10 @@
dependencies:
"@types/jasmine" "*"
-"@types/jquery@*", "@types/jquery@^3.5.16", "@types/jquery@^3.5.29":
- version "3.5.29"
- resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.29.tgz#3c06a1f519cd5fc3a7a108971436c00685b5dcea"
- integrity sha512-oXQQC9X9MOPRrMhPHHOsXqeQDnWeCDT3PelUIg/Oy8FAbzSZtFHRjc7IpbfFVmpLtJ+UOoywpRsuO5Jxjybyeg==
+"@types/jquery@*", "@types/jquery@^3.5.29", "@types/jquery@^3.5.30":
+ version "3.5.30"
+ resolved "https://registry.yarnpkg.com/@types/jquery/-/jquery-3.5.30.tgz#888d584cbf844d3df56834b69925085038fd80f7"
+ integrity sha512-nbWKkkyb919DOUxjmRVk8vwtDb0/k8FKncmUKFi+NY+QXqWltooxTrswvz4LspQwxvLdvzBN1TImr6cw3aQx2A==
dependencies:
"@types/sizzle" "*"
@@ -7377,7 +7377,7 @@ jquery.terminal@^2.35.3:
optionalDependencies:
fsevents "^2.3.2"
-jquery@>=1.9.1, jquery@^3.5.0, jquery@^3.6.3, jquery@^3.7.1:
+jquery@>=1.9.1, jquery@^3.5.0, jquery@^3.7.1:
version "3.7.1"
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.7.1.tgz#083ef98927c9a6a74d05a6af02806566d16274de"
integrity sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==