diff --git a/ui-ngx/src/app/core/http/rule-chain.service.ts b/ui-ngx/src/app/core/http/rule-chain.service.ts index 5450071ee5..2e6a1e121e 100644 --- a/ui-ngx/src/app/core/http/rule-chain.service.ts +++ b/ui-ngx/src/app/core/http/rule-chain.service.ts @@ -31,6 +31,7 @@ import { ComponentDescriptorService } from './component-descriptor.service'; import { IRuleNodeConfigurationComponent, LinkLabel, + normalizeLinkLabel, RuleNodeComponentDescriptor, RuleNodeConfiguration, RuleNodeConfigurationComponent, @@ -149,10 +150,10 @@ export class RuleChainService { const relationTypes = component.configurationDescriptor.nodeDefinition.relationTypes; const linkLabels: {[label: string]: LinkLabel} = {}; relationTypes.forEach((label) => { - linkLabels[label] = { + linkLabels[label] = normalizeLinkLabel({ name: label, value: label - }; + }); }); return linkLabels; } diff --git a/ui-ngx/src/app/modules/home/pages/rulechain/link-labels.component.ts b/ui-ngx/src/app/modules/home/pages/rulechain/link-labels.component.ts index 6745796cbb..d92f2a9093 100644 --- a/ui-ngx/src/app/modules/home/pages/rulechain/link-labels.component.ts +++ b/ui-ngx/src/app/modules/home/pages/rulechain/link-labels.component.ts @@ -16,7 +16,7 @@ import { Component, ElementRef, forwardRef, Input, OnChanges, OnInit, SimpleChanges, ViewChild } from '@angular/core'; import { ControlValueAccessor, UntypedFormBuilder, UntypedFormGroup, NG_VALUE_ACCESSOR } from '@angular/forms'; -import { LinkLabel } from '@shared/models/rule-node.models'; +import { LinkLabel, normalizeLinkLabel, toStandardizedLinkLabel } from '@shared/models/rule-node.models'; import { Observable, of } from 'rxjs'; import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { deepClone } from '@core/utils'; @@ -150,12 +150,9 @@ export class LinkLabelsComponent implements ControlValueAccessor, OnInit, OnChan if (value) { value.forEach((label) => { if (this.allowedLabels[label]) { - this.labels.push(deepClone(this.allowedLabels[label])); + this.labels.push(normalizeLinkLabel(this.allowedLabels[label])); } else { - this.labels.push({ - name: label, - value: label - }); + this.labels.push({name: label, value: label}); } }); } @@ -172,10 +169,7 @@ export class LinkLabelsComponent implements ControlValueAccessor, OnInit, OnChan return this.ruleChainService.getRuleChainOutputLabels(this.sourceRuleChainId, {ignoreErrors: true}).pipe( map((labels) => { for (const label of labels) { - labelsList.push({ - name: label, - value: label - }); + labelsList.push({name: toStandardizedLinkLabel(label), value: label}); } return labelsList; }), @@ -185,7 +179,7 @@ export class LinkLabelsComponent implements ControlValueAccessor, OnInit, OnChan ); } else { for (const label of Object.keys(this.allowedLabels)) { - labelsList.push({name: this.allowedLabels[label].name, value: this.allowedLabels[label].value}); + labelsList.push(normalizeLinkLabel(this.allowedLabels[label])); } return of(labelsList); } diff --git a/ui-ngx/src/app/modules/home/pages/rulechain/rulechain-page.component.html b/ui-ngx/src/app/modules/home/pages/rulechain/rulechain-page.component.html index 7f204aac2b..80efe7c85c 100644 --- a/ui-ngx/src/app/modules/home/pages/rulechain/rulechain-page.component.html +++ b/ui-ngx/src/app/modules/home/pages/rulechain/rulechain-page.component.html @@ -137,7 +137,7 @@ { this.enableHotKeys = true; @@ -857,15 +863,18 @@ export class RuleChainPageComponent extends PageComponent } private prepareEdgeContextMenu(edge: FcRuleEdge): RuleChainMenuContextInfo { + const sourceNode: FcRuleNode = this.ruleChainCanvas.modelService.nodes.getNodeByConnectorId(edge.source); + const isFromInput = sourceNode.component.type === RuleNodeType.INPUT; + const title = isFromInput ? edge.label : + toStandardizedLinkLabels(edge.labels ?? [], this.ruleChainService.getRuleNodeSupportedLinks(sourceNode.component)); const contextInfo: RuleChainMenuContextInfo = { headerClass: 'tb-link-header', icon: 'trending_flat', - title: edge.label, + title, subtitle: this.translate.instant('rulenode.link'), menuItems: [] }; - const sourceNode: FcRuleNode = this.ruleChainCanvas.modelService.nodes.getNodeByConnectorId(edge.source); - if (sourceNode.component.type !== RuleNodeType.INPUT) { + if (!isFromInput) { contextInfo.menuItems.push( { action: () => { @@ -1367,7 +1376,7 @@ export class RuleChainPageComponent extends PageComponent details = this.sanitizer.sanitize(SecurityContext.HTML, node.additionalInfo.description); } } - + name = this.sanitizer.sanitize(SecurityContext.HTML, name); desc = this.sanitizer.sanitize(SecurityContext.HTML, desc); @@ -1748,7 +1757,7 @@ export class RuleChainPageComponent extends PageComponent export interface AddRuleNodeLinkDialogData { link: FcRuleEdge; - labels: {[label: string]: LinkLabel}; + labels: { [label: string]: LinkLabel }; allowCustomLabels: boolean; sourceRuleChainId: string; } diff --git a/ui-ngx/src/app/shared/models/rule-node.models.spec.ts b/ui-ngx/src/app/shared/models/rule-node.models.spec.ts new file mode 100644 index 0000000000..a13d5126c3 --- /dev/null +++ b/ui-ngx/src/app/shared/models/rule-node.models.spec.ts @@ -0,0 +1,71 @@ +/// +/// Copyright © 2016-2026 The Thingsboard Authors +/// +/// Licensed under the Apache License, Version 2.0 (the "License"); +/// you may not use this file except in compliance with the License. +/// You may obtain a copy of the License at +/// +/// http://www.apache.org/licenses/LICENSE-2.0 +/// +/// Unless required by applicable law or agreed to in writing, software +/// distributed under the License is distributed on an "AS IS" BASIS, +/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +/// See the License for the specific language governing permissions and +/// limitations under the License. +/// + +import { normalizeLinkLabel, toStandardizedLinkLabel, toStandardizedLinkLabels } from './rule-node.models'; + +describe('toStandardizedLinkLabel', () => { + it('preserves an all-caps acronym and lowercases connector words', () => { + expect(toStandardizedLinkLabel('RPC Request from Device')).toBe('RPC Request from Device'); + }); + + it('capitalizes every word except connector words, even when the source is all lowercase', () => { + expect(toStandardizedLinkLabel('entity assigned to tenant')).toBe('Entity Assigned to Tenant'); + }); + + it('title-cases a mixed-case custom label, not preserving internal capitalization', () => { + expect(toStandardizedLinkLabel('the IoT gateway')).toBe('The Iot Gateway'); + }); + + it('returns an empty string for an empty label', () => { + expect(toStandardizedLinkLabel('')).toBe(''); + }); + + it('returns an empty string instead of throwing for a null or undefined label', () => { + expect(toStandardizedLinkLabel(undefined)).toBe(''); + expect(toStandardizedLinkLabel(null)).toBe(''); + }); +}); + +describe('normalizeLinkLabel', () => { + it('standardizes the label name while leaving the value untouched', () => { + expect(normalizeLinkLabel({name: 'entity assigned to tenant', value: 'entity assigned to tenant'})) + .toEqual({name: 'Entity Assigned to Tenant', value: 'entity assigned to tenant'}); + }); +}); + +describe('toStandardizedLinkLabels', () => { + const allowedLabels = { + success: {name: 'Success', value: 'success'}, + 'post telemetry': {name: 'Post Telemetry', value: 'post telemetry'} + }; + + it('standardizes only the labels that are well-known and renders custom labels verbatim', () => { + expect(toStandardizedLinkLabels(['post telemetry', 'checkTemperature'], allowedLabels)) + .toBe('Post Telemetry / checkTemperature'); + }); + + it('renders every label verbatim when none are in the allowed set', () => { + expect(toStandardizedLinkLabels(['gRPC', 'IoT data'], allowedLabels)).toBe('gRPC / IoT data'); + }); + + it('treats every label as custom when allowedLabels is undefined', () => { + expect(toStandardizedLinkLabels(['success'], undefined)).toBe('success'); + }); + + it('returns an empty string for an empty labels array', () => { + expect(toStandardizedLinkLabels([], allowedLabels)).toBe(''); + }); +}); diff --git a/ui-ngx/src/app/shared/models/rule-node.models.ts b/ui-ngx/src/app/shared/models/rule-node.models.ts index 30e1648f7e..2bd0cc7b6c 100644 --- a/ui-ngx/src/app/shared/models/rule-node.models.ts +++ b/ui-ngx/src/app/shared/models/rule-node.models.ts @@ -80,10 +80,43 @@ export interface IRuleNodeConfigurationComponent { configuration: RuleNodeConfiguration; configurationChanged: Observable; validate(); - testScript? (debugEventBody?: DebugRuleNodeEventBody); + testScript?(debugEventBody?: DebugRuleNodeEventBody); [key: string]: any; } +const LOWERCASE_WORDS = new Set(['a', 'an', 'the', 'and', + 'but', 'or', 'nor', 'for', 'yet', 'so', 'at', 'by', 'from', + 'in', 'of', 'on', 'to', 'up', 'with', 'as', 'into', 'per', 'via', 'than' +]); + +export function toStandardizedLinkLabel(label: string): string { + return label?.split(' ') + .map((word, index) => { + if (word.length > 1 && word === word.toUpperCase()) { + return word; + } + + if (index === 0) { + return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(); + } + + if (LOWERCASE_WORDS.has(word.toLowerCase())) { + return word.toLowerCase(); + } + return word.charAt(0).toUpperCase() + word.slice(1).toLowerCase(); + }).join(' ') ?? ''; +} + +export function normalizeLinkLabel(label: LinkLabel): LinkLabel { + return {name: toStandardizedLinkLabel(label.name), value: label.value}; +} + +export function toStandardizedLinkLabels(labels: string[], allowedLabels: {[label: string]: LinkLabel}): string { + return labels + .map(label => allowedLabels?.[label] ? toStandardizedLinkLabel(label) : label) + .join(' / '); +} + @Directive() // eslint-disable-next-line @angular-eslint/directive-class-suffix export abstract class RuleNodeConfigurationComponent extends PageComponent implements @@ -412,8 +445,8 @@ export enum MessageType { export const messageTypeNames = new Map( [ - [MessageType.POST_ATTRIBUTES_REQUEST, 'Post attributes'], - [MessageType.POST_TELEMETRY_REQUEST, 'Post telemetry'], + [MessageType.POST_ATTRIBUTES_REQUEST, 'Post Attributes'], + [MessageType.POST_TELEMETRY_REQUEST, 'Post Telemetry'], [MessageType.TO_SERVER_RPC_REQUEST, 'RPC Request from Device'], [MessageType.RPC_CALL_FROM_SERVER_TO_DEVICE, 'RPC Request to Device'], [MessageType.RPC_QUEUED, 'RPC Queued'], @@ -441,8 +474,8 @@ export const messageTypeNames = new Map( [MessageType.ALARM_UNASSIGNED, 'Alarm Unassigned'], [MessageType.COMMENT_CREATED, 'Comment Created'], [MessageType.COMMENT_UPDATED, 'Comment Updated'], - [MessageType.ENTITY_ASSIGNED_FROM_TENANT, 'Entity Assigned From Tenant'], - [MessageType.ENTITY_ASSIGNED_TO_TENANT, 'Entity Assigned To Tenant'], + [MessageType.ENTITY_ASSIGNED_FROM_TENANT, 'Entity Assigned from Tenant'], + [MessageType.ENTITY_ASSIGNED_TO_TENANT, 'Entity Assigned to Tenant'], [MessageType.TIMESERIES_UPDATED, 'Timeseries Updated'], [MessageType.TIMESERIES_DELETED, 'Timeseries Deleted'] ] diff --git a/ui-ngx/src/assets/locale/locale.constant-cs_CZ.json b/ui-ngx/src/assets/locale/locale.constant-cs_CZ.json index 041e3efe56..46307f72e9 100644 --- a/ui-ngx/src/assets/locale/locale.constant-cs_CZ.json +++ b/ui-ngx/src/assets/locale/locale.constant-cs_CZ.json @@ -1715,7 +1715,7 @@ "timeseries-placeholder": "Časové řady", "target-entity": "Cílová entita", "attributes-propagation": "Propagace atributů", - "attributes-propagation-hint": "Entitní pohled bude automaticky kopírovat specifikované atributy z cílové entity vždy, když uložíte nebo aktualizujete tento entitní pohled. Z výkonnostních důvodů nejsou atributy cílové entity propagovány při každé změně atributu. Automatickou propagaci můžete povolit konfigurací \"copy to view\" uzlu pravidla v rámci vašeho řetězu pravidel a provázáním \"Post attributes\" a \"Attributes Updated\" zpráv na nový uzel pravidla.", + "attributes-propagation-hint": "Entitní pohled bude automaticky kopírovat specifikované atributy z cílové entity vždy, když uložíte nebo aktualizujete tento entitní pohled. Z výkonnostních důvodů nejsou atributy cílové entity propagovány při každé změně atributu. Automatickou propagaci můžete povolit konfigurací \"copy to view\" uzlu pravidla v rámci vašeho řetězu pravidel a provázáním \"Post Attributes\" a \"Attributes Updated\" zpráv na nový uzel pravidla.", "timeseries-data": "Data časových řad", "timeseries-data-hint": "Nakonfigurujte klíče dat časových řad cílové entity, která budou dostupná pro entitní pohled. Tato data časových řad jsou pouze pro čtení.", "make-public-entity-view-title": "Jste si jisti, že chcete entitní pohled '{{entityViewName}}' zveřejnit?", diff --git a/ui-ngx/src/assets/locale/locale.constant-da_DK.json b/ui-ngx/src/assets/locale/locale.constant-da_DK.json index 0058dc7df6..f9caece6bb 100644 --- a/ui-ngx/src/assets/locale/locale.constant-da_DK.json +++ b/ui-ngx/src/assets/locale/locale.constant-da_DK.json @@ -2821,7 +2821,7 @@ "timeseries-placeholder": "Tidsserier", "target-entity": "Målenhed", "attributes-propagation": "Attributter propagation", - "attributes-propagation-hint": "Entitetsvisningen kopierer automatisk de specificerede attributter fra målenheden, hver gang du gemmer eller opdaterer denne entitetsvisning. Af hensyn til ydeevnen bliver attributterne ikke automatisk overført ved hver ændring. Du kan aktivere automatisk overførsel ved at konfigurere \"copy to view\" regelnode i din regelkæde og forbinde \"Post attributes\" og \"Attributes Updated\" beskeder til den nye regelnode.", + "attributes-propagation-hint": "Entitetsvisningen kopierer automatisk de specificerede attributter fra målenheden, hver gang du gemmer eller opdaterer denne entitetsvisning. Af hensyn til ydeevnen bliver attributterne ikke automatisk overført ved hver ændring. Du kan aktivere automatisk overførsel ved at konfigurere \"copy to view\" regelnode i din regelkæde og forbinde \"Post Attributes\" og \"Attributes Updated\" beskeder til den nye regelnode.", "timeseries-data": "Tidsseriedata", "timeseries-data-hint": "Konfigurer tidsserie-nøgler fra målenheden, som vil være tilgængelige i entitetsvisningen. Disse data er skrivebeskyttede.", "search": "Søg i entitetsvisninger", diff --git a/ui-ngx/src/assets/locale/locale.constant-de_DE.json b/ui-ngx/src/assets/locale/locale.constant-de_DE.json index 03ec53a2ed..f8d5e220ad 100644 --- a/ui-ngx/src/assets/locale/locale.constant-de_DE.json +++ b/ui-ngx/src/assets/locale/locale.constant-de_DE.json @@ -2821,7 +2821,7 @@ "timeseries-placeholder": "Zeitreihen", "target-entity": "Zielentität", "attributes-propagation": "Attributweiterleitung", - "attributes-propagation-hint": "Die Entitätsansicht kopiert automatisch die angegebenen Attribute von der Zielentität jedes Mal, wenn Sie diese Entitätsansicht speichern oder aktualisieren. Aus Leistungsgründen werden die Attribute der Zielentität nicht bei jeder Attributänderung automatisch in die Entitätsansicht übernommen. Sie können eine automatische Weiterleitung aktivieren, indem Sie den Regelknoten \"In Ansicht kopieren\" in Ihrer Regelkette konfigurieren und die Nachrichten \"Post attributes\" und \"Attributes Updated\" mit diesem neuen Regelknoten verknüpfen.", + "attributes-propagation-hint": "Die Entitätsansicht kopiert automatisch die angegebenen Attribute von der Zielentität jedes Mal, wenn Sie diese Entitätsansicht speichern oder aktualisieren. Aus Leistungsgründen werden die Attribute der Zielentität nicht bei jeder Attributänderung automatisch in die Entitätsansicht übernommen. Sie können eine automatische Weiterleitung aktivieren, indem Sie den Regelknoten \"In Ansicht kopieren\" in Ihrer Regelkette konfigurieren und die Nachrichten \"Post Attributes\" und \"Attributes Updated\" mit diesem neuen Regelknoten verknüpfen.", "timeseries-data": "Zeitreihendaten", "timeseries-data-hint": "Konfigurieren Sie die Zeitreihenschlüssel der Zielentität, die in der Entitätsansicht verfügbar sein sollen. Diese Zeitreihendaten sind schreibgeschützt.", "search": "Entitätssichten suchen", diff --git a/ui-ngx/src/assets/locale/locale.constant-el_GR.json b/ui-ngx/src/assets/locale/locale.constant-el_GR.json index f97ebf47f1..709c0dcca5 100644 --- a/ui-ngx/src/assets/locale/locale.constant-el_GR.json +++ b/ui-ngx/src/assets/locale/locale.constant-el_GR.json @@ -2821,7 +2821,7 @@ "timeseries-placeholder": "Χρονοσειρές", "target-entity": "Οντότητα στόχος", "attributes-propagation": "Διάδοση χαρακτηριστικών", - "attributes-propagation-hint": "Η Προβολή Οντότητας θα αντιγράφει αυτόματα τα καθορισμένα χαρακτηριστικά από την Οντότητα Στόχο κάθε φορά που αποθηκεύετε ή ενημερώνετε αυτή την προβολή. Για λόγους απόδοσης, τα χαρακτηριστικά της οντότητας στόχου δεν μεταφέρονται στην προβολή οντότητας με κάθε αλλαγή χαρακτηριστικού. Μπορείτε να ενεργοποιήσετε την αυτόματη διάδοση ρυθμίζοντας το node κανόνα \"copy to view\" και συνδέοντας τα μηνύματα \"Post attributes\" και \"Attributes Updated\" με το νέο node.", + "attributes-propagation-hint": "Η Προβολή Οντότητας θα αντιγράφει αυτόματα τα καθορισμένα χαρακτηριστικά από την Οντότητα Στόχο κάθε φορά που αποθηκεύετε ή ενημερώνετε αυτή την προβολή. Για λόγους απόδοσης, τα χαρακτηριστικά της οντότητας στόχου δεν μεταφέρονται στην προβολή οντότητας με κάθε αλλαγή χαρακτηριστικού. Μπορείτε να ενεργοποιήσετε την αυτόματη διάδοση ρυθμίζοντας το node κανόνα \"copy to view\" και συνδέοντας τα μηνύματα \"Post Attributes\" και \"Attributes Updated\" με το νέο node.", "timeseries-data": "Δεδομένα χρονοσειρών", "timeseries-data-hint": "Διαμορφώστε τα κλειδιά δεδομένων χρονοσειρών της οντότητας στόχου που θα είναι προσβάσιμα από την προβολή οντότητας. Αυτά τα δεδομένα χρονοσειρών είναι μόνο για ανάγνωση.", "search": "Αναζήτηση προβολών οντοτήτων", diff --git a/ui-ngx/src/assets/locale/locale.constant-en_US.json b/ui-ngx/src/assets/locale/locale.constant-en_US.json index b7a2d72e33..73d882f77d 100644 --- a/ui-ngx/src/assets/locale/locale.constant-en_US.json +++ b/ui-ngx/src/assets/locale/locale.constant-en_US.json @@ -2832,7 +2832,7 @@ "timeseries-placeholder": "Time series", "target-entity": "Target entity", "attributes-propagation": "Attributes propagation", - "attributes-propagation-hint": "Entity View will automatically copy specified attributes from Target Entity each time you save or update this entity view. For performance reasons target entity attributes are not propagated to entity view on each attribute change. You can enable automatic propagation by configuring \"copy to view\" rule node in your rule chain and linking \"Post attributes\" and \"Attributes Updated\" messages to the new rule node.", + "attributes-propagation-hint": "Entity View will automatically copy specified attributes from Target Entity each time you save or update this entity view. For performance reasons target entity attributes are not propagated to entity view on each attribute change. You can enable automatic propagation by configuring \"copy to view\" rule node in your rule chain and linking \"Post Attributes\" and \"Attributes Updated\" messages to the new rule node.", "timeseries-data": "Time series data", "timeseries-data-hint": "Configure time series data keys of the target entity that will be accessible to the entity view. This time series data is read-only.", "search": "Search entity views", diff --git a/ui-ngx/src/assets/locale/locale.constant-es_ES.json b/ui-ngx/src/assets/locale/locale.constant-es_ES.json index 0913972e47..c65261794b 100644 --- a/ui-ngx/src/assets/locale/locale.constant-es_ES.json +++ b/ui-ngx/src/assets/locale/locale.constant-es_ES.json @@ -2821,7 +2821,7 @@ "timeseries-placeholder": "Series temporales", "target-entity": "Entidad objetivo", "attributes-propagation": "Propagación de atributos", - "attributes-propagation-hint": "La vista de entidad copiará automáticamente los atributos especificados desde la entidad objetivo cada vez que guarde o actualice esta vista de entidad. Por razones de rendimiento, los atributos de la entidad objetivo no se propagan a la vista de entidad en cada cambio. Puede habilitar la propagación automática configurando un nodo de reglas \"copy to view\" y vinculando los mensajes \"Post attributes\" y \"Attributes Updated\" al nuevo nodo de reglas.", + "attributes-propagation-hint": "La vista de entidad copiará automáticamente los atributos especificados desde la entidad objetivo cada vez que guarde o actualice esta vista de entidad. Por razones de rendimiento, los atributos de la entidad objetivo no se propagan a la vista de entidad en cada cambio. Puede habilitar la propagación automática configurando un nodo de reglas \"copy to view\" y vinculando los mensajes \"Post Attributes\" y \"Attributes Updated\" al nuevo nodo de reglas.", "timeseries-data": "Datos de series temporales", "timeseries-data-hint": "Configure las claves de datos de series temporales de la entidad objetivo que estarán accesibles para la vista de entidad. Estos datos de series temporales son de solo lectura.", "search": "Buscar vistas de entidad", diff --git a/ui-ngx/src/assets/locale/locale.constant-fa_IR.json b/ui-ngx/src/assets/locale/locale.constant-fa_IR.json index 4ab3e8a059..55c8165775 100644 --- a/ui-ngx/src/assets/locale/locale.constant-fa_IR.json +++ b/ui-ngx/src/assets/locale/locale.constant-fa_IR.json @@ -860,7 +860,7 @@ "timeseries-placeholder": "سري هاي زماني", "target-entity": "موجودي هدف", "attributes-propagation": "انتشار ويژگي ها", - "attributes-propagation-hint": "هر بار که شما نمايش موجودي را بروز رساني يا ذخيره مي کنيد، نمايش موجودي بصور خودکار ويژگي هاي تعيين شده را از موجودي هدف کپي مي کند و به دلايل عملکردي، ويژگي هاي موجودي هدف، با هر بار تغيير ويژگي، در نمايش موجودي انتشار نمي يابند. مي توانيد با پيکربندي گره قواعد در زنجيره قواعد خود و پيوند دهي \"Post attributes\" و \"Attributes Updated\" آن به گره قواعد جديد، انتشار خودکار \"copy to view\" را ممکن سازيد ." , + "attributes-propagation-hint": "هر بار که شما نمايش موجودي را بروز رساني يا ذخيره مي کنيد، نمايش موجودي بصور خودکار ويژگي هاي تعيين شده را از موجودي هدف کپي مي کند و به دلايل عملکردي، ويژگي هاي موجودي هدف، با هر بار تغيير ويژگي، در نمايش موجودي انتشار نمي يابند. مي توانيد با پيکربندي گره قواعد در زنجيره قواعد خود و پيوند دهي \"Post Attributes\" و \"Attributes Updated\" آن به گره قواعد جديد، انتشار خودکار \"copy to view\" را ممکن سازيد ." , "timeseries-data": "داده ي سري هاي زماني", "timeseries-data-hint": "کليدهاي داده ي سري هاي زمانيِ موجوديِ هدف را پيکربندي کنيد تا در دسترسِ نمايش موجودي باشند. اين سري هاي زماني، فقط خواندني است" }, diff --git a/ui-ngx/src/assets/locale/locale.constant-fr_FR.json b/ui-ngx/src/assets/locale/locale.constant-fr_FR.json index 8934bb139c..7caaedf34e 100644 --- a/ui-ngx/src/assets/locale/locale.constant-fr_FR.json +++ b/ui-ngx/src/assets/locale/locale.constant-fr_FR.json @@ -2821,7 +2821,7 @@ "timeseries-placeholder": "Séries temporelles", "target-entity": "Entité cible", "attributes-propagation": "Propagation des attributs", - "attributes-propagation-hint": "La vue d’entité copiera automatiquement les attributs spécifiés de l’entité cible à chaque enregistrement ou mise à jour de cette vue. Pour des raisons de performance, les attributs de l’entité cible ne sont pas propagés à la vue d’entité à chaque modification. Vous pouvez activer la propagation automatique en configurant un nœud de règle \"copy to view\" dans votre chaîne de règles et en liant les messages \"Post attributes\" et \"Attributes Updated\" à ce nouveau nœud.", + "attributes-propagation-hint": "La vue d’entité copiera automatiquement les attributs spécifiés de l’entité cible à chaque enregistrement ou mise à jour de cette vue. Pour des raisons de performance, les attributs de l’entité cible ne sont pas propagés à la vue d’entité à chaque modification. Vous pouvez activer la propagation automatique en configurant un nœud de règle \"copy to view\" dans votre chaîne de règles et en liant les messages \"Post Attributes\" et \"Attributes Updated\" à ce nouveau nœud.", "timeseries-data": "Données de séries temporelles", "timeseries-data-hint": "Configurez les clés de séries temporelles de l’entité cible qui seront accessibles à la vue d’entité. Ces données sont en lecture seule.", "search": "Rechercher des vues d’entité", diff --git a/ui-ngx/src/assets/locale/locale.constant-it_IT.json b/ui-ngx/src/assets/locale/locale.constant-it_IT.json index 3117d40df7..2fddb1a239 100644 --- a/ui-ngx/src/assets/locale/locale.constant-it_IT.json +++ b/ui-ngx/src/assets/locale/locale.constant-it_IT.json @@ -2821,7 +2821,7 @@ "timeseries-placeholder": "Serie temporali", "target-entity": "Entità di destinazione", "attributes-propagation": "Propagazione degli attributi", - "attributes-propagation-hint": "La Entity View copierà automaticamente gli attributi specificati dall’entità di destinazione ogni volta che salvi o aggiorni questa entity view. Per motivi di prestazioni, gli attributi dell’entità di destinazione non vengono propagati alla entity view a ogni modifica degli attributi. Puoi abilitare la propagazione automatica configurando il rule node \"copy to view\" nella tua rule chain e collegando i messaggi \"Post attributes\" e \"Attributes Updated\" al nuovo rule node.", + "attributes-propagation-hint": "La Entity View copierà automaticamente gli attributi specificati dall’entità di destinazione ogni volta che salvi o aggiorni questa entity view. Per motivi di prestazioni, gli attributi dell’entità di destinazione non vengono propagati alla entity view a ogni modifica degli attributi. Puoi abilitare la propagazione automatica configurando il rule node \"copy to view\" nella tua rule chain e collegando i messaggi \"Post Attributes\" e \"Attributes Updated\" al nuovo rule node.", "timeseries-data": "Dati delle serie temporali", "timeseries-data-hint": "Configura le chiavi delle serie temporali dell’entità di destinazione che saranno accessibili alla entity view. Questi dati delle serie temporali sono di sola lettura.", "search": "Cerca viste entità", diff --git a/ui-ngx/src/assets/locale/locale.constant-ko_KR.json b/ui-ngx/src/assets/locale/locale.constant-ko_KR.json index a122a04ee7..e893a65eaf 100644 --- a/ui-ngx/src/assets/locale/locale.constant-ko_KR.json +++ b/ui-ngx/src/assets/locale/locale.constant-ko_KR.json @@ -1290,7 +1290,7 @@ "timeseries-placeholder": "시계열", "target-entity": "대상 개체", "attributes-propagation": "속성 전파", - "attributes-propagation-hint": "Entity View will automatically copy specified attributes from Target Entity each time you save or update this entity view. For performance reasons target entity attributes are not propagated to entity view on each attribute change. You can enable automatic propagation by configuring \"copy to view\" rule node in your rule chain and linking \"Post attributes\" and \"Attributes Updated\" messages to the new rule node.", + "attributes-propagation-hint": "Entity View will automatically copy specified attributes from Target Entity each time you save or update this entity view. For performance reasons target entity attributes are not propagated to entity view on each attribute change. You can enable automatic propagation by configuring \"copy to view\" rule node in your rule chain and linking \"Post Attributes\" and \"Attributes Updated\" messages to the new rule node.", "timeseries-data": "시계열 데이터", "timeseries-data-hint": "Configure timeseries data keys of the target entity that will be accessible to the entity view. This timeseries data is read-only.", "make-public-entity-view-title": "Are you sure you want to make the entity view '{{entityViewName}}' public?", diff --git a/ui-ngx/src/assets/locale/locale.constant-nl_NL.json b/ui-ngx/src/assets/locale/locale.constant-nl_NL.json index 3281909806..54575acef0 100644 --- a/ui-ngx/src/assets/locale/locale.constant-nl_NL.json +++ b/ui-ngx/src/assets/locale/locale.constant-nl_NL.json @@ -2821,7 +2821,7 @@ "timeseries-placeholder": "Tijdreeks", "target-entity": "Doelentiteit", "attributes-propagation": "Attribuutpropagatie", - "attributes-propagation-hint": "De entiteitweergave kopieert automatisch opgegeven attributen van de doelentiteit telkens wanneer je deze entiteitweergave opslaat of bijwerkt. Om prestatieredenen worden attributen van de doelentiteit niet bij elke wijziging doorgegeven. Je kunt automatische propagatie inschakelen door een \"copy to view\"-regelnode te configureren in je regelketen en \"Post attributes\" en \"Attributes Updated\" berichten eraan te koppelen.", + "attributes-propagation-hint": "De entiteitweergave kopieert automatisch opgegeven attributen van de doelentiteit telkens wanneer je deze entiteitweergave opslaat of bijwerkt. Om prestatieredenen worden attributen van de doelentiteit niet bij elke wijziging doorgegeven. Je kunt automatische propagatie inschakelen door een \"copy to view\"-regelnode te configureren in je regelketen en \"Post Attributes\" en \"Attributes Updated\" berichten eraan te koppelen.", "timeseries-data": "Tijdreeksgegevens", "timeseries-data-hint": "Configureer de sleutels van tijdreeksgegevens van de doelentiteit die toegankelijk zullen zijn voor de entiteitweergave. Deze tijdreeksgegevens zijn alleen-lezen.", "search": "Zoek entiteitweergaven", diff --git a/ui-ngx/src/assets/locale/locale.constant-no_NO.json b/ui-ngx/src/assets/locale/locale.constant-no_NO.json index 9a8ee78206..d9137ea6c3 100644 --- a/ui-ngx/src/assets/locale/locale.constant-no_NO.json +++ b/ui-ngx/src/assets/locale/locale.constant-no_NO.json @@ -2821,7 +2821,7 @@ "timeseries-placeholder": "Tidsserier", "target-entity": "Målenhet", "attributes-propagation": "Attribusjonsdistribusjon", - "attributes-propagation-hint": "Entitetsvisning vil automatisk kopiere spesifiserte attributter fra målenheten hver gang du lagrer eller oppdaterer denne entitetsvisningen. Av ytelsesgrunner blir attributtene til målenheten ikke kopiert ved hver endring. Du kan aktivere automatisk kopiering ved å konfigurere \"copy to view\"-regelnode i regelkjeden og koble \"Post attributes\" og \"Attributes Updated\"-meldinger til den nye regelnoden.", + "attributes-propagation-hint": "Entitetsvisning vil automatisk kopiere spesifiserte attributter fra målenheten hver gang du lagrer eller oppdaterer denne entitetsvisningen. Av ytelsesgrunner blir attributtene til målenheten ikke kopiert ved hver endring. Du kan aktivere automatisk kopiering ved å konfigurere \"copy to view\"-regelnode i regelkjeden og koble \"Post Attributes\" og \"Attributes Updated\"-meldinger til den nye regelnoden.", "timeseries-data": "Tidsseriedata", "timeseries-data-hint": "Konfigurer tidsserienøkler for målenheten som skal være tilgjengelige for entitetsvisningen. Disse dataene er skrivebeskyttet.", "search": "Søk etter entitetsvisninger", diff --git a/ui-ngx/src/assets/locale/locale.constant-pt_BR.json b/ui-ngx/src/assets/locale/locale.constant-pt_BR.json index 37e8bbae34..c8c9b23da1 100644 --- a/ui-ngx/src/assets/locale/locale.constant-pt_BR.json +++ b/ui-ngx/src/assets/locale/locale.constant-pt_BR.json @@ -2821,7 +2821,7 @@ "timeseries-placeholder": "Séries temporais", "target-entity": "Entidade de destino", "attributes-propagation": "Propagação de atributos", - "attributes-propagation-hint": "A visualização de entidade copiará automaticamente os atributos especificados da entidade de destino cada vez que você salvar ou atualizar esta visualização de entidade. Por razões de desempenho, os atributos da entidade de destino não são propagados para a visualização de entidade a cada alteração de atributo. Você pode habilitar a propagação automática configurando o nó de regra \"copy to view\" na sua cadeia de regras e vinculando as mensagens \"Post attributes\" e \"Attributes Updated\" ao novo nó de regra.", + "attributes-propagation-hint": "A visualização de entidade copiará automaticamente os atributos especificados da entidade de destino cada vez que você salvar ou atualizar esta visualização de entidade. Por razões de desempenho, os atributos da entidade de destino não são propagados para a visualização de entidade a cada alteração de atributo. Você pode habilitar a propagação automática configurando o nó de regra \"copy to view\" na sua cadeia de regras e vinculando as mensagens \"Post Attributes\" e \"Attributes Updated\" ao novo nó de regra.", "timeseries-data": "Dados de séries temporais", "timeseries-data-hint": "Configure as chaves de dados de séries temporais da entidade de destino que estarão acessíveis à visualização de entidade. Esses dados de séries temporais são somente leitura.", "search": "Pesquisar visualizações de entidade", diff --git a/ui-ngx/src/assets/locale/locale.constant-tr_TR.json b/ui-ngx/src/assets/locale/locale.constant-tr_TR.json index dfc2d1be39..6d63245bc0 100644 --- a/ui-ngx/src/assets/locale/locale.constant-tr_TR.json +++ b/ui-ngx/src/assets/locale/locale.constant-tr_TR.json @@ -2821,7 +2821,7 @@ "timeseries-placeholder": "Zaman serisi", "target-entity": "Hedef varlık", "attributes-propagation": "Özellik yayılımı", - "attributes-propagation-hint": "Varlık görünümü, bu varlık görünümünü her kaydettiğinizde veya güncellediğinizde, hedef varlıktan belirtilen özellikleri otomatik olarak kopyalar. Performans nedenleriyle, hedef varlık özellikleri her değiştiğinde görünümde otomatik olarak güncellenmez. Otomatik yayılımı etkinleştirmek için kural zincirinizde 'copy to view' kural düğümünü yapılandırıp, 'Post attributes' ve 'Attributes Updated' mesajlarını bu düğüme yönlendirin.", + "attributes-propagation-hint": "Varlık görünümü, bu varlık görünümünü her kaydettiğinizde veya güncellediğinizde, hedef varlıktan belirtilen özellikleri otomatik olarak kopyalar. Performans nedenleriyle, hedef varlık özellikleri her değiştiğinde görünümde otomatik olarak güncellenmez. Otomatik yayılımı etkinleştirmek için kural zincirinizde 'copy to view' kural düğümünü yapılandırıp, 'Post Attributes' ve 'Attributes Updated' mesajlarını bu düğüme yönlendirin.", "timeseries-data": "Zaman serisi verisi", "timeseries-data-hint": "Varlık görünümünde erişilebilir olacak hedef varlığın zaman serisi veri anahtarlarını yapılandırın. Bu zaman serisi verisi yalnızca okunabilir durumdadır.", "search": "Varlık görünümlerinde ara", diff --git a/ui-ngx/src/assets/locale/locale.constant-uk_UA.json b/ui-ngx/src/assets/locale/locale.constant-uk_UA.json index d71e1039b2..2319655e54 100644 --- a/ui-ngx/src/assets/locale/locale.constant-uk_UA.json +++ b/ui-ngx/src/assets/locale/locale.constant-uk_UA.json @@ -2821,7 +2821,7 @@ "timeseries-placeholder": "Часові ряди", "target-entity": "Цільова сутність", "attributes-propagation": "Поширення атрибутів", - "attributes-propagation-hint": "Фрагмент сутності автоматично копіюватиме вказані атрибути з цільової сутності щоразу, коли Ви зберігаєте або оновлюєте цей фрагмент сутності. З міркувань продуктивності атрибути цільової сутності не поширюються до фрагмента сутності при кожній зміні атрибутів. Ви можете увімкнути автоматичне поширення, налаштувавши вузол правила \"copy to view\" у Вашому ланцюгу правил і зв'язавши повідомлення \"Post attributes\" та \"Attributes Updated\" з новим вузлом правила.", + "attributes-propagation-hint": "Фрагмент сутності автоматично копіюватиме вказані атрибути з цільової сутності щоразу, коли Ви зберігаєте або оновлюєте цей фрагмент сутності. З міркувань продуктивності атрибути цільової сутності не поширюються до фрагмента сутності при кожній зміні атрибутів. Ви можете увімкнути автоматичне поширення, налаштувавши вузол правила \"copy to view\" у Вашому ланцюгу правил і зв'язавши повідомлення \"Post Attributes\" та \"Attributes Updated\" з новим вузлом правила.", "timeseries-data": "Дані часових рядів", "timeseries-data-hint": "Налаштуйте ключі даних часових рядів цільової сутності, які будуть доступні для фрагмента сутності. Ці дані часових рядів доступні лише для читання.", "search": "Шукати фрагменти сутностей", diff --git a/ui-ngx/src/assets/locale/locale.constant-zh_CN.json b/ui-ngx/src/assets/locale/locale.constant-zh_CN.json index 7f11a953ad..69fa7c2888 100644 --- a/ui-ngx/src/assets/locale/locale.constant-zh_CN.json +++ b/ui-ngx/src/assets/locale/locale.constant-zh_CN.json @@ -2821,7 +2821,7 @@ "timeseries-placeholder": "时间序列", "target-entity": "目标实体", "attributes-propagation": "属性传播", - "attributes-propagation-hint": "实体视图将在每次保存或更新此实体视图时自动从目标实体复制指定的属性。出于性能考虑,每次属性更改时不会自动将目标实体属性传播到实体视图。您可以通过在规则链中配置“copy to view”规则节点并将“Post attributes”和“Attributes Updated”消息链接到新规则节点来启用自动传播。", + "attributes-propagation-hint": "实体视图将在每次保存或更新此实体视图时自动从目标实体复制指定的属性。出于性能考虑,每次属性更改时不会自动将目标实体属性传播到实体视图。您可以通过在规则链中配置“copy to view”规则节点并将“Post Attributes”和“Attributes Updated”消息链接到新规则节点来启用自动传播。", "timeseries-data": "时间序列数据", "timeseries-data-hint": "配置实体视图可访问的目标实体时间序列数据键。此时间序列数据为只读。", "search": "搜索实体视图", diff --git a/ui-ngx/src/assets/locale/locale.constant-zh_TW.json b/ui-ngx/src/assets/locale/locale.constant-zh_TW.json index 7b0575f739..d92c98e511 100644 --- a/ui-ngx/src/assets/locale/locale.constant-zh_TW.json +++ b/ui-ngx/src/assets/locale/locale.constant-zh_TW.json @@ -1928,7 +1928,7 @@ "timeseries-placeholder": "時間序列", "target-entity": "目標實體", "attributes-propagation": "屬性傳播", - "attributes-propagation-hint": "每次儲存或更新這個實體視圖時,實體視圖將自動從目標實體複製指定的屬性。由於性能原因,目標實體屬性不會在每次屬性更改時傳播到實體視圖。您可以通過配置\"copy to view\"規則鏈中的規則節點,並將\"Post attributes\"和\"attributes Updated\"消息連結到新規則節點,從而啟用自動傳播。", + "attributes-propagation-hint": "每次儲存或更新這個實體視圖時,實體視圖將自動從目標實體複製指定的屬性。由於性能原因,目標實體屬性不會在每次屬性更改時傳播到實體視圖。您可以通過配置\"copy to view\"規則鏈中的規則節點,並將\"Post Attributes\"和\"Attributes Updated\"消息連結到新規則節點,從而啟用自動傳播。", "timeseries-data": "時間序列資料", "timeseries-data-hint": "配置目標實體的時間序列資料鍵,以便實體視圖可以存取這些鍵。這個時間序列資料是只讀的。", "search": "搜尋實體視圖",