Merge branch 'feature/rule-node/component' into feature/lazy-load/rulechain-page-components

This commit is contained in:
Vladyslav_Prykhodko 2025-01-14 10:58:26 +02:00
commit 36b2998a0d
85 changed files with 1615 additions and 1608 deletions

View File

@ -18,17 +18,17 @@
<section [formGroup]="assignCustomerConfigForm" class="flex flex-col">
<div class="tb-form-panel no-padding no-border">
<mat-form-field class="mat-block" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.customer-name-pattern</mat-label>
<mat-label translate>rule-node-config.customer-name-pattern</mat-label>
<input required matInput formControlName="customerNamePattern">
<mat-error *ngIf="assignCustomerConfigForm.get('customerNamePattern').hasError('required') ||
assignCustomerConfigForm.get('customerNamePattern').hasError('pattern')">
{{ 'tb.rulenode.customer-name-pattern-required' | translate }}
{{ 'rule-node-config.customer-name-pattern-required' | translate }}
</mat-error>
<mat-hint translate>tb.rulenode.customer-name-pattern-hint</mat-hint>
<mat-hint translate>rule-node-config.customer-name-pattern-hint</mat-hint>
</mat-form-field>
<div class="tb-form-row">
<mat-slide-toggle class="mat-slide" formControlName="createCustomerIfNotExists">
{{ 'tb.rulenode.create-customer-if-not-exists' | translate }}
{{ 'rule-node-config.create-customer-if-not-exists' | translate }}
</mat-slide-toggle>
</div>
</div>

View File

@ -17,11 +17,11 @@
-->
<section [formGroup]="attributesConfigForm" class="tb-form-panel no-border no-padding">
<div class="tb-form-panel stroked">
<tb-example-hint [hintText]="'tb.rulenode.attributes-scope-hint'">
<tb-example-hint [hintText]="'rule-node-config.attributes-scope-hint'">
</tb-example-hint>
<div class="tb-form-row no-border no-padding tb-standard-fields">
<mat-form-field class="flex">
<mat-label>{{ 'tb.rulenode.attributes-scope' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.attributes-scope' | translate }}</mat-label>
<mat-select required
class="tb-entity-type-select" matInput formControlName="scope">
<mat-option *ngFor="let scope of attributeScopes" [value]="scope">
@ -30,7 +30,7 @@
</mat-select>
</mat-form-field>
<mat-form-field class="flex">
<mat-label>{{ 'tb.rulenode.attributes-scope-value' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.attributes-scope-value' | translate }}</mat-label>
<input type="text" matInput readonly disabled [ngModel]="attributesConfigForm.get('scope').value" [ngModelOptions]="{standalone: true}">
<button type="button"
matSuffix
@ -38,7 +38,7 @@
aria-label="Copy"
ngxClipboard
[cbContent]="attributesConfigForm.get('scope').value"
matTooltip="{{ 'tb.rulenode.attributes-scope-value-copy' | translate }}">
matTooltip="{{ 'rule-node-config.attributes-scope-value-copy' | translate }}">
<mat-icon aria-hidden="false"
aria-label="help-icon">content_copy
</mat-icon>
@ -50,28 +50,28 @@
<section class="tb-form-panel stroked">
<mat-expansion-panel class="tb-settings">
<mat-expansion-panel-header>
<mat-panel-title translate>tb.rulenode.advanced-settings</mat-panel-title>
<mat-panel-title translate>rule-node-config.advanced-settings</mat-panel-title>
</mat-expansion-panel-header>
<div tb-hint-tooltip-icon="{{ (attributesConfigForm.get('updateAttributesOnlyOnValueChange').value
? 'tb.rulenode.update-attributes-only-on-value-change-hint-enabled'
: 'tb.rulenode.update-attributes-only-on-value-change-hint') | translate }}"
? 'rule-node-config.update-attributes-only-on-value-change-hint-enabled'
: 'rule-node-config.update-attributes-only-on-value-change-hint') | translate }}"
class="tb-form-row no-border no-padding">
<mat-slide-toggle class="mat-slide" formControlName="updateAttributesOnlyOnValueChange">
{{ 'tb.rulenode.update-attributes-only-on-value-change' | translate }}
{{ 'rule-node-config.update-attributes-only-on-value-change' | translate }}
</mat-slide-toggle>
</div>
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.send-attributes-updated-notification-hint' | translate }}"
<div tb-hint-tooltip-icon="{{ 'rule-node-config.send-attributes-updated-notification-hint' | translate }}"
*ngIf="attributesConfigForm.get('scope').value !== attributeScopeMap.CLIENT_SCOPE"
class="tb-form-row no-border no-padding">
<mat-slide-toggle class="mat-slide" formControlName="sendAttributesUpdatedNotification">
{{ 'tb.rulenode.send-attributes-updated-notification' | translate }}
{{ 'rule-node-config.send-attributes-updated-notification' | translate }}
</mat-slide-toggle>
</div>
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.notify-device-on-update-hint' | translate }}"
<div tb-hint-tooltip-icon="{{ 'rule-node-config.notify-device-on-update-hint' | translate }}"
*ngIf="attributesConfigForm.get('scope').value === attributeScopeMap.SHARED_SCOPE"
class="tb-form-row no-border no-padding">
<mat-slide-toggle class="mat-slide" formControlName="notifyDevice">
{{ 'tb.rulenode.notify-device' | translate }}
{{ 'rule-node-config.notify-device' | translate }}
</mat-slide-toggle>
</div>
</mat-expansion-panel>

View File

@ -57,11 +57,11 @@
</button>
</div>
<mat-form-field class="mat-block" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.alarm-type</mat-label>
<mat-label translate>rule-node-config.alarm-type</mat-label>
<input required matInput formControlName="alarmType">
<mat-error *ngIf="clearAlarmConfigForm.get('alarmType').hasError('required')">
{{ 'tb.rulenode.alarm-type-required' | translate }}
{{ 'rule-node-config.alarm-type-required' | translate }}
</mat-error>
<mat-hint translate>tb.rulenode.general-pattern-hint</mat-hint>
<mat-hint translate>rule-node-config.general-pattern-hint</mat-hint>
</mat-form-field>
</section>

View File

@ -47,7 +47,7 @@ export class ClearAlarmConfigComponent extends RuleNodeConfigurationComponent {
readonly hasScript = true;
readonly testScriptLabel = 'tb.rulenode.test-details-function';
readonly testScriptLabel = 'rule-node-config.test-details-function';
constructor(protected store: Store<AppState>,
private fb: UntypedFormBuilder,
@ -103,7 +103,7 @@ export class ClearAlarmConfigComponent extends RuleNodeConfigurationComponent {
this.nodeScriptTestService.testNodeScript(
script,
'json',
this.translate.instant('tb.rulenode.details'),
this.translate.instant('rule-node-config.details'),
'Details',
['msg', 'metadata', 'msgType'],
this.ruleNodeId,

View File

@ -17,10 +17,10 @@
-->
<section [formGroup]="createAlarmConfigForm" class="flex flex-col">
<mat-checkbox formControlName="useMessageAlarmData">
{{ 'tb.rulenode.use-message-alarm-data' | translate }}
{{ 'rule-node-config.use-message-alarm-data' | translate }}
</mat-checkbox>
<mat-checkbox formControlName="overwriteAlarmDetails" *ngIf="createAlarmConfigForm.get('useMessageAlarmData').value === true">
{{ 'tb.rulenode.overwrite-alarm-details' | translate }}
{{ 'rule-node-config.overwrite-alarm-details' | translate }}
</mat-checkbox>
<section class="flex flex-col" *ngIf="createAlarmConfigForm.get('useMessageAlarmData').value === false ||
createAlarmConfigForm.get('overwriteAlarmDetails').value === true">
@ -67,41 +67,41 @@
</section>
<section class="flex flex-col" *ngIf="createAlarmConfigForm.get('useMessageAlarmData').value === false">
<mat-form-field class="flex-1" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.alarm-type</mat-label>
<mat-label translate>rule-node-config.alarm-type</mat-label>
<input required matInput formControlName="alarmType">
<mat-error *ngIf="createAlarmConfigForm.get('alarmType').hasError('required')">
{{ 'tb.rulenode.alarm-type-required' | translate }}
{{ 'rule-node-config.alarm-type-required' | translate }}
</mat-error>
<mat-hint translate>tb.rulenode.general-pattern-hint</mat-hint>
<mat-hint translate>rule-node-config.general-pattern-hint</mat-hint>
</mat-form-field>
<mat-checkbox formControlName="dynamicSeverity">
{{ 'tb.rulenode.use-alarm-severity-pattern' | translate }}
{{ 'rule-node-config.use-alarm-severity-pattern' | translate }}
</mat-checkbox>
<mat-form-field class="flex-1" *ngIf="!createAlarmConfigForm.get('dynamicSeverity').value">
<mat-label translate>tb.rulenode.alarm-severity</mat-label>
<mat-label translate>rule-node-config.alarm-severity</mat-label>
<mat-select formControlName="severity" required>
<mat-option *ngFor="let severity of alarmSeverities" [value]="severity">
{{ alarmSeverityTranslationMap.get(severity) | translate }}
</mat-option>
</mat-select>
<mat-error *ngIf="createAlarmConfigForm.get('severity').hasError('required')">
{{ 'tb.rulenode.alarm-severity-required' | translate }}
{{ 'rule-node-config.alarm-severity-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="flex-1" *ngIf="createAlarmConfigForm.get('dynamicSeverity').value" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.alarm-severity-pattern</mat-label>
<mat-label translate>rule-node-config.alarm-severity-pattern</mat-label>
<input matInput formControlName="severity" required>
<mat-error *ngIf="createAlarmConfigForm.get('severity').hasError('required')">
{{ 'tb.rulenode.alarm-severity-required' | translate }}
{{ 'rule-node-config.alarm-severity-required' | translate }}
</mat-error>
<mat-hint [innerHTML]="'tb.rulenode.alarm-severity-pattern-hint' | translate | safe: 'html'"></mat-hint>
<mat-hint [innerHTML]="'rule-node-config.alarm-severity-pattern-hint' | translate | safe: 'html'"></mat-hint>
</mat-form-field>
<mat-checkbox formControlName="propagate">
{{ 'tb.rulenode.propagate' | translate }}
{{ 'rule-node-config.propagate' | translate }}
</mat-checkbox>
<section *ngIf="createAlarmConfigForm.get('propagate').value === true">
<mat-form-field floatLabel="always" class="mat-block" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.relation-types-list</mat-label>
<mat-label translate>rule-node-config.relation-types-list</mat-label>
<mat-chip-grid #relationTypesChipList>
<mat-chip-row
*ngFor="let key of createAlarmConfigForm.get('relationTypes').value;"
@ -109,20 +109,20 @@
{{key}}
<mat-icon matChipRemove>close</mat-icon>
</mat-chip-row>
<input matInput type="text" placeholder="{{'tb.rulenode.relation-types-list' | translate}}"
<input matInput type="text" placeholder="{{'rule-node-config.relation-types-list' | translate}}"
[matChipInputFor]="relationTypesChipList"
[matChipInputSeparatorKeyCodes]="separatorKeysCodes"
(matChipInputTokenEnd)="addKey($event, 'relationTypes')"
[matChipInputAddOnBlur]="true">
</mat-chip-grid>
<mat-hint translate>tb.rulenode.relation-types-list-hint</mat-hint>
<mat-hint translate>rule-node-config.relation-types-list-hint</mat-hint>
</mat-form-field>
</section>
<mat-checkbox formControlName="propagateToOwner">
{{ 'tb.rulenode.propagate-to-owner' | translate }}
{{ 'rule-node-config.propagate-to-owner' | translate }}
</mat-checkbox>
<mat-checkbox formControlName="propagateToTenant">
{{ 'tb.rulenode.propagate-to-tenant' | translate }}
{{ 'rule-node-config.propagate-to-tenant' | translate }}
</mat-checkbox>
</section>
</section>

View File

@ -54,7 +54,7 @@ export class CreateAlarmConfigComponent extends RuleNodeConfigurationComponent {
readonly hasScript = true;
readonly testScriptLabel = 'tb.rulenode.test-details-function';
readonly testScriptLabel = 'rule-node-config.test-details-function';
constructor(protected store: Store<AppState>,
private fb: UntypedFormBuilder,
@ -143,7 +143,7 @@ export class CreateAlarmConfigComponent extends RuleNodeConfigurationComponent {
this.nodeScriptTestService.testNodeScript(
script,
'json',
this.translate.instant('tb.rulenode.details'),
this.translate.instant('rule-node-config.details'),
'Details',
['msg', 'metadata', 'msgType'],
this.ruleNodeId,

View File

@ -17,7 +17,7 @@
-->
<section [formGroup]="createRelationConfigForm" class="tb-form-panel no-padding no-border">
<div class="tb-form-panel stroked no-padding-bottom">
<div class="tb-form-panel-title" translate>tb.rulenode.relation-parameters</div>
<div class="tb-form-panel-title" translate>rule-node-config.relation-parameters</div>
<div class="flex flex-col">
<mat-form-field class="mat-block" hideRequiredMarker>
<mat-label translate>relation.direction</mat-label>
@ -35,7 +35,7 @@
</div>
<div class="tb-form-panel stroked no-padding-bottom">
<div class="tb-form-panel-title" translate>tb.rulenode.target-entity</div>
<div class="tb-form-panel-title" translate>rule-node-config.target-entity</div>
<div class="flex flex-row gap-4">
<tb-entity-type-select
class="flex-1"
@ -55,43 +55,43 @@
<mat-form-field *ngIf="createRelationConfigForm.get('entityType').value === entityType.DEVICE ||
createRelationConfigForm.get('entityType').value === entityType.ASSET"
class="mat-block flex-1">
<mat-label translate>tb.rulenode.profile-name</mat-label>
<mat-label translate>rule-node-config.profile-name</mat-label>
<input matInput formControlName="entityTypePattern">
</mat-form-field>
</div>
<tb-example-hint [hintText]="'tb.rulenode.kv-map-pattern-hint'"
<tb-example-hint [hintText]="'rule-node-config.kv-map-pattern-hint'"
*ngIf="createRelationConfigForm.get('entityType').value === entityType.CUSTOMER ||
createRelationConfigForm.get('entityType').value === entityType.DEVICE ||
createRelationConfigForm.get('entityType').value === entityType.ASSET"></tb-example-hint>
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.create-entity-if-not-exists-hint' | translate }}"
<div tb-hint-tooltip-icon="{{ 'rule-node-config.create-entity-if-not-exists-hint' | translate }}"
*ngIf="createRelationConfigForm.get('entityType').value === entityType.CUSTOMER ||
createRelationConfigForm.get('entityType').value === entityType.DEVICE ||
createRelationConfigForm.get('entityType').value === entityType.ASSET"
style="margin-bottom: 18px"
class="tb-form-row no-border no-padding">
<mat-slide-toggle class="mat-slide" formControlName="createEntityIfNotExists">
{{ 'tb.rulenode.create-entity-if-not-exists' | translate }}
{{ 'rule-node-config.create-entity-if-not-exists' | translate }}
</mat-slide-toggle>
</div>
</div>
<section class="tb-form-panel stroked no-padding">
<mat-expansion-panel class="tb-settings">
<mat-expansion-panel-header style="padding: 16px">
<mat-panel-title translate>tb.rulenode.advanced-settings</mat-panel-title>
<mat-panel-title translate>rule-node-config.advanced-settings</mat-panel-title>
</mat-expansion-panel-header>
<div class="tb-form-panel no-border no-padding-top">
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.remove-current-relations-hint' | translate }}"
<div tb-hint-tooltip-icon="{{ 'rule-node-config.remove-current-relations-hint' | translate }}"
class="tb-form-row no-border no-padding">
<mat-slide-toggle class="mat-slide" formControlName="removeCurrentRelations">
{{ 'tb.rulenode.remove-current-relations' | translate }}
{{ 'rule-node-config.remove-current-relations' | translate }}
</mat-slide-toggle>
</div>
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.change-originator-to-related-entity-hint' | translate }}"
<div tb-hint-tooltip-icon="{{ 'rule-node-config.change-originator-to-related-entity-hint' | translate }}"
class="tb-form-row no-border no-padding">
<mat-slide-toggle class="mat-slide" formControlName="changeOriginatorToRelatedEntity">
{{ 'tb.rulenode.change-originator-to-related-entity' | translate }}
{{ 'rule-node-config.change-originator-to-related-entity' | translate }}
</mat-slide-toggle>
</div>
</div>

View File

@ -30,8 +30,8 @@ export class CreateRelationConfigComponent extends RuleNodeConfigurationComponen
directionTypes = Object.keys(EntitySearchDirection);
directionTypeTranslations = new Map<EntitySearchDirection, string>(
[
[EntitySearchDirection.FROM, 'tb.rulenode.search-direction-from'],
[EntitySearchDirection.TO, 'tb.rulenode.search-direction-to'],
[EntitySearchDirection.FROM, 'rule-node-config.search-direction-from'],
[EntitySearchDirection.TO, 'rule-node-config.search-direction-to'],
]
);
@ -39,13 +39,13 @@ export class CreateRelationConfigComponent extends RuleNodeConfigurationComponen
entityTypeNamePatternTranslation = new Map<EntityType, string>(
[
[EntityType.DEVICE, 'tb.rulenode.device-name-pattern'],
[EntityType.ASSET, 'tb.rulenode.asset-name-pattern'],
[EntityType.ENTITY_VIEW, 'tb.rulenode.entity-view-name-pattern'],
[EntityType.CUSTOMER, 'tb.rulenode.customer-title-pattern'],
[EntityType.USER, 'tb.rulenode.user-name-pattern'],
[EntityType.DASHBOARD, 'tb.rulenode.dashboard-name-pattern'],
[EntityType.EDGE, 'tb.rulenode.edge-name-pattern']
[EntityType.DEVICE, 'rule-node-config.device-name-pattern'],
[EntityType.ASSET, 'rule-node-config.asset-name-pattern'],
[EntityType.ENTITY_VIEW, 'rule-node-config.entity-view-name-pattern'],
[EntityType.CUSTOMER, 'rule-node-config.customer-title-pattern'],
[EntityType.USER, 'rule-node-config.user-name-pattern'],
[EntityType.DASHBOARD, 'rule-node-config.dashboard-name-pattern'],
[EntityType.EDGE, 'rule-node-config.edge-name-pattern']
]
);

View File

@ -17,11 +17,11 @@
-->
<section [formGroup]="deleteAttributesConfigForm" class="tb-form-panel no-border no-padding">
<div class="tb-form-panel stroked">
<tb-example-hint [hintText]="'tb.rulenode.attributes-scope-hint'">
<tb-example-hint [hintText]="'rule-node-config.attributes-scope-hint'">
</tb-example-hint>
<div class="tb-form-row no-border no-padding tb-standard-fields">
<mat-form-field class="flex">
<mat-label>{{ 'tb.rulenode.attributes-scope' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.attributes-scope' | translate }}</mat-label>
<mat-select required
class="tb-entity-type-select" matInput formControlName="scope">
<mat-option *ngFor="let scope of attributeScopes" [value]="scope">
@ -30,7 +30,7 @@
</mat-select>
</mat-form-field>
<mat-form-field class="flex">
<mat-label>{{ 'tb.rulenode.attributes-scope-value' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.attributes-scope-value' | translate }}</mat-label>
<input type="text" matInput readonly disabled [ngModel]="deleteAttributesConfigForm.get('scope').value" [ngModelOptions]="{standalone: true}">
<button type="button"
matSuffix
@ -38,7 +38,7 @@
aria-label="Copy"
ngxClipboard
[cbContent]="deleteAttributesConfigForm.get('scope').value"
matTooltip="{{ 'tb.rulenode.attributes-scope-value-copy' | translate }}">
matTooltip="{{ 'rule-node-config.attributes-scope-value-copy' | translate }}">
<mat-icon aria-hidden="false"
aria-label="help-icon">content_copy
</mat-icon>
@ -48,7 +48,7 @@
</div>
<mat-form-field class="mat-block" subscriptSizing="dynamic">
<mat-label>{{ 'tb.rulenode.attributes-keys' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.attributes-keys' | translate }}</mat-label>
<mat-chip-grid formControlName="keys" #attributeChipList>
<mat-chip-row
*ngFor="let key of deleteAttributesConfigForm.get('keys').value;"
@ -62,26 +62,26 @@
(matChipInputTokenEnd)="addKey($event)"
[matChipInputAddOnBlur]="true">
</mat-chip-grid>
<mat-error *ngIf="deleteAttributesConfigForm.get('keys').hasError('required')">{{ 'tb.rulenode.attributes-keys-required' | translate }}</mat-error>
<mat-hint translate>tb.rulenode.general-pattern-hint</mat-hint>
<mat-error *ngIf="deleteAttributesConfigForm.get('keys').hasError('required')">{{ 'rule-node-config.attributes-keys-required' | translate }}</mat-error>
<mat-hint translate>rule-node-config.general-pattern-hint</mat-hint>
</mat-form-field>
<section class="tb-form-panel stroked">
<mat-expansion-panel class="tb-settings">
<mat-expansion-panel-header>
<mat-panel-title translate>tb.rulenode.advanced-settings</mat-panel-title>
<mat-panel-title translate>rule-node-config.advanced-settings</mat-panel-title>
</mat-expansion-panel-header>
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.send-attributes-deleted-notification-hint' | translate }}"
<div tb-hint-tooltip-icon="{{ 'rule-node-config.send-attributes-deleted-notification-hint' | translate }}"
class="tb-form-row no-border no-padding">
<mat-slide-toggle class="mat-slide" formControlName="sendAttributesDeletedNotification">
{{ 'tb.rulenode.send-attributes-deleted-notification' | translate }}
{{ 'rule-node-config.send-attributes-deleted-notification' | translate }}
</mat-slide-toggle>
</div>
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.notify-device-on-delete-hint' | translate }}"
<div tb-hint-tooltip-icon="{{ 'rule-node-config.notify-device-on-delete-hint' | translate }}"
*ngIf="deleteAttributesConfigForm.get('scope').value === attributeScopeMap.SHARED_SCOPE"
class="tb-form-row no-border no-padding">
<mat-slide-toggle class="mat-slide" formControlName="notifyDevice">
{{ 'tb.rulenode.notify-device' | translate }}
{{ 'rule-node-config.notify-device' | translate }}
</mat-slide-toggle>
</div>
</mat-expansion-panel>

View File

@ -17,7 +17,7 @@
-->
<section [formGroup]="deleteRelationConfigForm" class="tb-form-panel no-padding no-border">
<div class="tb-form-panel stroked no-padding-bottom">
<div class="tb-form-panel-title" translate>tb.rulenode.relation-parameters</div>
<div class="tb-form-panel-title" translate>rule-node-config.relation-parameters</div>
<div class="flex flex-col">
<mat-form-field class="mat-block" hideRequiredMarker>
<mat-label translate>relation.direction</mat-label>
@ -34,10 +34,10 @@
</div>
</div>
<div class="tb-form-panel stroked">
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.delete-relation-with-specific-entity-hint' | translate }}"
<div tb-hint-tooltip-icon="{{ 'rule-node-config.delete-relation-with-specific-entity-hint' | translate }}"
class="tb-form-row no-border no-padding">
<mat-slide-toggle class="mat-slide" formControlName="deleteForSingleEntity">
{{ 'tb.rulenode.delete-relation-with-specific-entity' | translate }}
{{ 'rule-node-config.delete-relation-with-specific-entity' | translate }}
</mat-slide-toggle>
</div>
<div *ngIf="deleteRelationConfigForm.get('deleteForSingleEntity').value">
@ -56,7 +56,7 @@
</mat-form-field>
</div>
<tb-example-hint *ngIf="deleteRelationConfigForm.get('entityType').value && deleteRelationConfigForm.get('entityType').value !== entityType.TENANT"
[hintText]="'tb.rulenode.kv-map-single-pattern-hint'"></tb-example-hint>
[hintText]="'rule-node-config.kv-map-single-pattern-hint'"></tb-example-hint>
</div>
</div>
</section>

View File

@ -31,20 +31,20 @@ export class DeleteRelationConfigComponent extends RuleNodeConfigurationComponen
directionTypeTranslations = new Map<EntitySearchDirection, string>(
[
[EntitySearchDirection.FROM, 'tb.rulenode.del-relation-direction-from'],
[EntitySearchDirection.TO, 'tb.rulenode.del-relation-direction-to'],
[EntitySearchDirection.FROM, 'rule-node-config.del-relation-direction-from'],
[EntitySearchDirection.TO, 'rule-node-config.del-relation-direction-to'],
]
);
entityTypeNamePatternTranslation = new Map<EntityType, string>(
[
[EntityType.DEVICE, 'tb.rulenode.device-name-pattern'],
[EntityType.ASSET, 'tb.rulenode.asset-name-pattern'],
[EntityType.ENTITY_VIEW, 'tb.rulenode.entity-view-name-pattern'],
[EntityType.CUSTOMER, 'tb.rulenode.customer-title-pattern'],
[EntityType.USER, 'tb.rulenode.user-name-pattern'],
[EntityType.DASHBOARD, 'tb.rulenode.dashboard-name-pattern'],
[EntityType.EDGE, 'tb.rulenode.edge-name-pattern']
[EntityType.DEVICE, 'rule-node-config.device-name-pattern'],
[EntityType.ASSET, 'rule-node-config.asset-name-pattern'],
[EntityType.ENTITY_VIEW, 'rule-node-config.entity-view-name-pattern'],
[EntityType.CUSTOMER, 'rule-node-config.customer-title-pattern'],
[EntityType.USER, 'rule-node-config.user-name-pattern'],
[EntityType.DASHBOARD, 'rule-node-config.dashboard-name-pattern'],
[EntityType.EDGE, 'rule-node-config.edge-name-pattern']
]
);

View File

@ -16,17 +16,17 @@
-->
<section [formGroup]="deviceProfile" class="tb-form-panel stroked">
<div class="tb-form-hint tb-primary-fill" translate>tb.rulenode.device-profile-node-hint</div>
<div tb-hint-tooltip-icon="{{'tb.rulenode.persist-alarm-rules-hint' | translate }}"
<div class="tb-form-hint tb-primary-fill" translate>rule-node-config.device-profile-node-hint</div>
<div tb-hint-tooltip-icon="{{'rule-node-config.persist-alarm-rules-hint' | translate }}"
class="tb-form-row no-border no-padding slide-toggle">
<mat-slide-toggle class="mat-slide" formControlName="persistAlarmRulesState">
{{ 'tb.rulenode.persist-alarm-rules' | translate }}
{{ 'rule-node-config.persist-alarm-rules' | translate }}
</mat-slide-toggle>
</div>
<div tb-hint-tooltip-icon="{{'tb.rulenode.fetch-alarm-rules-hint' | translate }}"
<div tb-hint-tooltip-icon="{{'rule-node-config.fetch-alarm-rules-hint' | translate }}"
class="tb-form-row no-border no-padding slide-toggle">
<mat-slide-toggle class="mat-slide" formControlName="fetchAlarmRulesStateOnStart">
{{ 'tb.rulenode.fetch-alarm-rules' | translate }}
{{ 'rule-node-config.fetch-alarm-rules' | translate }}
</mat-slide-toggle>
</div>
</section>

View File

@ -17,7 +17,7 @@
-->
<section [formGroup]="deviceState">
<mat-form-field class="mat-block" subscriptSizing="dynamic">
<mat-label>{{ 'tb.rulenode.select-device-connectivity-event' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.select-device-connectivity-event' | translate }}</mat-label>
<mat-select formControlName="event">
<mat-option *ngFor="let eventOption of eventOptions" [value]="eventOption">
{{ messageTypeNames.get(eventOption) }}

View File

@ -17,33 +17,33 @@
-->
<section [formGroup]="generatorConfigForm" class="tb-form-panel no-border no-padding">
<div class="tb-form-panel no-padding-bottom stroked">
<div class="tb-form-panel-title" translate>tb.rulenode.generation-parameters</div>
<div class="tb-form-panel-title" translate>rule-node-config.generation-parameters</div>
<div class="tb-form-row no-border no-padding tb-standard-fields column-xs">
<mat-form-field class="flex">
<mat-label translate>tb.rulenode.message-count</mat-label>
<mat-label translate>rule-node-config.message-count</mat-label>
<input required type="number" min="0" step="1" matInput formControlName="msgCount">
<mat-error *ngIf="generatorConfigForm.get('msgCount').hasError('required')">
{{ 'tb.rulenode.message-count-required' | translate }}
{{ 'rule-node-config.message-count-required' | translate }}
</mat-error>
<mat-error *ngIf="generatorConfigForm.get('msgCount').hasError('min')">
{{ 'tb.rulenode.min-message-count-message' | translate }}
{{ 'rule-node-config.min-message-count-message' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="flex">
<mat-label translate>tb.rulenode.generation-frequency-seconds</mat-label>
<mat-label translate>rule-node-config.generation-frequency-seconds</mat-label>
<input required type="number" min="1" step="1" matInput formControlName="periodInSeconds">
<mat-error *ngIf="generatorConfigForm.get('periodInSeconds').hasError('required')">
{{ 'tb.rulenode.generation-frequency-required' | translate }}
{{ 'rule-node-config.generation-frequency-required' | translate }}
</mat-error>
<mat-error *ngIf="generatorConfigForm.get('periodInSeconds').hasError('min')">
{{ 'tb.rulenode.min-generation-frequency-message' | translate }}
{{ 'rule-node-config.min-generation-frequency-message' | translate }}
</mat-error>
</mat-form-field>
</div>
</div>
<div class="tb-form-panel no-padding-bottom stroked">
<div class="tb-form-panel-title" translate>tb.rulenode.originator</div>
<div class="tb-form-panel-title" translate>rule-node-config.originator</div>
<tb-entity-select class="flex-1"
required="true"
useAliasEntityTypes="true"
@ -55,7 +55,7 @@
<div class="tb-form-panel stroked">
<mat-expansion-panel class="tb-settings" expanded>
<mat-expansion-panel-header>
<mat-panel-title translate>tb.rulenode.generator-function</mat-panel-title>
<mat-panel-title translate>rule-node-config.generator-function</mat-panel-title>
</mat-expansion-panel-header>
<tb-js-func *ngIf="generatorConfigForm.get('scriptLang').value === scriptLanguage.JS"
#jsFuncComponent
@ -66,10 +66,10 @@
noValidate="true">
<tb-toggle-select toolbarPrefixButton formControlName="scriptLang" appearance="fill" *ngIf="tbelEnabled">
<tb-toggle-option [value]="scriptLanguage.TBEL">
{{ 'tb.rulenode.script-lang-tbel' | translate }}
{{ 'rule-node-config.script-lang-tbel' | translate }}
</tb-toggle-option>
<tb-toggle-option [value]="scriptLanguage.JS">
{{ 'tb.rulenode.script-lang-js' | translate }}
{{ 'rule-node-config.script-lang-js' | translate }}
</tb-toggle-option>
</tb-toggle-select>
<button toolbarSuffixButton
@ -92,10 +92,10 @@
noValidate="true">
<tb-toggle-select toolbarPrefixButton formControlName="scriptLang" appearance="fill">
<tb-toggle-option [value]="scriptLanguage.TBEL">
{{ 'tb.rulenode.script-lang-tbel' | translate }}
{{ 'rule-node-config.script-lang-tbel' | translate }}
</tb-toggle-option>
<tb-toggle-option [value]="scriptLanguage.JS">
{{ 'tb.rulenode.script-lang-js' | translate }}
{{ 'rule-node-config.script-lang-js' | translate }}
</tb-toggle-option>
</tb-toggle-select>
<button toolbarSuffixButton

View File

@ -51,13 +51,13 @@ export class GeneratorConfigComponent extends RuleNodeConfigurationComponent {
];
additionEntityTypes = {
TENANT: this.translate.instant('tb.rulenode.current-tenant'),
RULE_NODE: this.translate.instant('tb.rulenode.current-rule-node')
TENANT: this.translate.instant('rule-node-config.current-tenant'),
RULE_NODE: this.translate.instant('rule-node-config.current-rule-node')
};
readonly hasScript = true;
readonly testScriptLabel = 'tb.rulenode.test-generator-function';
readonly testScriptLabel = 'rule-node-config.test-generator-function';
constructor(private fb: UntypedFormBuilder,
private nodeScriptTestService: NodeScriptTestService,
@ -131,7 +131,7 @@ export class GeneratorConfigComponent extends RuleNodeConfigurationComponent {
this.nodeScriptTestService.testNodeScript(
script,
'generate',
this.translate.instant('tb.rulenode.generator'),
this.translate.instant('rule-node-config.generator'),
'Generate',
['prevMsg', 'prevMetadata', 'prevMsgType'],
this.ruleNodeId,

View File

@ -17,32 +17,32 @@
-->
<section [formGroup]="geoActionConfigForm" class="tb-form-panel no-border no-padding">
<section class="tb-form-panel stroked">
<div class="tb-form-panel-title" translate>tb.rulenode.coordinate-field-names</div>
<div class="tb-form-panel-title" translate>rule-node-config.coordinate-field-names</div>
<section>
<div class="flex flex-row gap-4">
<mat-form-field class="mat-block max-w-50% flex-full">
<mat-label>{{ 'tb.rulenode.latitude-field-name' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.latitude-field-name' | translate }}</mat-label>
<input matInput formControlName="latitudeKeyName" required>
<mat-error *ngIf="geoActionConfigForm.get('latitudeKeyName').hasError('required')">
{{ 'tb.rulenode.latitude-field-name-required' | translate }}
{{ 'rule-node-config.latitude-field-name-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block max-w-50% flex-full">
<mat-label>{{ 'tb.rulenode.longitude-field-name' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.longitude-field-name' | translate }}</mat-label>
<input matInput formControlName="longitudeKeyName" required>
<mat-error *ngIf="geoActionConfigForm.get('longitudeKeyName').hasError('required')">
{{ 'tb.rulenode.longitude-field-name-required' | translate }}
{{ 'rule-node-config.longitude-field-name-required' | translate }}
</mat-error>
</mat-form-field>
</div>
<div class="tb-form-hint tb-primary-fill" translate>tb.rulenode.coordinate-field-hint</div>
<div class="tb-form-hint tb-primary-fill" translate>rule-node-config.coordinate-field-hint</div>
</section>
</section>
<section class="tb-form-panel stroked" [class.no-padding-bottom]="!defaultPaddingEnable">
<div class="tb-form-panel-title" translate>tb.rulenode.geofence-configuration</div>
<div class="tb-form-panel-title" translate>rule-node-config.geofence-configuration</div>
<section class="flex flex-col">
<mat-form-field class="mat-block flex-1" hideRequiredMarker>
<mat-label>{{ 'tb.rulenode.perimeter-type' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.perimeter-type' | translate }}</mat-label>
<mat-select formControlName="perimeterType">
<mat-option *ngFor="let type of perimeterTypes" [value]="type">
{{ perimeterTypeTranslationMap.get(type) | translate }}
@ -50,63 +50,63 @@
</mat-select>
</mat-form-field>
<div tb-hint-tooltip-icon="{{ geoActionConfigForm.get('perimeterType').value === perimeterType.CIRCLE
? ('tb.rulenode.fetch-circle-parameter-info-from-metadata-hint'
? ('rule-node-config.fetch-circle-parameter-info-from-metadata-hint'
| translate : { perimeterKeyName: geoActionConfigForm.get('perimeterKeyName').valid
? geoActionConfigForm.get('perimeterKeyName').value
: 'ss_perimeter'})
: ('tb.rulenode.fetch-poligon-parameter-info-from-metadata-hint'
: ('rule-node-config.fetch-poligon-parameter-info-from-metadata-hint'
| translate : { perimeterKeyName: geoActionConfigForm.get('perimeterKeyName').valid
? geoActionConfigForm.get('perimeterKeyName').value
: 'ss_perimeter'}) }}"
class="tb-form-row no-border no-padding slide-toggle">
<mat-slide-toggle class="mat-slide" formControlName="fetchPerimeterInfoFromMessageMetadata">
{{ 'tb.rulenode.fetch-perimeter-info-from-metadata' | translate }}
{{ 'rule-node-config.fetch-perimeter-info-from-metadata' | translate }}
</mat-slide-toggle>
</div>
<mat-form-field *ngIf="geoActionConfigForm.get('fetchPerimeterInfoFromMessageMetadata').value" class="mat-block">
<mat-label>{{ 'tb.rulenode.perimeter-key-name' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.perimeter-key-name' | translate }}</mat-label>
<input matInput formControlName="perimeterKeyName" required>
<mat-error *ngIf="geoActionConfigForm.get('perimeterKeyName').hasError('required')">
{{ 'tb.rulenode.perimeter-key-name-required' | translate }}
{{ 'rule-node-config.perimeter-key-name-required' | translate }}
</mat-error>
<mat-hint>{{ 'tb.rulenode.perimeter-key-name-hint' | translate }}</mat-hint>
<mat-hint>{{ 'rule-node-config.perimeter-key-name-hint' | translate }}</mat-hint>
</mat-form-field>
<div class="flex flex-col"
*ngIf="geoActionConfigForm.get('perimeterType').value === perimeterType.CIRCLE &&
!geoActionConfigForm.get('fetchPerimeterInfoFromMessageMetadata').value">
<div class="flex flex-row gap-4">
<mat-form-field class="flex-1">
<mat-label>{{ 'tb.rulenode.circle-center-latitude' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.circle-center-latitude' | translate }}</mat-label>
<input type="number" min="-90" max="90" step="0.1" matInput formControlName="centerLatitude" required>
<mat-error *ngIf="geoActionConfigForm.get('centerLatitude').hasError('required')">
{{ 'tb.rulenode.circle-center-latitude-required' | translate }}
{{ 'rule-node-config.circle-center-latitude-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="flex-1">
<mat-label>{{ 'tb.rulenode.circle-center-longitude' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.circle-center-longitude' | translate }}</mat-label>
<input type="number" min="-180" max="180" step="0.1" matInput formControlName="centerLongitude" required>
<mat-error *ngIf="geoActionConfigForm.get('centerLongitude').hasError('required')">
{{ 'tb.rulenode.circle-center-longitude-required' | translate }}
{{ 'rule-node-config.circle-center-longitude-required' | translate }}
</mat-error>
</mat-form-field>
</div>
<div class="flex flex-row gap-4">
<mat-form-field class="flex-1">
<mat-label>{{ 'tb.rulenode.range' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.range' | translate }}</mat-label>
<input type="number" min="0" step="0.1" matInput formControlName="range" required>
<mat-error *ngIf="geoActionConfigForm.get('range').hasError('required')">
{{ 'tb.rulenode.range-required' | translate }}
{{ 'rule-node-config.range-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="flex-1">
<mat-label>{{ 'tb.rulenode.range-units' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.range-units' | translate }}</mat-label>
<mat-select formControlName="rangeUnit" required>
<mat-option *ngFor="let type of rangeUnits" [value]="type">
{{ rangeUnitTranslationMap.get(type) | translate }}
</mat-option>
</mat-select>
<mat-error *ngIf="geoActionConfigForm.get('rangeUnit').hasError('required')">
{{ 'tb.rulenode.range-units-required' | translate }}
{{ 'rule-node-config.range-units-required' | translate }}
</mat-error>
</mat-form-field>
</div>
@ -114,15 +114,15 @@
<div class="flex flex-col" *ngIf="geoActionConfigForm.get('perimeterType').value === perimeterType.POLYGON &&
!geoActionConfigForm.get('fetchPerimeterInfoFromMessageMetadata').value">
<mat-form-field class="mat-block" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.polygon-definition</mat-label>
<mat-label translate>rule-node-config.polygon-definition</mat-label>
<input matInput formControlName="polygonsDefinition" required>
<mat-icon matSuffix class="margin-8 cursor-pointer" aria-hidden="false" aria-label="help-icon"
color="primary"
matTooltip="{{ 'tb.rulenode.polygon-definition-hint' | translate }}">
matTooltip="{{ 'rule-node-config.polygon-definition-hint' | translate }}">
help
</mat-icon>
<mat-error *ngIf="geoActionConfigForm.get('polygonsDefinition').hasError('required')">
{{ 'tb.rulenode.polygon-definition-required' | translate }}
{{ 'rule-node-config.polygon-definition-required' | translate }}
</mat-error>
</mat-form-field>
</div>
@ -130,7 +130,7 @@
</section>
<section class="tb-form-panel stroked no-padding-bottom">
<div class="flex flex-col items-stretch justify-between gt-sm:flex-row lt-md:gap-4">
<div class="tb-form-panel-title">{{ 'tb.rulenode.presence-monitoring-strategy' | translate }}</div>
<div class="tb-form-panel-title">{{ 'rule-node-config.presence-monitoring-strategy' | translate }}</div>
<tb-toggle-select class="fetch-to-data-toggle" formControlName="reportPresenceStatusOnEachMessage" appearance="fill" >
<tb-toggle-option *ngFor="let strategy of presenceMonitoringStrategyKeys" [value]="presenceMonitoringStrategies.get(strategy).value">
{{ presenceMonitoringStrategies.get(strategy).name | translate }}
@ -138,27 +138,27 @@
</tb-toggle-select>
</div>
<div class="tb-form-hint tb-primary-fill"> {{ geoActionConfigForm.get('reportPresenceStatusOnEachMessage').value === false ?
('tb.rulenode.presence-monitoring-strategy-on-first-message-hint' | translate) :
('tb.rulenode.presence-monitoring-strategy-on-each-message-hint' | translate) }}
('rule-node-config.presence-monitoring-strategy-on-first-message-hint' | translate) :
('rule-node-config.presence-monitoring-strategy-on-each-message-hint' | translate) }}
</div>
<section class="flex flex-col">
<div *ngIf="geoActionConfigForm.get('reportPresenceStatusOnEachMessage').value === false">
<div class="flex flex-col gt-sm:flex-row gt-sm:gap-2">
<mat-form-field class="mat-block flex-1">
<mat-label translate>tb.rulenode.min-inside-duration</mat-label>
<mat-label translate>rule-node-config.min-inside-duration</mat-label>
<input type="number" step="1" min="1" max="2147483647" matInput formControlName="minInsideDuration" required>
<mat-error *ngIf="geoActionConfigForm.get('minInsideDuration').hasError('required')">
{{ 'tb.rulenode.min-inside-duration-value-required' | translate }}
{{ 'rule-node-config.min-inside-duration-value-required' | translate }}
</mat-error>
<mat-error *ngIf="geoActionConfigForm.get('minInsideDuration').hasError('min')">
{{ 'tb.rulenode.time-value-range' | translate }}
{{ 'rule-node-config.time-value-range' | translate }}
</mat-error>
<mat-error *ngIf="geoActionConfigForm.get('minInsideDuration').hasError('max')">
{{ 'tb.rulenode.time-value-range' | translate }}
{{ 'rule-node-config.time-value-range' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block flex-1">
<mat-label translate>tb.rulenode.min-inside-duration-time-unit</mat-label>
<mat-label translate>rule-node-config.min-inside-duration-time-unit</mat-label>
<mat-select formControlName="minInsideDurationTimeUnit" required>
<mat-option *ngFor="let timeUnit of timeUnits" [value]="timeUnit">
{{ timeUnitsTranslationMap.get(timeUnit) | translate }}
@ -168,20 +168,20 @@
</div>
<div class="flex flex-col gt-sm:flex-row gt-sm:gap-2">
<mat-form-field class="mat-block flex-1">
<mat-label translate>tb.rulenode.min-outside-duration</mat-label>
<mat-label translate>rule-node-config.min-outside-duration</mat-label>
<input type="number" step="1" min="1" max="2147483647" matInput formControlName="minOutsideDuration" required>
<mat-error *ngIf="geoActionConfigForm.get('minOutsideDuration').hasError('required')">
{{ 'tb.rulenode.min-outside-duration-value-required' | translate }}
{{ 'rule-node-config.min-outside-duration-value-required' | translate }}
</mat-error>
<mat-error *ngIf="geoActionConfigForm.get('minOutsideDuration').hasError('min')">
{{ 'tb.rulenode.time-value-range' | translate }}
{{ 'rule-node-config.time-value-range' | translate }}
</mat-error>
<mat-error *ngIf="geoActionConfigForm.get('minOutsideDuration').hasError('max')">
{{ 'tb.rulenode.time-value-range' | translate }}
{{ 'rule-node-config.time-value-range' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block flex-1">
<mat-label translate>tb.rulenode.min-outside-duration-time-unit</mat-label>
<mat-label translate>rule-node-config.min-outside-duration-time-unit</mat-label>
<mat-select formControlName="minOutsideDurationTimeUnit" required>
<mat-option *ngFor="let timeUnit of timeUnits" [value]="timeUnit">
{{ timeUnitsTranslationMap.get(timeUnit) | translate }}

View File

@ -46,7 +46,7 @@ export class LogConfigComponent extends RuleNodeConfigurationComponent {
readonly hasScript = true;
readonly testScriptLabel = 'tb.rulenode.test-to-string-function';
readonly testScriptLabel = 'rule-node-config.test-to-string-function';
constructor(private fb: UntypedFormBuilder,
private nodeScriptTestService: NodeScriptTestService,
@ -100,7 +100,7 @@ export class LogConfigComponent extends RuleNodeConfigurationComponent {
this.nodeScriptTestService.testNodeScript(
script,
'string',
this.translate.instant('tb.rulenode.to-string'),
this.translate.instant('rule-node-config.to-string'),
'ToString',
['msg', 'metadata', 'msgType'],
this.ruleNodeId,

View File

@ -22,27 +22,27 @@
formControlName="operation">
</tb-math-function-autocomplete>
<fieldset class="fields-group flex flex-col gap-2">
<legend class="group-title" translate>tb.rulenode.argument-tile</legend>
<legend class="group-title" translate>rule-node-config.argument-tile</legend>
<tb-arguments-map-config formControlName="arguments"
[function]="mathFunctionConfigForm.get('operation').value">
</tb-arguments-map-config>
</fieldset>
<fieldset *ngIf="mathFunctionConfigForm.get('operation').value === MathFunction.CUSTOM"
class="fields-group flex flex-col gap-2">
<legend class="group-title">{{'tb.rulenode.custom-expression-field-input' | translate }} *</legend>
<legend class="group-title">{{'rule-node-config.custom-expression-field-input' | translate }} *</legend>
<mat-form-field class="mat-block no-margin-top flex-1" subscriptSizing="dynamic">
<input matInput formControlName="customFunction" required/>
<mat-error *ngIf="mathFunctionConfigForm.get('customFunction').hasError('required')" translate>
tb.rulenode.custom-expression-field-input-required
rule-node-config.custom-expression-field-input-required
</mat-error>
<mat-hint translate>tb.rulenode.custom-expression-field-input-hint</mat-hint>
<mat-hint translate>rule-node-config.custom-expression-field-input-hint</mat-hint>
</mat-form-field>
</fieldset>
<fieldset class="fields-group flex flex-col gap-2">
<legend class="group-title" translate>tb.rulenode.result-title</legend>
<legend class="group-title" translate>rule-node-config.result-title</legend>
<div formGroupName="result">
<mat-form-field class="mat-block flex-1">
<mat-label translate>tb.rulenode.type-field-input</mat-label>
<mat-label translate>rule-node-config.type-field-input</mat-label>
<mat-select formControlName="type" required>
<mat-select-trigger>
{{ argumentTypeResultMap.get(mathFunctionConfigForm.get('result.type').value)?.name | translate }}
@ -51,17 +51,17 @@
style="border-bottom: 1px solid #eee;">
{{ argumentTypeResultMap.get(argument).name | translate }}
<small style="display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">
{{ argumentTypeResultMap.get(argument).description }}
{{ argumentTypeResultMap.get(argument).description | translate }}
</small>
</mat-option>
</mat-select>
<mat-error *ngIf="mathFunctionConfigForm.get('result.type').hasError('required')" translate>
tb.rulenode.type-field-input-required
rule-node-config.type-field-input-required
</mat-error>
</mat-form-field>
<div class="xs:flex-col gt-xs:gap-4 flex flex-1 flex-row">
<mat-form-field class="mat-block flex-1" *ngIf="mathFunctionConfigForm.get('result').get('type').value === ArgumentTypeResult.ATTRIBUTE">
<mat-label translate>tb.rulenode.attribute-scope-field-input</mat-label>
<mat-label translate>rule-node-config.attribute-scope-field-input</mat-label>
<mat-select required formControlName="attributeScope">
<mat-option *ngFor="let scope of attributeScopeResult" [value]="scope">
{{ attributeScopeMap.get(scope) | translate }}
@ -69,33 +69,33 @@
</mat-select>
</mat-form-field>
<mat-form-field floatLabel="always" class="mat-block flex-1">
<mat-label translate>tb.rulenode.key-field-input</mat-label>
<mat-label translate>rule-node-config.key-field-input</mat-label>
<input matInput formControlName="key" required/>
<mat-icon class="help-icon margin-8 cursor-pointer" aria-hidden="false" aria-label="help-icon" matSuffix
color="primary"
matTooltip="{{ 'tb.rulenode.math-templatization-tooltip' | translate }}">help</mat-icon>
matTooltip="{{ 'rule-node-config.math-templatization-tooltip' | translate }}">help</mat-icon>
<mat-error *ngIf="mathFunctionConfigForm.get('result.key').hasError('required')" translate>
tb.rulenode.key-field-input-required
rule-node-config.key-field-input-required
</mat-error>
</mat-form-field>
</div>
<div class="xs:flex-col gt-xs:gap-4 flex flex-1 flex-row">
<mat-form-field floatLabel="always" class="mat-block flex-1" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.number-floating-point-field-input</mat-label>
<mat-label translate>rule-node-config.number-floating-point-field-input</mat-label>
<input formControlName="resultValuePrecision"
matInput
step="1" min="0"
type="number"/>
<mat-hint [innerHTML]="'tb.rulenode.number-floating-point-field-input-hint' | translate | safe: 'html'"></mat-hint>
<mat-hint [innerHTML]="'rule-node-config.number-floating-point-field-input-hint' | translate | safe: 'html'"></mat-hint>
</mat-form-field>
</div>
<div *ngIf="[ArgumentTypeResult.ATTRIBUTE, ArgumentTypeResult.TIME_SERIES].includes(mathFunctionConfigForm.get('result').get('type').value)"
class="xs:flex-col gt-xs:gap-4 flex flex-1 flex-row items-stretch justify-start" style="padding-top: 16px;">
<mat-checkbox formControlName="addToBody">
{{'tb.rulenode.add-to-message-field-input' | translate }}
{{'rule-node-config.add-to-message-field-input' | translate }}
</mat-checkbox>
<mat-checkbox formControlName="addToMetadata">
{{'tb.rulenode.add-to-metadata-field-input' | translate}}
{{'rule-node-config.add-to-metadata-field-input' | translate}}
</mat-checkbox>
</div>
</div>

View File

@ -17,20 +17,20 @@
-->
<section [formGroup]="msgCountConfigForm" class="flex flex-col">
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.interval-seconds</mat-label>
<mat-label translate>rule-node-config.interval-seconds</mat-label>
<input required type="number" min="1" step="1" matInput formControlName="interval">
<mat-error *ngIf="msgCountConfigForm.get('interval').hasError('required')">
{{ 'tb.rulenode.interval-seconds-required' | translate }}
{{ 'rule-node-config.interval-seconds-required' | translate }}
</mat-error>
<mat-error *ngIf="msgCountConfigForm.get('interval').hasError('min')">
{{ 'tb.rulenode.min-interval-seconds-message' | translate }}
{{ 'rule-node-config.min-interval-seconds-message' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.output-timeseries-key-prefix</mat-label>
<mat-label translate>rule-node-config.output-timeseries-key-prefix</mat-label>
<input required matInput formControlName="telemetryPrefix">
<mat-error *ngIf="msgCountConfigForm.get('telemetryPrefix').hasError('required')">
{{ 'tb.rulenode.output-timeseries-key-prefix-required' | translate }}
{{ 'rule-node-config.output-timeseries-key-prefix-required' | translate }}
</mat-error>
</mat-form-field>
</section>

View File

@ -17,41 +17,41 @@
-->
<section [formGroup]="msgDelayConfigForm" class="flex flex-col">
<mat-checkbox formControlName="useMetadataPeriodInSecondsPatterns">
{{ 'tb.rulenode.use-metadata-period-in-seconds-patterns' | translate }}
{{ 'rule-node-config.use-metadata-period-in-seconds-patterns' | translate }}
</mat-checkbox>
<div class="tb-hint" translate>tb.rulenode.use-metadata-period-in-seconds-patterns-hint</div>
<div class="tb-hint" translate>rule-node-config.use-metadata-period-in-seconds-patterns-hint</div>
<mat-form-field *ngIf="msgDelayConfigForm.get('useMetadataPeriodInSecondsPatterns').value !== true; else periodInSecondsPattern"
class="mat-block">
<mat-label translate>tb.rulenode.period-seconds</mat-label>
<mat-label translate>rule-node-config.period-seconds</mat-label>
<input required type="number" min="0" step="1" matInput formControlName="periodInSeconds">
<mat-error *ngIf="msgDelayConfigForm.get('periodInSeconds').hasError('required')">
{{ 'tb.rulenode.period-seconds-required' | translate }}
{{ 'rule-node-config.period-seconds-required' | translate }}
</mat-error>
<mat-error *ngIf="msgDelayConfigForm.get('periodInSeconds').hasError('min')">
{{ 'tb.rulenode.min-period-0-seconds-message' | translate }}
{{ 'rule-node-config.min-period-0-seconds-message' | translate }}
</mat-error>
</mat-form-field>
<ng-template #periodInSecondsPattern>
<mat-form-field class="mat-block" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.period-in-seconds-pattern</mat-label>
<mat-label translate>rule-node-config.period-in-seconds-pattern</mat-label>
<input required matInput formControlName="periodInSecondsPattern">
<mat-error *ngIf="msgDelayConfigForm.get('periodInSecondsPattern').hasError('required')">
{{ 'tb.rulenode.period-in-seconds-pattern-required' | translate }}
{{ 'rule-node-config.period-in-seconds-pattern-required' | translate }}
</mat-error>
<mat-hint translate>tb.rulenode.general-pattern-hint</mat-hint>
<mat-hint translate>rule-node-config.general-pattern-hint</mat-hint>
</mat-form-field>
</ng-template>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.max-pending-messages</mat-label>
<mat-label translate>rule-node-config.max-pending-messages</mat-label>
<input required type="number" min="1" max="100000" step="1" matInput formControlName="maxPendingMsgs">
<mat-error *ngIf="msgDelayConfigForm.get('maxPendingMsgs').hasError('required')">
{{ 'tb.rulenode.max-pending-messages-required' | translate }}
{{ 'rule-node-config.max-pending-messages-required' | translate }}
</mat-error>
<mat-error *ngIf="msgDelayConfigForm.get('maxPendingMsgs').hasError('min')">
{{ 'tb.rulenode.max-pending-messages-range' | translate }}
{{ 'rule-node-config.max-pending-messages-range' | translate }}
</mat-error>
<mat-error *ngIf="msgDelayConfigForm.get('maxPendingMsgs').hasError('max')">
{{ 'tb.rulenode.max-pending-messages-range' | translate }}
{{ 'rule-node-config.max-pending-messages-range' | translate }}
</mat-error>
</mat-form-field>
</section>

View File

@ -17,11 +17,11 @@
-->
<section [formGroup]="pushToCloudConfigForm" class="tb-form-panel no-border no-padding">
<div class="tb-form-panel stroked">
<tb-example-hint [hintText]="'tb.rulenode.attributes-scope-hint'">
<tb-example-hint [hintText]="'rule-node-config.attributes-scope-hint'">
</tb-example-hint>
<div class="tb-form-row no-border no-padding tb-standard-fields">
<mat-form-field class="flex">
<mat-label>{{ 'tb.rulenode.attributes-scope' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.attributes-scope' | translate }}</mat-label>
<mat-select required
class="tb-entity-type-select" matInput formControlName="scope">
<mat-option *ngFor="let scope of attributeScopes" [value]="scope">
@ -30,7 +30,7 @@
</mat-select>
</mat-form-field>
<mat-form-field class="flex">
<mat-label>{{ 'tb.rulenode.attributes-scope-value' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.attributes-scope-value' | translate }}</mat-label>
<input type="text" matInput readonly disabled [ngModel]="pushToCloudConfigForm.get('scope').value" [ngModelOptions]="{standalone: true}">
<button type="button"
matSuffix
@ -38,7 +38,7 @@
aria-label="Copy"
ngxClipboard
[cbContent]="pushToCloudConfigForm.get('scope').value"
matTooltip="{{ 'tb.rulenode.attributes-scope-value-copy' | translate }}">
matTooltip="{{ 'rule-node-config.attributes-scope-value-copy' | translate }}">
<mat-icon aria-hidden="false"
aria-label="help-icon">content_copy
</mat-icon>

View File

@ -17,11 +17,11 @@
-->
<section [formGroup]="pushToEdgeConfigForm" class="tb-form-panel no-border no-padding">
<div class="tb-form-panel stroked">
<tb-example-hint [hintText]="'tb.rulenode.attributes-scope-hint'">
<tb-example-hint [hintText]="'rule-node-config.attributes-scope-hint'">
</tb-example-hint>
<div class="tb-form-row no-border no-padding tb-standard-fields">
<mat-form-field class="flex">
<mat-label>{{ 'tb.rulenode.attributes-scope' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.attributes-scope' | translate }}</mat-label>
<mat-select required
class="tb-entity-type-select" matInput formControlName="scope">
<mat-option *ngFor="let scope of attributeScopes" [value]="scope">
@ -30,7 +30,7 @@
</mat-select>
</mat-form-field>
<mat-form-field class="flex">
<mat-label>{{ 'tb.rulenode.attributes-scope-value' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.attributes-scope-value' | translate }}</mat-label>
<input type="text" matInput readonly disabled [ngModel]="pushToEdgeConfigForm.get('scope').value" [ngModelOptions]="{standalone: true}">
<button type="button"
matSuffix
@ -38,7 +38,7 @@
aria-label="Copy"
ngxClipboard
[cbContent]="pushToEdgeConfigForm.get('scope').value"
matTooltip="{{ 'tb.rulenode.attributes-scope-value-copy' | translate }}">
matTooltip="{{ 'rule-node-config.attributes-scope-value-copy' | translate }}">
<mat-icon aria-hidden="false"
aria-label="help-icon">content_copy
</mat-icon>

View File

@ -16,20 +16,20 @@
-->
<section [formGroup]="rpcReplyConfigForm" class="tb-form-panel stroked no-padding-bottom">
<div class="tb-form-panel-title" translate>tb.rulenode.reply-routing-configuration</div>
<tb-example-hint [hintText]="'tb.rulenode.rpc-reply-routing-configuration-hint'">
<div class="tb-form-panel-title" translate>rule-node-config.reply-routing-configuration</div>
<tb-example-hint [hintText]="'rule-node-config.rpc-reply-routing-configuration-hint'">
</tb-example-hint>
<div class="tb-form-row no-border no-padding tb-standard-fields column-xs">
<mat-form-field class="flex">
<mat-label translate>tb.rulenode.service-id-metadata-attribute</mat-label>
<mat-label translate>rule-node-config.service-id-metadata-attribute</mat-label>
<input matInput formControlName="serviceIdMetaDataAttribute">
</mat-form-field>
<mat-form-field class="flex">
<mat-label translate>tb.rulenode.session-id-metadata-attribute</mat-label>
<mat-label translate>rule-node-config.session-id-metadata-attribute</mat-label>
<input matInput formControlName="sessionIdMetaDataAttribute">
</mat-form-field>
<mat-form-field class="flex">
<mat-label translate>tb.rulenode.request-id-metadata-attribute</mat-label>
<mat-label translate>rule-node-config.request-id-metadata-attribute</mat-label>
<input matInput formControlName="requestIdMetaDataAttribute">
</mat-form-field>
</div>

View File

@ -17,13 +17,13 @@
-->
<section [formGroup]="rpcRequestConfigForm" class="flex flex-col">
<mat-form-field class="mat-block flex-1">
<mat-label translate>tb.rulenode.timeout-sec</mat-label>
<mat-label translate>rule-node-config.timeout-sec</mat-label>
<input type="number" min="0" step="1" matInput formControlName="timeoutInSeconds" required>
<mat-error *ngIf="rpcRequestConfigForm.get('timeoutInSeconds').hasError('required')">
{{ 'tb.rulenode.timeout-required' | translate }}
{{ 'rule-node-config.timeout-required' | translate }}
</mat-error>
<mat-error *ngIf="rpcRequestConfigForm.get('timeoutInSeconds').hasError('min')">
{{ 'tb.rulenode.min-timeout-message' | translate }}
{{ 'rule-node-config.min-timeout-message' | translate }}
</mat-error>
</mat-form-field>
</section>

View File

@ -17,40 +17,40 @@
-->
<section [formGroup]="saveToCustomTableConfigForm" class="tb-form-panel no-border no-padding">
<mat-form-field class="mat-block" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.custom-table-name</mat-label>
<mat-label translate>rule-node-config.custom-table-name</mat-label>
<input required matInput formControlName="tableName">
<mat-icon class="help-icon margin-8 cursor-pointer"
aria-hidden="false"
aria-label="help-icon"
matSuffix
matTooltip="{{ 'tb.rulenode.custom-table-hint' | translate }}">
matTooltip="{{ 'rule-node-config.custom-table-hint' | translate }}">
help
</mat-icon>
<mat-error *ngIf="saveToCustomTableConfigForm.get('tableName').hasError('required') ||
saveToCustomTableConfigForm.get('tableName').hasError('pattern')">
{{ 'tb.rulenode.custom-table-name-required' | translate }}
{{ 'rule-node-config.custom-table-name-required' | translate }}
</mat-error>
</mat-form-field>
<tb-kv-map-config
required
formControlName="fieldsMapping"
[labelText]="'tb.rulenode.fields-mapping' | translate"
[requiredText]="'tb.rulenode.fields-mapping-required' | translate"
[keyText]="'tb.rulenode.message-field' | translate"
[keyRequiredText]="'tb.rulenode.message-field-required' | translate"
[valText]="'tb.rulenode.table-col' | translate"
[valRequiredText]="'tb.rulenode.table-col-required' | translate"
[hintText]="'tb.rulenode.fields-mapping-hint'">
[labelText]="'rule-node-config.fields-mapping' | translate"
[requiredText]="'rule-node-config.fields-mapping-required' | translate"
[keyText]="'rule-node-config.message-field' | translate"
[keyRequiredText]="'rule-node-config.message-field-required' | translate"
[valText]="'rule-node-config.table-col' | translate"
[valRequiredText]="'rule-node-config.table-col-required' | translate"
[hintText]="'rule-node-config.fields-mapping-hint'">
</tb-kv-map-config>
<mat-form-field class="mat-block flex-1">
<mat-label translate>tb.rulenode.default-ttl</mat-label>
<mat-label translate>rule-node-config.default-ttl</mat-label>
<input type="number" min="0" step="1" matInput formControlName="defaultTtl" required>
<mat-hint translate>tb.rulenode.default-ttl-zero-hint</mat-hint>
<mat-hint translate>rule-node-config.default-ttl-zero-hint</mat-hint>
<mat-error *ngIf="saveToCustomTableConfigForm.get('defaultTtl').hasError('min')">
{{ 'tb.rulenode.min-default-ttl-message' | translate }}
{{ 'rule-node-config.min-default-ttl-message' | translate }}
</mat-error>
<mat-error *ngIf="saveToCustomTableConfigForm.get('defaultTtl').hasError('required')">
{{ 'tb.rulenode.default-ttl-required' | translate }}
{{ 'rule-node-config.default-ttl-required' | translate }}
</mat-error>
</mat-form-field>
</section>

View File

@ -16,16 +16,16 @@
-->
<section [formGroup]="sendRestApiCallReplyConfigForm" class="tb-form-panel stroked no-padding-bottom">
<div class="tb-form-panel-title" translate>tb.rulenode.reply-routing-configuration</div>
<tb-example-hint [hintText]="'tb.rulenode.reply-routing-configuration-hint'">
<div class="tb-form-panel-title" translate>rule-node-config.reply-routing-configuration</div>
<tb-example-hint [hintText]="'rule-node-config.reply-routing-configuration-hint'">
</tb-example-hint>
<div class="tb-form-row no-border no-padding tb-standard-fields column-xs">
<mat-form-field class="flex">
<mat-label translate>tb.rulenode.service-id-metadata-attribute</mat-label>
<mat-label translate>rule-node-config.service-id-metadata-attribute</mat-label>
<input matInput formControlName="serviceIdMetaDataAttribute">
</mat-form-field>
<mat-form-field class="flex">
<mat-label translate>tb.rulenode.request-id-metadata-attribute</mat-label>
<mat-label translate>rule-node-config.request-id-metadata-attribute</mat-label>
<input matInput formControlName="requestIdMetaDataAttribute">
</mat-form-field>
</div>

View File

@ -17,33 +17,33 @@
-->
<section [formGroup]="timeseriesConfigForm" class="tb-form-panel no-border no-padding">
<mat-form-field class="mat-block flex-1">
<mat-label translate>tb.rulenode.default-ttl</mat-label>
<mat-label translate>rule-node-config.default-ttl</mat-label>
<input type="number" min="0" step="1" matInput formControlName="defaultTTL" required>
<mat-icon class="help-icon margin-8 cursor-pointer"
aria-hidden="false"
aria-label="help-icon"
matSuffix
matTooltip="{{ 'tb.rulenode.default-ttl-hint' | translate }}">
matTooltip="{{ 'rule-node-config.default-ttl-hint' | translate }}">
help
</mat-icon>
<mat-error *ngIf="timeseriesConfigForm.get('defaultTTL').hasError('required')">
{{ 'tb.rulenode.default-ttl-required' | translate }}
{{ 'rule-node-config.default-ttl-required' | translate }}
</mat-error>
<mat-error *ngIf="timeseriesConfigForm.get('defaultTTL').hasError('min')">
{{ 'tb.rulenode.min-default-ttl-message' | translate }}
{{ 'rule-node-config.min-default-ttl-message' | translate }}
</mat-error>
</mat-form-field>
<div class="tb-form-panel stroked">
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.use-server-ts-hint' | translate}}"
<div tb-hint-tooltip-icon="{{ 'rule-node-config.use-server-ts-hint' | translate}}"
class="tb-form-row no-border no-padding">
<mat-slide-toggle class="mat-slide" formControlName="useServerTs">
{{ 'tb.rulenode.use-server-ts' | translate }}
{{ 'rule-node-config.use-server-ts' | translate }}
</mat-slide-toggle>
</div>
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.skip-latest-persistence-hint' | translate}}"
<div tb-hint-tooltip-icon="{{ 'rule-node-config.skip-latest-persistence-hint' | translate}}"
class="tb-form-row no-border no-padding">
<mat-slide-toggle class="mat-slide" formControlName="skipLatestPersistence">
{{ 'tb.rulenode.skip-latest-persistence' | translate }}
{{ 'rule-node-config.skip-latest-persistence' | translate }}
</mat-slide-toggle>
</div>
</div>

View File

@ -19,20 +19,20 @@
<div class="tb-form-panel no-padding no-border">
<div class="tb-form-panel stroked" [class.no-padding-bottom]="unassignCustomerConfigForm.get('unassignFromCustomer').value">
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.unassign-from-customer-tooltip' | translate }}"
<div tb-hint-tooltip-icon="{{ 'rule-node-config.unassign-from-customer-tooltip' | translate }}"
class="tb-form-row no-border no-padding">
<mat-slide-toggle class="mat-slide" formControlName="unassignFromCustomer">
{{ 'tb.rulenode.unassign-from-customer' | translate }}
{{ 'rule-node-config.unassign-from-customer' | translate }}
</mat-slide-toggle>
</div>
<mat-form-field class="mat-block" subscriptSizing="dynamic" *ngIf="unassignCustomerConfigForm.get('unassignFromCustomer').value">
<mat-label translate>tb.rulenode.customer-name-pattern</mat-label>
<mat-label translate>rule-node-config.customer-name-pattern</mat-label>
<input required matInput formControlName="customerNamePattern">
<mat-error *ngIf="unassignCustomerConfigForm.get('customerNamePattern').hasError('required') ||
unassignCustomerConfigForm.get('customerNamePattern').hasError('pattern')">
{{ 'tb.rulenode.customer-name-pattern-required' | translate }}
{{ 'rule-node-config.customer-name-pattern-required' | translate }}
</mat-error>
<mat-hint translate>tb.rulenode.customer-name-pattern-hint</mat-hint>
<mat-hint translate>rule-node-config.customer-name-pattern-hint</mat-hint>
</mat-form-field>
</div>
</div>

View File

@ -42,7 +42,7 @@
style="padding: 0 10px; min-width: 20px;">{{argumentControl.get('name').value}}.</span>
<div class="flex flex-1 flex-col">
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.argument-source-field-input</mat-label>
<mat-label translate>rule-node-config.argument-source-field-input</mat-label>
<mat-select [formControl]="argumentControl.get('type')" required>
<mat-select-trigger>
{{ argumentTypeMap.get(argumentControl.get('type').value)?.name | translate }}
@ -51,55 +51,55 @@
style="border-bottom: 1px solid #eee;">
{{ argumentTypeMap.get(argument).name | translate }}
<small style="display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">
{{ argumentTypeMap.get(argument).description }}
{{ argumentTypeMap.get(argument).description | translate }}
</small>
</mat-option>
</mat-select>
<mat-error *ngIf="argumentControl.get('type').hasError('required')" translate>
tb.rulenode.argument-source-field-input-required
rule-node-config.argument-source-field-input-required
</mat-error>
</mat-form-field>
<div class="flex flex-1 flex-row xs:flex-col gt-xs:gap-4">
<mat-form-field floatLabel="always" class="mat-block gt-xs:max-w-50% gt-xs:flex-full"
*ngIf="argumentControl.get('type').value && argumentControl.get('type').value !== ArgumentType.CONSTANT">
<mat-label translate>tb.rulenode.argument-key-field-input</mat-label>
<mat-label translate>rule-node-config.argument-key-field-input</mat-label>
<input [formControl]="argumentControl.get('key')" matInput required/>
<mat-icon class="help-icon margin-8 cursor-pointer" aria-hidden="false" aria-label="help-icon" matSuffix
color="primary"
matTooltip="{{ 'tb.rulenode.math-templatization-tooltip' | translate }}">
matTooltip="{{ 'rule-node-config.math-templatization-tooltip' | translate }}">
help
</mat-icon>
<mat-error *ngIf="argumentControl.get('key').hasError('required')" translate>
tb.rulenode.argument-key-field-input-required
rule-node-config.argument-key-field-input-required
</mat-error>
</mat-form-field>
<mat-form-field floatLabel="always" class="mat-block flex-1"
*ngIf="argumentControl.get('type').value === ArgumentType.CONSTANT">
<mat-label translate>tb.rulenode.constant-value-field-input</mat-label>
<mat-label translate>rule-node-config.constant-value-field-input</mat-label>
<input [formControl]="argumentControl.get('key')"
matInput
required
step="1" min="0"
type="number"/>
<mat-error *ngIf="argumentControl.get('key').hasError('required')" translate>
tb.rulenode.constant-value-field-input-required
rule-node-config.constant-value-field-input-required
</mat-error>
</mat-form-field>
<mat-form-field *ngIf="argumentControl.get('type').value && argumentControl.get('type').value !== ArgumentType.CONSTANT"
floatLabel="always" class="mat-block gt-xs:max-w-50% gt-xs:flex-full">
<mat-label translate>tb.rulenode.default-value-field-input</mat-label>
<mat-label translate>rule-node-config.default-value-field-input</mat-label>
<input [formControl]="argumentControl.get('defaultValue')" matInput step="1" type="number"/>
</mat-form-field>
</div>
<mat-form-field *ngIf="argumentControl.get('type').value === ArgumentType.ATTRIBUTE" class="mat-block">
<mat-label translate>tb.rulenode.attribute-scope-field-input</mat-label>
<mat-label translate>rule-node-config.attribute-scope-field-input</mat-label>
<mat-select required [formControl]="argumentControl.get('attributeScope')">
<mat-option *ngFor="let scope of attributeScope" [value]="scope">
{{ attributeScopeMap.get(scope) | translate }}
</mat-option>
</mat-select>
<mat-error *ngIf="argumentControl.get('attributeScope').hasError('required')" translate>
tb.rulenode.attribute-scope-field-input-required
rule-node-config.attribute-scope-field-input-required
</mat-error>
</mat-form-field>
</div>
@ -116,7 +116,7 @@
</div>
<div *ngIf="!argumentsFormArray.length">
<span translate
class="tb-prompt flex items-center justify-center">tb.rulenode.no-arguments-prompt</span>
class="tb-prompt flex items-center justify-center">rule-node-config.no-arguments-prompt</span>
</div>
<button mat-button mat-raised-button color="primary"
[disabled]="argumentsFormArray.length >= maxArgs"

View File

@ -18,14 +18,14 @@
<section [formGroup]="credentialsConfigFormGroup" class="flex flex-col">
<mat-expansion-panel class="tb-credentials-config-panel-group">
<mat-expansion-panel-header>
<mat-panel-title translate>tb.rulenode.credentials</mat-panel-title>
<mat-panel-title translate>rule-node-config.credentials</mat-panel-title>
<mat-panel-description>
{{ credentialsTypeTranslationsMap.get(credentialsConfigFormGroup.get('type').value) | translate }}
</mat-panel-description>
</mat-expansion-panel-header>
<ng-template matExpansionPanelContent>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.credentials-type</mat-label>
<mat-label translate>rule-node-config.credentials-type</mat-label>
<mat-select formControlName="type" required>
<mat-option *ngFor="let credentialsType of allCredentialsTypes" [value]="credentialsType"
[disabled]="credentialsType === 'cert.PEM' && disableCertPemCredentials">
@ -33,7 +33,7 @@
</mat-option>
</mat-select>
<mat-error *ngIf="credentialsConfigFormGroup.get('type').hasError('required')">
{{ 'tb.rulenode.credentials-type-required' | translate }}
{{ 'rule-node-config.credentials-type-required' | translate }}
</mat-error>
</mat-form-field>
<section class="flex flex-col" [ngSwitch]="credentialsConfigFormGroup.get('type').value">
@ -41,50 +41,50 @@
</ng-template>
<ng-template ngSwitchCase="basic">
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.username</mat-label>
<mat-label translate>rule-node-config.username</mat-label>
<input required matInput formControlName="username">
<mat-error *ngIf="credentialsConfigFormGroup.get('username').hasError('required')">
{{ 'tb.rulenode.username-required' | translate }}
{{ 'rule-node-config.username-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.password</mat-label>
<mat-label translate>rule-node-config.password</mat-label>
<input type="password" [required]="passwordFieldRequired" matInput formControlName="password">
<tb-toggle-password matSuffix></tb-toggle-password>
<mat-error *ngIf="credentialsConfigFormGroup.get('password').hasError('required')">
{{ 'tb.rulenode.password-required' | translate }}
{{ 'rule-node-config.password-required' | translate }}
</mat-error>
</mat-form-field>
</ng-template>
<ng-template ngSwitchCase="cert.PEM">
<div class="tb-hint">{{ 'tb.rulenode.credentials-pem-hint' | translate }}</div>
<div class="tb-hint">{{ 'rule-node-config.credentials-pem-hint' | translate }}</div>
<tb-file-input formControlName="caCert"
inputId="caCertSelect"
[existingFileName]="credentialsConfigFormGroup.get('caCertFileName').value"
(fileNameChanged)="credentialsConfigFormGroup.get('caCertFileName').setValue($event)"
label="{{'tb.rulenode.ca-cert' | translate}}"
noFileText="tb.rulenode.no-file"
dropLabel="{{'tb.rulenode.drop-file' | translate}}">
label="{{'rule-node-config.ca-cert' | translate}}"
noFileText="rule-node-config.no-file"
dropLabel="{{'rule-node-config.drop-file' | translate}}">
</tb-file-input>
<tb-file-input formControlName="cert"
inputId="CertSelect"
[existingFileName]="credentialsConfigFormGroup.get('certFileName').value"
(fileNameChanged)="credentialsConfigFormGroup.get('certFileName').setValue($event)"
label="{{'tb.rulenode.cert' | translate}}"
noFileText="tb.rulenode.no-file"
dropLabel="{{'tb.rulenode.drop-file' | translate}}">
label="{{'rule-node-config.cert' | translate}}"
noFileText="rule-node-config.no-file"
dropLabel="{{'rule-node-config.drop-file' | translate}}">
</tb-file-input>
<tb-file-input style="padding-bottom: 8px;"
formControlName="privateKey"
inputId="privateKeySelect"
[existingFileName]="credentialsConfigFormGroup.get('privateKeyFileName').value"
(fileNameChanged)="credentialsConfigFormGroup.get('privateKeyFileName').setValue($event)"
label="{{'tb.rulenode.private-key' | translate}}"
noFileText="tb.rulenode.no-file"
dropLabel="{{'tb.rulenode.drop-file' | translate}}">
label="{{'rule-node-config.private-key' | translate}}"
noFileText="rule-node-config.no-file"
dropLabel="{{'rule-node-config.drop-file' | translate}}">
</tb-file-input>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.private-key-password</mat-label>
<mat-label translate>rule-node-config.private-key-password</mat-label>
<input type="password" matInput formControlName="password">
<tb-toggle-password matSuffix></tb-toggle-password>
</mat-form-field>

View File

@ -21,28 +21,28 @@
<mat-label translate>relation.direction</mat-label>
<mat-select required formControlName="direction">
<mat-option *ngFor="let type of directionTypes" [value]="type">
{{ directionTypeTranslations.get(type) | translate }} <span translate>tb.rulenode.relations-query-config-direction-suffix</span>
{{ directionTypeTranslations.get(type) | translate }} <span translate>rule-node-config.relations-query-config-direction-suffix</span>
</mat-option>
</mat-select>
</mat-form-field>
<mat-form-field floatLabel="always" class="mat-block max-w-50% flex-full">
<mat-label translate>tb.rulenode.max-relation-level</mat-label>
<mat-label translate>rule-node-config.max-relation-level</mat-label>
<input matInput
type="text"
pattern="[0-9]*"
inputmode="numeric"
min="1"
placeholder="{{ 'tb.rulenode.unlimited-level' | translate }}"
placeholder="{{ 'rule-node-config.unlimited-level' | translate }}"
formControlName="maxLevel">
<mat-error *ngIf="deviceRelationsQueryFormGroup.get('maxLevel').hasError('min')">
{{ 'tb.rulenode.max-relation-level-error' | translate }}
{{ 'rule-node-config.max-relation-level-error' | translate }}
</mat-error>
<mat-error *ngIf="deviceRelationsQueryFormGroup.get('maxLevel').invalid">
{{ 'tb.rulenode.max-relation-level-invalid' | translate }}
{{ 'rule-node-config.max-relation-level-invalid' | translate }}
</mat-error>
</mat-form-field>
</div>
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.last-level-device-relation-tooltip' | translate }}"
<div tb-hint-tooltip-icon="{{ 'rule-node-config.last-level-device-relation-tooltip' | translate }}"
*ngIf="deviceRelationsQueryFormGroup.get('maxLevel').value > 1"
class="tb-form-row no-border no-padding last-level-slide-toggle">
<mat-slide-toggle class="mat-slide" formControlName="fetchLastLevelOnly">
@ -55,12 +55,12 @@
</tb-relation-type-autocomplete>
<tb-entity-subtype-list
required
[label]="'tb.rulenode.device-profiles' | translate"
[label]="'rule-node-config.device-profiles' | translate"
[entityType]="entityType.DEVICE"
[emptyInputPlaceholder]="'tb.rulenode.add-device-profile' | translate"
[filledInputPlaceholder]="'tb.rulenode.add-device-profile' | translate"
[emptyInputPlaceholder]="'rule-node-config.add-device-profile' | translate"
[filledInputPlaceholder]="'rule-node-config.add-device-profile' | translate"
formControlName="deviceTypes">
<mat-icon matSuffix class="help-icon margin-8 cursor-pointer" aria-hidden="false" aria-label="help-icon" color="primary"
matTooltip="{{ 'tb.rulenode.chip-help' | translate: { inputName: 'tb.rulenode.device-profile' | translate } }}">help</mat-icon>
matTooltip="{{ 'rule-node-config.chip-help' | translate: { inputName: 'rule-node-config.device-profile' | translate } }}">help</mat-icon>
</tb-entity-subtype-list>
</section>

View File

@ -24,6 +24,6 @@
tb-help-popup-placement="right"
trigger-style="letter-spacing:0.25px; font-size:12px"
[tb-help-popup-style]="{maxWidth: '820px'}"
trigger-text="{{ 'tb.key-val.see-examples' | translate }}">
trigger-text="{{ 'rule-node-config.key-val.see-examples' | translate }}">
</div>
</div>

View File

@ -44,7 +44,7 @@
type="button"
(click)="removeKeyVal($index)"
[disabled]="isLoading$ | async"
matTooltip="{{ 'tb.key-val.remove-entry' | translate }}"
matTooltip="{{ 'rule-node-config.key-val.remove-entry' | translate }}"
matTooltipPosition="above">
<mat-icon>close</mat-icon>
</button>
@ -53,7 +53,7 @@
</div>
<tb-error [error]="ngControl.hasError('kvMapRequired') || ngControl.hasError('uniqueKeyValuePair') ?
(ngControl.hasError('kvMapRequired') ? translate.instant(requiredText) :
translate.instant('tb.key-val.unique-key-value-pair-error', {keyText: translate.instant(keyText),
translate.instant('rule-node-config.key-val.unique-key-value-pair-error', {keyText: translate.instant(keyText),
valText: translate.instant(valText)})) : ''"></tb-error>
<div style="margin-top: 16px;">
<button mat-button mat-raised-button color="primary"
@ -61,7 +61,7 @@
[disabled]="isLoading$ | async"
(click)="addKeyVal()"
type="button"
matTooltip="{{ 'tb.key-val.add-entry' | translate }}"
matTooltip="{{ 'rule-node-config.key-val.add-entry' | translate }}"
matTooltipPosition="above">
<mat-icon>add</mat-icon>
{{ 'action.add' | translate }}

View File

@ -22,10 +22,10 @@
{{ requiredText }}
</div>
<div class="tb-form-panel-hint tb-error" translate *ngIf="kvListFormGroup.hasError('required')">
tb.rulenode.map-fields-required
rule-node-config.map-fields-required
</div>
<div class="tb-form-panel-hint tb-error" translate *ngIf="kvListFormGroup.hasError('uniqueKeyValuePair')">
{{ 'tb.key-val.unique-key-value-pair-error' | translate:
{{ 'rule-node-config.key-val.unique-key-value-pair-error' | translate:
{
valText: valText,
keyText: keyText
@ -54,7 +54,7 @@
mat-icon-button
(click)="removeKeyVal($index)"
[disabled]="disabled"
matTooltip="{{ 'tb.key-val.remove-mapping-entry' | translate }}"
matTooltip="{{ 'rule-node-config.key-val.remove-mapping-entry' | translate }}"
matTooltipPosition="above">
<mat-icon>delete</mat-icon>
</button>
@ -65,7 +65,7 @@
</div>
<div>
<button type="button" mat-stroked-button color="primary" (click)="addKeyVal()">
{{ 'tb.key-val.add-mapping-entry' | translate }}
{{ 'rule-node-config.key-val.add-mapping-entry' | translate }}
</button>
</div>
<tb-example-hint [hintText]="hintText" [popupHelpLink]="popupHelpLink" *ngIf="popupHelpLink || hintText"></tb-example-hint>

View File

@ -16,7 +16,7 @@
-->
<mat-form-field [formGroup]="mathFunctionForm" class="mat-block">
<mat-label translate>tb.rulenode.functions-field-input</mat-label>
<mat-label translate>rule-node-config.functions-field-input</mat-label>
<input [required]="required"
(focusin)="onFocus()"
type="text"
@ -37,7 +37,7 @@
</small>
</mat-option>
<mat-option *ngIf="!(filteredOptions | async)?.length" [value]="null">
<span translate>tb.rulenode.no-option-found</span>
<span translate>rule-node-config.no-option-found</span>
</mat-option>
</mat-autocomplete>
</mat-form-field>

View File

@ -47,25 +47,25 @@
<mat-option *ngIf="(filteredMessageTypes | async)?.length === 0" [value]="null" class="tb-not-found">
<div class="tb-not-found-content" (click)="$event.stopPropagation()">
<div *ngIf="!textIsNotEmpty(searchText); else searchNotEmpty">
<span translate>tb.rulenode.no-message-types-found</span>
<span translate>rule-node-config.no-message-types-found</span>
</div>
<ng-template #searchNotEmpty>
<span>
{{ 'tb.rulenode.no-message-type-matching' | translate :
{{ 'rule-node-config.no-message-type-matching' | translate :
{messageType: truncate.transform(searchText, true, 6, &apos;...&apos;)}
}}
</span>
</ng-template>
<span>
<a translate (click)="createMessageType($event, searchText)">tb.rulenode.create-new-message-type</a>
<a translate (click)="createMessageType($event, searchText)">rule-node-config.create-new-message-type</a>
</span>
</div>
</mat-option>
</mat-autocomplete>
<mat-icon class="help-icon margin-8 cursor-pointer" aria-hidden="false" aria-label="help-icon" matSuffix
color="primary"
matTooltip="{{ 'tb.rulenode.chip-help' | translate: { inputName: 'tb.rulenode.message-type' | translate } }}">help</mat-icon>
matTooltip="{{ 'rule-node-config.chip-help' | translate: { inputName: 'rule-node-config.message-type' | translate } }}">help</mat-icon>
<mat-error *ngIf="chipList.errorState">
{{ 'tb.rulenode.select-message-types-required' | translate }}
{{ 'rule-node-config.select-message-types-required' | translate }}
</mat-error>
</mat-form-field>

View File

@ -56,7 +56,7 @@ export class MessageTypesConfigComponent extends PageComponent implements Contro
label: string;
@Input()
placeholder = 'tb.rulenode.add-message-type';
placeholder = 'rule-node-config.add-message-type';
@Input()
disabled: boolean;

View File

@ -17,7 +17,7 @@
-->
<section class="tb-form-row no-border no-padding tb-standard-fields column-xs" [formGroup]="messageTypeFormGroup">
<mat-form-field class="flex" subscriptSizing="{{ subscriptSizing }}" hideRequiredMarker>
<mat-label>{{'tb.rulenode.output-message-type' | translate}}</mat-label>
<mat-label>{{'rule-node-config.output-message-type' | translate}}</mat-label>
<mat-select formControlName="messageTypeAlias">
<mat-option *ngFor="let msgType of messageTypes" [value]="msgType">
{{msgType.name}}
@ -25,7 +25,7 @@
</mat-select>
</mat-form-field>
<mat-form-field class="flex" subscriptSizing="{{ subscriptSizing }}" [hideRequiredMarker]="messageTypeFormGroup.get('messageType').disabled">
<mat-label>{{'tb.rulenode.message-type-value' | translate}}</mat-label>
<mat-label>{{'rule-node-config.message-type-value' | translate}}</mat-label>
<input matInput type="text" formControlName="messageType">
<button type="button"
matSuffix
@ -34,16 +34,16 @@
*ngIf="messageTypeFormGroup.get('messageType').value"
ngxClipboard
[cbContent]="messageTypeFormGroup.get('messageType').value"
matTooltip="{{ 'tb.rulenode.copy-message-type' | translate }}">
matTooltip="{{ 'rule-node-config.copy-message-type' | translate }}">
<mat-icon aria-hidden="false"
aria-label="help-icon">content_copy
</mat-icon>
</button>
<mat-error *ngIf="messageTypeFormGroup.get('messageType').hasError('required')">
{{ 'tb.rulenode.message-type-value-required' | translate }}
{{ 'rule-node-config.message-type-value-required' | translate }}
</mat-error>
<mat-error *ngIf="messageTypeFormGroup.get('messageType').hasError('maxlength')">
{{ 'tb.rulenode.message-type-value-max-length' | translate }}
{{ 'rule-node-config.message-type-value-max-length' | translate }}
</mat-error>
</mat-form-field>
</section>

View File

@ -29,12 +29,12 @@
</mat-select>
</mat-form-field>
<mat-form-field floatLabel="always" class="mat-block flex-1">
<mat-label translate>tb.rulenode.max-relation-level</mat-label>
<mat-label translate>rule-node-config.max-relation-level</mat-label>
<input matInput
type="number"
min="1"
step="1"
placeholder="{{ 'tb.rulenode.unlimited-level' | translate }}"
placeholder="{{ 'rule-node-config.unlimited-level' | translate }}"
formControlName="maxLevel">
</mat-form-field>
</div>

View File

@ -16,35 +16,35 @@
-->
<section [formGroup]="relationsQueryFormGroup" class="tb-form-panel stroked">
<div class="tb-form-panel-title tb-required" translate>tb.rulenode.relations-query</div>
<div class="tb-form-panel-title tb-required" translate>rule-node-config.relations-query</div>
<section>
<div class="flex flex-row gap-4">
<mat-form-field class="mat-block max-w-50% flex-full" style="min-width: 100px;" hideRequiredMarker>
<mat-label translate>relation.direction</mat-label>
<mat-select required formControlName="direction">
<mat-option *ngFor="let type of directionTypes" [value]="type">
{{ directionTypeTranslations.get(type) | translate }} <span translate>tb.rulenode.relations-query-config-direction-suffix</span>
{{ directionTypeTranslations.get(type) | translate }} <span translate>rule-node-config.relations-query-config-direction-suffix</span>
</mat-option>
</mat-select>
</mat-form-field>
<mat-form-field floatLabel="always" class="mat-block max-w-50% flex-full">
<mat-label translate>tb.rulenode.max-relation-level</mat-label>
<mat-label translate>rule-node-config.max-relation-level</mat-label>
<input matInput
type="text"
pattern="[0-9]*"
min="1"
inputmode="numeric"
placeholder="{{ 'tb.rulenode.unlimited-level' | translate }}"
placeholder="{{ 'rule-node-config.unlimited-level' | translate }}"
formControlName="maxLevel">
<mat-error *ngIf="relationsQueryFormGroup.get('maxLevel').hasError('min')">
{{ 'tb.rulenode.max-relation-level-error' | translate }}
{{ 'rule-node-config.max-relation-level-error' | translate }}
</mat-error>
<mat-error *ngIf="relationsQueryFormGroup.get('maxLevel').invalid">
{{ 'tb.rulenode.max-relation-level-invalid' | translate }}
{{ 'rule-node-config.max-relation-level-invalid' | translate }}
</mat-error>
</mat-form-field>
</div>
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.last-level-relation-tooltip' | translate }}"
<div tb-hint-tooltip-icon="{{ 'rule-node-config.last-level-relation-tooltip' | translate }}"
*ngIf="relationsQueryFormGroup.get('maxLevel').value > 1"
class="tb-form-row no-border no-padding last-level-slide-toggle">
<mat-slide-toggle class="mat-slide" formControlName="fetchLastLevelOnly">

View File

@ -16,38 +16,38 @@
-->
<div class="tb-form-panel no-padding no-border" [formGroup]="attributeControlGroup">
<tb-example-hint [hintText]="'tb.rulenode.kv-map-pattern-hint'"
<tb-example-hint [hintText]="'rule-node-config.kv-map-pattern-hint'"
[popupHelpLink]="popupHelpLink"></tb-example-hint>
<tb-string-items-list subscriptSizing="dynamic" class="mat-block" editable
(focusout)="onTouched()"
[placeholder]="'tb.rulenode.add-attribute-key' | translate"
[label]="'tb.rulenode.client-attributes' | translate" formControlName="clientAttributeNames">
[placeholder]="'rule-node-config.add-attribute-key' | translate"
[label]="'rule-node-config.client-attributes' | translate" formControlName="clientAttributeNames">
<ng-container matSuffix *ngTemplateOutlet="helpIcon"></ng-container>
</tb-string-items-list>
<tb-string-items-list subscriptSizing="dynamic" class="mat-block" editable
(focusout)="onTouched()"
[placeholder]="'tb.rulenode.add-attribute-key' | translate"
[label]="'tb.rulenode.shared-attributes' | translate" formControlName="sharedAttributeNames">
[placeholder]="'rule-node-config.add-attribute-key' | translate"
[label]="'rule-node-config.shared-attributes' | translate" formControlName="sharedAttributeNames">
<ng-container matSuffix *ngTemplateOutlet="helpIcon"></ng-container>
</tb-string-items-list>
<tb-string-items-list subscriptSizing="dynamic" class="mat-block" editable
(focusout)="onTouched()"
[placeholder]="'tb.rulenode.add-attribute-key' | translate"
[label]="'tb.rulenode.server-attributes' | translate" formControlName="serverAttributeNames">
[placeholder]="'rule-node-config.add-attribute-key' | translate"
[label]="'rule-node-config.server-attributes' | translate" formControlName="serverAttributeNames">
<ng-container matSuffix *ngTemplateOutlet="helpIcon"></ng-container>
</tb-string-items-list>
<tb-string-items-list subscriptSizing="dynamic" editable class="mat-block"
(focusout)="onTouched()"
[placeholder]="'tb.rulenode.add-telemetry-key' | translate"
[label]="'tb.rulenode.latest-telemetry' | translate" formControlName="latestTsKeyNames">
[placeholder]="'rule-node-config.add-telemetry-key' | translate"
[label]="'rule-node-config.latest-telemetry' | translate" formControlName="latestTsKeyNames">
<ng-container matSuffix *ngTemplateOutlet="helpIcon"></ng-container>
</tb-string-items-list>
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.fetch-latest-telemetry-with-timestamp-tooltip' | translate:
<div tb-hint-tooltip-icon="{{ 'rule-node-config.fetch-latest-telemetry-with-timestamp-tooltip' | translate:
{ latestTsKeyName: attributeControlGroup.get('latestTsKeyNames').value[0]} }}"
*ngIf="attributeControlGroup.get('latestTsKeyNames').value?.length > 0"
class="tb-form-row no-border no-padding">
<mat-slide-toggle class="mat-slide" formControlName="getLatestValueWithTs">
{{ 'tb.rulenode.fetch-latest-telemetry-with-timestamp' | translate }}
{{ 'rule-node-config.fetch-latest-telemetry-with-timestamp' | translate }}
</mat-slide-toggle>
</div>
</div>
@ -55,5 +55,5 @@
<ng-template #helpIcon>
<mat-icon class="help-icon margin-8 cursor-pointer" aria-hidden="false" aria-label="help-icon"
color="primary"
matTooltip="{{ 'tb.rulenode.chip-help' | translate: { inputName: 'tb.rulenode.field-name' | translate } }}">help</mat-icon>
matTooltip="{{ 'rule-node-config.chip-help' | translate: { inputName: 'rule-node-config.field-name' | translate } }}">help</mat-icon>
</ng-template>

View File

@ -19,7 +19,7 @@
<div class="tb-form-row no-padding no-border space-between">
<div class="tb-form-panel-title">{{ labelText }}</div>
<div class="tb-form-panel-hint tb-error" translate *ngIf="svListFormGroup.hasError('required')">
tb.rulenode.map-fields-required
rule-node-config.map-fields-required
</div>
<div class="tb-form-panel-hint tb-error" translate *ngIf="svListFormGroup.hasError('svMapRequired')">
{{ requiredText }}
@ -51,7 +51,7 @@
mat-icon-button
(click)="removeKeyVal($index)"
[disabled]="isLoading$ | async"
matTooltip="{{ 'tb.key-val.remove-mapping-entry' | translate }}"
matTooltip="{{ 'rule-node-config.key-val.remove-mapping-entry' | translate }}"
matTooltipPosition="above">
<mat-icon>delete</mat-icon>
</button>
@ -63,7 +63,7 @@
<div>
<button [disabled]="(isLoading$ | async) || keyValsFormArray().length >= selectOptions.length"
type="button" mat-stroked-button color="primary" (click)="addKeyVal()">
{{ 'tb.key-val.add-mapping-entry' | translate }}
{{ 'rule-node-config.key-val.add-mapping-entry' | translate }}
</button>
</div>
<tb-example-hint [hintText]="hintText" [popupHelpLink]="popupHelpLink"></tb-example-hint>

View File

@ -18,74 +18,74 @@
<section [formGroup]="calculateDeltaConfigForm">
<div class="gt-sm:flex gt-sm:flex-row gt-sm:gap-5.5">
<mat-form-field class="mat-block flex-1">
<mat-label>{{ 'tb.rulenode.input-value-key' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.input-value-key' | translate }}</mat-label>
<input matInput formControlName="inputValueKey">
<mat-error *ngIf="calculateDeltaConfigForm.get('inputValueKey').hasError('required') ||
calculateDeltaConfigForm.get('inputValueKey').hasError('pattern')">
{{ 'tb.rulenode.input-value-key-required' | translate }}
{{ 'rule-node-config.input-value-key-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block flex-1">
<mat-label>{{ 'tb.rulenode.output-value-key' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.output-value-key' | translate }}</mat-label>
<input matInput formControlName="outputValueKey">
<mat-error *ngIf="calculateDeltaConfigForm.get('outputValueKey').hasError('required') ||
calculateDeltaConfigForm.get('outputValueKey').hasError('pattern')">
{{ 'tb.rulenode.output-value-key-required' | translate }}
{{ 'rule-node-config.output-value-key-required' | translate }}
</mat-error>
</mat-form-field>
</div>
<mat-form-field class="mat-block flex-1">
<mat-label>{{ 'tb.rulenode.number-of-digits-after-floating-point' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.number-of-digits-after-floating-point' | translate }}</mat-label>
<input type="number" min="0" max="15" step="1" matInput formControlName="round">
<mat-error *ngIf="calculateDeltaConfigForm.get('round').hasError('min')">
{{ 'tb.rulenode.number-of-digits-after-floating-point-range' | translate }}
{{ 'rule-node-config.number-of-digits-after-floating-point-range' | translate }}
</mat-error>
<mat-error *ngIf="calculateDeltaConfigForm.get('round').hasError('max')">
{{ 'tb.rulenode.number-of-digits-after-floating-point-range' | translate }}
{{ 'rule-node-config.number-of-digits-after-floating-point-range' | translate }}
</mat-error>
</mat-form-field>
<div class="tb-form-panel no-padding no-border">
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.failure-if-delta-negative-tooltip' | translate }}"
<div tb-hint-tooltip-icon="{{ 'rule-node-config.failure-if-delta-negative-tooltip' | translate }}"
class="tb-form-row same-padding">
<mat-slide-toggle class="mat-slide margin" formControlName="tellFailureIfDeltaIsNegative">
{{ 'tb.rulenode.failure-if-delta-negative' | translate }}
{{ 'rule-node-config.failure-if-delta-negative' | translate }}
</mat-slide-toggle>
</div>
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.use-caching-tooltip' | translate :
<div tb-hint-tooltip-icon="{{ 'rule-node-config.use-caching-tooltip' | translate :
{ inputValueKey: calculateDeltaConfigForm.get('inputValueKey').valid ?
calculateDeltaConfigForm.get('inputValueKey').value : 'tb.rulenode.input-value-key' | translate } }}"
calculateDeltaConfigForm.get('inputValueKey').value : 'rule-node-config.input-value-key' | translate } }}"
class="tb-form-row same-padding">
<mat-slide-toggle class="mat-slide margin" formControlName="useCache">
{{ 'tb.rulenode.use-caching' | translate }}
{{ 'rule-node-config.use-caching' | translate }}
</mat-slide-toggle>
</div>
<div class="tb-form-panel stroked" [class.no-padding-bottom]="calculateDeltaConfigForm.get('addPeriodBetweenMsgs').value">
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.add-time-difference-between-readings-tooltip' | translate:
<div tb-hint-tooltip-icon="{{ 'rule-node-config.add-time-difference-between-readings-tooltip' | translate:
{ periodValueKey: (calculateDeltaConfigForm.get('periodValueKey').valid &&
calculateDeltaConfigForm.get('addPeriodBetweenMsgs').value) ? calculateDeltaConfigForm.get('periodValueKey').value :
'periodInMs' } }}"
class="tb-form-row no-border no-padding">
<mat-slide-toggle class="mat-slide" formControlName="addPeriodBetweenMsgs">
{{ 'tb.rulenode.add-time-difference-between-readings' | translate:
{{ 'rule-node-config.add-time-difference-between-readings' | translate:
{ inputValueKey: calculateDeltaConfigForm.get('inputValueKey').valid ?
calculateDeltaConfigForm.get('inputValueKey').value : 'tb.rulenode.input-value-key' | translate } }}
calculateDeltaConfigForm.get('inputValueKey').value : 'rule-node-config.input-value-key' | translate } }}
</mat-slide-toggle>
</div>
<mat-form-field class="mat-block" *ngIf="calculateDeltaConfigForm.get('addPeriodBetweenMsgs').value">
<mat-label>{{ 'tb.rulenode.period-value-key' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.period-value-key' | translate }}</mat-label>
<input required matInput formControlName="periodValueKey">
<mat-error *ngIf="calculateDeltaConfigForm.get('periodValueKey').hasError('required')">
{{ 'tb.rulenode.period-value-key-required' | translate }}
{{ 'rule-node-config.period-value-key-required' | translate }}
</mat-error>
</mat-form-field>
</div>
<div tb-hint-tooltip-icon="{{ calculateDeltaConfigForm.get('addPeriodBetweenMsgs').value ? ('tb.rulenode.exclude-zero-deltas-time-difference-hint' | translate :{
outputValueKey: calculateDeltaConfigForm.get('outputValueKey').valid ? calculateDeltaConfigForm.get('outputValueKey').value : 'tb.rulenode.output-value-key' | translate,
periodValueKey: calculateDeltaConfigForm.get('periodValueKey').valid ? calculateDeltaConfigForm.get('periodValueKey').value : 'tb.rulenode.period-value-key' | translate
}) : ('tb.rulenode.exclude-zero-deltas-hint' | translate :{ outputValueKey: calculateDeltaConfigForm.get('outputValueKey').valid ? calculateDeltaConfigForm.get('outputValueKey').value : 'tb.rulenode.output-value-key' | translate }) }}"
<div tb-hint-tooltip-icon="{{ calculateDeltaConfigForm.get('addPeriodBetweenMsgs').value ? ('rule-node-config.exclude-zero-deltas-time-difference-hint' | translate :{
outputValueKey: calculateDeltaConfigForm.get('outputValueKey').valid ? calculateDeltaConfigForm.get('outputValueKey').value : 'rule-node-config.output-value-key' | translate,
periodValueKey: calculateDeltaConfigForm.get('periodValueKey').valid ? calculateDeltaConfigForm.get('periodValueKey').value : 'rule-node-config.period-value-key' | translate
}) : ('rule-node-config.exclude-zero-deltas-hint' | translate :{ outputValueKey: calculateDeltaConfigForm.get('outputValueKey').valid ? calculateDeltaConfigForm.get('outputValueKey').value : 'rule-node-config.output-value-key' | translate }) }}"
class="tb-form-row same-padding">
<mat-slide-toggle class="mat-slide margin" formControlName="excludeZeroDeltas">
{{ 'tb.rulenode.exclude-zero-deltas' | translate }}
{{ 'rule-node-config.exclude-zero-deltas' | translate }}
</mat-slide-toggle>
</div>
</div>

View File

@ -16,7 +16,7 @@
-->
<section [formGroup]="customerAttributesConfigForm" class="tb-form-panel stroked">
<div class="tb-form-panel-title" translate>tb.rulenode.mapping-of-customers</div>
<div class="tb-form-panel-title" translate>rule-node-config.mapping-of-customers</div>
<div class="flex flex-1 items-center justify-center">
<div class="fetch-to-data-toggle">
<tb-toggle-select class="fetch-to-data-toggle" formControlName="dataToFetch" appearance="fill">
@ -29,18 +29,18 @@
<tb-kv-map-config
required
formControlName="dataMapping"
[requiredText]="'tb.rulenode.attr-mapping-required' | translate"
[labelText]="selectTranslation('tb.rulenode.latest-telemetry-mapping','tb.rulenode.attributes-mapping') | translate"
[keyText]="selectTranslation('tb.rulenode.source-telemetry','tb.rulenode.source-attribute') | translate"
[keyRequiredText]="selectTranslation('tb.rulenode.source-telemetry-required','tb.rulenode.source-attribute-required') | translate"
[valText]="'tb.rulenode.target-key' | translate"
[valRequiredText]="'tb.rulenode.target-key-required' | translate"
[hintText]="'tb.rulenode.kv-map-pattern-hint'"
[requiredText]="'rule-node-config.attr-mapping-required' | translate"
[labelText]="selectTranslation('rule-node-config.latest-telemetry-mapping','rule-node-config.attributes-mapping') | translate"
[keyText]="selectTranslation('rule-node-config.source-telemetry','rule-node-config.source-attribute') | translate"
[keyRequiredText]="selectTranslation('rule-node-config.source-telemetry-required','rule-node-config.source-attribute-required') | translate"
[valText]="'rule-node-config.target-key' | translate"
[valRequiredText]="'rule-node-config.target-key-required' | translate"
[hintText]="'rule-node-config.kv-map-pattern-hint'"
popupHelpLink="rulenode/customer_attributes_node_fields_templatization">
</tb-kv-map-config>
<tb-msg-metadata-chip
[labelText]="customerAttributesConfigForm.get('dataToFetch').value === DataToFetch.LATEST_TELEMETRY ?
('tb.rulenode.add-mapped-latest-telemetry-to' | translate) : ('tb.rulenode.add-mapped-attribute-to' | translate)"
('rule-node-config.add-mapped-latest-telemetry-to' | translate) : ('rule-node-config.add-mapped-attribute-to' | translate)"
formControlName="fetchTo">
</tb-msg-metadata-chip>
</section>

View File

@ -17,7 +17,7 @@
-->
<section [formGroup]="deviceAttributesConfigForm" class="tb-form-panel no-padding no-border">
<div class="tb-form-panel stroked no-padding-bottom">
<div class="tb-form-panel-title" translate>tb.rulenode.device-relations-query</div>
<div class="tb-form-panel-title" translate>rule-node-config.device-relations-query</div>
<tb-device-relations-query-config
required
formControlName="deviceRelationsQuery">
@ -25,22 +25,22 @@
</div>
<div class="tb-form-panel stroked">
<div class="tb-form-row no-padding no-border space-between">
<div class="tb-form-panel-title tb-required" translate>tb.rulenode.related-device-attributes</div>
<div class="tb-form-panel-title tb-required" translate>rule-node-config.related-device-attributes</div>
<div class="tb-form-panel-hint tb-error" translate
[hidden]="!(deviceAttributesConfigForm.get('attributesControl').touched &&
deviceAttributesConfigForm.get('attributesControl').hasError('atLeastOneRequired'))">
tb.rulenode.at-least-one-field-required
rule-node-config.at-least-one-field-required
</div>
</div>
<tb-select-attributes formControlName="attributesControl"
popupHelpLink="rulenode/related_device_attributes_node_fields_templatization"></tb-select-attributes>
<tb-msg-metadata-chip formControlName="fetchTo"
[labelText]="'tb.rulenode.add-selected-attributes-to' | translate"></tb-msg-metadata-chip>
[labelText]="'rule-node-config.add-selected-attributes-to' | translate"></tb-msg-metadata-chip>
</div>
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.tell-failure-tooltip' | translate }}"
<div tb-hint-tooltip-icon="{{ 'rule-node-config.tell-failure-tooltip' | translate }}"
class="tb-form-row same-padding">
<mat-slide-toggle class="mat-slide margin" formControlName="tellFailureIfAbsent">
{{ 'tb.rulenode.tell-failure' | translate }}
{{ 'rule-node-config.tell-failure' | translate }}
</mat-slide-toggle>
</div>
</section>

View File

@ -18,18 +18,18 @@
<section [formGroup]="entityDetailsConfigForm">
<tb-string-items-list [predefinedValues]="predefinedValues"
class="mat-block" required
[label]="'tb.rulenode.select-details' | translate"
[placeholder]="'tb.rulenode.add-detail' | translate"
[requiredText]="'tb.rulenode.entity-details-list-empty' | translate"
[label]="'rule-node-config.select-details' | translate"
[placeholder]="'rule-node-config.add-detail' | translate"
[requiredText]="'rule-node-config.entity-details-list-empty' | translate"
formControlName="detailsList">
<mat-icon matSuffix class="help-icon margin-8 cursor-pointer" aria-hidden="false" aria-label="help-icon"
color="primary"
matTooltip="{{ 'tb.rulenode.chip-help' | translate: { inputName: 'tb.rulenode.detail' | translate } }}">
matTooltip="{{ 'rule-node-config.chip-help' | translate: { inputName: 'rule-node-config.detail' | translate } }}">
help
</mat-icon>
</tb-string-items-list>
<tb-msg-metadata-chip
[labelText]="'tb.rulenode.add-selected-details-to' | translate"
[labelText]="'rule-node-config.add-selected-details-to' | translate"
formControlName="fetchTo">
</tb-msg-metadata-chip>
</section>

View File

@ -17,7 +17,7 @@
-->
<section [formGroup]="fetchDeviceCredentialsConfigForm">
<tb-msg-metadata-chip
[labelText]="'tb.rulenode.fetch-credentials-to' | translate"
[labelText]="'rule-node-config.fetch-credentials-to' | translate"
formControlName="fetchTo">
</tb-msg-metadata-chip>
</section>

View File

@ -16,47 +16,47 @@
-->
<section [formGroup]="getTelemetryFromDatabaseConfigForm" class="tb-form-panel no-padding no-border">
<tb-string-items-list class="mat-block" editable [placeholder]="'tb.rulenode.add-timeseries-key' | translate"
<tb-string-items-list class="mat-block" editable [placeholder]="'rule-node-config.add-timeseries-key' | translate"
subscriptSizing="dynamic" required
[requiredText]="'tb.rulenode.timeseries-keys-required' | translate"
[label]="'tb.rulenode.timeseries-keys' | translate" formControlName="latestTsKeyNames"
[hint]="'tb.rulenode.general-pattern-hint' | translate">
[requiredText]="'rule-node-config.timeseries-keys-required' | translate"
[label]="'rule-node-config.timeseries-keys' | translate" formControlName="latestTsKeyNames"
[hint]="'rule-node-config.general-pattern-hint' | translate">
<div matHintEnd class="see-example" tb-help-popup="{{'rulenode/originator_telemetry_node_fields_templatization'}}"
hintMode
tb-help-popup-placement="right"
trigger-style="letter-spacing:0.25px; font-size:12px"
[tb-help-popup-style]="{maxWidth: '820px'}"
trigger-text="{{ 'tb.key-val.see-examples' | translate }}"></div>
trigger-text="{{ 'rule-node-config.key-val.see-examples' | translate }}"></div>
<mat-icon matSuffix class="help-icon margin-8 cursor-pointer" aria-hidden="false" aria-label="help-icon" color="primary"
matTooltip="{{ 'tb.rulenode.chip-help' | translate: { inputName: 'tb.rulenode.timeseries-key' | translate } }}">help
matTooltip="{{ 'rule-node-config.chip-help' | translate: { inputName: 'rule-node-config.timeseries-key' | translate } }}">help
</mat-icon>
</tb-string-items-list>
<div class="tb-form-panel stroked">
<div class="tb-form-panel-title" translate>tb.rulenode.fetch-interval</div>
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.use-metadata-dynamic-interval-tooltip' | translate }}"
<div class="tb-form-panel-title" translate>rule-node-config.fetch-interval</div>
<div tb-hint-tooltip-icon="{{ 'rule-node-config.use-metadata-dynamic-interval-tooltip' | translate }}"
class="tb-form-row no-border no-padding">
<mat-slide-toggle class="mat-slide" formControlName="useMetadataIntervalPatterns">
{{ 'tb.rulenode.use-metadata-dynamic-interval' | translate }}
{{ 'rule-node-config.use-metadata-dynamic-interval' | translate }}
</mat-slide-toggle>
</div>
<div formGroupName="interval" class="flex flex-col"
*ngIf="getTelemetryFromDatabaseConfigForm.get('useMetadataIntervalPatterns').value === false; else intervalPattern">
<div class="flex flex-col gap-0 gt-sm:flex-row gt-sm:gap-4">
<mat-form-field class="mat-block gt-sm:max-w-50% gt-sm:flex-full">
<mat-label>{{ 'tb.rulenode.interval-start' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.interval-start' | translate }}</mat-label>
<input type="number" step="1" min="1" max="2147483647" matInput formControlName="startInterval" required>
<mat-error *ngIf="getTelemetryFromDatabaseConfigForm.get('interval.startInterval').hasError('required')">
{{ 'tb.rulenode.start-interval-value-required' | translate }}
{{ 'rule-node-config.start-interval-value-required' | translate }}
</mat-error>
<mat-error *ngIf="getTelemetryFromDatabaseConfigForm.get('interval.startInterval').hasError('min')">
{{ 'tb.rulenode.time-value-range' | translate }}
{{ 'rule-node-config.time-value-range' | translate }}
</mat-error>
<mat-error *ngIf="getTelemetryFromDatabaseConfigForm.get('interval.startInterval').hasError('max')">
{{ 'tb.rulenode.time-value-range' | translate }}
{{ 'rule-node-config.time-value-range' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block gt-sm:max-w-50% gt-sm:flex-full" hideRequiredMarker>
<mat-label>{{ 'tb.rulenode.time-unit' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.time-unit' | translate }}</mat-label>
<mat-select formControlName="startIntervalTimeUnit" required>
<mat-option *ngFor="let timeUnit of timeUnits" [value]="timeUnit">
{{ timeUnitsTranslationMap.get(timeUnit) | translate }}
@ -66,20 +66,20 @@
</div>
<div class="flex flex-col gap-0 gt-sm:flex-row gt-sm:gap-4">
<mat-form-field class="mat-block gt-sm:max-w-50% gt-sm:flex-full">
<mat-label>{{ 'tb.rulenode.interval-end' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.interval-end' | translate }}</mat-label>
<input type="number" step="1" min="1" max="2147483647" matInput formControlName="endInterval" required>
<mat-error *ngIf="getTelemetryFromDatabaseConfigForm.get('interval.endInterval').hasError('required')">
{{ 'tb.rulenode.end-interval-value-required' | translate }}
{{ 'rule-node-config.end-interval-value-required' | translate }}
</mat-error>
<mat-error *ngIf="getTelemetryFromDatabaseConfigForm.get('interval.endInterval').hasError('min')">
{{ 'tb.rulenode.time-value-range' | translate }}
{{ 'rule-node-config.time-value-range' | translate }}
</mat-error>
<mat-error *ngIf="getTelemetryFromDatabaseConfigForm.get('interval.endInterval').hasError('max')">
{{ 'tb.rulenode.time-value-range' | translate }}
{{ 'rule-node-config.time-value-range' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block gt-sm:max-w-50% gt-sm:flex-full" hideRequiredMarker>
<mat-label>{{ 'tb.rulenode.time-unit' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.time-unit' | translate }}</mat-label>
<mat-select formControlName="endIntervalTimeUnit" required>
<mat-option *ngFor="let timeUnit of timeUnits" [value]="timeUnit">
{{ timeUnitsTranslationMap.get(timeUnit) | translate }}
@ -91,7 +91,7 @@
<mat-icon class="description-icon">error_outline</mat-icon>
<div class="description-text">
<ng-container *ngIf="getTelemetryFromDatabaseConfigForm.get('interval').valid; else invalidText">
{{ 'tb.rulenode.fetch-timeseries-from-to' | translate:
{{ 'rule-node-config.fetch-timeseries-from-to' | translate:
{
startInterval: getTelemetryFromDatabaseConfigForm.get('interval.startInterval').value,
endInterval: getTelemetryFromDatabaseConfigForm.get('interval.endInterval').value,
@ -100,7 +100,7 @@
} }}
</ng-container>
<ng-template #invalidText>
{{ "tb.rulenode.fetch-timeseries-from-to-invalid" | translate }}
{{ "rule-node-config.fetch-timeseries-from-to-invalid" | translate }}
</ng-template>
</div>
</div>
@ -108,29 +108,29 @@
<ng-template #intervalPattern>
<div class="input-block flex flex-col">
<mat-form-field class="mat-block flex-1">
<mat-label>{{ 'tb.rulenode.start-interval' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.start-interval' | translate }}</mat-label>
<input matInput formControlName="startIntervalPattern" required>
<mat-error *ngIf="getTelemetryFromDatabaseConfigForm.get('startIntervalPattern').hasError('required') ||
getTelemetryFromDatabaseConfigForm.get('startIntervalPattern').hasError('pattern')">
{{ 'tb.rulenode.start-interval-required' | translate }}
{{ 'rule-node-config.start-interval-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block flex-1">
<mat-label>{{ 'tb.rulenode.end-interval' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.end-interval' | translate }}</mat-label>
<input matInput formControlName="endIntervalPattern" required>
<mat-error *ngIf="getTelemetryFromDatabaseConfigForm.get('endIntervalPattern').hasError('required') ||
getTelemetryFromDatabaseConfigForm.get('endIntervalPattern').hasError('pattern')">
{{ 'tb.rulenode.end-interval-required' | translate }}
{{ 'rule-node-config.end-interval-required' | translate }}
</mat-error>
</mat-form-field>
<tb-example-hint [hintText]="'tb.rulenode.metadata-dynamic-interval-hint'"
<tb-example-hint [hintText]="'rule-node-config.metadata-dynamic-interval-hint'"
popupHelpLink="rulenode/originator_telemetry_node_fields_templatization">
</tb-example-hint>
</div>
</ng-template>
</div>
<div class="tb-form-panel stroked">
<div class="tb-form-panel-title" translate>tb.rulenode.fetch-strategy</div>
<div class="tb-form-panel-title" translate>rule-node-config.fetch-strategy</div>
<div class="tb-form-panel no-border no-padding item-center">
<div class="fetch-mod-toggle">
<tb-toggle-select formControlName="fetchMode" appearance="fill">
@ -155,7 +155,7 @@
</mat-form-field>
<div *ngIf="getTelemetryFromDatabaseConfigForm.get('aggregation').value === aggregationTypes.NONE">
<mat-form-field class="mat-block" hideRequiredMarker>
<mat-label> {{ "tb.rulenode.order-by-timestamp" | translate }} </mat-label>
<mat-label> {{ "rule-node-config.order-by-timestamp" | translate }} </mat-label>
<mat-select formControlName="orderBy" required>
<mat-option *ngFor="let order of samplingOrders" [value]="order">
{{ samplingOrdersTranslate.get(order) | translate }}
@ -163,17 +163,17 @@
</mat-select>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label>{{ "tb.rulenode.limit" | translate }}</mat-label>
<mat-label>{{ "rule-node-config.limit" | translate }}</mat-label>
<input type="number" min="2" max="1000" step="1" matInput formControlName="limit" required>
<mat-hint>{{ "tb.rulenode.limit-hint" | translate }}</mat-hint>
<mat-hint>{{ "rule-node-config.limit-hint" | translate }}</mat-hint>
<mat-error *ngIf="getTelemetryFromDatabaseConfigForm.get('limit').hasError('required')">
{{ 'tb.rulenode.limit-required' | translate }}
{{ 'rule-node-config.limit-required' | translate }}
</mat-error>
<mat-error *ngIf="getTelemetryFromDatabaseConfigForm.get('limit').hasError('min')">
{{ 'tb.rulenode.limit-range' | translate }}
{{ 'rule-node-config.limit-range' | translate }}
</mat-error>
<mat-error *ngIf="getTelemetryFromDatabaseConfigForm.get('limit').hasError('max')">
{{ 'tb.rulenode.limit-range' | translate }}
{{ 'rule-node-config.limit-range' | translate }}
</mat-error>
</mat-form-field>
</div>

View File

@ -18,23 +18,23 @@
<section class="tb-form-panel no-padding no-border" [formGroup]="originatorAttributesConfigForm">
<div class="tb-form-panel stroked">
<div class="tb-form-row no-padding no-border space-between">
<div class="tb-form-panel-title tb-required" translate>tb.rulenode.originator-attributes</div>
<div class="tb-form-panel-title tb-required" translate>rule-node-config.originator-attributes</div>
<div class="tb-form-panel-hint tb-error" translate
[hidden]="!(originatorAttributesConfigForm.get('attributesControl').touched &&
originatorAttributesConfigForm.get('attributesControl').hasError('atLeastOneRequired'))">
tb.rulenode.at-least-one-field-required
rule-node-config.at-least-one-field-required
</div>
</div>
<tb-select-attributes formControlName="attributesControl"
popupHelpLink="rulenode/originator_attributes_node_fields_templatization">
</tb-select-attributes>
<tb-msg-metadata-chip [labelText]="'tb.rulenode.add-originator-attributes-to' | translate"
<tb-msg-metadata-chip [labelText]="'rule-node-config.add-originator-attributes-to' | translate"
formControlName="fetchTo">
</tb-msg-metadata-chip>
</div>
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.tell-failure-tooltip' | translate }}" class="tb-form-row same-padding">
<div tb-hint-tooltip-icon="{{ 'rule-node-config.tell-failure-tooltip' | translate }}" class="tb-form-row same-padding">
<mat-slide-toggle class="mat-slide margin" formControlName="tellFailureIfAbsent">
{{ 'tb.rulenode.tell-failure' | translate }}
{{ 'rule-node-config.tell-failure' | translate }}
</mat-slide-toggle>
</div>
</section>

View File

@ -21,21 +21,21 @@
[selectOptions]="originatorFields"
targetKeyPrefix="originator"
formControlName="dataMapping"
[requiredText]="'tb.rulenode.attr-mapping-required' | translate"
[labelText]="'tb.rulenode.originator-fields-mapping' | translate"
[selectText]="'tb.rulenode.source-field' | translate"
[selectRequiredText]="'tb.rulenode.source-field-required' | translate"
[valText]="'tb.rulenode.target-key' | translate"
[valRequiredText]="'tb.rulenode.target-key-required' | translate"
[hintText]="'tb.rulenode.originator-fields-sv-map-hint' | translate"
[requiredText]="'rule-node-config.attr-mapping-required' | translate"
[labelText]="'rule-node-config.originator-fields-mapping' | translate"
[selectText]="'rule-node-config.source-field' | translate"
[selectRequiredText]="'rule-node-config.source-field-required' | translate"
[valText]="'rule-node-config.target-key' | translate"
[valRequiredText]="'rule-node-config.target-key-required' | translate"
[hintText]="'rule-node-config.originator-fields-sv-map-hint' | translate"
popupHelpLink="rulenode/originator_fields_node_fields_templatization">
</tb-sv-map-config>
<tb-msg-metadata-chip [labelText]="'tb.rulenode.add-mapped-originator-fields-to' | translate"
<tb-msg-metadata-chip [labelText]="'rule-node-config.add-mapped-originator-fields-to' | translate"
formControlName="fetchTo">
</tb-msg-metadata-chip>
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.skip-empty-fields-tooltip' | translate }}" class="tb-form-row same-padding">
<div tb-hint-tooltip-icon="{{ 'rule-node-config.skip-empty-fields-tooltip' | translate }}" class="tb-form-row same-padding">
<mat-slide-toggle class="mat-slide margin" formControlName="ignoreNullStrings">
{{ 'tb.rulenode.skip-empty-fields' | translate }}
{{ 'rule-node-config.skip-empty-fields' | translate }}
</mat-slide-toggle>
</div>
</section>

View File

@ -21,7 +21,7 @@
formControlName="relationsQuery">
</tb-relations-query-config>
<div class="tb-form-panel stroked">
<div class="tb-form-panel-title" translate>tb.rulenode.data-to-fetch</div>
<div class="tb-form-panel-title" translate>rule-node-config.data-to-fetch</div>
<tb-toggle-select formControlName="dataToFetch" appearance="fill">
<tb-toggle-option *ngFor="let data of fetchToData" [value]="data.value">
{{ data.name }}
@ -31,28 +31,28 @@
[hidden]="relatedAttributesConfigForm.get('dataToFetch').value === DataToFetch.FIELDS"
required
formControlName="kvMap"
[requiredText]="'tb.rulenode.attr-mapping-required' | translate"
[labelText]="selectTranslation('tb.rulenode.latest-telemetry-mapping','tb.rulenode.attributes-mapping') | translate"
[keyText]="selectTranslation('tb.rulenode.source-telemetry','tb.rulenode.source-attribute') | translate"
[keyRequiredText]="selectTranslation('tb.rulenode.source-telemetry-required','tb.rulenode.source-attribute-required') | translate"
[valText]="'tb.rulenode.target-key' | translate"
[valRequiredText]="'tb.rulenode.target-key-required' | translate"
[hintText]="'tb.rulenode.kv-map-pattern-hint'"
[requiredText]="'rule-node-config.attr-mapping-required' | translate"
[labelText]="selectTranslation('rule-node-config.latest-telemetry-mapping','rule-node-config.attributes-mapping') | translate"
[keyText]="selectTranslation('rule-node-config.source-telemetry','rule-node-config.source-attribute') | translate"
[keyRequiredText]="selectTranslation('rule-node-config.source-telemetry-required','rule-node-config.source-attribute-required') | translate"
[valText]="'rule-node-config.target-key' | translate"
[valRequiredText]="'rule-node-config.target-key-required' | translate"
[hintText]="'rule-node-config.kv-map-pattern-hint'"
popupHelpLink="rulenode/related_entity_data_node_fields_templatization">
</tb-kv-map-config>
<tb-sv-map-config
[hidden]="relatedAttributesConfigForm.get('dataToFetch').value !== DataToFetch.FIELDS"
required
[labelText]="'tb.rulenode.fields-mapping' | translate"
[labelText]="'rule-node-config.fields-mapping' | translate"
targetKeyPrefix="relatedEntity"
[selectOptions]="originatorFields"
formControlName="svMap"
[requiredText]="'tb.rulenode.attr-mapping-required' | translate"
[selectText]="'tb.rulenode.source-field' | translate"
[selectRequiredText]="'tb.rulenode.source-field-required' | translate"
[valText]="'tb.rulenode.target-key' | translate"
[valRequiredText]="'tb.rulenode.target-key-required' | translate"
[hintText]="'tb.rulenode.sv-map-hint' | translate"
[requiredText]="'rule-node-config.attr-mapping-required' | translate"
[selectText]="'rule-node-config.source-field' | translate"
[selectRequiredText]="'rule-node-config.source-field-required' | translate"
[valText]="'rule-node-config.target-key' | translate"
[valRequiredText]="'rule-node-config.target-key-required' | translate"
[hintText]="'rule-node-config.sv-map-hint' | translate"
popupHelpLink="rulenode/related_entity_data_node_fields_templatization">
</tb-sv-map-config>
<tb-msg-metadata-chip formControlName="fetchTo"

View File

@ -16,7 +16,7 @@
-->
<section [formGroup]="tenantAttributesConfigForm" class="tb-form-panel stroked">
<div class="tb-form-panel-title" translate>tb.rulenode.mapping-of-tenant</div>
<div class="tb-form-panel-title" translate>rule-node-config.mapping-of-tenant</div>
<div class="flex flex-1 items-center justify-center">
<div class="fetch-to-data-toggle">
<tb-toggle-select class="fetch-to-data-toggle" formControlName="dataToFetch" appearance="fill">
@ -29,17 +29,17 @@
<tb-kv-map-config
required
formControlName="dataMapping"
[requiredText]="'tb.rulenode.attr-mapping-required' | translate"
[labelText]="selectTranslation('tb.rulenode.latest-telemetry-mapping', 'tb.rulenode.attributes-mapping') | translate"
[keyText]="selectTranslation('tb.rulenode.source-telemetry', 'tb.rulenode.source-attribute') | translate"
[keyRequiredText]="selectTranslation('tb.rulenode.source-telemetry-required', 'tb.rulenode.source-attribute-required') | translate"
[valText]="'tb.rulenode.target-key' | translate"
[valRequiredText]="'tb.rulenode.target-key-required' | translate"
[hintText]="'tb.rulenode.kv-map-pattern-hint'"
[requiredText]="'rule-node-config.attr-mapping-required' | translate"
[labelText]="selectTranslation('rule-node-config.latest-telemetry-mapping', 'rule-node-config.attributes-mapping') | translate"
[keyText]="selectTranslation('rule-node-config.source-telemetry', 'rule-node-config.source-attribute') | translate"
[keyRequiredText]="selectTranslation('rule-node-config.source-telemetry-required', 'rule-node-config.source-attribute-required') | translate"
[valText]="'rule-node-config.target-key' | translate"
[valRequiredText]="'rule-node-config.target-key-required' | translate"
[hintText]="'rule-node-config.kv-map-pattern-hint'"
popupHelpLink="rulenode/tenant_attributes_node_fields_templatization">
</tb-kv-map-config>
<tb-msg-metadata-chip formControlName="fetchTo"
[labelText]="tenantAttributesConfigForm.get('dataToFetch').value === DataToFetch.LATEST_TELEMETRY ?
('tb.rulenode.add-mapped-latest-telemetry-to' | translate) : ('tb.rulenode.add-mapped-attribute-to' | translate)">
('rule-node-config.add-mapped-latest-telemetry-to' | translate) : ('rule-node-config.add-mapped-attribute-to' | translate)">
</tb-msg-metadata-chip>
</section>

View File

@ -17,45 +17,45 @@
-->
<section [formGroup]="azureIotHubConfigForm" class="flex flex-col">
<mat-form-field class="mat-block" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.topic</mat-label>
<mat-label translate>rule-node-config.topic</mat-label>
<input required matInput formControlName="topicPattern">
<mat-error *ngIf="azureIotHubConfigForm.get('topicPattern').hasError('required')">
{{ 'tb.rulenode.topic-required' | translate }}
{{ 'rule-node-config.topic-required' | translate }}
</mat-error>
<mat-hint translate>tb.rulenode.general-pattern-hint</mat-hint>
<mat-hint translate>rule-node-config.general-pattern-hint</mat-hint>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.hostname</mat-label>
<mat-label translate>rule-node-config.hostname</mat-label>
<input required matInput formControlName="host">
<mat-error *ngIf="azureIotHubConfigForm.get('host').hasError('required')">
{{ 'tb.rulenode.hostname-required' | translate }}
{{ 'rule-node-config.hostname-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.device-id</mat-label>
<mat-label translate>rule-node-config.device-id</mat-label>
<input required matInput formControlName="clientId" autocomplete="new-clientId">
<mat-error *ngIf="azureIotHubConfigForm.get('clientId').hasError('required')">
{{ 'tb.rulenode.device-id-required' | translate }}
{{ 'rule-node-config.device-id-required' | translate }}
</mat-error>
</mat-form-field>
<mat-accordion>
<mat-expansion-panel class="tb-mqtt-credentials-panel-group">
<mat-expansion-panel-header>
<mat-panel-title class="tb-required" translate>tb.rulenode.credentials</mat-panel-title>
<mat-panel-title class="tb-required" translate>rule-node-config.credentials</mat-panel-title>
<mat-panel-description>
{{ azureIotHubCredentialsTypeTranslationsMap.get(azureIotHubConfigForm.get('credentials.type').value) | translate }}
</mat-panel-description>
</mat-expansion-panel-header>
<section formGroupName="credentials" class="flex flex-col">
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.credentials-type</mat-label>
<mat-label translate>rule-node-config.credentials-type</mat-label>
<mat-select formControlName="type" required>
<mat-option *ngFor="let credentialsType of allAzureIotHubCredentialsTypes" [value]="credentialsType">
{{ azureIotHubCredentialsTypeTranslationsMap.get(credentialsType) | translate }}
</mat-option>
</mat-select>
<mat-error *ngIf="azureIotHubConfigForm.get('credentials.type').hasError('required')">
{{ 'tb.rulenode.credentials-type-required' | translate }}
{{ 'rule-node-config.credentials-type-required' | translate }}
</mat-error>
</mat-form-field>
<section class="flex flex-col" [ngSwitch]="azureIotHubConfigForm.get('credentials.type').value">
@ -63,20 +63,20 @@
</ng-template>
<ng-template ngSwitchCase="sas">
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.sas-key</mat-label>
<mat-label translate>rule-node-config.sas-key</mat-label>
<input type="password" required matInput formControlName="sasKey" autocomplete="new-password">
<tb-toggle-password matSuffix></tb-toggle-password>
<mat-error *ngIf="azureIotHubConfigForm.get('credentials.sasKey').hasError('required')">
{{ 'tb.rulenode.sas-key-required' | translate }}
{{ 'rule-node-config.sas-key-required' | translate }}
</mat-error>
</mat-form-field>
<tb-file-input formControlName="caCert"
inputId="caCertSelect"
[existingFileName]="azureIotHubConfigForm.get('credentials.caCertFileName').value"
(fileNameChanged)="azureIotHubConfigForm.get('credentials.caCertFileName').setValue($event)"
label="{{'tb.rulenode.azure-ca-cert' | translate}}"
noFileText="tb.rulenode.no-file"
dropLabel="{{'tb.rulenode.drop-file' | translate}}">
label="{{'rule-node-config.azure-ca-cert' | translate}}"
noFileText="rule-node-config.no-file"
dropLabel="{{'rule-node-config.drop-file' | translate}}">
</tb-file-input>
</ng-template>
<ng-template ngSwitchCase="cert.PEM">
@ -84,9 +84,9 @@
inputId="caCertSelect"
[existingFileName]="azureIotHubConfigForm.get('credentials.caCertFileName').value"
(fileNameChanged)="azureIotHubConfigForm.get('credentials.caCertFileName').setValue($event)"
label="{{'tb.rulenode.azure-ca-cert' | translate}}"
noFileText="tb.rulenode.no-file"
dropLabel="{{'tb.rulenode.drop-file' | translate}}">
label="{{'rule-node-config.azure-ca-cert' | translate}}"
noFileText="rule-node-config.no-file"
dropLabel="{{'rule-node-config.drop-file' | translate}}">
</tb-file-input>
<tb-file-input formControlName="cert"
inputId="CertSelect"
@ -94,9 +94,9 @@
(fileNameChanged)="azureIotHubConfigForm.get('credentials.certFileName').setValue($event)"
required
requiredAsError
label="{{'tb.rulenode.cert' | translate}}"
noFileText="tb.rulenode.no-file"
dropLabel="{{'tb.rulenode.drop-file' | translate}}">
label="{{'rule-node-config.cert' | translate}}"
noFileText="rule-node-config.no-file"
dropLabel="{{'rule-node-config.drop-file' | translate}}">
</tb-file-input>
<tb-file-input style="padding-bottom: 8px;"
formControlName="privateKey"
@ -105,12 +105,12 @@
(fileNameChanged)="azureIotHubConfigForm.get('credentials.privateKeyFileName').setValue($event)"
required
requiredAsError
label="{{'tb.rulenode.private-key' | translate}}"
noFileText="tb.rulenode.no-file"
dropLabel="{{'tb.rulenode.drop-file' | translate}}">
label="{{'rule-node-config.private-key' | translate}}"
noFileText="rule-node-config.no-file"
dropLabel="{{'rule-node-config.drop-file' | translate}}">
</tb-file-input>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.private-key-password</mat-label>
<mat-label translate>rule-node-config.private-key-password</mat-label>
<input type="password" matInput formControlName="password" autocomplete="new-password">
<tb-toggle-password matSuffix></tb-toggle-password>
</mat-form-field>

View File

@ -17,56 +17,56 @@
-->
<section [formGroup]="kafkaConfigForm" class="flex flex-col">
<mat-form-field class="mat-block" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.topic-pattern</mat-label>
<mat-label translate>rule-node-config.topic-pattern</mat-label>
<input required matInput formControlName="topicPattern">
<mat-error *ngIf="kafkaConfigForm.get('topicPattern').hasError('required')">
{{ 'tb.rulenode.topic-pattern-required' | translate }}
{{ 'rule-node-config.topic-pattern-required' | translate }}
</mat-error>
<mat-hint translate>tb.rulenode.general-pattern-hint</mat-hint>
<mat-hint translate>rule-node-config.general-pattern-hint</mat-hint>
</mat-form-field>
<mat-form-field class="mat-block" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.key-pattern</mat-label>
<mat-label translate>rule-node-config.key-pattern</mat-label>
<input matInput formControlName="keyPattern">
<mat-hint translate>tb.rulenode.general-pattern-hint</mat-hint>
<mat-hint translate>rule-node-config.general-pattern-hint</mat-hint>
</mat-form-field>
<div class="tb-hint" translate>tb.rulenode.key-pattern-hint</div>
<div class="tb-hint" translate>rule-node-config.key-pattern-hint</div>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.bootstrap-servers</mat-label>
<mat-label translate>rule-node-config.bootstrap-servers</mat-label>
<input required matInput formControlName="bootstrapServers">
<mat-error *ngIf="kafkaConfigForm.get('bootstrapServers').hasError('required')">
{{ 'tb.rulenode.bootstrap-servers-required' | translate }}
{{ 'rule-node-config.bootstrap-servers-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.retries</mat-label>
<mat-label translate>rule-node-config.retries</mat-label>
<input type="number" step="1" min="0" matInput formControlName="retries">
<mat-error *ngIf="kafkaConfigForm.get('retries').hasError('min')">
{{ 'tb.rulenode.min-retries-message' | translate }}
{{ 'rule-node-config.min-retries-message' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.batch-size-bytes</mat-label>
<mat-label translate>rule-node-config.batch-size-bytes</mat-label>
<input type="number" step="1" min="0" matInput formControlName="batchSize">
<mat-error *ngIf="kafkaConfigForm.get('batchSize').hasError('min')">
{{ 'tb.rulenode.min-batch-size-bytes-message' | translate }}
{{ 'rule-node-config.min-batch-size-bytes-message' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.linger-ms</mat-label>
<mat-label translate>rule-node-config.linger-ms</mat-label>
<input type="number" step="1" min="0" matInput formControlName="linger">
<mat-error *ngIf="kafkaConfigForm.get('linger').hasError('min')">
{{ 'tb.rulenode.min-linger-ms-message' | translate }}
{{ 'rule-node-config.min-linger-ms-message' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.buffer-memory-bytes</mat-label>
<mat-label translate>rule-node-config.buffer-memory-bytes</mat-label>
<input type="number" step="1" min="0" matInput formControlName="bufferMemory">
<mat-error *ngIf="kafkaConfigForm.get('bufferMemory').hasError('min')">
{{ 'tb.rulenode.min-buffer-memory-bytes-message' | translate }}
{{ 'rule-node-config.min-buffer-memory-bytes-message' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.acks</mat-label>
<mat-label translate>rule-node-config.acks</mat-label>
<mat-select formControlName="acks" required>
<mat-option *ngFor="let ackValue of ackValues" [value]="ackValue">
{{ ackValue }}
@ -74,34 +74,34 @@
</mat-select>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.key-serializer</mat-label>
<mat-label translate>rule-node-config.key-serializer</mat-label>
<input required matInput formControlName="keySerializer">
<mat-error *ngIf="kafkaConfigForm.get('keySerializer').hasError('required')">
{{ 'tb.rulenode.key-serializer-required' | translate }}
{{ 'rule-node-config.key-serializer-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.value-serializer</mat-label>
<mat-label translate>rule-node-config.value-serializer</mat-label>
<input required matInput formControlName="valueSerializer">
<mat-error *ngIf="kafkaConfigForm.get('valueSerializer').hasError('required')">
{{ 'tb.rulenode.value-serializer-required' | translate }}
{{ 'rule-node-config.value-serializer-required' | translate }}
</mat-error>
</mat-form-field>
<label translate class="tb-title">tb.rulenode.other-properties</label>
<label translate class="tb-title">rule-node-config.other-properties</label>
<tb-kv-map-config-old
required="false"
formControlName="otherProperties"
keyText="tb.rulenode.key"
keyRequiredText="tb.rulenode.key-required"
valText="tb.rulenode.value"
valRequiredText="tb.rulenode.value-required">
keyText="rule-node-config.key"
keyRequiredText="rule-node-config.key-required"
valText="rule-node-config.value"
valRequiredText="rule-node-config.value-required">
</tb-kv-map-config-old>
<mat-checkbox class="flex-1" formControlName="addMetadataKeyValuesAsKafkaHeaders">
{{ 'tb.rulenode.add-metadata-key-values-as-kafka-headers' | translate }}
{{ 'rule-node-config.add-metadata-key-values-as-kafka-headers' | translate }}
</mat-checkbox>
<div class="tb-hint" translate>tb.rulenode.add-metadata-key-values-as-kafka-headers-hint</div>
<div class="tb-hint" translate>rule-node-config.add-metadata-key-values-as-kafka-headers-hint</div>
<mat-form-field class="mat-block flex-1" *ngIf="kafkaConfigForm.get('addMetadataKeyValuesAsKafkaHeaders').value">
<mat-label translate>tb.rulenode.charset-encoding</mat-label>
<mat-label translate>rule-node-config.charset-encoding</mat-label>
<mat-select formControlName="kafkaHeadersCharset" required>
<mat-option *ngFor="let charset of ToByteStandartCharsetTypesValues" [value]="charset">
{{ ToByteStandartCharsetTypeTranslationMap.get(charset) | translate }}

View File

@ -18,23 +18,23 @@
<section [formGroup]="lambdaConfigForm" class="tb-form-panel no-padding no-border">
<div class="tb-form-panel stroked">
<div class="tb-form-row no-padding no-border">
<div class="tb-form-panel-title tb-required" translate>tb.rulenode.function-configuration</div>
<div class="tb-form-panel-title tb-required" translate>rule-node-config.function-configuration</div>
</div>
<tb-example-hint [hintText]="'tb.rulenode.template-rules-hint'"
<tb-example-hint [hintText]="'rule-node-config.template-rules-hint'"
popupHelpLink="rulenode/node-templatization-doc">
</tb-example-hint>
<div class="tb-standard-fields">
<mat-form-field class="mat-block">
<mat-label>{{'tb.rulenode.function-name' | translate}}</mat-label>
<mat-label>{{'rule-node-config.function-name' | translate}}</mat-label>
<input required matInput formControlName="functionName">
<mat-error *ngIf="lambdaConfigForm.get('functionName').hasError('required')">
{{'tb.rulenode.function-name-required' | translate}}
{{'rule-node-config.function-name-required' | translate}}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label>{{'tb.rulenode.qualifier' | translate}}</mat-label>
<mat-label>{{'rule-node-config.qualifier' | translate}}</mat-label>
<input matInput formControlName="qualifier">
<mat-hint translate>tb.rulenode.qualifier-hint</mat-hint>
<mat-hint translate>rule-node-config.qualifier-hint</mat-hint>
</mat-form-field>
</div>
</div>
@ -42,28 +42,28 @@
<div class="tb-form-panel stroked">
<mat-expansion-panel class="tb-settings" expanded>
<mat-expansion-panel-header>
<mat-panel-title class="tb-form-panel-title tb-required" translate>tb.rulenode.aws-credentials</mat-panel-title>
<mat-panel-title class="tb-form-panel-title tb-required" translate>rule-node-config.aws-credentials</mat-panel-title>
</mat-expansion-panel-header>
<div class="tb-standard-fields">
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.aws-access-key-id</mat-label>
<mat-label translate>rule-node-config.aws-access-key-id</mat-label>
<input required matInput formControlName="accessKey">
<mat-error *ngIf="lambdaConfigForm.get('accessKey').hasError('required')">
{{ 'tb.rulenode.aws-access-key-id-required' | translate }}
{{ 'rule-node-config.aws-access-key-id-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.aws-secret-access-key</mat-label>
<mat-label translate>rule-node-config.aws-secret-access-key</mat-label>
<input required matInput formControlName="secretKey">
<mat-error *ngIf="lambdaConfigForm.get('secretKey').hasError('required')">
{{ 'tb.rulenode.aws-secret-access-key-required' | translate }}
{{ 'rule-node-config.aws-secret-access-key-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.aws-region</mat-label>
<mat-label translate>rule-node-config.aws-region</mat-label>
<input required matInput formControlName="region">
<mat-error *ngIf="lambdaConfigForm.get('region').hasError('required')">
{{ 'tb.rulenode.aws-region-required' | translate }}
{{ 'rule-node-config.aws-region-required' | translate }}
</mat-error>
</mat-form-field>
</div>
@ -72,41 +72,41 @@
<div class="tb-form-panel stroked no-padding">
<mat-expansion-panel class="tb-settings">
<mat-expansion-panel-header style="padding: 16px">
<mat-panel-title translate>tb.rulenode.advanced-settings</mat-panel-title>
<mat-panel-title translate>rule-node-config.advanced-settings</mat-panel-title>
</mat-expansion-panel-header>
<div class="tb-form-panel no-border no-padding no-gap" style="margin-top: 0">
<div class="tb-form-row no-border same-padding tb-standard-fields">
<mat-form-field class="flex">
<mat-label translate>tb.rulenode.connection-timeout</mat-label>
<mat-label translate>rule-node-config.connection-timeout</mat-label>
<input type="number" required min="0" matInput formControlName="connectionTimeout">
<mat-error *ngIf="lambdaConfigForm.get('connectionTimeout').hasError('required')">
{{ 'tb.rulenode.connection-timeout-required' | translate }}
{{ 'rule-node-config.connection-timeout-required' | translate }}
</mat-error>
<mat-error *ngIf="lambdaConfigForm.get('connectionTimeout').hasError('min')">
{{ 'tb.rulenode.connection-timeout-min' | translate }}
{{ 'rule-node-config.connection-timeout-min' | translate }}
</mat-error>
<mat-icon matSuffix class="help-icon margin-8 cursor-pointer" aria-hidden="false" aria-label="help-icon"
color="primary"
matTooltip="{{ 'tb.rulenode.connection-timeout-hint' | translate }}">help</mat-icon>
matTooltip="{{ 'rule-node-config.connection-timeout-hint' | translate }}">help</mat-icon>
</mat-form-field>
<mat-form-field class="flex">
<mat-label translate>tb.rulenode.request-timeout</mat-label>
<mat-label translate>rule-node-config.request-timeout</mat-label>
<input type="number" required min="0" matInput formControlName="requestTimeout">
<mat-error *ngIf="lambdaConfigForm.get('requestTimeout').hasError('required')">
{{ 'tb.rulenode.request-timeout-required' | translate }}
{{ 'rule-node-config.request-timeout-required' | translate }}
</mat-error>
<mat-error *ngIf="lambdaConfigForm.get('requestTimeout').hasError('min')">
{{ 'tb.rulenode.request-timeout-min' | translate }}
{{ 'rule-node-config.request-timeout-min' | translate }}
</mat-error>
<mat-icon matSuffix class="help-icon margin-8 cursor-pointer" aria-hidden="false" aria-label="help-icon"
color="primary"
matTooltip="{{ 'tb.rulenode.request-timeout-hint' | translate }}">help</mat-icon>
matTooltip="{{ 'rule-node-config.request-timeout-hint' | translate }}">help</mat-icon>
</mat-form-field>
</div>
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.tell-failure-aws-lambda-hint' | translate }}"
<div tb-hint-tooltip-icon="{{ 'rule-node-config.tell-failure-aws-lambda-hint' | translate }}"
class="tb-form-row no-border" style="margin-bottom: 16px">
<mat-slide-toggle class="mat-slide" formControlName="tellFailureIfFuncThrowsExc">
{{ 'tb.rulenode.tell-failure-aws-lambda' | translate }}
{{ 'rule-node-config.tell-failure-aws-lambda' | translate }}
</mat-slide-toggle>
</div>
</div>

View File

@ -17,69 +17,69 @@
-->
<section [formGroup]="mqttConfigForm" class="flex flex-col">
<mat-form-field class="mat-block" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.topic-pattern</mat-label>
<mat-label translate>rule-node-config.topic-pattern</mat-label>
<input required matInput formControlName="topicPattern">
<mat-error *ngIf="mqttConfigForm.get('topicPattern').hasError('required')">
{{ 'tb.rulenode.topic-pattern-required' | translate }}
{{ 'rule-node-config.topic-pattern-required' | translate }}
</mat-error>
<mat-hint translate>tb.rulenode.general-pattern-hint</mat-hint>
<mat-hint translate>rule-node-config.general-pattern-hint</mat-hint>
</mat-form-field>
<div class="flex flex-1 flex-col gt-sm:flex-row gt-sm:gap-2">
<mat-form-field class="mat-block gt-sm:max-w-60% gt-sm:flex-full">
<mat-label translate>tb.rulenode.host</mat-label>
<mat-label translate>rule-node-config.host</mat-label>
<input required matInput formControlName="host">
<mat-error *ngIf="mqttConfigForm.get('host').hasError('required')">
{{ 'tb.rulenode.host-required' | translate }}
{{ 'rule-node-config.host-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block gt-sm:max-w-40% gt-sm:flex-full">
<mat-label translate>tb.rulenode.port</mat-label>
<mat-label translate>rule-node-config.port</mat-label>
<input required type="number" step="1" min="1" max="65535" matInput formControlName="port">
<mat-error *ngIf="mqttConfigForm.get('port').hasError('required')">
{{ 'tb.rulenode.port-required' | translate }}
{{ 'rule-node-config.port-required' | translate }}
</mat-error>
<mat-error *ngIf="mqttConfigForm.get('port').hasError('min')">
{{ 'tb.rulenode.port-range' | translate }}
{{ 'rule-node-config.port-range' | translate }}
</mat-error>
<mat-error *ngIf="mqttConfigForm.get('port').hasError('max')">
{{ 'tb.rulenode.port-range' | translate }}
{{ 'rule-node-config.port-range' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block gt-sm:max-w-40% gt-sm:flex-full">
<mat-label translate>tb.rulenode.connect-timeout</mat-label>
<mat-label translate>rule-node-config.connect-timeout</mat-label>
<input required type="number" step="1" min="1" max="200" matInput formControlName="connectTimeoutSec">
<mat-error *ngIf="mqttConfigForm.get('connectTimeoutSec').hasError('required')">
{{ 'tb.rulenode.connect-timeout-required' | translate }}
{{ 'rule-node-config.connect-timeout-required' | translate }}
</mat-error>
<mat-error *ngIf="mqttConfigForm.get('connectTimeoutSec').hasError('min')">
{{ 'tb.rulenode.connect-timeout-range' | translate }}
{{ 'rule-node-config.connect-timeout-range' | translate }}
</mat-error>
<mat-error *ngIf="mqttConfigForm.get('connectTimeoutSec').hasError('max')">
{{ 'tb.rulenode.connect-timeout-range' | translate }}
{{ 'rule-node-config.connect-timeout-range' | translate }}
</mat-error>
</mat-form-field>
</div>
<mat-form-field class="mat-block" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.client-id</mat-label>
<mat-label translate>rule-node-config.client-id</mat-label>
<input matInput formControlName="clientId">
<mat-hint>{{'tb.rulenode.client-id-hint' | translate}}</mat-hint>
<mat-hint>{{'rule-node-config.client-id-hint' | translate}}</mat-hint>
</mat-form-field>
<mat-checkbox formControlName="appendClientIdSuffix">
{{ 'tb.rulenode.append-client-id-suffix' | translate }}
{{ 'rule-node-config.append-client-id-suffix' | translate }}
</mat-checkbox>
<div class="tb-hint">{{ "tb.rulenode.client-id-suffix-hint" | translate }}</div>
<div class="tb-hint">{{ "rule-node-config.client-id-suffix-hint" | translate }}</div>
<mat-checkbox formControlName="parseToPlainText">
{{ 'tb.rulenode.parse-to-plain-text' | translate }}
{{ 'rule-node-config.parse-to-plain-text' | translate }}
</mat-checkbox>
<div class="tb-hint">{{ "tb.rulenode.parse-to-plain-text-hint" | translate }}</div>
<div class="tb-hint">{{ "rule-node-config.parse-to-plain-text-hint" | translate }}</div>
<mat-checkbox formControlName="cleanSession">
{{ 'tb.rulenode.clean-session' | translate }}
{{ 'rule-node-config.clean-session' | translate }}
</mat-checkbox>
<mat-checkbox formControlName="retainedMessage">
{{ "tb.rulenode.retained-message" | translate }}
{{ "rule-node-config.retained-message" | translate }}
</mat-checkbox>
<mat-checkbox formControlName="ssl">
{{ 'tb.rulenode.enable-ssl' | translate }}
{{ 'rule-node-config.enable-ssl' | translate }}
</mat-checkbox>
<tb-credentials-config formControlName="credentials" [passwordFieldRequired]="false"></tb-credentials-config>
</section>

View File

@ -17,17 +17,17 @@
-->
<section [formGroup]="pubSubConfigForm" class="flex flex-col">
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.gcp-project-id</mat-label>
<mat-label translate>rule-node-config.gcp-project-id</mat-label>
<input required matInput formControlName="projectId">
<mat-error *ngIf="pubSubConfigForm.get('projectId').hasError('required')">
{{ 'tb.rulenode.gcp-project-id-required' | translate }}
{{ 'rule-node-config.gcp-project-id-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.pubsub-topic-name</mat-label>
<mat-label translate>rule-node-config.pubsub-topic-name</mat-label>
<input required matInput formControlName="topicName">
<mat-error *ngIf="pubSubConfigForm.get('topicName').hasError('required')">
{{ 'tb.rulenode.pubsub-topic-name-required' | translate }}
{{ 'rule-node-config.pubsub-topic-name-required' | translate }}
</mat-error>
</mat-form-field>
<tb-file-input style="padding-bottom: 24px;"
@ -36,18 +36,18 @@
(fileNameChanged)="pubSubConfigForm.get('serviceAccountKeyFileName').setValue($event)"
required
requiredAsError
label="{{'tb.rulenode.gcp-service-account-key' | translate}}"
noFileText="tb.rulenode.no-file"
dropLabel="{{'tb.rulenode.drop-file' | translate}}">
label="{{'rule-node-config.gcp-service-account-key' | translate}}"
noFileText="rule-node-config.no-file"
dropLabel="{{'rule-node-config.drop-file' | translate}}">
</tb-file-input>
<label translate class="tb-title">tb.rulenode.message-attributes</label>
<div class="tb-hint" [innerHTML]="'tb.rulenode.message-attributes-hint' | translate | safe: 'html'"></div>
<label translate class="tb-title">rule-node-config.message-attributes</label>
<div class="tb-hint" [innerHTML]="'rule-node-config.message-attributes-hint' | translate | safe: 'html'"></div>
<tb-kv-map-config-old
required="false"
formControlName="messageAttributes"
keyText="tb.rulenode.name"
keyRequiredText="tb.rulenode.name-required"
valText="tb.rulenode.value"
valRequiredText="tb.rulenode.value-required">
keyText="rule-node-config.name"
keyRequiredText="rule-node-config.name-required"
valText="rule-node-config.value"
valRequiredText="rule-node-config.value-required">
</tb-kv-map-config-old>
</section>

View File

@ -17,15 +17,15 @@
-->
<section [formGroup]="rabbitMqConfigForm" class="flex flex-col">
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.exchange-name-pattern</mat-label>
<mat-label translate>rule-node-config.exchange-name-pattern</mat-label>
<input matInput formControlName="exchangeNamePattern">
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.routing-key-pattern</mat-label>
<mat-label translate>rule-node-config.routing-key-pattern</mat-label>
<input matInput formControlName="routingKeyPattern">
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.message-properties</mat-label>
<mat-label translate>rule-node-config.message-properties</mat-label>
<mat-select formControlName="messageProperties">
<mat-option *ngFor="let property of messageProperties" [value]="property">
{{ property }}
@ -34,63 +34,63 @@
</mat-form-field>
<div class="gt-sm:flex gt-sm:flex-row gt-sm:gap-2">
<mat-form-field class="mat-block gt-sm:max-w-60% gt-sm:flex-full">
<mat-label translate>tb.rulenode.host</mat-label>
<mat-label translate>rule-node-config.host</mat-label>
<input required matInput formControlName="host">
<mat-error *ngIf="rabbitMqConfigForm.get('host').hasError('required')">
{{ 'tb.rulenode.host-required' | translate }}
{{ 'rule-node-config.host-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block gt-sm:max-w-40% gt-sm:flex-full">
<mat-label translate>tb.rulenode.port</mat-label>
<mat-label translate>rule-node-config.port</mat-label>
<input required type="number" step="1" min="1" max="65535" matInput formControlName="port">
<mat-error *ngIf="rabbitMqConfigForm.get('port').hasError('required')">
{{ 'tb.rulenode.port-required' | translate }}
{{ 'rule-node-config.port-required' | translate }}
</mat-error>
<mat-error *ngIf="rabbitMqConfigForm.get('port').hasError('min')">
{{ 'tb.rulenode.port-range' | translate }}
{{ 'rule-node-config.port-range' | translate }}
</mat-error>
<mat-error *ngIf="rabbitMqConfigForm.get('port').hasError('max')">
{{ 'tb.rulenode.port-range' | translate }}
{{ 'rule-node-config.port-range' | translate }}
</mat-error>
</mat-form-field>
</div>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.virtual-host</mat-label>
<mat-label translate>rule-node-config.virtual-host</mat-label>
<input matInput formControlName="virtualHost">
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.username</mat-label>
<mat-label translate>rule-node-config.username</mat-label>
<input matInput formControlName="username">
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.password</mat-label>
<mat-label translate>rule-node-config.password</mat-label>
<input type="password" matInput formControlName="password">
<tb-toggle-password matSuffix></tb-toggle-password>
</mat-form-field>
<mat-checkbox formControlName="automaticRecoveryEnabled">
{{ 'tb.rulenode.automatic-recovery' | translate }}
{{ 'rule-node-config.automatic-recovery' | translate }}
</mat-checkbox>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.connection-timeout-ms</mat-label>
<mat-label translate>rule-node-config.connection-timeout-ms</mat-label>
<input type="number" step="1" min="0" matInput formControlName="connectionTimeout">
<mat-error *ngIf="rabbitMqConfigForm.get('connectionTimeout').hasError('min')">
{{ 'tb.rulenode.min-connection-timeout-ms-message' | translate }}
{{ 'rule-node-config.min-connection-timeout-ms-message' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.handshake-timeout-ms</mat-label>
<mat-label translate>rule-node-config.handshake-timeout-ms</mat-label>
<input type="number" step="1" min="0" matInput formControlName="handshakeTimeout">
<mat-error *ngIf="rabbitMqConfigForm.get('handshakeTimeout').hasError('min')">
{{ 'tb.rulenode.min-handshake-timeout-ms-message' | translate }}
{{ 'rule-node-config.min-handshake-timeout-ms-message' | translate }}
</mat-error>
</mat-form-field>
<label translate class="tb-title">tb.rulenode.client-properties</label>
<label translate class="tb-title">rule-node-config.client-properties</label>
<tb-kv-map-config-old
required="false"
formControlName="clientProperties"
keyText="tb.rulenode.key"
keyRequiredText="tb.rulenode.key-required"
valText="tb.rulenode.value"
valRequiredText="tb.rulenode.value-required">
keyText="rule-node-config.key"
keyRequiredText="rule-node-config.key-required"
valText="rule-node-config.value"
valRequiredText="rule-node-config.value-required">
</tb-kv-map-config-old>
</section>

View File

@ -17,15 +17,15 @@
-->
<section [formGroup]="restApiCallConfigForm" class="flex flex-col">
<mat-form-field class="mat-block" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.endpoint-url-pattern</mat-label>
<mat-label translate>rule-node-config.endpoint-url-pattern</mat-label>
<input required matInput formControlName="restEndpointUrlPattern">
<mat-error *ngIf="restApiCallConfigForm.get('restEndpointUrlPattern').hasError('required')">
{{ 'tb.rulenode.endpoint-url-pattern-required' | translate }}
{{ 'rule-node-config.endpoint-url-pattern-required' | translate }}
</mat-error>
<mat-hint translate>tb.rulenode.general-pattern-hint</mat-hint>
<mat-hint translate>rule-node-config.general-pattern-hint</mat-hint>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.request-method</mat-label>
<mat-label translate>rule-node-config.request-method</mat-label>
<mat-select formControlName="requestMethod">
<mat-option *ngFor="let requestType of httpRequestTypes" [value]="requestType">
{{ requestType }}
@ -33,26 +33,26 @@
</mat-select>
</mat-form-field>
<mat-checkbox formControlName="enableProxy">
{{ 'tb.rulenode.enable-proxy' | translate }}
{{ 'rule-node-config.enable-proxy' | translate }}
</mat-checkbox>
<mat-checkbox *ngIf="!restApiCallConfigForm.get('enableProxy').value" formControlName="useSimpleClientHttpFactory">
{{ 'tb.rulenode.use-simple-client-http-factory' | translate }}
{{ 'rule-node-config.use-simple-client-http-factory' | translate }}
</mat-checkbox>
<mat-checkbox formControlName="parseToPlainText">
{{ 'tb.rulenode.parse-to-plain-text' | translate }}
{{ 'rule-node-config.parse-to-plain-text' | translate }}
</mat-checkbox>
<div class="tb-hint" style="padding-bottom: 5px;" translate>tb.rulenode.parse-to-plain-text-hint</div>
<div class="tb-hint" style="padding-bottom: 5px;" translate>rule-node-config.parse-to-plain-text-hint</div>
<mat-checkbox formControlName="ignoreRequestBody">
{{ 'tb.rulenode.ignore-request-body' | translate }}
{{ 'rule-node-config.ignore-request-body' | translate }}
</mat-checkbox>
<div *ngIf="restApiCallConfigForm.get('enableProxy').value">
<mat-checkbox formControlName="useSystemProxyProperties">
{{ 'tb.rulenode.use-system-proxy-properties' | translate }}
{{ 'rule-node-config.use-system-proxy-properties' | translate }}
</mat-checkbox>
<div *ngIf="!restApiCallConfigForm.get('useSystemProxyProperties').value">
<div class="gt-sm:flex gt-sm:flex-row gt-sm:gap-2">
<mat-form-field class="mat-block gt-sm:max-w-10% gt-sm:flex-full">
<mat-label translate>tb.rulenode.proxy-scheme</mat-label>
<mat-label translate>rule-node-config.proxy-scheme</mat-label>
<mat-select formControlName="proxyScheme">
<mat-option *ngFor="let proxyScheme of proxySchemes" [value]="proxyScheme">
{{ proxyScheme }}
@ -60,71 +60,71 @@
</mat-select>
</mat-form-field>
<mat-form-field class="md-block gt-sm:max-w-50% gt-sm:flex-full">
<mat-label translate>tb.rulenode.proxy-host</mat-label>
<mat-label translate>rule-node-config.proxy-host</mat-label>
<input matInput required formControlName="proxyHost">
<mat-error *ngIf="restApiCallConfigForm.get('proxyHost').hasError('required')">
{{ 'tb.rulenode.proxy-host-required' | translate }}
{{ 'rule-node-config.proxy-host-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block gt-sm:max-w-40% gt-sm:flex-full">
<mat-label translate>tb.rulenode.proxy-port</mat-label>
<mat-label translate>rule-node-config.proxy-port</mat-label>
<input matInput required formControlName="proxyPort" type="number" step="1">
<mat-error *ngIf="restApiCallConfigForm.get('proxyPort').hasError('required')">
{{ 'tb.rulenode.proxy-port-required' | translate }}
{{ 'rule-node-config.proxy-port-required' | translate }}
</mat-error>
<mat-error
*ngIf="restApiCallConfigForm.get('proxyPort').hasError('min') || restApiCallConfigForm.get('proxyPort').hasError('max')">
{{ 'tb.rulenode.proxy-port-range' | translate }}
{{ 'rule-node-config.proxy-port-range' | translate }}
</mat-error>
</mat-form-field>
</div>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.proxy-user</mat-label>
<mat-label translate>rule-node-config.proxy-user</mat-label>
<input matInput formControlName="proxyUser">
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.proxy-password</mat-label>
<mat-label translate>rule-node-config.proxy-password</mat-label>
<input matInput formControlName="proxyPassword">
</mat-form-field>
</div>
</div>
<mat-form-field *ngIf="!restApiCallConfigForm.get('useSimpleClientHttpFactory').value || restApiCallConfigForm.get('enableProxy').value" class="mat-block"
subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.read-timeout</mat-label>
<mat-label translate>rule-node-config.read-timeout</mat-label>
<input type="text" min="0" [max]="IntLimit" inputmode="numeric" pattern="[0-9]*" matInput formControlName="readTimeoutMs">
<mat-hint translate>tb.rulenode.read-timeout-hint</mat-hint>
<mat-hint translate>rule-node-config.read-timeout-hint</mat-hint>
<mat-error
*ngIf="restApiCallConfigForm.get('readTimeoutMs').hasError('max')">
{{ 'tb.rulenode.int-range' | translate }}
{{ 'rule-node-config.int-range' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.max-parallel-requests-count</mat-label>
<mat-label translate>rule-node-config.max-parallel-requests-count</mat-label>
<input type="text" min="0" [max]="IntLimit" inputmode="numeric" pattern="[0-9]*" matInput formControlName="maxParallelRequestsCount">
<mat-hint translate>tb.rulenode.max-parallel-requests-count-hint</mat-hint>
<mat-hint translate>rule-node-config.max-parallel-requests-count-hint</mat-hint>
<mat-error
*ngIf="restApiCallConfigForm.get('maxParallelRequestsCount').hasError('max')">
{{ 'tb.rulenode.int-range' | translate }}
{{ 'rule-node-config.int-range' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.max-response-size</mat-label>
<mat-label translate>rule-node-config.max-response-size</mat-label>
<input type="text" min="1" [max]="MemoryBufferSizeInKbLimit" inputmode="numeric" pattern="[0-9]*" matInput formControlName="maxInMemoryBufferSizeInKb">
<mat-hint translate>tb.rulenode.max-response-size-hint</mat-hint>
<mat-hint translate>rule-node-config.max-response-size-hint</mat-hint>
<mat-error
*ngIf="restApiCallConfigForm.get('maxInMemoryBufferSizeInKb').hasError('min') || restApiCallConfigForm.get('maxInMemoryBufferSizeInKb').hasError('max')">
{{ 'tb.rulenode.memory-buffer-size-range' | translate: { max: MemoryBufferSizeInKbLimit } }}
{{ 'rule-node-config.memory-buffer-size-range' | translate: { max: MemoryBufferSizeInKbLimit } }}
</mat-error>
</mat-form-field>
<label translate class="tb-title">tb.rulenode.headers</label>
<div class="tb-hint" [innerHTML]="'tb.rulenode.headers-hint' | translate | safe: 'html'"> </div>
<label translate class="tb-title">rule-node-config.headers</label>
<div class="tb-hint" [innerHTML]="'rule-node-config.headers-hint' | translate | safe: 'html'"> </div>
<tb-kv-map-config-old
required="false"
formControlName="headers"
keyText="tb.rulenode.header"
keyRequiredText="tb.rulenode.header-required"
valText="tb.rulenode.value"
valRequiredText="tb.rulenode.value-required">
keyText="rule-node-config.header"
keyRequiredText="rule-node-config.header-required"
valText="rule-node-config.value"
valRequiredText="rule-node-config.value-required">
</tb-kv-map-config-old>
<tb-credentials-config formControlName="credentials" [disableCertPemCredentials]="restApiCallConfigForm.get('useSimpleClientHttpFactory').value"></tb-credentials-config>
</section>

View File

@ -17,11 +17,11 @@
-->
<section [formGroup]="sendEmailConfigForm" class="flex flex-col">
<mat-checkbox formControlName="useSystemSmtpSettings">
{{ 'tb.rulenode.use-system-smtp-settings' | translate }}
{{ 'rule-node-config.use-system-smtp-settings' | translate }}
</mat-checkbox>
<section class="flex flex-col" *ngIf="sendEmailConfigForm.get('useSystemSmtpSettings').value === false">
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.smtp-protocol</mat-label>
<mat-label translate>rule-node-config.smtp-protocol</mat-label>
<mat-select formControlName="smtpProtocol">
<mat-option *ngFor="let smtpProtocol of smtpProtocols" [value]="smtpProtocol">
{{ smtpProtocol.toUpperCase() }}
@ -30,41 +30,41 @@
</mat-form-field>
<div class="gt-sm:flex gt-sm:flex-row gt-sm:gap-2">
<mat-form-field class="mat-block gt-sm:max-w-60% gt-sm:flex-full">
<mat-label translate>tb.rulenode.smtp-host</mat-label>
<mat-label translate>rule-node-config.smtp-host</mat-label>
<input required matInput formControlName="smtpHost">
<mat-error *ngIf="sendEmailConfigForm.get('smtpHost').hasError('required')">
{{ 'tb.rulenode.smtp-host-required' | translate }}
{{ 'rule-node-config.smtp-host-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block gt-sm:max-w-40% gt-sm:flex-full">
<mat-label translate>tb.rulenode.smtp-port</mat-label>
<mat-label translate>rule-node-config.smtp-port</mat-label>
<input required type="number" step="1" min="1" max="65535" matInput formControlName="smtpPort">
<mat-error *ngIf="sendEmailConfigForm.get('smtpPort').hasError('required')">
{{ 'tb.rulenode.smtp-port-required' | translate }}
{{ 'rule-node-config.smtp-port-required' | translate }}
</mat-error>
<mat-error *ngIf="sendEmailConfigForm.get('smtpPort').hasError('min')">
{{ 'tb.rulenode.smtp-port-range' | translate }}
{{ 'rule-node-config.smtp-port-range' | translate }}
</mat-error>
<mat-error *ngIf="sendEmailConfigForm.get('smtpPort').hasError('max')">
{{ 'tb.rulenode.smtp-port-range' | translate }}
{{ 'rule-node-config.smtp-port-range' | translate }}
</mat-error>
</mat-form-field>
</div>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.timeout-msec</mat-label>
<mat-label translate>rule-node-config.timeout-msec</mat-label>
<input required type="number" step="1" min="0" matInput formControlName="timeout">
<mat-error *ngIf="sendEmailConfigForm.get('timeout').hasError('required')">
{{ 'tb.rulenode.timeout-required' | translate }}
{{ 'rule-node-config.timeout-required' | translate }}
</mat-error>
<mat-error *ngIf="sendEmailConfigForm.get('timeout').hasError('min')">
{{ 'tb.rulenode.min-timeout-msec-message' | translate }}
{{ 'rule-node-config.min-timeout-msec-message' | translate }}
</mat-error>
</mat-form-field>
<mat-checkbox formControlName="enableTls">
{{ 'tb.rulenode.enable-tls' | translate }}
{{ 'rule-node-config.enable-tls' | translate }}
</mat-checkbox>
<mat-form-field class="mat-block" *ngIf="sendEmailConfigForm.get('enableTls').value === true">
<mat-label translate>tb.rulenode.tls-version</mat-label>
<mat-label translate>rule-node-config.tls-version</mat-label>
<mat-select formControlName="tlsVersion">
<mat-option *ngFor="let tlsVersion of tlsVersions" [value]="tlsVersion">
{{ tlsVersion }}
@ -72,44 +72,44 @@
</mat-select>
</mat-form-field>
<tb-checkbox formControlName="enableProxy">
{{ 'tb.rulenode.enable-proxy' | translate }}
{{ 'rule-node-config.enable-proxy' | translate }}
</tb-checkbox>
<div *ngIf="sendEmailConfigForm.get('enableProxy').value">
<div class="gt-sm:flex gt-sm:flex-row gt-sm:gap-2">
<mat-form-field class="mat-block gt-sm:max-w-60% gt-sm:flex-full">
<mat-label translate>tb.rulenode.proxy-host</mat-label>
<mat-label translate>rule-node-config.proxy-host</mat-label>
<input matInput required formControlName="proxyHost">
<mat-error *ngIf="sendEmailConfigForm.get('proxyHost').hasError('required')">
{{ 'tb.rulenode.proxy-host-required' | translate }}
{{ 'rule-node-config.proxy-host-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block gt-sm:max-w-40% gt-sm:flex-full">
<mat-label translate>tb.rulenode.proxy-port</mat-label>
<mat-label translate>rule-node-config.proxy-port</mat-label>
<input matInput required formControlName="proxyPort" type="number" step="1" min="1" max="65535">
<mat-error *ngIf="sendEmailConfigForm.get('proxyPort').hasError('required')">
{{ 'tb.rulenode.proxy-port-required' | translate }}
{{ 'rule-node-config.proxy-port-required' | translate }}
</mat-error>
<mat-error *ngIf="sendEmailConfigForm.get('proxyPort').hasError('min') || sendEmailConfigForm.get('proxyPort').hasError('max')">
{{ 'tb.rulenode.proxy-port-range' | translate }}
{{ 'rule-node-config.proxy-port-range' | translate }}
</mat-error>
</mat-form-field>
</div>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.proxy-user</mat-label>
<mat-label translate>rule-node-config.proxy-user</mat-label>
<input matInput formControlName="proxyUser">
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.proxy-password</mat-label>
<mat-label translate>rule-node-config.proxy-password</mat-label>
<input matInput formControlName="proxyPassword">
</mat-form-field>
</div>
<mat-form-field class="mat-block" floatLabel="always">
<mat-label translate>tb.rulenode.username</mat-label>
<input matInput placeholder="{{ 'tb.rulenode.enter-username' | translate }}" formControlName="username">
<mat-label translate>rule-node-config.username</mat-label>
<input matInput placeholder="{{ 'rule-node-config.enter-username' | translate }}" formControlName="username">
</mat-form-field>
<mat-form-field class="mat-block" floatLabel="always">
<mat-label translate>tb.rulenode.password</mat-label>
<input matInput type="password" placeholder="{{ 'tb.rulenode.enter-password' | translate }}" formControlName="password">
<mat-label translate>rule-node-config.password</mat-label>
<input matInput type="password" placeholder="{{ 'rule-node-config.enter-password' | translate }}" formControlName="password">
<tb-toggle-password matSuffix></tb-toggle-password>
</mat-form-field>
</section>

View File

@ -17,23 +17,23 @@
-->
<section [formGroup]="sendSmsConfigForm" class="flex flex-col">
<mat-form-field class="mat-block" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.numbers-to-template</mat-label>
<mat-label translate>rule-node-config.numbers-to-template</mat-label>
<input required matInput formControlName="numbersToTemplate">
<mat-error *ngIf="sendSmsConfigForm.get('numbersToTemplate').hasError('required')">
{{ 'tb.rulenode.numbers-to-template-required' | translate }}
{{ 'rule-node-config.numbers-to-template-required' | translate }}
</mat-error>
<mat-hint [innerHTML]="'tb.rulenode.numbers-to-template-hint' | translate | safe: 'html'"></mat-hint>
<mat-hint [innerHTML]="'rule-node-config.numbers-to-template-hint' | translate | safe: 'html'"></mat-hint>
</mat-form-field>
<mat-form-field class="mat-block" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.sms-message-template</mat-label>
<mat-label translate>rule-node-config.sms-message-template</mat-label>
<textarea required matInput formControlName="smsMessageTemplate" rows="6"></textarea>
<mat-error *ngIf="sendSmsConfigForm.get('smsMessageTemplate').hasError('required')">
{{ 'tb.rulenode.sms-message-template-required' | translate }}
{{ 'rule-node-config.sms-message-template-required' | translate }}
</mat-error>
<mat-hint translate>tb.rulenode.general-pattern-hint</mat-hint>
<mat-hint translate>rule-node-config.general-pattern-hint</mat-hint>
</mat-form-field>
<mat-checkbox formControlName="useSystemSmsSettings">
{{ 'tb.rulenode.use-system-sms-settings' | translate }}
{{ 'rule-node-config.use-system-sms-settings' | translate }}
</mat-checkbox>
<tb-sms-provider-configuration
*ngIf="sendSmsConfigForm.get('useSystemSmsSettings').value === false"

View File

@ -17,21 +17,21 @@
-->
<section [formGroup]="slackConfigForm" class="flex flex-col">
<mat-form-field class="mat-block flex-1">
<mat-label translate>tb.rulenode.message-template</mat-label>
<mat-label translate>rule-node-config.message-template</mat-label>
<input required matInput formControlName="messageTemplate">
<mat-error *ngIf="slackConfigForm.get('messageTemplate').hasError('required')">
{{ 'tb.rulenode.message-template-required' | translate }}
{{ 'rule-node-config.message-template-required' | translate }}
</mat-error>
<mat-hint translate>tb.rulenode.general-pattern-hint</mat-hint>
<mat-hint translate>rule-node-config.general-pattern-hint</mat-hint>
</mat-form-field>
<mat-checkbox formControlName="useSystemSettings">
{{ 'tb.rulenode.use-system-slack-settings' | translate }}
{{ 'rule-node-config.use-system-slack-settings' | translate }}
</mat-checkbox>
<mat-form-field *ngIf="!slackConfigForm.get('useSystemSettings').value" class="mat-block">
<mat-label translate>tb.rulenode.slack-api-token</mat-label>
<mat-label translate>rule-node-config.slack-api-token</mat-label>
<input required matInput formControlName="botToken">
<mat-error *ngIf="slackConfigForm.get('botToken').hasError('required')">
{{ 'tb.rulenode.slack-api-token-required' | translate }}
{{ 'rule-node-config.slack-api-token-required' | translate }}
</mat-error>
</mat-form-field>
<label class="tb-title">{{ 'notification.slack-chanel-type' | translate }}</label>

View File

@ -17,32 +17,32 @@
-->
<section [formGroup]="snsConfigForm" class="flex flex-col">
<mat-form-field class="mat-block" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.topic-arn-pattern</mat-label>
<mat-label translate>rule-node-config.topic-arn-pattern</mat-label>
<input required matInput formControlName="topicArnPattern">
<mat-error *ngIf="snsConfigForm.get('topicArnPattern').hasError('required')">
{{ 'tb.rulenode.topic-arn-pattern-required' | translate }}
{{ 'rule-node-config.topic-arn-pattern-required' | translate }}
</mat-error>
<mat-hint translate>tb.rulenode.general-pattern-hint</mat-hint>
<mat-hint translate>rule-node-config.general-pattern-hint</mat-hint>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.aws-access-key-id</mat-label>
<mat-label translate>rule-node-config.aws-access-key-id</mat-label>
<input required matInput formControlName="accessKeyId">
<mat-error *ngIf="snsConfigForm.get('accessKeyId').hasError('required')">
{{ 'tb.rulenode.aws-access-key-id-required' | translate }}
{{ 'rule-node-config.aws-access-key-id-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.aws-secret-access-key</mat-label>
<mat-label translate>rule-node-config.aws-secret-access-key</mat-label>
<input required matInput formControlName="secretAccessKey">
<mat-error *ngIf="snsConfigForm.get('secretAccessKey').hasError('required')">
{{ 'tb.rulenode.aws-secret-access-key-required' | translate }}
{{ 'rule-node-config.aws-secret-access-key-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.aws-region</mat-label>
<mat-label translate>rule-node-config.aws-region</mat-label>
<input required matInput formControlName="region">
<mat-error *ngIf="snsConfigForm.get('region').hasError('required')">
{{ 'tb.rulenode.aws-region-required' | translate }}
{{ 'rule-node-config.aws-region-required' | translate }}
</mat-error>
</mat-form-field>
</section>

View File

@ -17,7 +17,7 @@
-->
<section [formGroup]="sqsConfigForm" class="flex flex-col">
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.queue-type</mat-label>
<mat-label translate>rule-node-config.queue-type</mat-label>
<mat-select formControlName="queueType" required>
<mat-option *ngFor="let type of sqsQueueTypes" [value]="type">
{{ sqsQueueTypeTranslationsMap.get(type) | translate }}
@ -25,52 +25,52 @@
</mat-select>
</mat-form-field>
<mat-form-field class="mat-block" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.queue-url-pattern</mat-label>
<mat-label translate>rule-node-config.queue-url-pattern</mat-label>
<input required matInput formControlName="queueUrlPattern">
<mat-error *ngIf="sqsConfigForm.get('queueUrlPattern').hasError('required')">
{{ 'tb.rulenode.queue-url-pattern-required' | translate }}
{{ 'rule-node-config.queue-url-pattern-required' | translate }}
</mat-error>
<mat-hint translate>tb.rulenode.general-pattern-hint</mat-hint>
<mat-hint translate>rule-node-config.general-pattern-hint</mat-hint>
</mat-form-field>
<mat-form-field *ngIf="sqsConfigForm.get('queueType').value === sqsQueueType.STANDARD" class="mat-block">
<mat-label translate>tb.rulenode.delay-seconds</mat-label>
<mat-label translate>rule-node-config.delay-seconds</mat-label>
<input required type="number" min="0" max="900" step="1" matInput formControlName="delaySeconds">
<mat-error *ngIf="sqsConfigForm.get('delaySeconds').hasError('min')">
{{ 'tb.rulenode.min-delay-seconds-message' | translate }}
{{ 'rule-node-config.min-delay-seconds-message' | translate }}
</mat-error>
<mat-error *ngIf="sqsConfigForm.get('delaySeconds').hasError('max')">
{{ 'tb.rulenode.max-delay-seconds-message' | translate }}
{{ 'rule-node-config.max-delay-seconds-message' | translate }}
</mat-error>
</mat-form-field>
<label translate class="tb-title">tb.rulenode.message-attributes</label>
<div class="tb-hint" [innerHTML]="'tb.rulenode.message-attributes-hint' | translate | safe: 'html'"></div>
<label translate class="tb-title">rule-node-config.message-attributes</label>
<div class="tb-hint" [innerHTML]="'rule-node-config.message-attributes-hint' | translate | safe: 'html'"></div>
<tb-kv-map-config-old
required="false"
formControlName="messageAttributes"
keyText="tb.rulenode.name"
keyRequiredText="tb.rulenode.name-required"
valText="tb.rulenode.value"
valRequiredText="tb.rulenode.value-required">
keyText="rule-node-config.name"
keyRequiredText="rule-node-config.name-required"
valText="rule-node-config.value"
valRequiredText="rule-node-config.value-required">
</tb-kv-map-config-old>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.aws-access-key-id</mat-label>
<mat-label translate>rule-node-config.aws-access-key-id</mat-label>
<input required matInput formControlName="accessKeyId">
<mat-error *ngIf="sqsConfigForm.get('accessKeyId').hasError('required')">
{{ 'tb.rulenode.aws-access-key-id-required' | translate }}
{{ 'rule-node-config.aws-access-key-id-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.aws-secret-access-key</mat-label>
<mat-label translate>rule-node-config.aws-secret-access-key</mat-label>
<input required matInput formControlName="secretAccessKey">
<mat-error *ngIf="sqsConfigForm.get('secretAccessKey').hasError('required')">
{{ 'tb.rulenode.aws-secret-access-key-required' | translate }}
{{ 'rule-node-config.aws-secret-access-key-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.aws-region</mat-label>
<mat-label translate>rule-node-config.aws-region</mat-label>
<input required matInput formControlName="region">
<mat-error *ngIf="sqsConfigForm.get('region').hasError('required')">
{{ 'tb.rulenode.aws-region-required' | translate }}
{{ 'rule-node-config.aws-region-required' | translate }}
</mat-error>
</mat-form-field>
</section>

View File

@ -17,9 +17,9 @@
-->
<section [formGroup]="alarmStatusConfigForm" class="tb-form-panel stroked">
<div class="tb-form-row no-padding no-border space-between">
<div class="tb-form-panel-title tb-required" translate>tb.rulenode.alarm-status</div>
<div class="tb-form-panel-title tb-required" translate>rule-node-config.alarm-status</div>
<div class="tb-form-panel-hint tb-error" translate [hidden]="alarmStatusConfigForm.get('alarmStatusList').valid">
tb.rulenode.alarm-required
rule-node-config.alarm-required
</div>
</div>
<tb-alarm-status-select formControlName="alarmStatusList"></tb-alarm-status-select>

View File

@ -17,29 +17,29 @@
-->
<section [formGroup]="checkMessageConfigForm" class="tb-form-panel stroked">
<div class="tb-form-row no-padding no-border space-between">
<div class="tb-form-panel-title tb-required" translate>tb.rulenode.fields-to-check</div>
<div class="tb-form-panel-title tb-required" translate>rule-node-config.fields-to-check</div>
<div class="tb-form-panel-hint tb-error" translate [hidden]="!(touchedValidationControl && checkMessageConfigForm.hasError('atLeastOne'))">
tb.rulenode.at-least-one-field-required
rule-node-config.at-least-one-field-required
</div>
</div>
<tb-string-items-list editable subscriptSizing="dynamic"
[label]="'tb.rulenode.data-keys' | translate"
[placeholder]="'tb.rulenode.add-message-field' | translate"
[label]="'rule-node-config.data-keys' | translate"
[placeholder]="'rule-node-config.add-message-field' | translate"
formControlName="messageNames">
<mat-icon matSuffix color="primary" class="help-icon margin-8 cursor-pointer" aria-hidden="false" aria-label="help-icon"
matTooltip="{{ 'tb.rulenode.chip-help' | translate: { inputName: 'tb.rulenode.field-name' | translate } }}">help</mat-icon>
matTooltip="{{ 'rule-node-config.chip-help' | translate: { inputName: 'rule-node-config.field-name' | translate } }}">help</mat-icon>
</tb-string-items-list>
<tb-string-items-list editable subscriptSizing="dynamic"
[label]="'tb.rulenode.metadata-keys' | translate"
[placeholder]="'tb.rulenode.add-metadata-field' | translate"
[label]="'rule-node-config.metadata-keys' | translate"
[placeholder]="'rule-node-config.add-metadata-field' | translate"
formControlName="metadataNames">
<mat-icon matSuffix color="primary" class="help-icon margin-8 cursor-pointer" aria-hidden="false" aria-label="help-icon"
matTooltip="{{ 'tb.rulenode.chip-help' | translate: { inputName: 'tb.rulenode.field-name' | translate } }}">help</mat-icon>
matTooltip="{{ 'rule-node-config.chip-help' | translate: { inputName: 'rule-node-config.field-name' | translate } }}">help</mat-icon>
</tb-string-items-list>
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.check-all-keys-tooltip' | translate }}"
<div tb-hint-tooltip-icon="{{ 'rule-node-config.check-all-keys-tooltip' | translate }}"
class="tb-form-row no-border no-padding">
<mat-slide-toggle class="mat-slide" formControlName="checkAllKeys">
{{ 'tb.rulenode.check-all-keys' | translate }}
{{ 'rule-node-config.check-all-keys' | translate }}
</mat-slide-toggle>
</div>
</section>

View File

@ -16,13 +16,13 @@
-->
<section [formGroup]="checkRelationConfigForm" class="tb-form-panel stroked no-padding-bottom">
<div class="tb-form-panel-title" translate>tb.rulenode.relation-search-parameters</div>
<div class="tb-form-panel-title" translate>rule-node-config.relation-search-parameters</div>
<div class="flex flex-col">
<mat-form-field class="mat-block" hideRequiredMarker>
<mat-label>{{ 'relation.direction' | translate }}</mat-label>
<mat-select formControlName="direction" required>
<mat-option *ngFor="let direction of entitySearchDirection" [value]="direction">
{{ entitySearchDirectionTranslationsMap.get(direction) | translate }} <span translate>tb.rulenode.relations-query-config-direction-suffix</span>
{{ entitySearchDirectionTranslationsMap.get(direction) | translate }} <span translate>rule-node-config.relations-query-config-direction-suffix</span>
</mat-option>
</mat-select>
</mat-form-field>
@ -30,10 +30,10 @@
required
formControlName="relationType">
</tb-relation-type-autocomplete>
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.check-relation-to-specific-entity-tooltip' | translate }}"
<div tb-hint-tooltip-icon="{{ 'rule-node-config.check-relation-to-specific-entity-tooltip' | translate }}"
class="tb-form-row no-border no-padding slide-toggle">
<mat-slide-toggle class="mat-slide" formControlName="checkForSingleEntity">
{{ 'tb.rulenode.check-relation-to-specific-entity' | translate }}
{{ 'rule-node-config.check-relation-to-specific-entity' | translate }}
</mat-slide-toggle>
</div>
<div *ngIf="checkRelationConfigForm.get('checkForSingleEntity').value" class="same-width-component-row">

View File

@ -17,32 +17,32 @@
-->
<section [formGroup]="geoFilterConfigForm" class="tb-form-panel no-border no-padding">
<section class="tb-form-panel stroked">
<div class="tb-form-panel-title" translate>tb.rulenode.coordinate-field-names</div>
<div class="tb-form-panel-title" translate>rule-node-config.coordinate-field-names</div>
<section>
<div class="flex flex-row gap-4">
<mat-form-field class="mat-block max-w-50% flex-full">
<mat-label>{{ 'tb.rulenode.latitude-field-name' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.latitude-field-name' | translate }}</mat-label>
<input matInput formControlName="latitudeKeyName" required>
<mat-error *ngIf="geoFilterConfigForm.get('latitudeKeyName').hasError('required')">
{{ 'tb.rulenode.latitude-field-name-required' | translate }}
{{ 'rule-node-config.latitude-field-name-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block max-w-50% flex-full">
<mat-label>{{ 'tb.rulenode.longitude-field-name' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.longitude-field-name' | translate }}</mat-label>
<input matInput formControlName="longitudeKeyName" required>
<mat-error *ngIf="geoFilterConfigForm.get('longitudeKeyName').hasError('required')">
{{ 'tb.rulenode.longitude-field-name-required' | translate }}
{{ 'rule-node-config.longitude-field-name-required' | translate }}
</mat-error>
</mat-form-field>
</div>
<div class="tb-form-hint tb-primary-fill" translate>tb.rulenode.coordinate-field-hint</div>
<div class="tb-form-hint tb-primary-fill" translate>rule-node-config.coordinate-field-hint</div>
</section>
</section>
<section class="tb-form-panel stroked" [class.no-padding-bottom]="!defaultPaddingEnable">
<div class="tb-form-panel-title" translate>tb.rulenode.geofence-configuration</div>
<div class="tb-form-panel-title" translate>rule-node-config.geofence-configuration</div>
<section class="flex flex-col">
<mat-form-field class="mat-block flex-1" hideRequiredMarker>
<mat-label>{{ 'tb.rulenode.perimeter-type' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.perimeter-type' | translate }}</mat-label>
<mat-select formControlName="perimeterType">
<mat-option *ngFor="let type of perimeterTypes" [value]="type">
{{ perimeterTypeTranslationMap.get(type) | translate }}
@ -50,63 +50,63 @@
</mat-select>
</mat-form-field>
<div tb-hint-tooltip-icon="{{ geoFilterConfigForm.get('perimeterType').value === perimeterType.CIRCLE
? ('tb.rulenode.fetch-circle-parameter-info-from-metadata-hint'
? ('rule-node-config.fetch-circle-parameter-info-from-metadata-hint'
| translate : { perimeterKeyName: geoFilterConfigForm.get('perimeterKeyName').valid
? geoFilterConfigForm.get('perimeterKeyName').value
: 'ss_perimeter'})
: ('tb.rulenode.fetch-poligon-parameter-info-from-metadata-hint'
: ('rule-node-config.fetch-poligon-parameter-info-from-metadata-hint'
| translate : { perimeterKeyName: geoFilterConfigForm.get('perimeterKeyName').valid
? geoFilterConfigForm.get('perimeterKeyName').value
: 'ss_perimeter'}) }}"
class="tb-form-row no-border no-padding slide-toggle">
<mat-slide-toggle class="mat-slide" formControlName="fetchPerimeterInfoFromMessageMetadata">
{{ 'tb.rulenode.fetch-perimeter-info-from-metadata' | translate }}
{{ 'rule-node-config.fetch-perimeter-info-from-metadata' | translate }}
</mat-slide-toggle>
</div>
<mat-form-field *ngIf="geoFilterConfigForm.get('fetchPerimeterInfoFromMessageMetadata').value" class="mat-block">
<mat-label>{{ 'tb.rulenode.perimeter-key-name' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.perimeter-key-name' | translate }}</mat-label>
<input matInput formControlName="perimeterKeyName" required>
<mat-error *ngIf="geoFilterConfigForm.get('perimeterKeyName').hasError('required')">
{{ 'tb.rulenode.perimeter-key-name-required' | translate }}
{{ 'rule-node-config.perimeter-key-name-required' | translate }}
</mat-error>
<mat-hint>{{ 'tb.rulenode.perimeter-key-name-hint' | translate }}</mat-hint>
<mat-hint>{{ 'rule-node-config.perimeter-key-name-hint' | translate }}</mat-hint>
</mat-form-field>
<div class="flex flex-col"
*ngIf="geoFilterConfigForm.get('perimeterType').value === perimeterType.CIRCLE &&
!geoFilterConfigForm.get('fetchPerimeterInfoFromMessageMetadata').value">
<div class="flex flex-row gap-4">
<mat-form-field class="flex-1">
<mat-label>{{ 'tb.rulenode.circle-center-latitude' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.circle-center-latitude' | translate }}</mat-label>
<input type="number" min="-90" max="90" step="0.1" matInput formControlName="centerLatitude" required>
<mat-error *ngIf="geoFilterConfigForm.get('centerLatitude').hasError('required')">
{{ 'tb.rulenode.circle-center-latitude-required' | translate }}
{{ 'rule-node-config.circle-center-latitude-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="flex-1">
<mat-label>{{ 'tb.rulenode.circle-center-longitude' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.circle-center-longitude' | translate }}</mat-label>
<input type="number" min="-180" max="180" step="0.1" matInput formControlName="centerLongitude" required>
<mat-error *ngIf="geoFilterConfigForm.get('centerLongitude').hasError('required')">
{{ 'tb.rulenode.circle-center-longitude-required' | translate }}
{{ 'rule-node-config.circle-center-longitude-required' | translate }}
</mat-error>
</mat-form-field>
</div>
<div class="flex flex-row gap-4">
<mat-form-field class="flex-1">
<mat-label>{{ 'tb.rulenode.range' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.range' | translate }}</mat-label>
<input type="number" min="0" step="0.1" matInput formControlName="range" required>
<mat-error *ngIf="geoFilterConfigForm.get('range').hasError('required')">
{{ 'tb.rulenode.range-required' | translate }}
{{ 'rule-node-config.range-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="flex-1">
<mat-label>{{ 'tb.rulenode.range-units' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.range-units' | translate }}</mat-label>
<mat-select formControlName="rangeUnit" required>
<mat-option *ngFor="let type of rangeUnits" [value]="type">
{{ rangeUnitTranslationMap.get(type) | translate }}
</mat-option>
</mat-select>
<mat-error *ngIf="geoFilterConfigForm.get('rangeUnit').hasError('required')">
{{ 'tb.rulenode.range-units-required' | translate }}
{{ 'rule-node-config.range-units-required' | translate }}
</mat-error>
</mat-form-field>
</div>
@ -114,11 +114,11 @@
<mat-form-field class="mat-block" subscriptSizing="dynamic"
*ngIf="geoFilterConfigForm.get('perimeterType').value === perimeterType.POLYGON &&
!geoFilterConfigForm.get('fetchPerimeterInfoFromMessageMetadata').value">
<mat-label>{{ 'tb.rulenode.polygon-definition' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.polygon-definition' | translate }}</mat-label>
<input matInput formControlName="polygonsDefinition" required>
<mat-hint>{{ 'tb.rulenode.polygon-definition-hint' | translate }}</mat-hint>
<mat-hint>{{ 'rule-node-config.polygon-definition-hint' | translate }}</mat-hint>
<mat-error *ngIf="geoFilterConfigForm.get('polygonsDefinition').hasError('required')">
{{ 'tb.rulenode.polygon-definition-required' | translate }}
{{ 'rule-node-config.polygon-definition-required' | translate }}
</mat-error>
</mat-form-field>
</section>

View File

@ -18,7 +18,7 @@
<section [formGroup]="messageTypeConfigForm">
<tb-message-types-config
required
[label]="'tb.rulenode.select-message-types' | translate"
[label]="'rule-node-config.select-message-types' | translate"
formControlName="messageTypes">
</tb-message-types-config>
</section>

View File

@ -20,12 +20,12 @@
formControlName="originatorTypes"
[allowedEntityTypes]="allowedEntityTypes"
[ignoreAuthorityFilter]="true"
[emptyInputPlaceholder]="'tb.rulenode.add-entity-type' | translate"
[filledInputPlaceholder]="'tb.rulenode.add-entity-type' | translate"
[label]="'tb.rulenode.select-entity-types' | translate"
[emptyInputPlaceholder]="'rule-node-config.add-entity-type' | translate"
[filledInputPlaceholder]="'rule-node-config.add-entity-type' | translate"
[label]="'rule-node-config.select-entity-types' | translate"
required>
<mat-icon matSuffix class="help-icon margin-8 cursor-pointer" aria-hidden="false" aria-label="help-icon"
color="primary"
matTooltip="{{ 'tb.rulenode.chip-help' | translate: { inputName: 'tb.rulenode.entity-type' | translate } }}">help</mat-icon>
matTooltip="{{ 'rule-node-config.chip-help' | translate: { inputName: 'rule-node-config.entity-type' | translate } }}">help</mat-icon>
</tb-entity-type-list>
</section>

View File

@ -43,7 +43,7 @@ export class ScriptConfigComponent extends RuleNodeConfigurationComponent {
readonly hasScript = true;
readonly testScriptLabel = 'tb.rulenode.test-filter-function';
readonly testScriptLabel = 'rule-node-config.test-filter-function';
constructor(protected store: Store<AppState>,
private fb: UntypedFormBuilder,
@ -104,7 +104,7 @@ export class ScriptConfigComponent extends RuleNodeConfigurationComponent {
this.nodeScriptTestService.testNodeScript(
script,
'filter',
this.translate.instant('tb.rulenode.filter'),
this.translate.instant('rule-node-config.filter'),
'Filter',
['msg', 'metadata', 'msgType'],
this.ruleNodeId,

View File

@ -46,7 +46,7 @@ export class SwitchConfigComponent extends RuleNodeConfigurationComponent {
readonly hasScript = true;
readonly testScriptLabel = 'tb.rulenode.test-switch-function';
readonly testScriptLabel = 'rule-node-config.test-switch-function';
constructor(private fb: UntypedFormBuilder,
private nodeScriptTestService: NodeScriptTestService,
@ -106,7 +106,7 @@ export class SwitchConfigComponent extends RuleNodeConfigurationComponent {
this.nodeScriptTestService.testNodeScript(
script,
'switch',
this.translate.instant('tb.rulenode.switch'),
this.translate.instant('rule-node-config.switch'),
'Switch',
['msg', 'metadata', 'msgType'],
this.ruleNodeId,

View File

@ -17,10 +17,10 @@
-->
<section [formGroup]="ruleChainInputConfigForm" class="flex flex-col">
<div class="tb-form-panel no-padding no-border">
<div tb-hint-tooltip-icon="{{ 'tb.rulenode.forward-msg-default-rule-chain-tooltip' | translate }}"
<div tb-hint-tooltip-icon="{{ 'rule-node-config.forward-msg-default-rule-chain-tooltip' | translate }}"
class="tb-form-row no-border">
<mat-slide-toggle class="mat-slide" formControlName="forwardMsgToDefaultRuleChain">
{{ 'tb.rulenode.forward-msg-default-rule-chain' | translate }}
{{ 'rule-node-config.forward-msg-default-rule-chain' | translate }}
</mat-slide-toggle>
</div>
<tb-entity-autocomplete required

View File

@ -16,5 +16,5 @@
-->
<section [formGroup]="ruleChainOutputConfigForm" class="flex flex-col">
<div innerHTML="{{ 'tb.rulenode.output-node-name-hint' | translate }}"></div>
<div innerHTML="{{ 'rule-node-config.output-node-name-hint' | translate }}"></div>
</section>

View File

@ -34,27 +34,27 @@ export interface OriginatorValuesDescriptions {
export const originatorSourceTranslations = new Map<OriginatorSource, string>(
[
[OriginatorSource.CUSTOMER, 'tb.rulenode.originator-customer'],
[OriginatorSource.TENANT, 'tb.rulenode.originator-tenant'],
[OriginatorSource.RELATED, 'tb.rulenode.originator-related'],
[OriginatorSource.ALARM_ORIGINATOR, 'tb.rulenode.originator-alarm-originator'],
[OriginatorSource.ENTITY, 'tb.rulenode.originator-entity'],
[OriginatorSource.CUSTOMER, 'rule-node-config.originator-customer'],
[OriginatorSource.TENANT, 'rule-node-config.originator-tenant'],
[OriginatorSource.RELATED, 'rule-node-config.originator-related'],
[OriginatorSource.ALARM_ORIGINATOR, 'rule-node-config.originator-alarm-originator'],
[OriginatorSource.ENTITY, 'rule-node-config.originator-entity'],
]
);
export const originatorSourceDescTranslations = new Map<OriginatorSource, string>(
[
[OriginatorSource.CUSTOMER, 'tb.rulenode.originator-customer-desc'],
[OriginatorSource.TENANT, 'tb.rulenode.originator-tenant-desc'],
[OriginatorSource.RELATED, 'tb.rulenode.originator-related-entity-desc'],
[OriginatorSource.ALARM_ORIGINATOR, 'tb.rulenode.originator-alarm-originator-desc'],
[OriginatorSource.ENTITY, 'tb.rulenode.originator-entity-by-name-pattern-desc'],
[OriginatorSource.CUSTOMER, 'rule-node-config.originator-customer-desc'],
[OriginatorSource.TENANT, 'rule-node-config.originator-tenant-desc'],
[OriginatorSource.RELATED, 'rule-node-config.originator-related-entity-desc'],
[OriginatorSource.ALARM_ORIGINATOR, 'rule-node-config.originator-alarm-originator-desc'],
[OriginatorSource.ENTITY, 'rule-node-config.originator-entity-by-name-pattern-desc'],
]
);
export const allowedOriginatorFields: EntityField[] = [
entityFields.createdTime,
entityFields.name,
{value: 'type', name: 'tb.rulenode.profile-name', keyName: 'originatorProfileName'},
{value: 'type', name: 'rule-node-config.profile-name', keyName: 'originatorProfileName'},
entityFields.firstName,
entityFields.lastName,
entityFields.email,
@ -67,8 +67,8 @@ export const allowedOriginatorFields: EntityField[] = [
entityFields.zip,
entityFields.phone,
entityFields.label,
{value: 'id', name: 'tb.rulenode.id', keyName: 'id'},
{value: 'additionalInfo', name: 'tb.rulenode.additional-info', keyName: 'additionalInfo'}
{value: 'id', name: 'rule-node-config.id', keyName: 'id'},
{value: 'additionalInfo', name: 'rule-node-config.additional-info', keyName: 'additionalInfo'}
];
export const OriginatorFieldsMappingValues = new Map<string, string>(
@ -100,8 +100,8 @@ export enum PerimeterType {
export const perimeterTypeTranslations = new Map<PerimeterType, string>(
[
[PerimeterType.CIRCLE, 'tb.rulenode.perimeter-circle'],
[PerimeterType.POLYGON, 'tb.rulenode.perimeter-polygon'],
[PerimeterType.CIRCLE, 'rule-node-config.perimeter-circle'],
[PerimeterType.POLYGON, 'rule-node-config.perimeter-polygon'],
]
);
@ -115,11 +115,11 @@ export enum TimeUnit {
export const timeUnitTranslations = new Map<TimeUnit, string>(
[
[TimeUnit.MILLISECONDS, 'tb.rulenode.time-unit-milliseconds'],
[TimeUnit.SECONDS, 'tb.rulenode.time-unit-seconds'],
[TimeUnit.MINUTES, 'tb.rulenode.time-unit-minutes'],
[TimeUnit.HOURS, 'tb.rulenode.time-unit-hours'],
[TimeUnit.DAYS, 'tb.rulenode.time-unit-days']
[TimeUnit.MILLISECONDS, 'rule-node-config.time-unit-milliseconds'],
[TimeUnit.SECONDS, 'rule-node-config.time-unit-seconds'],
[TimeUnit.MINUTES, 'rule-node-config.time-unit-minutes'],
[TimeUnit.HOURS, 'rule-node-config.time-unit-hours'],
[TimeUnit.DAYS, 'rule-node-config.time-unit-days']
]
);
@ -133,11 +133,11 @@ export enum RangeUnit {
export const rangeUnitTranslations = new Map<RangeUnit, string>(
[
[RangeUnit.METER, 'tb.rulenode.range-unit-meter'],
[RangeUnit.KILOMETER, 'tb.rulenode.range-unit-kilometer'],
[RangeUnit.FOOT, 'tb.rulenode.range-unit-foot'],
[RangeUnit.MILE, 'tb.rulenode.range-unit-mile'],
[RangeUnit.NAUTICAL_MILE, 'tb.rulenode.range-unit-nautical-mile']
[RangeUnit.METER, 'rule-node-config.range-unit-meter'],
[RangeUnit.KILOMETER, 'rule-node-config.range-unit-kilometer'],
[RangeUnit.FOOT, 'rule-node-config.range-unit-foot'],
[RangeUnit.MILE, 'rule-node-config.range-unit-mile'],
[RangeUnit.NAUTICAL_MILE, 'rule-node-config.range-unit-nautical-mile']
]
);
@ -162,17 +162,17 @@ export interface SvMapOption {
export const entityDetailsTranslations = new Map<EntityDetailsField, string>(
[
[EntityDetailsField.ID, 'tb.rulenode.entity-details-id'],
[EntityDetailsField.TITLE, 'tb.rulenode.entity-details-title'],
[EntityDetailsField.COUNTRY, 'tb.rulenode.entity-details-country'],
[EntityDetailsField.STATE, 'tb.rulenode.entity-details-state'],
[EntityDetailsField.CITY, 'tb.rulenode.entity-details-city'],
[EntityDetailsField.ZIP, 'tb.rulenode.entity-details-zip'],
[EntityDetailsField.ADDRESS, 'tb.rulenode.entity-details-address'],
[EntityDetailsField.ADDRESS2, 'tb.rulenode.entity-details-address2'],
[EntityDetailsField.PHONE, 'tb.rulenode.entity-details-phone'],
[EntityDetailsField.EMAIL, 'tb.rulenode.entity-details-email'],
[EntityDetailsField.ADDITIONAL_INFO, 'tb.rulenode.entity-details-additional_info']
[EntityDetailsField.ID, 'rule-node-config.entity-details-id'],
[EntityDetailsField.TITLE, 'rule-node-config.entity-details-title'],
[EntityDetailsField.COUNTRY, 'rule-node-config.entity-details-country'],
[EntityDetailsField.STATE, 'rule-node-config.entity-details-state'],
[EntityDetailsField.CITY, 'rule-node-config.entity-details-city'],
[EntityDetailsField.ZIP, 'rule-node-config.entity-details-zip'],
[EntityDetailsField.ADDRESS, 'rule-node-config.entity-details-address'],
[EntityDetailsField.ADDRESS2, 'rule-node-config.entity-details-address2'],
[EntityDetailsField.PHONE, 'rule-node-config.entity-details-phone'],
[EntityDetailsField.EMAIL, 'rule-node-config.entity-details-email'],
[EntityDetailsField.ADDITIONAL_INFO, 'rule-node-config.entity-details-additional_info']
]
);
@ -184,17 +184,17 @@ export enum FetchMode {
export const deduplicationStrategiesTranslations = new Map<FetchMode, string>(
[
[FetchMode.FIRST, 'tb.rulenode.first'],
[FetchMode.LAST, 'tb.rulenode.last'],
[FetchMode.ALL, 'tb.rulenode.all']
[FetchMode.FIRST, 'rule-node-config.first'],
[FetchMode.LAST, 'rule-node-config.last'],
[FetchMode.ALL, 'rule-node-config.all']
]
);
export const deduplicationStrategiesHintTranslations = new Map<FetchMode, string>(
[
[FetchMode.FIRST, 'tb.rulenode.first-mode-hint'],
[FetchMode.LAST, 'tb.rulenode.last-mode-hint'],
[FetchMode.ALL, 'tb.rulenode.all-mode-hint']
[FetchMode.FIRST, 'rule-node-config.first-mode-hint'],
[FetchMode.LAST, 'rule-node-config.last-mode-hint'],
[FetchMode.ALL, 'rule-node-config.all-mode-hint']
]
);
@ -211,24 +211,24 @@ export enum DataToFetch {
export const dataToFetchTranslations = new Map<DataToFetch, string>(
[
[DataToFetch.ATTRIBUTES, 'tb.rulenode.attributes'],
[DataToFetch.LATEST_TELEMETRY, 'tb.rulenode.latest-telemetry'],
[DataToFetch.FIELDS, 'tb.rulenode.fields']
[DataToFetch.ATTRIBUTES, 'rule-node-config.attributes'],
[DataToFetch.LATEST_TELEMETRY, 'rule-node-config.latest-telemetry'],
[DataToFetch.FIELDS, 'rule-node-config.fields']
]
);
export const msgMetadataLabelTranslations = new Map<DataToFetch, string>(
[
[DataToFetch.ATTRIBUTES, 'tb.rulenode.add-mapped-attribute-to'],
[DataToFetch.LATEST_TELEMETRY, 'tb.rulenode.add-mapped-latest-telemetry-to'],
[DataToFetch.FIELDS, 'tb.rulenode.add-mapped-fields-to']
[DataToFetch.ATTRIBUTES, 'rule-node-config.add-mapped-attribute-to'],
[DataToFetch.LATEST_TELEMETRY, 'rule-node-config.add-mapped-latest-telemetry-to'],
[DataToFetch.FIELDS, 'rule-node-config.add-mapped-fields-to']
]
);
export const samplingOrderTranslations = new Map<SamplingOrder, string>(
[
[SamplingOrder.ASC, 'tb.rulenode.ascending'],
[SamplingOrder.DESC, 'tb.rulenode.descending']
[SamplingOrder.ASC, 'rule-node-config.ascending'],
[SamplingOrder.DESC, 'rule-node-config.descending']
]
);
@ -239,8 +239,8 @@ export enum SqsQueueType {
export const sqsQueueTypeTranslations = new Map<SqsQueueType, string>(
[
[SqsQueueType.STANDARD, 'tb.rulenode.sqs-queue-standard'],
[SqsQueueType.FIFO, 'tb.rulenode.sqs-queue-fifo'],
[SqsQueueType.STANDARD, 'rule-node-config.sqs-queue-standard'],
[SqsQueueType.FIFO, 'rule-node-config.sqs-queue-fifo'],
]
);
@ -249,9 +249,9 @@ export const credentialsTypes: credentialsType[] = ['anonymous', 'basic', 'cert.
export const credentialsTypeTranslations = new Map<credentialsType, string>(
[
['anonymous', 'tb.rulenode.credentials-anonymous'],
['basic', 'tb.rulenode.credentials-basic'],
['cert.PEM', 'tb.rulenode.credentials-pem']
['anonymous', 'rule-node-config.credentials-anonymous'],
['basic', 'rule-node-config.credentials-basic'],
['cert.PEM', 'rule-node-config.credentials-pem']
]
);
@ -260,8 +260,8 @@ export const azureIotHubCredentialsTypes: AzureIotHubCredentialsType[] = ['sas',
export const azureIotHubCredentialsTypeTranslations = new Map<AzureIotHubCredentialsType, string>(
[
['sas', 'tb.rulenode.credentials-sas'],
['cert.PEM', 'tb.rulenode.credentials-pem']
['sas', 'rule-node-config.credentials-sas'],
['cert.PEM', 'rule-node-config.credentials-pem']
]
);
@ -283,12 +283,12 @@ export const ToByteStandartCharsetTypes = [
export const ToByteStandartCharsetTypeTranslations = new Map<string, string>(
[
['US-ASCII', 'tb.rulenode.charset-us-ascii'],
['ISO-8859-1', 'tb.rulenode.charset-iso-8859-1'],
['UTF-8', 'tb.rulenode.charset-utf-8'],
['UTF-16BE', 'tb.rulenode.charset-utf-16be'],
['UTF-16LE', 'tb.rulenode.charset-utf-16le'],
['UTF-16', 'tb.rulenode.charset-utf-16'],
['US-ASCII', 'rule-node-config.charset-us-ascii'],
['ISO-8859-1', 'rule-node-config.charset-iso-8859-1'],
['UTF-8', 'rule-node-config.charset-utf-8'],
['UTF-16BE', 'rule-node-config.charset-utf-16be'],
['UTF-16LE', 'rule-node-config.charset-utf-16le'],
['UTF-16', 'rule-node-config.charset-utf-16'],
]
);
@ -720,23 +720,23 @@ export enum FetchTo {
}
export const FetchFromToTranslation = new Map<FetchTo, string>([
[FetchTo.DATA, 'tb.rulenode.message-to-metadata'],
[FetchTo.METADATA, 'tb.rulenode.metadata-to-message'],
[FetchTo.DATA, 'rule-node-config.message-to-metadata'],
[FetchTo.METADATA, 'rule-node-config.metadata-to-message'],
]);
export const FetchFromTranslation = new Map<FetchTo, string>([
[FetchTo.DATA, 'tb.rulenode.from-message'],
[FetchTo.METADATA, 'tb.rulenode.from-metadata'],
[FetchTo.DATA, 'rule-node-config.from-message'],
[FetchTo.METADATA, 'rule-node-config.from-metadata'],
]);
export const FetchToTranslation = new Map<FetchTo, string>([
[FetchTo.DATA, 'tb.rulenode.message'],
[FetchTo.METADATA, 'tb.rulenode.metadata'],
[FetchTo.DATA, 'rule-node-config.message'],
[FetchTo.METADATA, 'rule-node-config.metadata'],
]);
export const FetchToRenameTranslation = new Map<FetchTo, string>([
[FetchTo.DATA, 'tb.rulenode.message'],
[FetchTo.METADATA, 'tb.rulenode.message-metadata'],
[FetchTo.DATA, 'rule-node-config.message'],
[FetchTo.METADATA, 'rule-node-config.message-metadata'],
]);
export interface ArgumentTypeData {
@ -748,36 +748,36 @@ export const ArgumentTypeMap = new Map<ArgumentType, ArgumentTypeData>([
[
ArgumentType.MESSAGE_BODY,
{
name: 'tb.rulenode.message-body-type',
description: 'Fetch argument value from incoming message'
name: 'rule-node-config.message-body-type',
description: 'rule-node-config.message-body-type-description'
}
],
[
ArgumentType.MESSAGE_METADATA,
{
name: 'tb.rulenode.message-metadata-type',
description: 'Fetch argument value from incoming message metadata'
name: 'rule-node-config.message-metadata-type',
description: 'rule-node-config.message-metadata-type-description'
}
],
[
ArgumentType.ATTRIBUTE,
{
name: 'tb.rulenode.attribute-type',
description: 'Fetch attribute value from database'
name: 'rule-node-config.attribute-type',
description: 'rule-node-config.attribute-type-description'
}
],
[
ArgumentType.TIME_SERIES,
{
name: 'tb.rulenode.time-series-type',
description: 'Fetch latest time-series value from database'
name: 'rule-node-config.time-series-type',
description: 'rule-node-config.time-series-type-description'
}
],
[
ArgumentType.CONSTANT,
{
name: 'tb.rulenode.constant-type',
description: 'Define constant value'
name: 'rule-node-config.constant-type',
description: 'rule-node-config.constant-type-description'
}
]
]);
@ -786,29 +786,29 @@ export const ArgumentTypeResultMap = new Map<ArgumentTypeResult, ArgumentTypeDat
[
ArgumentTypeResult.MESSAGE_BODY,
{
name: 'tb.rulenode.message-body-type',
description: 'Add result to the outgoing message'
name: 'rule-node-config.message-body-type',
description: 'rule-node-config.message-body-type-result-description'
}
],
[
ArgumentTypeResult.MESSAGE_METADATA,
{
name: 'tb.rulenode.message-metadata-type',
description: 'Add result to the outgoing message metadata'
name: 'rule-node-config.message-metadata-type',
description: 'rule-node-config.message-metadata-result-description'
}
],
[
ArgumentTypeResult.ATTRIBUTE,
{
name: 'tb.rulenode.attribute-type',
description: 'Store result as an entity attribute in the database'
name: 'rule-node-config.attribute-type',
description: 'rule-node-config.attribute-type-result-description'
}
],
[
ArgumentTypeResult.TIME_SERIES,
{
name: 'tb.rulenode.time-series-type',
description: 'Store result as an entity time-series in the database'
name: 'rule-node-config.time-series-type',
description: 'rule-node-config.time-series-type-result-description'
}
]
]);
@ -827,9 +827,9 @@ export enum AttributeScopeResult {
}
export const AttributeScopeMap = new Map<AttributeScope, string>([
[AttributeScope.SHARED_SCOPE, 'tb.rulenode.shared-scope'],
[AttributeScope.SERVER_SCOPE, 'tb.rulenode.server-scope'],
[AttributeScope.CLIENT_SCOPE, 'tb.rulenode.client-scope']
[AttributeScope.SHARED_SCOPE, 'rule-node-config.shared-scope'],
[AttributeScope.SERVER_SCOPE, 'rule-node-config.server-scope'],
[AttributeScope.CLIENT_SCOPE, 'rule-node-config.client-scope']
]);
export enum PresenceMonitoringStrategy {
@ -847,14 +847,14 @@ export const PresenceMonitoringStrategiesData = new Map<PresenceMonitoringStrate
PresenceMonitoringStrategy.ON_EACH_MESSAGE,
{
value: true,
name: 'tb.rulenode.presence-monitoring-strategy-on-each-message'
name: 'rule-node-config.presence-monitoring-strategy-on-each-message'
}
],
[
PresenceMonitoringStrategy.ON_FIRST_MESSAGE,
{
value: false,
name: 'tb.rulenode.presence-monitoring-strategy-on-first-message'
name: 'rule-node-config.presence-monitoring-strategy-on-first-message'
}
]
]);

View File

@ -17,7 +17,7 @@
-->
<section [formGroup]="changeOriginatorConfigForm" class="tb-form-panel no-border no-padding">
<mat-form-field class="mat-block" subscriptSizing="dynamic" hideRequiredMarker>
<mat-label translate>tb.rulenode.new-originator</mat-label>
<mat-label translate>rule-node-config.new-originator</mat-label>
<mat-select formControlName="originatorSource" required>
<mat-select-trigger>
<span *ngIf="originatorSourceTranslationMap.get(changeOriginatorConfigForm.get('originatorSource').value)">
@ -37,7 +37,7 @@
</mat-form-field>
<div class="tb-form-panel stroked no-padding-bottom"
*ngIf="changeOriginatorConfigForm.get('originatorSource').value === originatorSource.ENTITY">
<tb-example-hint [hintText]="'tb.rulenode.entity-name-pattern-hint'"
<tb-example-hint [hintText]="'rule-node-config.entity-name-pattern-hint'"
popupHelpLink="rulenode/change_originator_node_fields_templatization">
</tb-example-hint>
<div class="tb-form-row no-border no-padding tb-standard-fields">
@ -49,11 +49,11 @@
class="mat-mdc-form-field flex">
</tb-entity-type-select>
<mat-form-field class="flex">
<mat-label translate>tb.rulenode.entity-name-pattern</mat-label>
<mat-label translate>rule-node-config.entity-name-pattern</mat-label>
<input required matInput formControlName="entityNamePattern">
<mat-error *ngIf="changeOriginatorConfigForm.get('entityNamePattern').hasError('required') ||
changeOriginatorConfigForm.get('entityNamePattern').hasError('pattern')">
{{ 'tb.rulenode.entity-name-pattern-required' | translate }}
{{ 'rule-node-config.entity-name-pattern-required' | translate }}
</mat-error>
</mat-form-field>
</div>

View File

@ -17,19 +17,19 @@
-->
<section [formGroup]="copyKeysConfigForm" class="tb-form-panel no-padding no-border">
<tb-msg-metadata-chip
[labelText]="('tb.key-val.copy-key-values-from' | translate)"
[labelText]="('rule-node-config.key-val.copy-key-values-from' | translate)"
[translation]="translation"
formControlName="copyFrom">
</tb-msg-metadata-chip>
<tb-string-items-list class="mat-block"
required
[label]="'tb.rulenode.keys' | translate"
[placeholder]="'tb.rulenode.add-key' | translate"
[requiredText]="'tb.key-val.at-least-one-key-error' | translate"
[label]="'rule-node-config.keys' | translate"
[placeholder]="'rule-node-config.add-key' | translate"
[requiredText]="'rule-node-config.key-val.at-least-one-key-error' | translate"
formControlName="keys">
<mat-icon matSuffix class="help-icon margin-8 cursor-pointer" aria-hidden="false" aria-label="help-icon"
color="primary"
matTooltip="{{ 'tb.rulenode.use-regular-expression-hint' | translate }}">
matTooltip="{{ 'rule-node-config.use-regular-expression-hint' | translate }}">
help
</mat-icon>
</tb-string-items-list>

View File

@ -17,34 +17,34 @@
-->
<section [formGroup]="deduplicationConfigForm">
<mat-form-field class="mat-block">
<mat-label>{{'tb.rulenode.interval' | translate}}</mat-label>
<mat-label>{{'rule-node-config.interval' | translate}}</mat-label>
<input type='number' required matInput formControlName="interval">
<mat-error *ngIf="deduplicationConfigForm.get('interval').hasError('required')">
{{'tb.rulenode.interval-required' | translate}}
{{'rule-node-config.interval-required' | translate}}
</mat-error>
<mat-error *ngIf="deduplicationConfigForm.get('interval').hasError('min')">
{{'tb.rulenode.interval-min-error' | translate}}
{{'rule-node-config.interval-min-error' | translate}}
</mat-error>
<mat-icon matSuffix class="help-icon margin-8 cursor-pointer" aria-hidden="false" aria-label="help-icon"
color="primary"
matTooltip="{{ 'tb.rulenode.interval-hint' | translate }}">help</mat-icon>
matTooltip="{{ 'rule-node-config.interval-hint' | translate }}">help</mat-icon>
</mat-form-field>
<div class="tb-form-panel no-padding no-border">
<div class="tb-form-panel stroked">
<div class="tb-form-panel-title tb-required" translate>tb.rulenode.strategy</div>
<div class="tb-form-panel-title tb-required" translate>rule-node-config.strategy</div>
<tb-toggle-select class="fetch-to-data-toggle" formControlName="strategy" appearance="fill">
<tb-toggle-option *ngFor="let strategy of deduplicationStrategies" [value]="strategy">
{{ deduplicationStrategiesTranslations.get(strategy) | translate }}
</tb-toggle-option>
</tb-toggle-select>
<tb-example-hint [hintText]="'tb.rulenode.strategy-all-hint'"
<tb-example-hint [hintText]="'rule-node-config.strategy-all-hint'"
*ngIf="deduplicationConfigForm.get('strategy').value === 'ALL'">
</tb-example-hint>
<tb-example-hint [hintText]="'tb.rulenode.strategy-first-hint'"
<tb-example-hint [hintText]="'rule-node-config.strategy-first-hint'"
textAlign="'center'"
*ngIf="deduplicationConfigForm.get('strategy').value === 'FIRST'">
</tb-example-hint>
<tb-example-hint [hintText]="'tb.rulenode.strategy-last-hint'"
<tb-example-hint [hintText]="'rule-node-config.strategy-last-hint'"
textAlign="'center'"
*ngIf="deduplicationConfigForm.get('strategy').value === 'LAST'">
</tb-example-hint>
@ -58,40 +58,40 @@
<section class="tb-form-panel stroked">
<mat-expansion-panel class="tb-settings">
<mat-expansion-panel-header>
<mat-panel-title translate>tb.rulenode.advanced-settings</mat-panel-title>
<mat-panel-title translate>rule-node-config.advanced-settings</mat-panel-title>
</mat-expansion-panel-header>
<div class="tb-form-row no-border no-padding tb-standard-fields">
<mat-form-field class="flex">
<mat-label>{{'tb.rulenode.max-pending-msgs' | translate}}</mat-label>
<mat-label>{{'rule-node-config.max-pending-msgs' | translate}}</mat-label>
<input type = 'number' required matInput formControlName="maxPendingMsgs">
<mat-error *ngIf="deduplicationConfigForm.get('maxPendingMsgs').hasError('required')">
{{'tb.rulenode.max-pending-msgs-required' | translate}}
{{'rule-node-config.max-pending-msgs-required' | translate}}
</mat-error>
<mat-error *ngIf="deduplicationConfigForm.get('maxPendingMsgs').hasError('max')">
{{'tb.rulenode.max-pending-msgs-max-error' | translate}}
{{'rule-node-config.max-pending-msgs-max-error' | translate}}
</mat-error>
<mat-error *ngIf="deduplicationConfigForm.get('maxPendingMsgs').hasError('min')">
{{'tb.rulenode.max-pending-msgs-min-error' | translate}}
{{'rule-node-config.max-pending-msgs-min-error' | translate}}
</mat-error>
<mat-icon matSuffix class="help-icon margin-8 cursor-pointer" aria-hidden="false" aria-label="help-icon"
color="primary"
matTooltip="{{ 'tb.rulenode.max-pending-msgs-hint' | translate }}">help</mat-icon>
matTooltip="{{ 'rule-node-config.max-pending-msgs-hint' | translate }}">help</mat-icon>
</mat-form-field>
<mat-form-field class="flex">
<mat-label>{{'tb.rulenode.max-retries' | translate}}</mat-label>
<mat-label>{{'rule-node-config.max-retries' | translate}}</mat-label>
<input type = 'number' required matInput formControlName="maxRetries">
<mat-error *ngIf="deduplicationConfigForm.get('maxRetries').hasError('required')">
{{'tb.rulenode.max-retries-required' | translate}}
{{'rule-node-config.max-retries-required' | translate}}
</mat-error>
<mat-error *ngIf="deduplicationConfigForm.get('maxRetries').hasError('max')">
{{'tb.rulenode.max-retries-max-error' | translate}}
{{'rule-node-config.max-retries-max-error' | translate}}
</mat-error>
<mat-error *ngIf="deduplicationConfigForm.get('maxRetries').hasError('min')">
{{'tb.rulenode.max-retries-min-error' | translate}}
{{'rule-node-config.max-retries-min-error' | translate}}
</mat-error>
<mat-icon matSuffix class="help-icon margin-8 cursor-pointer" aria-hidden="false" aria-label="help-icon"
color="primary"
matTooltip="{{ 'tb.rulenode.max-retries-hint' | translate }}">help</mat-icon>
matTooltip="{{ 'rule-node-config.max-retries-hint' | translate }}">help</mat-icon>
</mat-form-field>
</div>
</mat-expansion-panel>

View File

@ -17,18 +17,18 @@
-->
<section [formGroup]="deleteKeysConfigForm" class="tb-form-panel no-border no-padding">
<tb-msg-metadata-chip
[labelText]="('tb.key-val.delete-key-values-from' | translate)"
[labelText]="('rule-node-config.key-val.delete-key-values-from' | translate)"
formControlName="deleteFrom">
</tb-msg-metadata-chip>
<tb-string-items-list class="mat-block"
required
[label]="'tb.rulenode.keys' | translate"
[placeholder]="'tb.rulenode.add-key' | translate"
[requiredText]="'tb.key-val.at-least-one-key-error' | translate"
[label]="'rule-node-config.keys' | translate"
[placeholder]="'rule-node-config.add-key' | translate"
[requiredText]="'rule-node-config.key-val.at-least-one-key-error' | translate"
formControlName="keys">
<mat-icon matSuffix class="help-icon margin-8 cursor-pointer" aria-hidden="false" aria-label="help-icon"
color="primary"
matTooltip="{{ 'tb.rulenode.use-regular-expression-delete-hint' | translate }}">
matTooltip="{{ 'rule-node-config.use-regular-expression-delete-hint' | translate }}">
help
</mat-icon>
</tb-string-items-list>

View File

@ -17,9 +17,9 @@
-->
<section [formGroup]="jsonPathConfigForm">
<mat-form-field subscriptSizing="dynamic" class="mat-block">
<mat-label>{{ 'tb.rulenode.json-path-expression' | translate }}</mat-label>
<mat-label>{{ 'rule-node-config.json-path-expression' | translate }}</mat-label>
<input matInput formControlName="jsonPath" required/>
<mat-hint>{{ 'tb.rulenode.json-path-expression-hint' | translate }}</mat-hint>
<mat-error *ngIf="jsonPathConfigForm.get('jsonPath').hasError('required')">{{ 'tb.rulenode.json-path-expression-required' | translate }}</mat-error>
<mat-hint>{{ 'rule-node-config.json-path-expression-hint' | translate }}</mat-hint>
<mat-error *ngIf="jsonPathConfigForm.get('jsonPath').hasError('required')">{{ 'rule-node-config.json-path-expression-required' | translate }}</mat-error>
</mat-form-field>
</section>

View File

@ -16,7 +16,7 @@
-->
<section [formGroup]="renameKeysConfigForm" class="tb-form-panel stroked">
<div class="tb-form-panel-title" translate>tb.rulenode.rename-keys-in</div>
<div class="tb-form-panel-title" translate>rule-node-config.rename-keys-in</div>
<div class="fx-centered">
<div class="fetch-to-data-toggle">
<tb-toggle-select class="fetch-to-data-toggle" formControlName="renameIn" appearance="fill">
@ -28,13 +28,13 @@
</div>
<tb-kv-map-config
required
labelText="{{ translation.get(renameKeysConfigForm.get('renameIn').value) | translate }} {{'tb.rulenode.keys-mapping' | translate}}"
labelText="{{ translation.get(renameKeysConfigForm.get('renameIn').value) | translate }} {{'rule-node-config.keys-mapping' | translate}}"
formControlName="renameKeysMapping"
uniqueKeyValuePairValidator
requiredText="{{'tb.rulenode.attr-mapping-required' | translate}}"
keyText="{{'tb.rulenode.current-key-name' | translate}}"
keyRequiredText="{{'tb.rulenode.key-name-required' | translate}}"
valText="{{'tb.rulenode.new-key-name' | translate}}"
valRequiredText="{{'tb.rulenode.new-key-name-required' | translate}}">
requiredText="{{'rule-node-config.attr-mapping-required' | translate}}"
keyText="{{'rule-node-config.current-key-name' | translate}}"
keyRequiredText="{{'rule-node-config.key-name-required' | translate}}"
valText="{{'rule-node-config.new-key-name' | translate}}"
valRequiredText="{{'rule-node-config.new-key-name-required' | translate}}">
</tb-kv-map-config>
</section>

View File

@ -46,7 +46,7 @@ export class TransformScriptConfigComponent extends RuleNodeConfigurationCompone
readonly hasScript = true;
readonly testScriptLabel = 'tb.rulenode.test-transformer-function';
readonly testScriptLabel = 'rule-node-config.test-transformer-function';
constructor(private fb: FormBuilder,
private nodeScriptTestService: NodeScriptTestService,
@ -104,7 +104,7 @@ export class TransformScriptConfigComponent extends RuleNodeConfigurationCompone
this.nodeScriptTestService.testNodeScript(
script,
'update',
this.translate.instant('tb.rulenode.transformer'),
this.translate.instant('rule-node-config.transformer'),
'Transform',
['msg', 'metadata', 'msgType'],
this.ruleNodeId,

View File

@ -17,13 +17,13 @@
-->
<section [formGroup]="toEmailConfigForm" class="tb-form-panel no-border no-padding">
<div class="tb-form-panel stroked">
<div class="tb-form-panel-title" translate>tb.rulenode.email-sender</div>
<div class="tb-form-panel-title" translate>rule-node-config.email-sender</div>
<div class="tb-form-row no-border no-padding tb-standard-fields">
<mat-form-field class="flex" subscriptSizing="dynamic">
<mat-label translate>tb.rulenode.from-template</mat-label>
<mat-label translate>rule-node-config.from-template</mat-label>
<input required matInput formControlName="fromTemplate">
<mat-hint align="start">
{{ 'tb.rulenode.email-from-template-hint' | translate }}
{{ 'rule-node-config.email-from-template-hint' | translate }}
</mat-hint>
<mat-hint align="end">
<div class="input-bottom-double-hint">
@ -33,25 +33,25 @@
tb-help-popup-placement="right"
trigger-style="letter-spacing:0.25px; font-size:12px;"
[tb-help-popup-style]="{maxWidth: '820px'}"
trigger-text="{{ 'tb.key-val.see-examples' | translate }}"></div>
trigger-text="{{ 'rule-node-config.key-val.see-examples' | translate }}"></div>
</div>
</mat-hint>
<mat-error *ngIf="toEmailConfigForm.get('fromTemplate').hasError('required')">
{{ 'tb.rulenode.from-template-required' | translate }}
{{ 'rule-node-config.from-template-required' | translate }}
</mat-error>
</mat-form-field>
</div>
</div>
<div class="tb-form-panel stroked">
<div class="tb-form-panel no-padding no-border">
<div class="tb-form-panel-title" translate>tb.rulenode.recipients</div>
<tb-example-hint [hintText]="'tb.rulenode.recipients-block-main-hint'"
<div class="tb-form-panel-title" translate>rule-node-config.recipients</div>
<tb-example-hint [hintText]="'rule-node-config.recipients-block-main-hint'"
popupHelpLink="rulenode/to_email_node_fields_templatization">
</tb-example-hint>
</div>
<div class="tb-form-row no-border no-padding tb-standard-fields">
<mat-form-field class="flex">
<mat-label translate>tb.rulenode.to-template</mat-label>
<mat-label translate>rule-node-config.to-template</mat-label>
<textarea required
matInput
class="tb-enable-vertical-resize"
@ -59,11 +59,11 @@
cdkTextareaAutosize
cdkAutosizeMinRows="1"></textarea>
<mat-error *ngIf="toEmailConfigForm.get('toTemplate').hasError('required')">
{{ 'tb.rulenode.to-template-required' | translate }}
{{ 'rule-node-config.to-template-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="flex">
<mat-label translate>tb.rulenode.cc-template</mat-label>
<mat-label translate>rule-node-config.cc-template</mat-label>
<textarea matInput
formControlName="ccTemplate"
class="tb-enable-vertical-resize"
@ -71,7 +71,7 @@
cdkAutosizeMinRows="1"></textarea>
</mat-form-field>
<mat-form-field class="flex">
<mat-label translate>tb.rulenode.bcc-template</mat-label>
<mat-label translate>rule-node-config.bcc-template</mat-label>
<textarea matInput
formControlName="bccTemplate"
class="tb-enable-vertical-resize"
@ -81,13 +81,13 @@
</div>
</div>
<div class="tb-form-panel stroked">
<div class="tb-form-panel-title" translate>tb.rulenode.message-subject-and-content</div>
<tb-example-hint [hintText]="'tb.rulenode.kv-map-pattern-hint'"
<div class="tb-form-panel-title" translate>rule-node-config.message-subject-and-content</div>
<tb-example-hint [hintText]="'rule-node-config.kv-map-pattern-hint'"
popupHelpLink="rulenode/to_email_node_fields_templatization">
</tb-example-hint>
<section>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.subject-template</mat-label>
<mat-label translate>rule-node-config.subject-template</mat-label>
<textarea required
matInput
formControlName="subjectTemplate"
@ -95,11 +95,11 @@
cdkTextareaAutosize
cdkAutosizeMinRows="1"></textarea>
<mat-error *ngIf="toEmailConfigForm.get('subjectTemplate').hasError('required')">
{{ 'tb.rulenode.subject-template-required' | translate }}
{{ 'rule-node-config.subject-template-required' | translate }}
</mat-error>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.mail-body-type</mat-label>
<mat-label translate>rule-node-config.mail-body-type</mat-label>
<mat-select formControlName="mailBodyType">
<mat-select-trigger>
<span *ngIf="toEmailConfigForm.get('mailBodyType').value">
@ -118,12 +118,12 @@
</mat-select>
</mat-form-field>
<mat-form-field class="mat-block" *ngIf="toEmailConfigForm.get('mailBodyType').value === 'dynamic'">
<mat-label translate>tb.rulenode.body-type-template</mat-label>
<mat-label translate>rule-node-config.body-type-template</mat-label>
<input required matInput formControlName="isHtmlTemplate">
<mat-hint translate>tb.mail-body-type.after-template-evaluation-hint</mat-hint>
<mat-hint translate>rule-node-config.mail-body-types.after-template-evaluation-hint</mat-hint>
</mat-form-field>
<mat-form-field class="mat-block">
<mat-label translate>tb.rulenode.body-template</mat-label>
<mat-label translate>rule-node-config.body-template</mat-label>
<textarea required
matInput
formControlName="bodyTemplate"
@ -131,7 +131,7 @@
cdkTextareaAutosize
cdkAutosizeMinRows="2"></textarea>
<mat-error *ngIf="toEmailConfigForm.get('bodyTemplate').hasError('required')">
{{ 'tb.rulenode.body-template-required' | translate }}
{{ 'rule-node-config.body-template-required' | translate }}
</mat-error>
</mat-form-field>
</section>

View File

@ -29,18 +29,18 @@ export class ToEmailConfigComponent extends RuleNodeConfigurationComponent {
toEmailConfigForm: FormGroup;
mailBodyTypes = [
{
name: 'tb.mail-body-type.plain-text',
description: 'tb.mail-body-type.plain-text-description',
name: 'rule-node-config.mail-body-types.plain-text',
description: 'rule-node-config.mail-body-types.plain-text-description',
value: 'false',
},
{
name: 'tb.mail-body-type.html',
description: 'tb.mail-body-type.html-text-description',
name: 'rule-node-config.mail-body-types.html',
description: 'rule-node-config.mail-body-types.html-text-description',
value: 'true',
},
{
name: 'tb.mail-body-type.use-body-type-template',
description: 'tb.mail-body-type.dynamic-text-description',
name: 'rule-node-config.mail-body-types.use-body-type-template',
description: 'rule-node-config.mail-body-types.dynamic-text-description',
value: 'dynamic',
}
];

File diff suppressed because it is too large Load Diff